c语言实践编程题

2025-03-28 版权声明 我要投稿

c语言实践编程题(精选10篇)

c语言实践编程题 篇1

#include

#include

typedef struct array1{

int ID;

struct array1* next;

}A;

typedef struct array2{

int ID;

int a;

int b;

int c;

}* B;

int main

{

A s1[15];

A* s2;

B s3;

for(int i=0;i<10;i++)

{

s1[i].ID=i+64;

}

s2=s1+3;

s3=(B)s2;

printf(”%d/n“,s3->b);

return 0;

c语言实践编程题 篇2

1 ATPCS调用标准

ARM处理器主要是利用编译器将汇编语言以及C/C++语言进行相互的切换, 并且ARM制定了相关标准, 来保障切换过程中的顺利实施。

1.1 寄存器使用规则

ATPCS为ARM寄存器进行不同命名, 从而在编程的过程中来利用ATPCS寄存器进行编程。如表1所示。

1.2 堆栈的使用规则

在ATPCS中规定, 堆栈的主要类型是FD, 被称为满递减堆栈, 所以必须要利用STMFD/LDMFF进行堆栈的操作。

1.3 参数传递规则

参数传递的规则不一样, 利用参数的数量可以将子程序分为参数数量固定, 以及参数数量不固定的子程序, 对于参数变化的子程序, 若参数的数量少于四个, 那么要利用寄存器来进行参数的传递, 若参数的数量多余四个, 那么必须要利用堆栈来进行参数的传递, 所以参数之间传递的规则不同。

2 ATPCS应用

2.1 汇编语言调用C语言

在对计算机嵌入式程序的开发中, 前期由汇编语言进行初始化的编程, 然后在进行C语言之间的切换, 对于C语言的切换, 主要指令R16lr帧指针是通过BL来实现的。以下是调用的字符:

2.2 C语言调用汇编语言

在程序中, 使用“C++”程序来调用C程序, 以下是调用C程序的字符:

2.3 汇编程序调用C++程序

在汇编语言与C++程序的切换时, 必须要利用关键词进行声明, 在C++程序的结构中, 如果没有基类, 则要使相应的存储结构与ARMC相同。并且在汇编过程中将参数的数据放在数据栈中, 只有这样才能使被调用的C++程序访问到相应的参数。

3 内嵌汇编

在进行混合编程的过程中, 若汇编代码较短, 那么可以利用内嵌汇编的方式进行混合编程, 不会直接指定寄存器, 而是直接利用编译器进行分配。主要的内嵌汇编语言如下:

4 结束语

在计算机系统嵌入式应用程序的开发中, 利用ARM汇编语言与C/C++语言相互结合的混合编程方式, 可以在很大程度上提高编程的最佳效果。本文主要举出了ARM汇编语言以及C/C++语言汇编中的实例, 提出了设计的方法, 阐述了ARM汇编语言与C/C++语言相互结混合编程方式的实现。

摘要:在计算机系统嵌入式应用程序的开发中, 对于汇编语言与C/C++语言的设计开发, 二者都存在着优缺点, 所以相关人员在开发中会采用ARM汇编语言与C/C++语言混合编程, 从而取得最大的效果。本文主要研究了ARM汇编语言与C/C++语言混合编程的设计实现方法, 并进行相关的讨论。

关键词:ARM汇编语言,C/C++语言,混合编程

参考文献

[1]马忠梅, 徐英慧.ARM嵌入式处理器结构与应用基础[M].北京航空航天大学出版社, 2010, 1 (2) :20-30.

[2]史斌, 孙晔.ARM汇编语言与C/C++混合编程方法[J].电子测量技术, 2010, 6 (6) :15-20.

c语言实践编程题 篇3

关键词:中等职业学校;C语言编程教学;编程能力培养

中图分类号:G712 文献标志码:A 文章编号:1673-9094-(2016)06C-0046-03

南宋诗人陆游在他的《冬夜读书示子聿》中写道:“纸上得来终觉浅,绝知此事要躬行。”这两句诗的意思是从书本上得到的知识终归是浅薄的,最终要想认识事物或事理的本质,还必须自己亲身的实践。作为一门实践性很强的课程《编程语言基础——c语言》着重程序设计在实践中的应用。因此,对于计算机专业的学生,仅仅在纸上写写程序是远远不够的,必须让他们把自己写的程序拿到电脑上去运行、调试,发现问题,然后再尝试解决问题,循环往复,在实践教学中培养他们的编程能力。

一、巧选题,激生趣

很多计算机教师都认为,只要是在机房上课,就有很大的随意性,所以往往不是很认真准备,有时会在课前准备两个题目,让学生上机做;有时干脆在上机的过程中随机出个题,目的就是只要让学生有事可做,不闲着就行,只要没学生问问题,就认为他们都会。表面上看,学生热热闹闹、忙忙碌碌,其实他们真正用于做题的时间并不多,很多学生都是浑水摸鱼、滥竽充数,只有少数几个学生是认真对待。

究其缘由,就是教师没有认识到上机的重要性,或者认识到了,没有在课前做充分的准备。而练习题的选取其实是首当其冲的。选得好,学生既喜欢做又提升了能力;选不好,学生既无趣又浪费了时间。那么,该如何巧选题呢?

(一)基础题+提升题的搭配套餐

上机就和上课一样,也有一个过程:从生到熟,所以刚开始上机编程时,教师应选取一些最基础的题目加深学生对c语言基础知识的理解。比如如下程序:

main( )

{float x1,x2;

double z1,z2;

float x;

double y;

x=123456.789;

y=123456.789;

printf(“x=%f”,x);

printf(“y=%f”,y);

}

选取这道题的目的就是让学生理解浮点数的“精度”和“范围”的确定,通过把这个程序输入电脑,并调试运行得出结果,学生很容易就记住了float型和double型数据的区别,而且该题没有任何难度,即使是学习能力较差的学生也很容易调试成功,所以很容易打动学生的心。

但没有挑战,就感受不到胜利的刺激。如果每次上机都是这种不费吹灰之力就可以完成的程序,时间长了,学生就会觉得索然无味,失去兴趣。这时就要适当地提升程序的难度,既要能激起学生的斗志,但又不能把学生一棍子打死。比如这道题:从键盘上输入a、b、c三个整数,按从小到大的顺序输出。选这道题的原因是刚学习过求两数之中的大者、小者的编程方法,而且已上机调试过,因此在此基础上又增加一个数,而且不是求最大或最小,而是要按一定的顺序输出,既联系了之前所学知识,又使其上升了一个梯度。在学生可以解决的范围之内,但又需要思考,调动了学生的兴趣,激发他们去探究。

(二)实用性+趣味性的完美组合

既然编程的目的是为了以后的实际应用,那么选取一些贴近生活的实用的程序就是必不可少的,因为和生活相关,学生看得到,想得出,当然也会有兴趣参与。看这道题:编程判断2020年是否为闰年?

学生看到这道题,立刻会想到以前中学学过的判断闰年的方法:能被4整除但不能被100整除或者能被400整除的年份即为闰年,接下来自然会把这个判断方法用c语言的语句和结构表示出来,一切都是顺理成章、水到渠成。

实用性的题目很多,但并不是所有的都符合学生的兴趣,如果再加些趣味性,相信学生会兴趣倍增,思维也随之开阔。如,把10元钱人民币兑换成1元、2元和5元的零钞,有多少种兑换方法?这是一道既贴合生活又很有趣的题,学生可能会立刻拿出三种面值的人民币,然后进行组合,也有可能会在大脑里进行快速地思考,然后结合学过的“百钱买百鸡”的编程方法编写该程序。

(三)题目形式的多样化

单一的题型,学生会感到腻,如果一上机就是从头到尾的编程,他们的兴趣就会锐减,所以多样化的题型更会吸引学生的眼球。教师就要多动脑子了,什么样的程序适合填空题型,什么样的程序适合改错题型,什么样的程序适合学生自己编写,什么样的程序只要学生调试,看结果。只要教师灵活选择,合理使用,相信学生定会乖乖配合,乐在其中。

二、巧搭配,促合作

上机时,虽然每个学生都有一台电脑可供使用,但这并不代表着他们是孤立的个体,相互之间不需要帮助和交流。恰恰相反,由于编程题的特殊性,他们之间更需要合作、互助,因此采取分组的学习方式是最适合不过的。

(一)组间同质,组内异质”

教师应对学生的个性、知识水平等方面有充分的了解,目的就是为了在学生合作过程中做到组内合作、组间竞争,让每个学生在合作中都能展示自我,发挥自己的特长。在充分了解之后,教师就应该以此为依据进行分组。比如,有的学生打字比较快,有的学生逻辑思维能力强,有的学生英语水平高,有的学生比较心细,合理搭配就可以集各家之所长,让他们在编程的过程中互相协作,互相鼓励,每个人都有事可做,每个人也都认为自己是不可缺少的,在合作的过程中共同学习,共同进步。

(二)明确分工,激发参与

为了达到最佳的合作效果,小组成员还应该在完成具体的任务前明确各自的分工,这个工作可由小组长来做。在具体做的过程中,每位成员应该积极参与,不偷懒,不耍滑,齐心协力,共同完成从程序的设计到编写,到运行,到调试,到获取正确结果,到最终记录的全过程。只有这样,巧妙搭配,合理分工,才能促进合作,从而使大家的编程能力都上升一个层次。

三、巧考核,提能力

C语言课程的考试,基本上是出一份试卷,学生只要动动笔即可。因此,很多学生并不重视上机,只重“纸上谈兵”,而这种思想对其编程能力的培养有百害而无一利。为了扭转学生这种不正确的想法,教师应把上机考核作为学生c语言成绩的一部分,而且考核的方式应该多种多样。

(一)竞争考核

教师把精心准备的编程题给各小组,然后开始观察各小组成员之间的合作情况:是否能全员参与,是否能齐心协力,是否能发挥各自的长处,小组长是否起到了应有的作用。而这些都将计入考核评价中;编程完成后,看哪个小组用的时间最短,并且编程的思路最清晰,用的方法最简洁,程序输入的格式最完美,有自己独到的见解,用了一种以上的方法等等,最后综合权衡,评出获胜小组,并给予一定的奖励。

(二)“小老师”考核

上机时,教师出题,给学生充分的时间思考,然后由学生自愿充当“小老师”,把编程的思想、方法一一道来,教师和其他学生根据其回答的条理性、正确性等方面为其打分,纳入考核成绩。

四、巧表扬,增信心

学生都以得到教师的表扬为荣,而在机房编程时,教师的表扬尤其重要。因为编程是一个细致的过程,来不得半点马虎,一个分号忘了,都会满盘皆输。一节课下来,完不成一个程序更是常见的现象,这就会导致学生疲乏、厌烦、急躁,如果教师的表扬或者一些鼓励性的话语适时地出现,对学生是很大的心理安慰。

学生的语法格式总是不对的时候,教师要表现出极大的耐心,和他一起查看错误提示,并适当鼓励学生:“你做得不错了,只是语法上有点错误,再找找看是哪个地方粗心了,马上就成功了,加油!”

学生不知该用哪种结构时,教师可以说:“你很不简单,能把编程的方法想得如此奇妙,老师都没想到这个方法,相信怎么用c语言的结构实现,对你来说一定不是问题,老师相信你!”

别的小组完成,而只有一个小组未完成时,教师可以说:“别着急,你们小组合作得很好,大家都能齐心协力,你看,都完成大半了,坚持到底就是胜利!”

总之,实践教学中的“四巧”策略确实可以培养学生的编程能力,改变他们对c语言的畏难情绪,让他们爱上编程。

Strategies of Developing Students' Programming Ability in Secondary Vocational C Language Practice Teaching

DONG Ping

(Xuzhou economic and Technological Development Zone Industrial School, Xuzhou 221121, Jiangsu Province)

Abstract: For secondary vocational computer professional students, C language course is the most difficult one to learn, which is reflected in programming. Therefore, cultivating the students' programming ability is particularly important, which should focus on "four skillful strategies" in practice teaching.

c语言实践编程题 篇4

func(char *str)

{

printf(“%d”,sizeof(str));

printf(“%d”,strlen(str));

}

main()

{

char a[]=“123456789”;

printf(“%d”,sizeof(a));

func(a);

}

答: 1049

网络/网络编程部份:

1、connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?

答:最通 常的方法最有效的是加定时器;也可以采用非阻塞模式。

2、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻 知道?

答:若客户端掉线或者重新启动,服务器端会收到复位信号,每一种tcp/ip得实现不一样,控制机制也不一样。

3.在子网210.27.48.21/30种有多少个可用地址?分别是什么?

答:

简:

30表示的是网络号(network number)是30位,剩下2位中11是广播(broadcast)地址,00是multicast地址,只有01和10可以作为host address。

详:

210.27.48.21/30 代表的子网的网络号是30位,即网络号是210.27.48.21 & 255.255.255.251=210.27.48.20,此子网的地址空间是2位,即可以有4个地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一个地址的主机号(host number/id)是0,而主机号0代表的是multicast地址。最后一个地址的最后两位是11,主机号每一位都为1代表的是广播(broadcast)地址。所以只有中间两个地址可以给host使用。其实那个问题本身不准确,广播或multicast地止也是可以使用的地址,所以 回答4也应该正确,当然问的人也可能是想要你回答

2。我个人觉得最好的回答是一个广播地址,一个multicast地址,2个unicast地址。

4.TTL 是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)

答:

简:TTL 是Time To Live,一般是hup count,每经过一个路由就会被减去一,如果它变成0,包会被丢掉。它的主要目的是防止包在有回路的网络上死转,浪费网络资源。ping和 traceroute用到它。

详: TTL是Time To Live,目前是hup count,当包每经过一个路由器它就会被减去一,如果它变成0,路由器就会把包丢掉。IP网络往往带有环(loop),比如子网A和子网B有两个路由器 相连,它就是一个loop。TTL的主要目的是防止包在有回路的网络上死转,因为包的TTL最终后变成0而使得此包从网上消失(此时往往路由器会送一个 ICMP包回来,traceroute就是根据这个做的)。ping会送包出去,所以里面有它,但是ping不一定非要不可它。traceroute则是 完全因为有它才能成的。ifconfig是用来配置网卡的,netstat-rn 是用来列路由表的,所以都用不着它

5.路由表示做什么用的?在linux环境中怎么来配置一条默认路由?

答:

简:路由表是用来决定如何将包从一个子网传送到 另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。

详: 路由表是用来决定如何将包从一个子网传送到另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。路由表的每一行至少有目标网 络号、netmask、到这个子网应该使用的网卡。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的netmask和包里的目标IP地 址做并逻辑运算(&)找出目标网络号,如果此网络号和这一行里的网络号相同就将这条路由保留下来做为备用路由,如果已经有备用路由了就在这两条路 由里将网络号最长的留下来,另一条丢掉,如此接着扫描下一行直到结束。如果扫描结束任没有找到任何路由,就用默认路由。确定路由后,直接将包送到对应的网 卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。题外话:路由算法其实效率很差,而且不scalable,解决办法是使用IP 交换机,比如MPLS。

在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。

6.在网络中有两台主机A和B,并通过路由器和其他交换设备连接 起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障? 答:测试这两台 机器是否连通:从一台机器ping另一台机器

如果ping不通,用traceroute可以确定是哪个路由器不能连通,然后再找问题是在交换设备/hup/cable等。

7.网络编程中设计并发服务器,使用多进程 与 多线程,请问有什么区别?

答案一:

1,进程:子进程是父进程的复制 品。子进程获得父进程数据空间、堆和栈的复制品。

2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数 据,但拥有自己的栈空间,拥有独立的执行序列。

两者都可以提高程序的并发度,提高程序运行效率和响应时间。

线程和进程在使用上各有优缺 点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

答案二:

根 本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:

1。速度: 线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。

2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空 间内。

C语言编程个人简历 篇5

C语言编程个人简历、本文由大学生个人简历网编辑,以下推荐一篇相关的、计算机应用与编程个人简历表格、参考!

姓    名:          性    别: 男

年    龄: 22岁 学    历: 本科

工作年限: 应届生 婚姻状况: 未婚

户    口: 长沙市

居 住 地: 湖南省邵阳市近期任职: 实习生

待遇要求: --3500/月 到岗时间: 1周以内

希望地区: 深圳市

希望岗位: 储备干部

自我评论

我待人真诚,做事有上进心,自学能力强。处事自信、认真、肯担当。父母坚毅,朴实的性格无时无刻不在感染着我,生活中对自己是尽量节俭,但工作学习中必须做到“贪得无厌”。我不甘于寂寞,我渴望能和身边的.朋友分享成功的喜悦,更享受经受挫败时一起的越挫越勇。但我又不擅于喧闹,我认为广博的知识必须静心汲取,全心投入的思考。唯有如此才能在技术上面日日进步,精益求精。我憧憬做一个事业成功的人,能凭自己双手给社会造益,能给家人幸福,能给身边人带来快乐。我钟爱一句话,也是驱使我有不懈奋斗的一句话——  “天行健,君子以自强不息。地势坤,君子以厚德载物。”工作经验

某公司   -02 - 2009-04

公司性质:

担任职位:实习生

工作职责和业绩:

在公司主要负责网站的开发与维护 教育经历

邵阳学院  -06 - -06

最高学历:本科

专业名称:信息与计算科学

专业描述:信息与计算科学专业 Information and Computing Sciences 信息与计算科学专业是以信息领域为背景数学与信息,管理相结合的交叉学科专业.该专业培养的学生具有良好的数学基础,能熟练地使用计算机,初步具备在信息与计算科学领域的某个方向上从事科学研究,解决实际问题,设计开发有关软件的能力.毕业生适合到企事业单位、高科技部门、高等院校、行政管理和经济管理部门,从事科研、教学和计算机应用软件的开发和管理工作,也可以继续攻读信息与计算科学及相关学科的硕士学位。

技能专长:

掌握C++、C语言编程,熟悉linux  C语言。Linux系统下文件I/O操作,进程控制,信号,网络编程均有学习。了解ARM平台下linux嵌入式项目开发流程。

it技能专长

技 能:AIX

使用时间:一个月

实验三_LINUX的C语言编程 篇6

要求:

1、请查阅资料,掌握vi编辑器的基本使用,包括两种不同模式的区别,如何在两种模式之间切换,以及常用的编辑命令等;

2、使用vi编写一个c程序,要求该程序通过命令行接收用户的输入,其输入参数为FreeBSD系统中的任意文本文件,接收输入后,c程序读取该文件内容,并打印在屏幕上。编辑好后,存为.c文件(如a.c),使用gcc编译该文件,运行结果文件。

3、详细记录学习的内容和实验的整个过程,包括用到的vi命令,c程序源代码,gcc命令,以及执行结果文件的命令等;

4、对整个实验过程进行分析总结,给出详细步骤;

一:vi编辑器的使用

vi 的两种命令模式;

Command(命令)模式,用于输入命令; Insert(插入)模式,用于插入文本;

Visual(可视)模式,用于视化的的高亮并选定正文;

Command 模式是vi或vim的默认模式,如果我们处于其它命令模式时,要通过ESC键切换过来。

当我们按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令; 文件的保存和退出 :w 保存;

:w filename 另存为filename; :wq!保存退出;

:wq!filename 注:以filename为文件名保存后退出; :q!不保存退出;

:x 应该是保存并退出,功能和:wq!相同 光标移动

j 向下移动一行; k 向上移动一行; h 向左移动一个字符; l 向右移动一个字符;

插入模式(文本的插入)i 在光标之前插入; a 在光标之后插入;

I 在光标所在行的行首插入; A 在光标所在行的行末插入;

o 在光标所在的行的上面插入一行; O 在光标所在的行的下面插入一行;

s 删除光标后的一个字符,然后进入插入模式; S 删除光标所在的行,然后进入插入模式; 文本内容的删除操作 x 一个字符;

#x 删除几个字符,#表示数字,比如3x; dw 删除一个单词;

#dw 删除几个单词,#用数字表示,比如3dw表示删除三个单词; dd 删除一行;

#dd 删除多个行,#代表数字,比如3dd 表示删除光标行及光标的下两行; 恢复修改及恢复删除操作; u 撤消修改或删除操作;

查找

/SEARCH 注:正向查找,按n键把光标移动到下一个符合条件的地方; ?SEARCH 注:反向查找,按shift+n 键,把光标移动到下一个符合条件的 替换

:s /SEARCH/REPLACE/g 注:把当前光标所处的行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示;

:%s /SEARCH/REPLACE 注:把文档中所有SEARCH替换成REPLACE;

:#,# s /SEARCH/REPLACE/g 注:#号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE;

二:编写程序和编译程序

先在home文件夹下建立test文件夹,用于自己的程序开发。

根据题目要求编写相应程序:

编写完程序后保存。

使用gcc命令编译时发现如下问题:

后来上网查找后发现FreeBSD默认不再使用GCC构建,使用Clang/LIVM替代GCC作为默认的C/C++编译器。

于是使用clang命令进行编译如下:

得到输出文件后,再新建一个test.txt文件用于测试。然后执行可执行文件:./a.out

由上可以看出,在执行编译命令后我并没有指定输出文件的类型和名称,a.out为默认输出的名称和类型,可以使用clang a.c –o test来生成不同类型和名称的输出文件。另外看到提示是输入文件的路径,如果是当前文件下的文件,则可以只输入文件的相对路径,如果在别的文件夹下则需要输入文件的绝对路径。如使用#cp /home/test/test.txt /home/test2.txt复制一个文件到别的目录后读取。测试如下:

三:程序源代码

#include int main(){ FILE *file;//定义文件指针

char path[20];//文件路径字符串

char msg[100];//读入数据缓存区

printf(“please enter the path of your filern”);//输出提示

scanf(“%s”,path);//获取文件路径

file = fopen(path);//打开文件

while(fgets(msg,sizeof(masg)-1,file)!=NULL)//逐行读取文件 直到文件末 { printf(“%s”,msg);//输出读取到的文件内容 } fclose(file);//关闭文件 return 0;//返回 } 四:实验总结和分析

本次实验首次使用vi编辑器编写了一段代码,并成功的编译并运行。首先说一下vi编辑器的使用感受,和window不太一样,它有不同的模式,只有在特定的模式下才能执行相应的命令或者操作。而且我发现了另一个很好用的ee编辑器,使用这个编辑器可以很方便的进行文件的操作,主要是它有很丰富的提示。但是为什么vi编辑器是大家常谈的呢?主要是vi编辑器体积小巧,功能强大,虽然在大的系统工程方面不太好用,但是正常的使用来说还是足够的,几乎所有的类似操作系统都会装有这一编辑器,学会vi编辑器的使用可以使自己在没有别的编辑器的情况下还能进行文件的编辑和系统的配置。这样对于日后的开发有很大的好处。另外在发现FreeBSD中没有安装gcc时,我尝试过给器安装一个gcc编辑器,但是却失败了,截图如下(图1),希望通过后面的学习安装上去。

图1:安装gcc编译器失败

c语言实践编程题 篇7

1 C语言概述及其具有的特征

当前时期, C语言已经成为全球范围中的计算机软件开发以及编写领域中的运用最为普遍的一种编程语言, 其传播速度以及发展速度均是极为迅速的[1]。C语言开发于20世纪60年代, 其在20世纪70年代不断发展完善, 经过50多年的发展, 目前C语言已经发展得较为成熟, 当前C语言拥有着以下一些基本特征。第一, C语言自身拥有着极为普遍的应用范围, 具有非常显著的可移植性, 可以在众多形态操作系统实现良好的适用。第二, C语言从外在形制方面来说, 其拥有着十分明显的简洁和紧凑等性能, 在进行实际使用过程中, 拥有着显著的灵活性和方便性。由于其自身语法欠缺一定的严格性, 为编程人员在进行程序编写过程中打下了较为自由的基础条件, 能够将高级编程语言与地基编程语言进行很好地衔接。第三, C语言拥有着非常多的数据结构。第四, C语言对于进行语句表意方面, 其拥有着多种多样而且数量众多运算符号, 利用这些运算符号能够完成其他高级语言不能很好实现的功能。第五, C语言拥有着典型与鲜明的应用和建设特点, 可以使数据对象和编程代码间可以进行有效的分割, 在软件编写过程中能够拥有着非常显著的清晰性, 给技术员进行使用、调试以及维护等工作带来极大的便利性[2]。第六, C语言可以对物理地址进行最为直接的访问。第七, 运用诸多的数据结构能够让C语言在实现数据运算的前提下, 还拥有着较为显著的图形元素处理以及引入方面的功能。

2 C语言学习过程中存在的问题

C语言因其具有强大以及丰富的使用功能, 使其得到了现代人们普遍的关注以及普遍的使用, 这便要对C语言使用技巧和基础知识加以有效地掌握与学习。然而, 事实上存在诸多的因素造成大量的C语言初学者常常在学习过程中感觉枯燥。虽然位过一定时间的学习以及实践, 但是无法对C语言的基础知识以及操作能力有显著的提升, 而且对于C语言整体认知也存在较大的缺陷[3]。这一学习问题主要可以从如下几点原因进行分析。

一方面, C语言对于目前大多数编程语言而言, 其处于高级语言范畴之内, C语言和以往的面向对象型的编程语言有着较为显著的差异, 这就造成C语言在进行学习过程中无法对编写的语言进行直观查看, 并且只能在编写完成并进行调试过程中才能对所编写的程序进行真实的感知, 此外, 在进行实际编写时, 一旦某一流程存在些许偏差均会造成程序输出存在错误。另一方面, 由于C语言具有的表意元素体系内存在有大量的算法和数据结构, 这便对学习者进行基础知识和应用技巧方面的学习与理解时带来了显著的制约, 致使部分学生在学习过程中感到枯燥乏味, 最终出现厌烦心理, 而且在学习时也会不断失去学习C语言的意愿, 不能确保学生学习效果得到显著的提升。

3 C语言所需的编程技巧

即便C语言拥有着众多的技术优势, 但是在实际学习过程中依旧存在较大的难度, 采取一定的编程经验以及技巧, 不但能够有效地提升编程效率, 而且可以在很大程度上对C语言学习有着帮助。

3.1 指针

C语言所具有的特征通常是利用指针表达来实现, 指针具有更为简单的语句, 而且能够有效地提高C语言的运行时的速度, 但是也存在占用内存相对较大的不足。诸如对于字符串进行赋值方面, 其中一种代码为:#defune LEN 32;char string 1[LEN];memset (string, 0, 1LEN) ;ct rcpy (st r ing1, ”this is a example”) ;另一种方式的代码为:const char string2[LEEN]=“this is a example”;char*cp;cp=string2。从上述两个代码来看, 他们的运行效率是无法相比的, 前者一定要对两个字符函数进行调用才能实现, 而后者对指针进行运用便可实现。但是后者灵活性不如前者好, 一旦字符串出现大量变更时, 前者所具有的灵活性便会展现出来, 后者将会对内存中的字符串加以大量占用。

3.2 数学方法

数学计算对于计算机而言是不可或缺的, 学习C语言过程中, 一定会遇到处理大量数据形式的结构, 编程的目的便在于解决这一问题, 利用计算机来对人工的繁重运算进行有效的代替, 从而有效地节省人工。对于一些相对较为简单的运算能够利用数学方式加以解决, 所以在利用C语言进行编程之前, 应该将数学思维运用在其中, 能够有效地提高工作效率, 对工作人员思维有着显著的扩展作用。

3.3 使用位操作

位操作能够显著的提升C语言编程的效率, 这是由于位操作使全部计算机程序内最为基础的数据单元, 拥有着非常重要的作用, 可以使代码显得相对简洁, 从而使效率得到极大的提升, 全部的运算操作基本上都可以根据位运算来进行处理, 但是位操作也存在一定的安全隐患, 因此这一技巧在实际使用过程中要根据其实际状况进行充分的考量。

4 基于单片机的C语言编程技巧

单片机已经是产品开发今后的必然发展趋势, 单片机计算机操作愈发复杂与繁重, 使其性能也得到了很大的提升, 其内部存储器也在逐渐扩大, 在代码量以及运行速度上均是汇编语言, 并不存在显著的差异, 因此利用单片机实现编程也是一项重要的研究内容[4]。C语言虽然拥有着众多的优势, 但是其所生成出来的代码相对较长, 除非拥有着较好的编程基础, 要不然的话其效果相对较差, 对此简单介绍一些有关单片机进行编程方面的技巧。

4.1 选择数据类型

基于单片机形式的C语言编程要与程序存储器进行有效的结合, 可以提供大量的数据类型, 能够被计算机进行直接读取的语言只要有bit和char, 其所产生的代码相对较短。而浮点型与整形等形式的数据无法被计算机进行直接读取, 要利用相关程序以及函数等才能实现, 而且所产生的代码相对较长。要想降低代码长度, 在对数据类型进行选取时要与实际情况相结合。

4.2 算法优化

明确所选取的数据库类型之后, 便要对程度算法实现一定的优化, 主要是针对程序运行速度以及程序代码量。此二者一般是相互独立, 拥有着此消彼长的联系, 如果空间复杂度得到了优化, 便会使时间复杂度得到一定的增加, 所以, 对算法进行优化时, 要根据具体情况取二者的平均值。代码效率一般是指代码从发出至返回所需的时间, 对时间复杂度进行优化的话, 主要是通过代码执行时间来实现, 对于执行时间方面的计算, 可以利用计时器来实现, 令单片机所自带的计时器方式调整成为自动重载形式之后, 调用代码过程中, 要将计时器进行开启, 在程序执行完成之后, 对计时器进行及时停止, 通过对时间进行计算, 基于此对其进行适当的优化。

5 结语

总而言之, C语言由于具有诸多的技术优势以及强大的功能, 使其在诸多的领域之中得到了非常普遍的运用, 对于我国诸多高校而言, 特别是理工科, 对C语言进行了大力的推动。由于C语言是一种面向过程形式的编程语言, 其中的关键部分使算法和数据节, 这也是学习过程中的重难点内容, 为了解决初学学生学习过程中的学习困难, 可以利用C语言进行编程过程中的技巧来有效地提高学习兴趣, 而且可以对教学效果以及学习效率具有显著的提升。

参考文献

[1]刘小艮.探究C语言编程技巧在C语言学习中的应用[J].科技展望, 2016 (7) :298.

[2]胡渝苹.关于计算机C语言编辑程序技巧探究[J].信息与电脑 (理论版) , 2014 (11) :158.

[3]邢如意.Linux系统下计算机C语言的编程技巧分析[J].电脑知识与技术, 2014 (36) :8674-8675, 8690.

c语言实践编程题 篇8

关键词 C语言 编成技巧 应用 研究

中图分类号:TP3 文献标识码:A

0前言

在大学计算机教学的过程中,C语言占据重要地位,由于C语言自身的特殊性质,逻辑性强、难度较大,因此,大部分学生对C语言学习存在畏惧心理。在学习C语言的过程中,编成技巧对学生发展至关重要,因此,现阶段,教师面临的主要任务是如何在C语言学习过程中,应用编成技巧。

1C语言学习现状

(1)学生基础薄弱

通常情况下,学校将C语言课程安排在大一,由于C语言课程难度较大、逻辑性较强,大一学生刚刚经历过高考,在短时间内,无法快速适应C语言课程。此外,由于C语言课程要求学生应将理论基础转变为实践应用,由于学生在高中期间,接触计算机的机会较少,因此,学生的实践应用能力较差,长此以往,学生的学习积极性较低,这不利于获得良好的教学效果。

(2)课时较少

现阶段,相比于其它课程,学校安排C语言课程的课时较少,因此,教师为完成教学任务,在每一节课中会逐渐增加教学内容,由于C语言自身的特殊性质,教师内容的增多,会加大学生的学习压力,在短时间内,学生无法快速理解教师讲授的内容,导致学生产生厌倦心理。

(3)学习方法落后

编成方法是学习C语言课程的主要目的,但是,由于在初学C语言的过程中,教师没有积极引导学生掌握正确的学习方法,学生仍旧按照其它课程的学习方法,即掌握基本的语法知识,不注重实践应用,不能够将理论基础转变为实践应用,导致学生在实践的过程中,经常会出现各种问题。

2C语言学习过程中编成技巧的应用

在学习C语言课程过程中,虽然难度较大、逻辑性较强,但是,只要学生能够熟练掌握编成技巧,不仅能够提高编成效率,还能够使自己更好的投入到C语言课程学习过程中。

2.1单片机C语言编成技巧

在学习C语言编成技巧的过程中,单片机C语言编成技巧已经成为发展的必然趋势,并且编成的技术性越来越高,内部的存储容量也在不断扩大,不管是在代码量、运行速度方面,单片机C语言编成都不落后于汇编语言。但是二者在编成技巧方面,仍旧存在较大的差别,以下是单片机C语言编成技巧:

(1)数据类型的选择

在单片机C语言编成的过程中,学生应充分利用程序存储器资源,为C语言编成提供更多的数据种类。在众多数据类型中,C语言能够识别的只有bit和char。这两种数据类型生成的代码相对较短,相比于bit和char,浮点型、整型数据类型,机器无法识别,如果想要识别这两种数据类型,学生需要借助其它工具,例如,函数以及与之相关的程序等等,此类数据类型生成的代码相对较长。在C语言编成的过程中,从表面分析,部分程序比较简单,但是在实际编成的过程中,却非常复杂,并且生成的代码较长。因此,为最大限度的缩短代码的长度,学生选择数据类型的过程中,应当依据实际情况,选择与之相适应的数据类型。

(2)优化算法

在确定选择何种数据类型过后,学生应优化程序算法,主要优化两个方面,即运行速度和程序代码量,运行速度代表时间的复杂,程序代码量代表空间的复杂,二者是成反比关系。例如,如果空间复杂度变低,时间复杂度就会逐渐增加,因此,学生在优化的过程中,应当依据实际情况,取二者的平均值。在评价二者性能的过程中,通常情况下,由开发人员自己进行评估。代码效率是指:代码从发出、使用以及返回过程中,所花费的时间,在优化时间复杂度方面,学生应当依赖代码执行的具体时间。在计算执行时间的过程中,学生可以通过计时器计算。也可以利用示波器。

2.2数据存储器的分配

在单片机运行的过程中,由于RAM容量相对较小,伴随数据信息的不断增多,要求扩展存储空间,以适应数据信息的增多,因此,这就要求教师应科学、合理的分配存储空间,进而不断提高利用效率。在C语言程序运行的过程中,主要应用存储器的覆盖技术,能够最大限度的节省存储空间。此外,内部寄存器负责参数之间的传递,如果存储器的剩余空间较小,会严重影响程序运行,因此,要求学生应处理好生成语句的长短,以免占据更多存储空间。

3结论

综上所述,通过分析C语言编成技巧在C语言课程教学中的应用,我们能够看出,学好C语言的关键是掌握编成技巧,但是,由于受到多种因素限制,学生并没有完全掌握编成技巧。因此,这就要求教师应转变以往的教学理念,积极引导学生将C语言理论基础转变为实践应用,进而不断提高学生的编成能力。

参考文献

[1] 段煅,刘建波,李丽丽.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护,2010,18(03):259-261.

[2] 李自清,崔玉刚.浅谈C语言编程中的常见错误和解决方法[J].科技信息(科学教研),2012,20(05):12-14.

[3] 王杰,王梦生,张筱雨.浅谈C语言编成技巧在C语言学习中的应用研究[J].电子技术与软件工程,2011,10(8):158-159.

c语言实践编程题 篇9

实验2顺序结构程序设计

二、6.实现两个数的对调:

#include void main(){ int a,b,t;scanf(“%d%d”,&a,&b);printf(“a=%d b=%dn”,a,b);t=a;a=b;b=t;printf(“a=%d b=%d”,a,b);} 7.编写程序

(1)#include #include void main(){ double a,x,y;scanf(“%lf %lf”,&a,&x);y=sin(sqrt(a*x))+log(a+x);printf(“%lfn”,y);}(2)

#include

#include void main(){ double a,x,y;scanf(“%lf %lf”,&a,&x);y=cos(sqrt(a+x))+exp(a*x);printf(“%lfn”,y);}(3)#include #include void main(){ double a,b,c,s,area;scanf(“%lf %lf %lf”,&a,&b,&c);s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));

C语言面试题大13 篇10

struct node

{ int data;

struct node *front,*next;

};

有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除

BOOL DeteleNode(Node *pHeader, DataType Value)

{

if (pHeader == NULL) return;

BOOL bRet = FALSE;

Node *pNode = pHead;

while (pNode != NULL)

{

if (pNode->data == Value)

{

if (pNode->front == NULL)

{

pHeader = pNode->next;

pHeader->front = NULL;

}

else

{

if (pNode->next != NULL)

{

pNode->next->front = pNode->front;

}

pNode->front->next = pNode->next;

}

Node *pNextNode = pNode->next;

delete pNode;

pNode = pNextNode;

bRet = TRUE;

//不要break或return, 删除所有

}

else

{

pNode = pNode->next;

}

}

return bRet;

}

void DE(Node *pHeadA, Node *pHeadB)

{

if (pHeadA == NULL || pHeadB == NULL)

{

return;

}

Node *pNode = pHeadA;

while (pNode != NULL)

{

if (DeteleNode(pHeadB, pNode->data))

{

if (pNode->front == NULL)

{

pHeadA = pNode->next;

pHeadA->front = NULL;

}

else

{

pNode->front->next = pNode->next;

if (pNode->next != NULL)

{

pNode->next->front = pNode->front;

}

}

Node *pNextNode = pNode->next;

delete pNode;

pNode = pNextNode;

}

else

{

pNode = pNode->next;

}

}

}

2. 编程实现:找出两个字符串中最大公共子字符串,如“abccade”,“dgcadde”的最大子串为“cad”

int GetCommon(char *s1, char *s2, char **r1, char **r2)

{

int len1 = strlen(s1);

int len2 = strlen(s2);

int maxlen = 0;

for(int i = 0; i < len1; i++)

{

for(int j = 0; j < len2; j++)

{

if(s1[i] == s2[j])

{

int as = i, bs = j, count = 1;

while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])

count++;

if(count >maxlen)

{

maxlen = count;

*r1 = s1 + i;

*r2 = s2 + j;

}

}

}

}

3. 编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数

char* test3(long num) {

char* buffer = (char*)malloc(11);

buffer[0] = “0”;

buffer[1] = “x”;

buffer[10] = “�”;

char* temp = buffer + 2;

for (int i=0; i < 8; i++) {

temp[i] = (char)(num<<4*i>>28);

temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 16;

temp[i] = temp[i] < 10 ? temp[i] + 48 : temp[i] + 55;

}

return buffer;

}

输入N, 打印 N*N 矩阵

比如 N = 3,打印:

1 2 3

8 9 4

7 6 5

N = 4,打印:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

解答:

1 #define N 15

int s[N][N];

void main

{

int k = 0, i = 0, j = 0;

int a = 1;

for( ; k < (N+1)/2; k++ )

{

while( j < N-k ) s[i][j++] = a++; i++; j--;

while( i < N-k ) s[i++][j] = a++; i--; j--;

while( j >k-1 ) s[i][j--] = a++; i--; j++;

while( i >k ) s[i--][j] = a++; i++; j++;

}

for( i = 0; i < N; i++ )

{

for( j = 0; j < N; j++ )

cout << s[i][j] << “ ”;

cout << endl;

}

}

2 define MAX_N 100

int matrix[MAX_N][MAX_N];

/*

*(x,y):第一个元素的坐标

* start:第一个元素的值

* n:矩阵的大小

*/

void SetMatrix(int x, int y, int start, int n) {

int i, j;

if (n <= 0) //递归结束条件

return;

if (n == 1) { //矩阵大小为1时

matrix[x][y] = start;

return;

}

for (i = x; i < x + n-1; i++) //矩阵上部

matrix[y][i] = start++;

for (j = y; j < y + n-1; j++) //右部

matrix[j][x+n-1] = start++;

for (i = x+n-1; i >x; i--) //底部

matrix[y+n-1][i] = start++;

for (j = y+n-1; j >y; j--) //左部

matrix[j][x] = start++;

SetMatrix(x+1, y+1, start, n-2); //递归

}

void main() {

int i, j;

int n;

scanf(“%d”, &n);

SetMatrix(0, 0, 1, n);

//打印螺旋矩阵

for(i = 0; i < n; i++) {

for (j = 0; j < n; j++)

printf(“%4d”, matrix[i][j]);

printf(“”);

}

}

斐波拉契数列递归实现的方法如下:

int Funct( int n )

{

if(n==0) return 1;

if(n==1) return 1;

retrurn Funct(n-1) + Funct(n-2);

}

请问,如何不使用递归,来实现上述函数?

请教各位高手!

解答:int Funct( int n ) // n 为非负整数

{

int a=0;

int b=1;

int c;

if(n==0) c=1;

else if(n==1) c=1;

else for(int i=2;i<=n;i++) //应该n从2开始算起

{

c=a+b;

a=b;

b=c;

}

return c;

}

解答:

现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位,

C语言面试题大汇总13

100 的二进制是 001 100 100

低位在前 高位在后

001----s3

100----s2

100----s1

所以结果应该是 1

如果先申明的在低位则:

001----s1

100----s2

100----s3

结果是 4

1、原题跟little-endian,big-endian没有关系

2、原题跟位域的存储空间分配有关,到底是从低字节分配还是从高字节分配,从Dev C++和VC7.1上看,都是从低字节开始分配,并且连续分配,中间不空,不像谭的书那样会留空位

3、原题跟编译器有关,编译器在未用堆栈空间的默认值分配上有所不同,Dev C++未用空间分配为

01110111b,VC7.1下为11001100b,所以在Dev C++下的结果为5,在VC7.1下为1。

注:PC一般采用little-endian,即高高低低,但在网络传输上,一般采用big-endian,即高低低高,华为是做网络的,所以可能考虑big-endian模式,这样输出结果可能为4

判断一个字符串是不是回文

int IsReverseStr(char *aStr)

{

int i,j;

int found=1;

if(aStr==NULL)

return -1;

j=strlen(aStr);

for(i=0;i

if(*(aStr+i)!=*(aStr+j-i-1))

{

found=0;

break;

}

return found;

}

Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

数组实现:

#include

#include

int Josephu(int n, int m)

{

int flag, i, j = 0;

int *arr = (int *)malloc(n * sizeof(int));

for (i = 0; i < n; ++i)

arr[i] = 1;

for (i = 1; i < n; ++i)

{

flag = 0;

while (flag < m)

{

if (j == n)

j = 0;

if (arr[j])

++flag;

++j;

}

arr[j - 1] = 0;

printf(“第%4d个出局的人是:%4d号”, i, j);

}

free(arr);

return j;

}

int main()

{

int n, m;

scanf(“%d%d”, &n, &m);

printf(“最后胜利的是%d号!”, Josephu(n, m));

system(“pause”);

return 0;

}

链表实现:

#include

#include

typedef struct Node

{

int index;

struct Node *next;

}JosephuNode;

int Josephu(int n, int m)

{

int i, j;

JosephuNode *head, *tail;

head = tail = (JosephuNode *)malloc(sizeof(JosephuNode));

for (i = 1; i < n; ++i)

{

tail->index = i;

tail->next = (JosephuNode *)malloc(sizeof(JosephuNode));

tail = tail->next;

}

tail->index = i;

tail->next = head;

for (i = 1; tail != head; ++i)

{

for (j = 1; j < m; ++j)

{

tail = head;

head = head->next;

}

tail->next = head->next;

printf(“第%4d个出局的人是:%4d号”, i, head->index);

free(head);

head = tail->next;

}

i = head->index;

free(head);

return i;

}

int main()

{

int n, m;

scanf(“%d%d”, &n, &m);

printf(“最后胜利的是%d号!”, Josephu(n, m));

system(“pause”);

return 0;

}

已知strcpy函数的原型是:

char * strcpy(char * strDest,const char * strSrc);

1.不调用库函数,实现strcpy函数。

2.解释为什么要返回char *。

解说:

1.strcpy的实现代码

char * strcpy(char * strDest,const char * strSrc)

{

if ((strDest==NULL)||(strSrc==NULL)) file://[/1]

throw “Invalid argument(s)”; //[2]

char * strDestCopy=strDest; file://[/3]

while ((*strDest++=*strSrc++)!=“�”); file://[/4]

return strDestCopy;

}

错误的做法:

[1]

(A)不检查指针的有效性,说明答题者不注重代码的健壮性。

(B) 检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false 三个关键字以提供更安全的条件表达式。

(C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

[2]

(A)return new string(“Invalid argument(s)”);,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。

(B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。

[3]

(A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。

[4]

(A)循环写成while (*strDest++=*strSrc++);,[1](B)。

上一篇:幼儿园小朋友六一儿童节祝福语下一篇:2024年度防震减灾工作总结