c经典编程例题

2024-04-14

c经典编程例题(精选8篇)

篇1:c经典编程例题

1、加法练习程序:由用户通过键盘输入加数和被加数,程序显示加法式子,用户通过键盘作答后,程序给出正确与错误提示信息。要求:利用C的选择语句if条件语句或switch开关语句,键盘输入数据前,程序会出被输入数据的信息提示。#include void main(){ int a,b,c;printf(“please put an addend:n”);scanf(“%d”,&a);printf(“please put an augend:n”);scanf(“%d”,&b);printf(“please answer the question:a+b=?”);scanf(“%d”,&c);if(a+b==c)printf(“very good!”);else printf(“wrong!”);}

个人感觉这个程序最不好的地方是,不管回答正确还是回答错误,程都会立即结束,所以我用了do„while实现一个回答错误之后获得再次回答机会的循环,则程序修改如下: #include void main(){ int a,b,c;printf(“请输入一个加数:n”);scanf(“%d”,&a);printf(“请输入一个被加数:n”);scanf(“%d”,&b);do { printf(“请回答:a+b=”);scanf(“%d”,&c);if(a+b!=c)printf(“请再想一想n”);} while(a+b==c)printf(“回答正确!”);}

2、判闰年程序:判断某一年是否闰年? 要求:程序首先提示用户从键盘输入4位数年份,程序能显示“XXXX年是闰年”或“XXXX年不闰年”的输出信息。

算法:year 是闰年,即year能被4整除但不能被100整除,或 year 能被 400 整除。其对应的C逻辑表达式为:(year % 4 = = 0 && year % 100!= 0)||(year % 400 = = 0)或:(!(year % 4)&& year % 100)||!(year % 400)程序中可设置1个变量leap来代表是否闰年的信息,闰年:leap=1;不闰年:leap=0。#include void main()int year;printf(“请输入4位数年份:”);scanf(“%d”,&year);if(year%4==0&&year%100!=0||year%400==0)//闰年就是能被4整除但不能被100整除及能被400整除的 printf(“%d是闰年”,year); else printf(“%d不是闰年”,year);}

3、三角形九九表程序:要求选择C实现循环的4种方法(if+go, for语句,while语句,do…while语句)中的一种,比如,最好选择for语句来实现如下形式的“九九表”输出。

#include void main()int a,b,c;for(a=1;a<=9;a++)//纵列表数每循环完一次换行 {for(b=1;b<=9;b++)if(b<=a)printf(“ %d”,a*b);printf(“n”);}}

4、平面等腰三角形: 要求利用C的for循环实现如下平面图形输出。

如图,等腰三角形有6层,则 #include viod main()int a,b,c;//a,b,c分别是层数变量,变量,*变量 for(a=1;a<=6;a++){for(b=6-a;b>=1;b--)printf(“ ”);for(c=1;c<=2*a-1;c++)printf(“*”);printf(“n”);}}

5、平面倒立等腰三角形: 要求利用C的for循环实现如下平面图形输出。

#include viod main()int a,b,c;//a,b,c分别是层数变量,变量,*变量 for(a=6;a>=1;a--){for(b=6-a;b>=1;b++)printf(“ ”);for(c=11;c<=2*a-1;c--)printf(“*”)printf(“n”);}}

6、判素数:要求由用户从键盘输入任一正整数m, 程序输出m是否素数的信息。#include viod main()int m,n;printf(“请输入任一正整数m:”);scanf(“%d”,&m);If(m==0||m==1);printf(“%d不是素数”,m);//0和1既不是素数也不是合数 for(n=2;n

7、计算:1!+2!+3!+...+9!

#include void main(){ int i;long p=1;double s=0.0;for(i=1;i<=9;i++){p*=i;S+=p;} printf(“1!+2!+3!+„+9!=%fn”,s);}

8、计算:1!+3!+5!+...+15!

#include void main()int i;long p=1;double s=0.0;for(i=1;i<=15;i++){p*=i;if(i%2!=0)s+=p;} printf(“1!+3!+5!+„15!=%tn”,s);}

9、计算:2!+4!+6!+...+16!

#include void main()int i;long p=1;double s=0.0;for(i=1;i<=16;i++){p*=i;if(i%2==0)s=s+p;} printf(“2!+4!+6!+„16!=%tn”,s);}

10、利用“比较交换法”对由用户从键盘输入的任意10个整数升序排序。要求:利用C的数组和循环,程序能分别输出排序前后的数组。#include void main(){ int i,s,a[10],t;//数组下标变量i printf(“请输入10个整数:n”);for(i=0;i<=9;i++)scanf(“%d”,&a[i]);//将10个整数分别存入该数组的下标0到9这10个位置中去 for(i=0;i<9;i++){for(s=i+1;s<=9;s++)//a[s]为a[i]的后一位 if(a[i]>a[s]){t=a[i];a[i]=a[s];a[s]=t;}//将数组中的数两两逐个比较换位,实现升序 printf(“排序后的数组为:n”);for(i=0;i<=9;i++)printf(“%d ”,a[i]);}

11、统计:由用户从键盘输入任意10个数,统计其中最大数,最小数及平均值。

#include void main(){ int i,s,a[10],t,sum;double n;printf(“输入任意10个整数:n”);for(i=0;i<=9;i++)scanf(“%d ”,&a[i]);for(i=0;i<=9;i++)printf(“%d ”,a[i]);for(i=0;i<=9;i++){for(s=i+1;s<9;s++)if(a[i]>a[s]){t=a[i];a[i]=a[s];a[s]=t;}//实现10数升序排列 for(i=0,1<=9,i++)sum+=a[i];n=sum/10;printf(“10个数的最大是:%dn 10个数的最小是:%dn 10个数的平均是:%tn”,a[9],a[0],n);}

12、由二维数组实现矩阵:定义数组int a[5][4];实现5行4列矩阵输出。要求:矩阵元按数组的逻辑顺序依次是1~20间的自然数。提示:用双重for循环与二维数组的按行输出。#include void main()int i,j,s=1;int a[5][4];for(i=0;i<=4;i++){for(j=0;j<=3;j++){for(a[j]=s;s<=20;s++)printf(“ ”);printf(“%4d”,a[i][j]);} printf(“n”);}

篇2:c经典编程例题

题目01:在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同的单词。

[cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

// 用数组定义一个字符串

char array[50] = “zha junju zhamengjun z mengjun”;

char *str = array;// 定义指针变量str,指向数组array

int len = 0;// 定义变量len,用于计数

int max = 0;// 定义变量max,存放最长单词的长度

char *p = 0;// 定义指针变量p,指向最长单词的首字符

10.11.// 判断指针当前指向的字符是不是'

12.while(*str!= ')13.{

14.if(*str!= )// 判断字符是不是空格 15.{

16.len++;// 计数加1 17.18.// 判断最大长度跟len长度的大小

19.if(max < len){

20.max = len;// 如果max小于len,将len赋值给max

21.p = str1];

46.} 47.else

48.{

49.sumDaysOfMonth += pingYear[monthDay;// 定义整型变量days,存储一个月内相隔的天数

54.int sumDays = 0;// 定义整型变量sumDays,存储两个时间点相隔的总天数

55.56.// 得到两个时间点相隔的总天数

57.sumDays = sumDaysOfYear + sumDaysOfMonth + days;58.59.printf(“两个时间点相隔%d天n”, sumDays);60.61.// 根据相隔的天数,判断小明遇到的人

62.if((sumDays % 2 == 0)&&(sumDays % 3 == 0))63.{

64.printf(“小明既结识了帅哥又结识了美女!n”);65.}

66.else if(sumDays % 2 == 0)67.{

68.printf(“小明结识了帅哥!n”);69.}

70.else if(sumDays % 3 == 0)71.{

72.printf(“小明结识了美女!n”);73.} 74.else

75.{

76.printf(“小明没有结识帅哥和美女n”);77.} 78.}

心得体会:(1)利用for循环遍历,if条件来判断是平年还是闰年,求出相隔年数的累加的天数(2)同理,利用第一步的方法,求出相隔月数的累加的天数,只是要注意每月的天数,根据平年和闰年的不同分别保存在两个不同的数组中,以便利于累加

(3)将输入的日减1,计算出当月相隔的天数,最后求出两个日期相隔的总天数。(4)根据总天数取余2和3,判断出小明当天结识的是美女还是帅哥。

题目05:提示用户输入一个正整数n,利用while循环计算并输出:1-2+3-4+5-6+7…+n的和。

[cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

// 1.定义变量存储用户输入的整数

int n = 0;

// 2.判断n是否为正整数

while(n <= 0){

// 2.1 提示输入

printf(“输入一个正整数:n”);

10.11.// 2.2 让用户输入

12.scanf(“%d”, &n);13.} 14.15.// 3.计算阶乘

16.int sum = 0;// 存储计算结果

17.int current = 0;// 当前要累加的数值

18.while(current < n){ 19.current++;20.21.// 如果是偶数,就减

22.if(current % 2 == 0){ 23.sum-= current;24.} else { // 如果是奇数,就加

25.sum += current;26.} 27.} 28.29.// 4.输出结果 30.printf(“%dn”, sum);31.32.return 0;33.}

心得体会:

(1)确保从键盘上输入的是一个整数(用while来判断);(2)用while循环来遍历从1到n的值;

(3)通过奇偶性判断所要累加数值的正负性,奇数就累加,偶数就累减。

题目06:提示用户输入一个正整数n,计算并输出n的阶乘结果:1*2*3*…*n。

[cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

// 1.定义变量存储用户输入的整数

int n = 0;

// 2.判断n是否为正整数

while(n <= 0){

// 2.1 提示输入

printf(“输入一个正整数:n”);

10.11.// 2.2 让用户输入

12.scanf(“%d”, &n);13.} 14.15.// 3.计算阶乘

16.int result = 1;// 存储计算结果

17.int current = 1;// 当前的乘数

18.while(current <= n){

19.result *= current;// 累乘每次的乘数

20.current++;// 乘完一次就++

21.} 22.23.// 4.输出阶乘结果

24.printf(“%d!= %dn”, n, result);25.26.return 0;27.}

心得体会:

(1)可以利用for循环或者while循环进行遍历,利用累乘即可求出值。(2)还可以利用递归来做,更简单。

题目07:编写一个函数,判断某个字符串是否为回文。回文就是从左边开始读 和 从右边开始读 都是一样的,比如“abcba” [cpp] view plain copy print?

1.2.3.4.5.6.7.8.9.int main(){

printf(“%dn”, isHuiwen(“a”));

return 0;}

/*

返回1代表是回文

返回0代表不是回文

10.*/ 11.int isHuiwen(char *str)

12.{

13.// 1.定义一个指向变量left指向字符串的首字符

14.char *left = str;

15.// 2.定义一个指向变量right指向字符串的末字符

16.char *right = str + strlen(str)1)+ count(n);// 求出每一个阶乘的累加和

58.} 59.60.// 定义和求出一个累加和

61.int count(int n)

62.{

63.if(n == 1)64.return 1;

65.return count(n1;22.23.// 如果左边元素的下标 < 右边元素的下标

24.while(left < right)25.{

26.// 利用中间变量交换两个元素的值

27.int temp = array[left];28.array[left] = array[right];29.array[right] = temp;30.31.// 交换一次后,左边元素下标增加,右边元素下标减小

32.33.left++;34.right--;35.} 36.}

心得体会:

(1)首先要明白一点,为什么不能通过sizeof(array)/ sizeof(int)来求出数组元素的个数?因为当数组作为参数传递的时候,函数的参数array实际上当做变量来存储传来的数组首元素的地址。而每一个指针变量占用8个字节。

(2)分别拿出数组首元素和数组尾元素,然后利用中间变量交换两个元素的值。(3)利用while循环,遍历数组元素,并使left< right保证循环到中间即可,否则每个元素又进行一次交换,结果值没有改变。

篇3:汇编和C混合编程的研究

关键词:C语言,汇编语言,混合编程,单片机

1. 引言

汇编语言面向底层,对单片机硬件操作方便,精确度和运行效率都很高,但是可维护性、可读性和可移植性都很差。C语言简洁、紧凑、使用灵活,可读性、可移植性好,编程效率较高[1],但运行效率和精度不如汇编语言。要编写出性能优良的程序,就要充分利用汇编语言和C语言的优点。

2. 单片机程序语言的特点

2.1 汇编语言的特点

在单片机应用系统设计中,过去主要用汇编语言开发程序。汇编语言的运算效率高、占用存储空间小、实时性强、执行速度快,能直接管理和控制存储器及硬件接口,充分发挥硬件的作用,但是可维护性、可读性和可移植性都很差。

2.2 C语言的特点

C语言生成的目标代码质量高、效率高,可直接对计算机硬件进行操作,开发周期短,运算符和数据结构丰富,具有现代化语言的各种数据结构和良好的程序结构,允许直接访问物理地址,能够进行位操作,实现了汇编语言的大部分功能,适用于各种应用程序设计。但对C语言进行汇编生成的代码较长,对硬件不及汇编语言方便,效率不及汇编语言高,编写时序程序精度不高,也不能自动检查数组的边界,各种运算符和优先级别太多。

2.3 汇编和C混合编程的特点

C语言和汇编语言混合编程,开发的程序集中了C和汇编的优势。其主要特点有运行速度快,占用空间少,可移植性好,开发效率高,编写时序精度高等。用汇编语言编写与硬件底层操作有关的程序,用C语言编写与硬件无关的运算程序,可充分发挥两种语言的长处,提高开发效率。

3. 混合编程的解决方案

混合编程的主体软件设计有三种方案:一是C51调用汇编程序[2],二是C51嵌入汇编程序,三是汇编程序调用C程序[3]。这三种方案中,较常用的是第二种。当汇编语言较短时,C51调用汇编程序就显得比较繁琐。C提供了嵌入汇编的功能,而嵌入式汇编简单明快的方法允许直接将汇编语言代码放入C语言程序中,汇编语言代码的高速性可以大大改善程序的性能,同时也避免了C语言与汇编语言的接口固有的复杂性。使用嵌入式汇编,程序设计人员可以在C语言程序按自己的意愿加入汇编语句,而不必考虑两者间的接口。

4. 汇编和C的相互调用

汇编和C的相互调用有如下三种情况:

(1)汇编程序中访问C程序的变量和函数

在汇编程序中,用_XX就可以访问C中的变量XX,访问数组时可以用_XX+偏移量访问。在汇编程序调用C函数时,如果没有参数传递,直接用_funcname就可以;如果有参数传递,则函数中最左边的一个参数由寄存器A给出,其它的参数按顺序由堆栈给出,返回值是返回到A寄存器或者由A寄存器给出的地址。但为了让汇编语言能访问到C语言定义的变量和函数,他们必须加extern前缀声明为外部变量。

(2)C程序中访问汇编程序中的变量

要在C程序中访问汇编程序中的变量,汇编程序中的变量名必须以下划线为首字符,并用GLOBAL使之成为全局变量。要在C程序中调用汇编程序中的过程,则过程名必须以下划线为首字符,且要根据C程序编译时使用的模式是stack-based MODEL还是register argument MODEL来正确地编写该过程,使其能正确地取得调用参数。

(3)在线汇编

在C程序中直接插入asm(“***”)即可。在线汇编提供了直接读写硬件的能力,但编译器并不检查和分析在线汇编语言,插入在线汇编语言会改变汇编环境或可能改变C变量的值将可能导致严重的错误。

5. C51嵌入汇编的实现

C51实现嵌入汇编有三种方法:

(1)直接在C主程序中插入__asm{},在每条汇编指令之前加__asm关键字的语句分隔符,并且可以将多条汇编指令放在同一行,如:__asm mov AH,9__asm mov dx,c__asm int 33

(2)在C文件中需要嵌入汇编代码的地方加上如下代码[5]:

(3)在C程序中定义的函数,编译后在函数名前带上一个下划线,如extern void func()变成_func。

6. 混合编程中需要注意的问题

实现汇编和C语言接口的过程需要解决参数的传递、寄存器的使用、存储模式的确认、变量和函数的相互调用、子程序的返回值五个问题;在建立两者的接口时必须符合三方面的理论约定:标识符命名约定、寄存器使用约定、函数调用约定。

C调用汇编有两种方法,一是直接在C中插入汇编语句,二是编写汇编子程序由C调用。方法一适用只需一两句汇编就能完成的程序;方法二较通用,如用汇编编写延时子程序可以实现精确延时。使用方法二的注意事项有以下几点:

(1)函数声明:C中在函数前加extern声明此函数为外部函数,在汇编中要声明函数名为全局变量,如

(2)参数传递:一般用寄存器传递参数,如果返回结果需要多个字节表示,最好用SRAM保存,即在汇编中将结果存入SRAM,在C中读取相应的地址。

(3)保存寄存器:Reserved register寄存器在调用子程序时,内容是不能被改变的,如果汇编子程序需用该寄存器,就要在程序入口时先将它们入栈,返回时再出栈。

(4)变量和函数接口问题:C定义的变量编译为.asm后,就被放进.bss区,此时变量名的前面都带了下划线,C中定义的函数编译后在函数名前也带了下划线。例如:extern int num就会变成.bss_num,1。

(5)汇编和C接口中寻址方式的改变问题

在C语言中对局部变量的建立和访问是通过堆栈实现,寻址是通过堆栈寄存器SP实现的。而汇编语言为了精简程序代码,TI在直接寻址方式中,地址的低7位直接包含在指令中,这低7位所能寻址的具体位置可由DP寄存器或SP寄存器决定。具体实现可通过设置ST1寄存器的CPL位实现,CPL=0,DP寻址,CPL=1,SP寻址。在DP寻址的时候,由DP提供高9位地址,与低7位组成16位地址;在SP寻址的时候,16位地址是由SP(16位)与低7位直接相加得来。

由于C语言的环境决定局部变量的寻址必须通过SP寄存器实现,而汇编语言影响SP寄存器,则在混合编程时可通过在汇编环境中使用DP方式寻址避免二者的干扰,编程中只要注意对CPL位正确设置即可。

7. 基于C和汇编混合编程进行单片机电路的实现

采用Keil u Vision3软件对C和汇编混合编程的程序进行设计和编译,主程序如下:

经过Keil编译无误后得到HEX目标文件,把该目标文件加载到Proteus仿真电路的单片机系统中进行仿真,仿真结果如图1所示。实践表明,基于汇编语言和C混合编程的单片机系统运行效果良好。

8. 结束语

对汇编语言和C语言进行混合编程,既能发挥C的编写效率高、容易维护和可移植性好等优点,也能利用汇编语言执行速度快、控制精度高的优势,提高了单片机系统的性能。

参考文献

[1]徐爱钧.单片机高级语言C51应用程序设计[M].北京:电子工业出版社,1998.

[2]徐爱钧.单片机高级语言C51应用程序设计[M].北京:电子工业出版社,1998.

[3]严天峰,王耀琦.KEIL C51集成开发环境C和汇编语言的相互调用[J].兰州交通大学学报,2008,(1).

[4]戴佳.51单片机C语言应用程序设计实例精讲[M].北京:电子工业出版社,2006.

[5]肖献保.Keil C51中调用汇编语言的研究与实现[J].科技资讯,2007,(31).

[6]张道德,李奕,王海涛.C51与ASM混合编程技术研究[J].湖北工业大学学报,2005,20(5):69-71.

[7]沈洋,孙伟.单片机C51与汇编语言的混合调用[J].电脑编程技巧与维护,2009(S1):87-88.

篇4:C语言编程教学方法探讨

关键词:C语言;C语言编程;教学

中图分类号:G642 文献标识码:A文章编号:1007-9599 (2011) 09-0000-01

C Language Programming Teaching Method

Wang Tiaoshan

(Huizhou Agricultural School,Huizhou516023,China)

Abstract:With advances in computer development,C language by the majority of computer workers attention and recognition.To this end,the national colleges and universities have set up a C language program.Introduction to C programming language,but easy,however,to enable students to fully grasp the programming skills,it makes the process of teaching is very difficult,following the author's teaching on the C language problems and solutions in more detail.

Keywords:C language;C language programming;Teaching

一、前言

21世纪,人们自然对未来有许多美好的愿望和设想。现代科学技术的飞速发展,改变了世界,也改变了人们的生活。作为新世纪的大学生,应当站在时代发展的前列,掌握现代科学技术知识,完善自己的知识结构和能力结构,以适应社会的发展要求。新世纪需要具有丰富的现代科学知识,能够独立解决面临的任务,充满活力,有创新意识的新型人才。

掌握计算机知识和应用无疑是培养新型人才的一个重要环节。计算机既是现代科学技术的结晶,又是大众化的工具。学习计算机知识不仅是为了掌握一种技能,更重要的是:它能启发人们对先进科学的向往,启发创新意识,推动新知识的学习,培养自学能力,锻炼动手实践的本领。因此,C语言教学就成为高等学校素质教育中极为重要的一部分。

二、C语言教学过程中出现的问题

(一)教学大众化,缺乏层次教学能力。在C语言的教学过程中,老师和学生的互动很少,老师只是一味的完成自己课前预定的教学任务,达不到针对不同层次水平的学生完成教学的目的。而学生在课堂上由于学习水平分级较大,会造成两极分化的严重性,会者不听,不会者难以理解的问题。

(二)老师缺乏情感投入,学生烦躁厌学。在C语言教学管理上,离不开教育者得感情投入。而在现阶段看来,很多老师在这方面做的还不够,错误的认为学生在课堂上可以做到自我管理,所以在教学技巧和方法上就缺乏情趣性,使得学生在学习过程中产生厌学的情绪,不利于进一步深入的学习。

(三)忽视了课堂上学生问题的存在。如果课堂上存在问题,不仅会影响课堂教育管理和其他学生学习的正常进行,严重的更会对学生的成长不利。其实课堂教育管理者要重视这一问题,必须调控课堂学习有效的进展,要坚决杜绝老师在课堂上对出现的问题忽视不见的情况发生。

(四)学生在学习C语言时出现的误区。随着C语言编程教学过程的不断深入,需要联想思考和记忆的相关内容难度会逐渐增大,这样就使得学生有时会陷入没有意义的算法中,这种只见树木不见森林的感觉,会使学生在学习过程中渐渐失去兴趣,调动不起学习的积极性,觉得学习C语言的学习是非常枯燥的。就算是在上机练习练习的时候也感到索然误区,一直照着课本上的例题,从头到尾输入计算机,得出与书上结果一致的答案就算上机通过,并没有真正的掌握语句的真正意义。就算有些学习认真的学生能够掌握课本上的内容,但是一旦要自己独立完成编程题的时候却无从下手。这样的结果就导致了学生在学习C语言编程课程的时候,无法做到知识的融会贯通和举一反三,就不能形成一个全面的C语言编程的知识体系。这对C语言编程教学的初衷是相违背的。

三、C语言编程教学方法

(一)创建以学生为本的多层次互动课堂管理模式。针对学习水平不同的学生,进行不同难度的作业分布,并且老师和同学不僅在课堂上及时交流,还要在课下沟通交流学习方法和技巧。完善C语言上机实践课程,通过增强学生的动手能力,促进其对课本知识的掌握和理论的实际运用。

(二)提高老师教学质量和素质水平。老师作为课堂管理模式的核心,其本身的教学质量和素质水平对于课堂的管理策略有着决定性的影响,正确的认识能促进学生在学习中的积极性,而错误的认识则会对学生的积极心起到负面影响。此外,在课堂管理中老师也要过多的投入感情因素,进而促进和谐课堂的建立,和学生的感情到达共鸣,做到以德服人,以理育人。

(三)改善课堂管理氛围。课堂管理的质量水平主要体现在教学目标与学生发展相符合。要达成既定的课堂管理的目标,就必须创造一种课堂新环境,焕发课堂生机与活力。建立秩序良好的课堂管理模式,首先保证课堂实体环境的舒适程度。其次,建立良好的师生人际交往关系,良好的人际关系能拉近师生关系,推动课堂和谐管理。也为学生减轻心理压力构建心灵的桥梁,是学生积极开朗,乐于好学。

(四)保证教学内容的新颖。根据新世纪的需要,要确保教学内容的新颖,以符合计算机科学技术的发展和C语言教学改革的要求。不仅要保留C语言教材中,通过实践考验,受到广泛认可的优秀教材。还要积极探索今年来迅速得到推广应用的计算机新技术,不断更新补充新的教学内容。

(五)采用多样化的形式。除了文字教学的基本形式外,还有配有习题解答和上机指导。并充分利用现代化教学方式,采用制作的电子出版物进行课堂教学,课下有利学生自学。

四、总结

如果要让学生能上好C语言编程,教育者就必须在教学的过程中摈弃传统的教学方法,既要让学生在学习过程中掌握概念,又要动手编程,还有进行上机的调试运行,衡量课程的好坏,不是看你知不知道,而是会不会干,考核的方法也不能用判断题和选择题,而应该把重点放在编制程序和调试程序上。在充分的发挥教师在教学过程的主导作用前提下,调动起学生的学习积极性、主动性和创造性,强烈激发学习兴趣,正确引导学生独立思考,融会贯通地掌握系统的C语言编程知识,使学生主动地学习知识,满足他们的求知欲望,教学管理真只有做到这样,才能取得良好的教学效果。

参考文献:

[1]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,2004

[2]刘昕.论启发式教学[EB/OL].2007,5:13

http://smxx2.zjhyedu.cn/ty/ShowArticle.asp.

篇5:一个C/C++编程面试题

编写一个程序完成以下功能:

- 从磁盘上读入一个文件,这个文件可能是一个HTML格式的文件或者其他格式的

- parse此文件中可能包含的RSS链接 (可能0或多个),

- 列出找到的RSS链接

注意:请不要使用任何Parse HTML, XML, RSS相关的`库,直接写C/C++代码来处理读入的内容,

请注意代码的风格,文件的分布安排、文件名、变量、样式等的命名、页面的美观等,这些都将影响您的得分。

提示:

1、注意各种异常情况的处理。

篇6:C编程笔试题

1、头文件中的 ifndef/define/endif 干什么用?

2、#include 和 #include “filename.h” 有什么区别?

3、const 有什么用途?(请至少说明两种)

4、在C 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

5、请简述以下两个for循环的优缺点

// 第一个

for (i=0; i

{

if (condition)

DoSomething;

else

DoOtherthing;

}

// 第二个

if (condition)

{

for (i=0; i

DoSomething;

}

else

{

for (i=0; i

DoOtherthing;

}

优点:

缺点:

优点:

篇7:c经典编程例题

本试题仅用于考查C++/C程序员的基本编程技能,

内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。

考试成绩能反映出考生的.编程质量以及对C++/C的理解程度,

但不能反映考生的智力和软件开发能力。

笔试时间90分钟。请考生认真答题,切勿轻视。

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。

(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。

例如 int 变量 n 与“零值”比较的 if 语句为:

if ( n == 0 )

if ( n != 0 )

以此类推。

请写出 BOOL flag 与“零值”比较的 if 语句:

请写出 float x 与“零值”比较的 if 语句:

请写出 char *p 与“零值”比较的 if 语句:

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

char str[] = “Hello” ;

char *p = str ;int

n = 10;

请计算

sizeof (str ) =

sizeof ( p ) =

sizeof ( n ) =

void Func ( char str[100])

{请计算 sizeof( str ) = }

void *p = malloc( 100 );

请计算sizeof ( p ) =

三、简答题(25分)

1、头文件中的 ifndef/define/endif 干什么用?

2、#include 和

#include “filename.h” 有什么区别?

3、const 有什么用途?(请至少说明两种)

4、在C++ 程序中调用被 C编译器编译后的函数,

为什么要加 extern “C”声明?

5、请简述以下两个for循环的优缺点

// 第一个for (i=0; i

{if (condition)

DoSomething;

else

DoOtherthing();}

优点:缺点:

// 第二个if (condition)

{for (i=0; i

DoSomething();}

else{

for (i=0; i

优点:缺点:

四、有关内存的思考题(20分)

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;GetMemory(str);

strcpy(str, “hello world”);

printf(str);

}请问运行Test函数会有什么样的结果?答:

char *GetMemory(void)

{

char p[] = “hello world”;

return p;

}

void Test(void)

{

char *str = NULL;

篇8:基于Linux的C编程开发

二十一世纪以来, 随着Linux的不断普及, 如何开发基于Linux的各种应用成为Linux的研究热点之一。而C语言是计算机世界最普遍、最常用的程序设计语言, 它既具有汇编语言的特点, 又具有高级语言的特点, 可在不同的软硬件平台上运行, 具有较强的移植性和通用性。因此, 如何使用C语言在Linux系统下开发应用, 成为当今重要的研究课题。下面, 就对这一课题进行详细阐述。

2 Linux特点

Linux诞生于1991年, 是一款免费开放、自由传播的Unix操作系统。它具有以下特征:

第一, 免费开源。Linux是开源操作系统之一, 通过Internet或光盘等免费途径可获得其源码, 并可以根据用户的需要修改其源码。

第二, 多用户。多用户是指Linux的系统资源可被不同的用户各自拥有并使用。在Linux中, 各个用户对己方资源 (如文件、设备等) 有着特定的权限。在一个Linux上不仅可以有很多的用户, 还可以让这些用户同时登录系统并协同工作。用户可以根据自己的需求调整各自预设的工作环境:例如, 个人主目录和桌面设置等。并且, Linux通过密码保护用户账号, 可以实现对用户应用和数据的访问控制。

第三, 多任务。多任务是现代计算机最重要的特点之一。它是指计算机可以同时执行多个程序, 而且各个程序的运行相互独立。Linux调度每个进程 (包括用户进程和系统进程) 平等地使用CPU。由于CPU速度非常快, 于是这些进程看上去好像在并行运行。

第四, 完全遵循POSIX规范。POSIX, 可移植的操作系统接口 (Portable Operating System Interface) , 定义了操作系统为应用程序提供的接口标准。因此, 在一个兼容POSIX标准的操作系统上编写的应用程序, 可以在任何其它的POSIX操作系统上编译和执行。

第五, 支持大多数硬件处理器。Linux可以运行在不同的处理器上, 例如Intel x86、MIPS、ARM、SPARC等处理器。并且, Linux 2.4以上版本的内核已经能够完全支持Intel 64位芯片架构。同时, 它还支持多处理器技术。

自Linux诞生以来, 它存在着许多不同的Linux版本, 如Debian、Red Hat、Slackware等。但它们都使用了Linux内核, 可安装在各种类型的硬件设备 (如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机) 等, 覆盖从嵌入式系统、PC到服务器的各个计算机领域。

3 C语言特点

C语言是一门跨平台的通用计算机编程语言, 其目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。二十世纪八十年代, 为免于各个厂商使用的C语言的语法差异, 美国国家标准协会制定了一套C语言语法完整的国际标准, 称为ANSI C, 被大多数编译器所支持。至今, 已有C89、C99和C11等版本, 其中, C11于2011年制订, 是C语言最新的国际标准。

C语言具有以下特点:

第一, C语言是一个有结构化程序设计、具有变量作用域以及递归功能的过程式语言。

第二, C语言传递参数可以是以值传递, 也可以传递指针。

第三, C语言不同的变量类型可以用结构体组合在一起。

第四, C语言只有32个保留字, 使变量、函数命名有更多弹性。

第五, C语言部分的变量类型可以转换, 例如整型和字符型变量。

第六, C语言通过指针可以容易的对存储器进行低级控制。

第七, 编译预处理使C语言的编译更具有弹性。

综上所述, C语言功能强大, 它不仅可用于编写常用的应用软件, 而且也可用于系统软件的编程。尽管C语言提供许多低级处理的功能, 但它仍保持良好跨平台的特性, 以一个标准规格写出的C语言程序可在大多数硬件平台上进行编译, 甚至包含一些嵌入式系统和服务器等。尤其对于从事Linux编程开发的人而言, C语言是帮助其简单高效地完成工作的最佳工具。

4 基于Linux的C语言开发过程及开发工具

基于Linux的C语言开发过程, 大致分为编辑、编译和调试等三步。其中, 主要用到的开发工具有vi、gedit、EMACS、gcc和gdb等。

4.1 编辑

在Linux下, 编写C语言源程序, 可以使用文本编辑器, 例如, vi、gedit和EMACS等。

vi是所有Unix及Linux系统下标准的编辑器。vi的工作模式有三种:命令模式、插入模式和底行模式。在命令模式下, 能够对屏幕光标的移动进行控制, 对字符、字或行的删除, 以及移动复制某区段的操作, 并且要进入其他两个工作模式时, 需要在命令模式下才能进入;在插入模式下, 文字输入只有在插入模式下才能够进行, 按ESC键可回到命令模式;在底行模式下, 能够对文件进行保存或退出vi, 同时也能够设置编辑环境, 如寻找字符串、列出行号。vi的强大不逊色于任何最新的文本编辑器, 但对于初次使用者来说, 需要花费一定时间掌握。

gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。它使用GTK+编写而成, 因此它十分的简单易用, 有良好的语法高亮, 对中文支持很好, 支持包括gb2312、gbk在内的多种字符编码。

EMACS, 即Editor MACro S (编辑器宏) 的缩写, 是一款著名的文本编辑器和集成开发环境。它最初由Richard Stallman于1975年在MIT和Guy Steele共同完成。自诞生以来, EMACS演化出了众多分支, 其中使用最广泛的两种是:1984年由Richard Stallman发起并由他维护至今的GNU EMACS, 以及1991年发起的XEMACS。XEMACS是GNU EMACS的分支, 至今仍保持着相当的兼容性。它们都使用Lisp这种有着极强扩展性的编程语言, 从而实现了包括编程、编译乃至网络浏览等功能的扩展。

4.2 编译

编译是使用编译器从在文本编辑器中编写的C语言源程序产生可执行程序的过程。在Linux下, 最常用的编译器是gcc。

gcc, 原名GNU C语言编译器 (GNU C Compiler) , 它由GNU发布, 原本只能编译C语言。经过多年发展, 它扩展为能够支持多种编程语言, 如C++、Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等, 因此, 改名GNU编译器套件 (GNU Compiler Collection) 。

gcc使用的基本格式是:gcc[options][filenames]。其中, options为编译所需参数, filenames是编译相关的文件名称。使用gcc编译C语言源程序文件时, 必须给出一系列必要的参数和相关文件名称。gcc的参数约有一百多项, 以下介绍其中最基本、最常用的参数:

-c, 只进行编译, 不进行链接生成可执行文件, 只是由用户输入的C语言源程序文件 (.c为后缀) 经过gcc编译后生成目标文件 (.o为后缀) , 通常用于编译不包含main函数的子程序文件。

-o output_filename, 设置最终输出的可执行文件名output_filename, 并且该文件名不能与C语言源程序文件名相同。如果忽略该参数, gcc默认最终输出的可执行文件为a.out。

-g, 产生调试工具gdb所必要的符号信息。特别需要注意的是, 若要调试C源代码文件, 必须加入该选项。

-O, 优化编译和链接。如果使用该参数, C语言源程序会在编译、链接过程中进行优化处理。这样, 最终产生的可执行文件的执行速度得以提高, 但是, 执行编译和链接的时间也相应增加。

-O2, 比-O更好的优化编译、链接。与此相应地, 整个编译和链接的过程会更慢。

-I dirname, 将目录dirname加入到头文件目录列表中。该参数在预编译过程中会用到。

-v, 显示gcc编译时详细的执行过程, gcc及其相关程序的版本号。

尽管gcc是基于Linux的C编译器, 但是以上使用gcc将C源代码文件转换为可执行文件的过程, 不仅只是单一编译的过程, 而要经过预处理 (又称预编译) 、编译和链接等三个过程。首先, 预处理是指分析源代码文件中的文件包含 (#include) 、预编译语句 (#define) 等, 以上步骤是gcc通过调用cpp来实现的。接着, gcc调用cc1执行编译, 由以.c为后缀的C源代码文件生成以.o为后缀的目标文件。最后, 当所有的目标文件生成后, 执行链接。在该阶段, 所有的目标文件被安排在最终生成的可执行文件中的适当位置, 并且, C源程序中调用的所有库函数 (如scanf、printf、sin、cos等) 也从各自所在的档案库连接到最终生成的可执行文件中的合适位置。以上操作由gcc调用ld来完成。

4.3 调试

调试是指在生成可执行程序后, 使用各种方法 (如单步调试、插入断点、监测变量等) 对C语言源程序进行查错和排错的过程。C语言源程序的正确性, 不仅表现在正常功能的执行上, 更重要的是对意外情况 (如异常输入) 的正确处理。Linux下最常用的调试器是gdb。

gdb, 由GNU发布, 是Unix/Linux下强大的程序调试工具。虽然它只是一个命令行调试工具, 但VC等IDE的图形化调试工具相比, 具有更强大的功能。要使用gdb调试C语言程序, 必须先在编译时使用gcc的参数-g把调试信息加到可执行文件中。gdb的常用命令有:

gdb execfilename:将可调试的可执行文件载入到gdb中。

step:单步运行 (进入函数内部) 程序。

next:单步运行 (不进入函数内部) 程序。

continue:恢复正常, 继续执行程序。

break:设置程序断点, 当运行到C语言源程序指定行数、或针对当前位置的偏移量、或指定函数名、或内存中的指定位置时程序暂停执行。

watch:设置程序观察点, 当运行到指定参数或表达式的值被改写时程序暂停执行。

info:显示正在被调试的程序的一些指定信息, 如断点和观察点等。

print:打印变量的当前值。

set var=value:修改变量的当前值。

x/NFU ADDR:按指定地址输出内存值。其中, N表示输出内存单元个数;F表示输出数据的形式:可以是x (16进制整数) 、d (带符号10进制整数) 、u (无符号10进制整数) 、f (浮点数) ;U指定一个单元的大小, 可以是b (单字节) 、h (双字节) 、w (四字节) 、g (八字节) 。

5 总结

随着Linux的不断普及, 目前基于Linux的应用也越来越多。而Linux的开源、免费、跨平台支持等特性, 使得具有较强移植性和通用性的C语言特别适于开发Linux应用。因此, 学会使用gcc、gdb等工具在Linux平台上进行C语言开发, 具有重要的意义。

摘要:C语言在Linux开发中占据越来越重要的作用。本文从Linux特点、C语言特点、基于Linux的C语言开发过程和开发工具等多个角度加以阐述, 着重分析了gcc和gdb等Linux下C编程开发常用工具。

关键词:LinuxC语言,gcc gdb

参考文献

[1]张锦涛.Linux系统下的C语言编程技巧探析[J].电脑编程技巧与维护, 2012, (20) .

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

[3]贺蕴彬.基于Linux系统分析计算机C语言编程技巧[J].网络安全技术与应用, 2014, (5) .

[4]史志才, 夏永祥, 王益涵.C程序设计课程的教学研究与探讨[J].教育发展研究, 2009 (11) .

上一篇:去医院看眼科六年级日记下一篇:微微的困惑作文