当前位置:文档之家› C语言编程题_经典40题(附解答)

C语言编程题_经典40题(附解答)

本文由李秀军8贡献
ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
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‖ , &a , &b ) ; EXCHANGE( a , b , x ) ; printf( ― a = %d\n b = %d\n‖ , a , b ) ; }
2 、编写程序,输入两个整数,求它们相除的余数。 用带参的宏来实现。 # define R(A , B) A%B
main( ) { int a , b ; printf( ―input a and b:‖) ; scanf (―%d,%d‖ , &a , &b ) ; printf( ―%d mod %d = %d\n‖ , a , b , R( a , b ) ) ; }
3、 分别用函数和带参的宏,从3个数中找出最大值。
int max( int a , int b , int c ) { int x ; x=(a>b)?a:b; x=(x>c)?x:c; return ( x ) ; } # define MAX( A , B , C , M ) ( M = A > B ? A : B ) > C ? M : C main ( ) 宏展开为: { int x , y , z , m ; (m=x>y?x:y)>z?m :z printf ( ― input x , y , z‖ ) ; scanf (―%d , %d , %d‖ , &x , &y , &z ) ; printf ( ―MAX=%d\n\n‖ , MAX( x , y , z , m ) ) ; printf ( ―max =%d\n‖ , max( x , y , z ) ) ; }
4、求和:S=1-(1/2)+(1/3)-(1/4)+……+(1/n),
其中 n=10。
方法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=%f\n‖,s ); }
方法2:求 s=1-(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=%f\n‖,s ); }
5、编写程序,求sum=1-3+5-7+……-99+101
方法1:
void 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=%f\n‖,sum ); }
方法2: 求 sum=1-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=%f\n‖,sum ); }
6、打印如下数字三角形:
void main( ) { int i,j; 1 for( i=1; i<10; i++) 121 { for( j=1; j<10-i; j++) 12321 1234321 printf(― ‖); /*输出9-i个空格*/ ……………… for( j=1; j<=i; j++) 12345678987654321 printf(―%d‖,j); for( j=i-1; j>0; 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*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元。编一程序实现自动计费功能。 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‖,&w); if (w >0) { f =money(w); printf(―\nweight=%d,freight=%f‖,w,f); } }while (w= =0); }
9、编写函数,将两个递增有序的表,合并成一 个递增有序的表。
#define N 50
#define SeqList struct seqlist
SeqList
{ int data[N];
int length;
};
合并函数如下: SeqList *mergelist(a,b) SeqList a,b; { SeqList c; int i=0, j=0, k=0; while((i i; j--)
if (R[j]/*本趟排序未发生数据交换,提前返回*/
11、将一个数插入到有序的数列中去,要求插入后,仍然保 持数列的有序性。李丽娟教材p156题7.38 1、方法与步骤 (1)读入n个数到数组a[N]中(要求N>n)。 (2)对a[n]按递增序进行排序。 (3)输出插入前的有序序列。 (4)读入要插入的数x。 (5)设置游标i从表尾开始搜索插入位置,若a[i]大于x则 将a[i]移到a[i+1]位置。
(6)一旦出现a[i]小于x,则将x插入到i+1位置。
(7)输出插入后的有序序列。
(3)完整的程序如下 #include ―stdio.h‖ #define N 10 main( ) { int i , j, x, n, a[N]; /*数字a的最大容量为N*/ printf(―请输入数组的实际元素个数n:\n‖); scanf(―%d‖, &n ); /*要求实际元素个数n小于N */ printf(―请输入%d个整数:\n‖, n ); for( i=0; i=0) && ( x 0) { x1=(x2+1)*2;
x2=x1;
day--; } printf(―第一天的桃子数为:”, x1); }
13、分别用递归和非递归的方法将一个整数转换成 字符串。 李丽娟教材p126题6.46:
非递归方法的基本思想
对于给定的整数n,从低位向高位逐位截取每一位上
的数字,并保存到数组a的从0号位置开始的相应位置上。
然后,从数组a中反向逐位取出相应位置上的数字并转换 为相应的字符输出。
非递归函数:
n 1234 #include void convert( int n ) a 4 3 2 1 { int i, j, a[5] ; i=0; while (n!=0) { a[i++]=n%10; /*截取n的最低位上的数字保存到a[i]位置上 */ n=n/10; /*将n缩小10倍 */ } j=i-1; while (j>=0) { putchar(a[j]+‘0‘); /*将a[j]位置上的数字转换为对应的字符 */ j=j-1; } }
递归函数:
#include ①void convert( int n )
{ 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‖,&num); printf(―\noutput:‖);
if (num<0)
printf(―\n‖); }
{ putchar(―-‖); num=-num; }
convert( num);
14、用递归的方法求 1+2+3+…+n。
李丽娟教材p126题6.43:
int add( int n) { int s ; if (n= =1) s =1 ; else s = n+add(n –1) ; return (s); }
main ( ) { int n ,y ; scanf ("%d", &n); y=add(n); printf(―%d的累加和=%d", n, y); }
3. 执行过程:
main ( ) { … y=add(5); … } } add(5) { … s=5+add(4); … return s;
假设输入 5→ n
add(4) { … s=4+add(3); … return s; } add(3) { … s=3+add(2); … return s; } add(2)
add(1)
{ … s=1;
{
… s=2+add(1); …

return s; }
return s;
}
15、编写递归函数reverse,将字符串s颠倒过来输出。
①void reverse ( char s[ ] , int i ) { ② if ( s[i+1]!=?\0‘ )
/*第一次调用时,i为0*/
③reverse( s , i+1) ;
④ putchar( s[i] ) ;
⑤}
16、任意输入一个整数,将其各位数字反序输出(例 如,输入1234,输出4321)。
int reverse (int n ) { int num; for( num=0; n>0; n/=10) num=num*10+n%10; return num; }
17、将一个长度不超过4的数字字符串转换成一
个整数。例如,字符串为“3248”,则转换成整数
3248。 int atoi(char *nst ) { int i, num=0; for( i=0; st[i]!=?\0‘; i++) num=num*10+nst[i]-‘0‘; return num; }
18、编写程序,将任意一个字符串从第一个字符开始间隔 地输出该串。例如,字符串为:abcdef,输出:ace。 #define N 20
void output(char str[ ] ) { int i; printf(―\n‖); for( i=0; st[i]!=?\0‘; i++) if (i%2= =0) putchar(str[i]); }
void main( ) { int i; char str[N]; printf(―please enter a string:‖ ); scanf(―%s‖,str); output(str); }
19、输入一串字符以‘#’结束,如果它是大写字母,则转 换为小写字母输出,如果是小写字母,则转换为大写字母输出, 如果不是字母,则照直输出。 while((ch=getchar( ))!=?#‘)
{ if ( ch>=?A‘&& ch<=?Z‘)
ch=ch-?A‘+?a‘; else if( ch>=?a‘&& ch<=?z‘)
ch=ch-?a‘+?A‘;
putchar(ch); }
20、编写程序,将字符串中的第m个字符开始的全部字符复 制成另一个字符串。要求在主函数中输入字符串及m的值,并输 出复制结果,在被调函数中完成复制。 #define MAX 80 void copystr(char *str1,char *str2, int n) { int i=0; while(str2[m]!=?\0‘) str1[i++]= str2[m++]; str1[i]= ?\0‘; } void main( ) { int m; char st1[MAX], st2[MAX]; printf(― please enter a string:‖); scanf(―%s‖,st2); printf(― please enter a number:‖); scanf(―%d‖,&

m); copystr( st1, st2,--m); printf(―%s\n‖,st1); }
21、编写函数,求一个字符串的长度。
(不能调用strlen函数)
int strlenth(char *st )
{ int i=0;
while(st[i]!=?\0‘) i++; return i; }
22、编写程序,将两个字符串连接起来。
(要求不用strcat函数) #define MAX 100
char *stcat(char *str1, char *str2)
{ char str[MAX]; int i=0, j=0, k=0;
while(str1[i]!=?\0‘)
str[k++]= str [i++]); while (str2[j]!=?\0‘) str[k++]= str [j++]);; str[k]= ?\0‘; return str; }
23、编写程序,输入一行字符,分别统计出其中英文字 母、空格(含‘\n‘、 ‘\t‘)、数字和其它字符的个数。 void main( ) { int c,i,nchar=0,ndigit=0,nwhite=0,nother=0; while((c=getchar())!=EOF) if((c>=?a‘&& c<=?z‘)|| (c>=?A‘&& c<=?Z‘)) ++nchar; else if(c>=0&& c<=9) ++ndiget; else if (c==? ‘ || c==?\n‘|| c==?\t‘) ++nwhite;
else ++norther;
printf(― nchar=%d\n ndigit= %d\n‖,nchar,ndiget); printf(― nwhite= %d\n nother= %d\n ‖,nwhite,nother);
}
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 tran(char *st ) { int i; for( i=0; st[i]!=?.‘;i++) if(st[i] >=?a‘&& st[i] <=?z‘) st[i]= st[i]- ?a‘+1;
else if (st[i] >=?A‘&& st[i] <=?Z‘)
st[i]= st[i]- ?A‘+27; else if (st[i] ==? ‘) st[i]= ?*‘;
}
*26、 用结构体存放下表中的数据,然后输出每人的姓名和 实发工资数(基本工资 + 浮动工资 – 支出)。 姓名 基本工资 浮动工资 支出 zhao qian sun 240.00 360.00 560.00 400.00 120.00 0.00 75.00 50.00 80.00
【分析及解答】 显然,该结构体应有四个成员:姓名、基本工资、浮动 工资和支出,实发数为后三个成员之和差运算。 在输出时,要注意输出格式的控制,特别是对实发工资 应定义其小数位数。 本题也可定义指向结构体的指针,请同学们自已完成。 程序如下:
#include struct worker { char name[10]; float base,flow,out; }a[3]={{"zhao",240,400,75}, {"qian",360,120,50},{"sun",560,0,80}};
main() { int i; for( i=0;i<3;i++) { printf("name:%s‖, a[i].name ); printf("salary:%10.2f",,a[i].base+a[i].flow-a[i].out ); } }
* 27、 编一个程序,输入10个员工的序号、姓名、基本工资、 职务工资;求出其中“基本工资 +职务工资”最少的员工姓名 并输出

。 【分析及解答】 本题要定义有四个成员的结构体数组,并在该结构体数 组中求最小值。程序中,用变量flag存放最少工资员工的序 号,其初值为0。同样可使用结构体指针来完成。 程序如下: #include struct worker { int no; char name[10]; float base,rank; }a[10];
main() { int i,flag=0; for(i=0;i<10;i++) { scanf("%s",a[i].name); scanf("%d",&a[i].no); scanf("%f %f",&a[i].base,&a[i].rank); } for(i=1;i<10;i++) if( a[i].base+a[i].rank < a[flag].base+a[flag].rank ) flag=i; printf("name:%s",a[flag].name); }
28、 编一个程序,输出10个学生的学号、姓名、3门课程的 成绩,求出总分最高的学生姓名并输出。
(此题与李丽娟教材p231题9.38相似 )
【分析及解答】本题与上题类似,只是将求最小值改为求 最大值而已。同样是用变量flag存放最大值即最高分学生的 序号,其初值也为0。程序如下:
#include struct student { int no; char name[10]; float chinese,math,eng; }a[10];
void main() { int i,sum1, sum2, flag=0; for( i=0;i<10;i++) { scanf("%s",a[i].name); scanf("%d",&a[i].no ); scanf("%f%f%f",&a[i].chinese,&a[i].math,&a[i].eng); } for( i=1;i<10;i++) { sum1= a[flag].chinese+a[flag].math+a[flag].eng ; sum2= a[i].chinese+a[i].math+a[i].eng ; if ( sum2 > sum1 ) flag=i; } printf("name:%s",a[flag].name); }
29、 编一个程序,输出下列学生成绩表中的数据,并用结构 体数组存放。然后输出三门课程的名称和平均分数。
name Zhao Qian
VF 97.5 90.0
VB 89.0 93.0
VC 78.0 87.5
Sun
Li
75.0
82.5
79.5
69.5
68.5
54.0
【分析及解答】 本题解法与以上几题相似,只是增加了求平均值的 运算。另外,在输出时,注意换行控制。
程序如下: #include struct student { char name[16]; float score[3]; }a[4]={{"Zhao",97.5,89,78}, {"Qian",90,93,87.5}, {"Sun",75,79.5,68.5}, {"Li",82.5,69.5,54 } }; char cases[3][10]={"VF","VB","VC"}; /*cases[0]、cases[1]、cases[2]用来存放课程名称*/
void main() { int i,j; float sum; for( i=0;i<3;i++) { printf("\n Case:%s\t",cases[i]); sum=0; for( j=0;j<4;j++) sum+=a[j].score[i]; sum/=4; printf("Avg score:%f\n",sum); } }
30、 某专业本学期开设课程有:数学(math)、英语 (english)、程序设计(program),根据你所在班的实际 人数,设计5个函数: ( 1 ) 从 键 盘 输 入 每 一 个 同 学 的 学 号 ( num)、 姓 名 (name)及各门课程的成绩(score); (2)求出每个同学的总成绩。 (3)从屏幕输出总分最高的学生的学号、姓名、各 单科成绩及总成绩。 (4)从屏幕输出某门课程、某个分数段的学生的学 号、姓名和该门课程的成绩。 (5)按平均

分从高到低顺序,输出全班同学的学号、 姓名和平均分。 再编写一个主函数进行测试。
31、 编一个程序,从键盘输入200个字符,存入名为“ f1.t‖ 的磁盘文件中。
【分析及解答】 因为有文件操作,所以程序头部必须有一条语句: #include "stdio.h‖ 它定义了数据类型FILE和文件操作库函数的说明。 程序先创建文件f1.t,然后从键盘每键入一个字符 就往文件中写一个字符,直至完成。 程序主函数中定义了一个局部变量int n,用做计数 器,键盘读取用库函数int getchar()。
程序如下:
#include "stdio.h" main() { FILE *fp; int n ; if ((fp=fopen("f1.t","w"))= =NULL) { printf(" Cannot open file!\n"); exit(1); } for (n=0; n<200; n++) fputc(getchar(),fp); fclose(fp); }
32、从上一题中建立的名为 f1.t 的磁盘文件中读取120个字符, 并显示在屏幕上。 【分析及解答】程序先打开文件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; n<120 ; n++) putchar( fgetc(fp)); fclose( fp ) ; }
33、 输入100个学生的信息(含学号、姓名、年龄、7科成 绩、总分),统计所有学生的总分,并存入磁盘二进制数据文件 student.dat中。然后再读取该文件,寻找总分最高的学生并输出该 生的所有信息。 【分析及解答】 用一个结构体student来表示学生信息。先创建二进制 文件 student.dat,在输入学生信息后就计算总分,然后写 入文件。重复100次,完成学生信息存入。设置整型变量m 存放最高总分值,整型变量n记录最高总分者的编号。寻 找结束后,用库函数fseek定位至最高总分的学生所在的位 置,读出后显示。
#include " stdio.h" struct student { long num; char name[10]; int age ; int subj[7]; 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",&s1.num); printf(" \nName: "); scanf("%s",https://www.doczj.com/doc/8f6149012.html,); printf("\n Seven Subject Score: "); s1.scoret=0; for ( j=0; j<7; j++ ) { scanf(" %d", &s1.subj[j]); s1.scoret +=s1.subj[j]; } fwrite(&s1, sizeof ( struct student),1,f1); } /*以上输入学生信息,循环100次*/ fclose(f1); if ((f1=fopen(" student.dat","rb"))= =NULL) { printf(" Cannot open file!\n"); exit(0); } /*以上先关闭文件,再以读的方式打开。下面是查找总分最高
者,m存放最高总分,n存放最

高总分学生的编号。*/
m=0; for( j=0; j<100; j++) { fread( &s1, sizeof ( struct student), 1, f1 ); if (s1.scoret>m) /*当前学生总分更高,则更新m,n的值 */ { m=s1.scoret ; n=j;} } fseek(f1,(long)n* sizeof ( struct student),0); fread( &s1, sizeof ( struct student), 1, f1 );
/*以上寻找完成,定位到总分最高的学生位置,读出信息。以 下完成显示并关闭文件。*/
printf(" \n Top student Number: %ld", s1.num); printf("\n Name: %s", https://www.doczj.com/doc/8f6149012.html,); printf("\n Seven Subject Score: "); for ( j=0; j<7; j++) printf ( " %d ", s1.subj[j] ) ; printf("\n total score:%d", s1.scoret ) ; fclose(f1); }
34、 编程序对名为CCW.TXT的磁盘文件中“@”之前的所 有字符加密,加密方法是每个字节的内容减10。 【分析及解答】
程序要求打开的文件是可读又可写,所以文件打开模 式字符串是:“r+―。文件指针f1读取”明文”字符后,将 文件读写指针用库函数fseek(f1,-1L,1)退回一格。将加密 后的字符写到该字符原来的位置。判断原明文字符是否为 结束标志,是则结束处理,否则继续处理,直至结束。 程序中将结束标志字符也加密,避免密文中出现结束 标志字符,导致解密错误。 库函数 fseek(f1,-1L,1)参数的第一项表示对应的文 件,第二项表示移动的长度,是长整型量。第三项表示参 照位置:0表示从文件头,1表示从当前位置,2 表示从文 件尾。程序如下:
#include " stdio.h" main() { FILE *f1; char c; if ( (f1=fopen("ccw.txt","r+") )= =NULL) { printf("Cannot open file!\n"); exit(0); } while(!feof(f1) ) { c=fgetc(f1); fseek(f1, -1L, 1); /*将文件读写指针退回一格*/ fputc( c-10, f1 ); /*将加密后的字符写入到该字符本身的位置*/ if( c= =‘@‘ ) exit(0); } fclose(f1); }
35. 分别编写三个程序打印下列三个图形。 * *** ***** *** *
图(c)
***** ***** ***** ***** *****
图(a)
* *** ***** *** *
图(b)
36. 按每行5个数打印输出100—300之间的 所有素数。 算法思想:i从101到299之间取奇数值,对 于i的每一个取值,用2 ~ sqrt(i) 之间的整数j去 试除i。设置标志变量b首先取值1,表示i是素数; 以后一旦发现有某一个j能整除i,则马上对b赋 值0,表示i不是素数。设置计数器k,用以统计 所输出的素数的个数。
37. 求100之内的所有完数(一个数如果恰好 等于它的因子之和,这个数就称为完数。例如, 6的因子为1、2、3,而6 = 1+2+3,所以,6是 完数。)
38. 求出10至1000之内能同时被2、3、7整除的 数,并输出。 39. 输入两个正整数,输出它们的最大公约数。 【提示】求最大公约数有两种基本算法,其一: 找出两整数中的最小的一个,最大公约数必在1与 最小整数的范围内。然后从

大到小,一一测试,即 可找到。其二:辗转相除法(设a>b,r为余数)。 ①求a/b的余数r;②若r=0,则b为最大公约数,若 r≠0,执行第③步;③将b的值放在a中,将r的值放 在b中;④执行第①步。
40. 计算e=1+的值并输出(设n=20)。
1 1! ? 1 2! ? …… ? 1 n!
41. 生成Fibonacci数列的前20项并输出。Fibonacci数 列为: 1,1,2,3,5,8,13,21,34,…

本TXT由“文库宝”下载:https://www.doczj.com/doc/8f6149012.html,/wenkubao

相关主题
文本预览
相关文档 最新文档