C语言编程题_经典40题(附解答).ppt_第1页
C语言编程题_经典40题(附解答).ppt_第2页
C语言编程题_经典40题(附解答).ppt_第3页
C语言编程题_经典40题(附解答).ppt_第4页
C语言编程题_经典40题(附解答).ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的参数。输出已交换后的两个值。,# define EXCHANGE(A,B,X) X=A; A=B; B=X main( ) int a , b , x ; printf( “input a and b:”) ; scanf (“%d,%d” , ,2 、编写程序,输入两个整数,求它们相除的余数。用带参的宏来实现。,# define R(A , B) A%B,main( ) int a , b ; printf( “input a and b:”) ; scanf (“%d,%d” , ,3、 分别用函数和带参的宏,

2、从3个数中找出最大值。,int max( int a , int b , int c ) int x ; x = ( a b ) ? a : b ; x = ( x c ) ? x : c ; return ( x ) ; ,main ( ) int x , y , z , m ; printf ( “ input x , y , z” ) ; scanf (“%d , %d , %d” , ,# define MAX( A , B , C , M ) ( M = A B ? A : B ) C ? M : C,4、求和:S1-(1/2)+(1/3)-(1/4)+(1/n), 其中 n=10。

3、,方法1:,void main( ) int i,n=10; float s=0; for( i=1; i=n; i+) s=s+(i%2= =1)?(1.0/i):(-1)* (1.0/i); printf(“s=%fn”,s ); ,方法2:求 s1-(1/2)+(1/3)-(1/4)+(1/n) 其中 n=10,void main( ) int i, n=10,f= -1; float s=0; for( i=1; i=n; i+) f= -f; s+= f * (1.0/i); printf(“s=%fn”,s ); ,5、编写程序,求sum1-3+5-7+-99+101,方法1:,v

4、oid main( ) int i; float sum=0; for( i=1; i=101; i+=4) sum+=i; for( i=3; i=99; i+=4) sum-=i; printf(“sum=%fn”,sum ); ,方法2: 求 sum1-3+5-7+-99+101,void main( ) int i, f=-1; float sum=0; for( i=1; i=101; i+=2) f=-f; sum+=f*i; printf(“sum=%fn”,sum ); ,6、打印如下数字三角形:,1 121 12321 1234321 12345678987654321,vo

5、id main( ) int i,j; for( i=1; i0; j-) printf(“%d”,j); printf(“n”); ,7、编写程序,输出左下三角的九九口诀表。,1*1= 1 1*2= 2 2*2= 4 1*3= 3 2*3= 6 3*3= 9 1*4= 4 2*4= 8 3*4=12 4*4=16 1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8= 8 2*8=16 3

6、*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,输出左下三角的九九口诀表的程序如下:,void main( ) int i, j; for( i=1; i=9; i+) for( j=1; j=i; j+) printf(“%4d* %d= %2d”, i, j, i*j); printf(“n”); ,8、铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超过50公斤,超过部分每公斤加收0.10元。编一程序实现

7、自动计费功能。,double money(double w ) if (w=50) return 0.15*w; else return 0.75+0.1*(w-50); ,void main( ) int w; double f; do printf(“请输入行李重量:”); scanf(“%d”, ,9、编写函数,将两个递增有序的表,合并成一个递增有序的表。,#define N 50 #define SeqList struct seqlist SeqList int dataN; int length; ;,合并函数如下:,SeqList *mergelist(a,b) SeqList

8、a,b; SeqList c; int i=0, j=0, k=0; while(ia.length) ,10、冒泡排序(Bubble Sorting)李丽娟教材p156题7.37,两两比较相邻元素,若反序则交换,直到无反序的记录为止。,( 1)冒泡排序的基本思想,在冒泡排序的过程中,各元素不断接近自己的位置。如果一趟比较下来没有进行过交换,就说明记录序列已经有序,不需继续排序下去。因此设置一个标志变量exchange,在每趟排序开始前,首先假设该趟不会有数据交换,置exchange为0;以后一旦发生数据交换,就对exchange置1。若一趟排序结束,exchange仍然为0,则说明该趟排序过

9、程中已无反序记录。因此,没有必要再进行下一趟排序。,例如,n=6,数组R的6个关键字分别为: 14,20,25,17,3,9 冒泡排序算法的执行过程如下图所示。,四,三,二,一,9,17,25,20,14,3,i,j,(2)冒泡排序算法,void Bubblesort( int R , int n ) /*对数组R0.n-1按递增序进行冒泡排序*/ int i, j, temp, exchange ; for ( i=0; i i; j-) if (RjRj-1) /*若反序则交换,将较小的元素往上调*/ temp =Rj; Rj=Rj-1; Rj-1= temp; exchange=1; i

10、f(exchange= =0) return; /*本趟排序未发生数据交换,提前返回*/ ,11、将一个数插入到有序的数列中去,要求插入后,仍然保持数列的有序性。李丽娟教材p156题7.38,1、方法与步骤,(1)读入n个数到数组aN中(要求Nn)。 (2)对an按递增序进行排序。 (3)输出插入前的有序序列。 (4)读入要插入的数x。 (5)设置游标i从表尾开始搜索插入位置,若ai大于x则将ai移到ai+1位置。 (6)一旦出现ai小于x,则将x插入到i+1位置。 (7)输出插入后的有序序列。,(3)完整的程序如下,#include “stdio.h” #define N 10 main(

11、) int i , j, x, n, aN; /*数字a的最大容量为N*/ printf(“请输入数组的实际元素个数n:n”); scanf(“%d”, /*排序*/ output ( a, n);/*输出插入前的序列*/,scanf(“%d”, /*插入元素x*/,output( a, n);/*输出插入后的序列*/ ,直接选择排序函数如下:,void selectsort( int b , int n) int i, j, k, temp ; for (i=0; i=n-2; i+) k=i; /*假设 i 位置上就是最小的*/ for ( j=i+1; j=n-1; j+) if (bj

12、bk) k=j ; if ( k!=i) temp=bi; bi=bk; bk=temp; ,输出一维数组的函数如下:,void output( int b , int n) int i ; printf(“n”); for (i=0; in; i+) printf(“%5d”, bi ); printf(“n”); ,12、猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上,将剩下的桃子吃掉一半又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个;到第10天早上就只剩下一个桃子了。编写程序,求第一天共摘了多少个桃子?,分析: 设第一天的桃子数为x1,第二天的桃子数为

13、x2; 则有:x2x1-x1/2-1 即:x12*(x2+1) 亦即:前一天的桃子数是后一天桃子数加1后的2倍。 由此得知,第9天的桃子数是第10天桃子数加1后的2倍。 第8天的桃子数是第9天桃子数加1后的2倍。 第1天的桃子数是第2天桃子数加1后的2倍。,程序如下:,void main( ) int day,x1,x2; day=9; x2=1; while(day0) x1=(x2+1)*2; x2=x1; day-; printf(“第一天的桃子数为:”, x1); ,13、分别用递归和非递归的方法将一个整数转换成字符串。 李丽娟教材p126题6.46:,非递归方法的基本思想,对于给定的

14、整数n,从低位向高位逐位截取每一位上的数字,并保存到数组a的从0号位置开始的相应位置上。然后,从数组a中反向逐位取出相应位置上的数字并转换为相应的字符输出。,#include void convert( int n ) int i, j, a5 ; i=0; while (n!=0) ai+=n%10; /*截取n的最低位上的数字保存到ai位置上 */ n=n/10; /*将n缩小10倍 */ ,非递归函数:,j=i-1; while (j=0) putchar(aj+0); /*将aj位置上的数字转换为对应的字符 */ j=j-1; ,#include void convert( int n

15、 ) int k ; if ( (k=n/10)!=0 ) convert( k ); /*截取n的最低位上的数字保存到栈中,并使 n 缩小10倍 */ putchar(n%10 +0); /*逐次弹出栈顶数字,并将其转换为对应的字符输出 */ ,递归函数:,void main( ) int num ; printf(“input a integer number:”); scanf(“%d”, ,主函数:,14、用递归的方法求 1+2+3+n。 李丽娟教材p126题6.43:,假设输入 5 n,3. 执行过程:,main ( ) y=add(5); ,add(4) s=4+add(3); r

16、eturn s; ,add(3) s=3+add(2); return s; ,n=4,n=3,add=6,add(2) s=2+add(1); return s; ,add(1) s=1; return s; ,n=1,add=1,n=2,add=3,add=10,add(5) s=5+add(4); return s; ,add=15,n=5,int add( int n), int s ;,if (n= =1),else s = n+add(n 1) ;,return (s);,s =1 ;,main ( ), int n ,y ;,scanf (%d, ,y=add(n);,print

17、f(“%d的累加和=%d, n, y);,15、编写递归函数reverse,将字符串s颠倒过来输出。,void reverse ( char s , int i ) /*第一次调用时,i为0*/ if ( si+1!=0 ) reverse( s , i+1) ; putchar( si ) ; ,16、任意输入一个整数,将其各位数字反序输出(例如,输入1234,输出4321)。,int reverse (int n ) int num; for( num=0; n0; n/=10) num=num*10+n%10; return num; ,17、将一个长度不超过4的数字字符串转换成一个整数

18、。例如,字符串为“3248”,则转换成整数3248。,int atoi(char *nst ) int i, num=0; for( i=0; sti!=0; i+) num=num*10+nsti-0; return num; ,18、编写程序,将任意一个字符串从第一个字符开始间隔地输出该串。例如,字符串为:abcdef,输出:ace。,#define N 20,void main( ) int i; char strN; printf(“please enter a string:” ); scanf(“%s”,str); output(str); ,void output(char st

19、r ) int i; printf(“n”); for( i=0; sti!=0; i+) if (i%2= =0) putchar(stri); ,19、输入一串字符以结束,如果它是大写字母,则转换为小写字母输出,如果是小写字母,则转换为大写字母输出,如果不是字母,则照直输出。,while(ch=getchar( )!=#) if ( ch=A ,20、编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值,并输出复制结果,在被调函数中完成复制。,#define MAX 80 void copystr(char *str1,char *str2,

20、int n) int i=0; while(str2m!=0) str1i+= str2m+; str1i= 0; ,void main( ) int m; char st1MAX, st2MAX; printf(“ please enter a string:”); scanf(“%s”,st2); printf(“ please enter a number:”); scanf(“%d”, ,21、编写函数,求一个字符串的长度。 (不能调用strlen函数),int strlenth(char *st ) int i=0; while(sti!=0) i+; return i; ,22、编

21、写程序,将两个字符串连接起来。 (要求不用strcat函数),#define MAX 100 char *stcat(char *str1, char *str2) char strMAX; int i=0, j=0, k=0; while(str1i!=0) strk+= str i+); while (str2j!=0) strk+= str j+); strk= 0; return str; ,23、编写程序,输入一行字符,分别统计出其中英文字母、空格(含n、 t)、数字和其它字符的个数。,void main( ) int c,i,nchar=0,ndigit=0,nwhite=0,no

22、ther=0; while(c=getchar()!=EOF) if(c=a ,24、编写程序,统计从键盘输入的字符个数和行数。,void main( ) int c, nc=0,nl=0; while(c=getchar()!=EOF) if ( c=n) +nl; +nc; printf(“ lines:%d.n chars: %d.n”,nl,nc); ,25、编写一个译码函数,把一个英语句子译成数字代码。译码规则是:以数字1代替字母a,数字2代替字母b,数字26代替字母z;以数字27代替字母A,数字28代替字母B,数字52代替字母Z;以空格符代替星号*。英文句子以.结束。,void t

23、ran(char *st ) int i; for( i=0; sti!=.;i+) if(sti =a ,*26、 用结构体存放下表中的数据,然后输出每人的姓名和实发工资数(基本工资 + 浮动工资 支出)。,【分析及解答】 显然,该结构体应有四个成员:姓名、基本工资、浮动工资和支出,实发数为后三个成员之和差运算。 在输出时,要注意输出格式的控制,特别是对实发工资应定义其小数位数。 本题也可定义指向结构体的指针,请同学们自已完成。程序如下:,#include struct worker char name10; float base,flow,out; a3=zhao,240,400,75,

24、qian,360,120,50,sun,560,0,80;,main() int i; for( i=0;i3;i+) printf(name:%s”, ); printf(salary:%10.2f,ai.base+ai.flow-ai.out ); ,* 27、 编一个程序,输入10个员工的序号、姓名、基本工资、职务工资;求出其中“基本工资职务工资”最少的员工姓名并输出。,【分析及解答】 本题要定义有四个成员的结构体数组,并在该结构体数组中求最小值。程序中,用变量flag存放最少工资员工的序号,其初值为0。同样可使用结构体指针来完成。 程序如下:,#include stru

25、ct worker int no; char name10; float base,rank; a10;,main() int i,flag=0; for(i=0;i10;i+) scanf(%s,); scanf(%d, int n ; if (fp=fopen(f1.t,w)= =NULL) printf( Cannot open file!n); exit(1); for (n=0; n200; n+) fputc(getchar(),fp); fclose(fp); ,程序如下:,32、从上一题中建立的名为 f1.t 的磁盘文件中读取120个字符,并显示在屏幕上。,【分析

26、及解答】程序先打开文件f1.t,然后读一字符显示一个字符。程序主函数中定义了一个局部变量int n,用于计数,从文件中读取字符用库函数int fgetc(FILE *fp),显示字符用库函数int putchar( int ch)。,#include stdio.h main() FILE *fp; int n ; if ( fp=fopen(f1.t” , r) = =NULL ) printf( Cannot open file!n) ; exit(1) ; for ( n=0; n120 ; n+) putchar( fgetc(fp); fclose( fp ) ; ,33、 输入10

27、0个学生的信息(含学号、姓名、年龄、7科成绩、总分),统计所有学生的总分,并存入磁盘二进制数据文件student.dat中。然后再读取该文件,寻找总分最高的学生并输出该生的所有信息。,【分析及解答】,用一个结构体student来表示学生信息。先创建二进制文件 student.dat,在输入学生信息后就计算总分,然后写入文件。重复100次,完成学生信息存入。设置整型变量m存放最高总分值,整型变量n记录最高总分者的编号。寻找结束后,用库函数fseek定位至最高总分的学生所在的位置,读出后显示。,#include stdio.h struct student long num; char name1

28、0; int age ; int subj7; int scoret; s1;,main() FILE *f1; int m,n,j; if (f1=fopen(student.dat, wb)= =NULL ) printf(Cannot open file!n); exit(0); /*以上先创建二进制文件,作好写准备*/ /*以下为输入学生信息,计算总分,并写入文件*/,for ( m=1; m=100; m+) printf( nNumber: ); scanf(%ld, /*以上先关闭文件,再以读的方式打开。下面是查找总分最高者,m存放最高总分,n存放最高总分学生的编号。*/,m=0; for( j=0; jm) /*当前学生总分更高,则更新m,n的值 */ m=s1.scoret ; n=j; fseek(f1,(long)n* sizeof ( struct student),0); fread( ,34、 编程序对名为CCW.TXT的磁盘文件中“”之前的所有字符加密,加密方法是每个字节的内容减10。,【分析及解答】,程序要求打开的文件是可读又可写,所以文件打开模式字符串是:“r+“。文件指针f1读取”明文”字符后,将文件读写指针用库函数fseek(f1,-1L,1)退回一格。将加密后的字符写到该字符原来的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论