资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,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”,EXCHANGE(a,b,x);,printf(“a=%dn b=%dn”,a,b);,2,、,编写程序,输入两个整数,求它们相除的余数。用带参的宏来实现。,#,define R(A,B)A%B,main(),int a,b;,printf(“input a and b:”);,scanf(“%d,%d”,printf(“%d mod%d=%dn”,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);,main(),int x,y,z,m;,printf(“input x,y,z”);,scanf(“%d,%d,%d”,printf(“MAX=%dnn”,MAX(x,y,z,m);,printf(“max=%dn”,max(x,y,z);,宏展开为:,(,m=x y?x:y)z?m:z,#,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。,方法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:,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=%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,void main(),int i,j;,for(i=1;i10;i+),for(j=1;j10-i;j+),printf(“”);,/*,输出9-,i,个空格*/,for(j=1;j0;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(w0),f=money(w);,printf(“nweight=%d,freight=%f”,w,f);,while(w=0);,9、,编写函数,将两个递增有序的表,合并成一个递增有序的表。,#define N 50,#define SeqList struct seqlist,SeqList,int dataN;,int length;,;,合并函数如下:,SeqList *mergelist(a,b),SeqList a,b;,SeqList c;,int i=0,j=0,k=0;,while(ia.length)&(j b.length),if(a.datai)=b.dataj),c.datak+=a.datai+);,else c.datak+=b.dataj+);,while(ia.length),c.datak+=a.datai+);,while(j b.length),c.datak+=b.dataj+);,c.length=k;,return c;,10、,冒泡排序,(,Bubble Sorting),李丽娟教材,p156,题7.37,两两比较相邻元素,,,若反序则交换,,直到无反序的记录为止。,(1)冒泡排序的基本思想,在冒泡排序的过程中,各元素不断接近自己的位置。如果一趟比较下来没有进行过交换,就说明记录序列已经有序,不需继续排序下去。因此设置一个标志变量,exchange,,在每趟排序开始前,首先假设该趟不会有数据交换,置,exchange,为0;以后一旦发生数据交换,就对,exchange,置1。若一趟排序结束,,exchange,仍然为0,则说明该趟排序过程中已无反序记录。因此,没有必要再进行下一趟排序。,例如,,n=6,,数组,R,的6个关键字分别为:,14,20,25,17,3,9,冒泡排序算法的执行过程如下图所示。,四,三,二,一,9,17,25,20,17,25,25,20,17,14,20,17,25,20,14,9,14,3,5,4,3,2,1,9,3,17,25,20,14,0,i,j,(2)冒泡排序算法,void Bubblesort(int R,int n),/*,对数组,R0.n-1,按递增序进行冒泡排序*/,int i,j,temp,exchange;,for (i=0;i i;j-),if(Rjn)。,(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(),int i,j,x,n,aN;,/*,数字,a,的最大容量为,N*/,printf(“,请输入数组的实际元素个数,n:n”);,scanf(“,%,d”,/*,要求实际元素个数,n,小于,N*/,printf(“,请输入%,d,个整数:,n”,n);,for(i=0;i=0),/*,元素后移*/,ai+1=x;,/*,插入元素,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(bjbk)k=j;,if(k!=i),temp=bi;bi=bk;bk=temp;,输出一维数组的函数如下:,void output(int b,int n),int i;,printf(“,n”);,for(i=0;i0),x1=(x2+1)*2;,x2=x1;,day-;,printf(“,第一天的桃子数为:”,x1);,13、,分别用递归和非递归的方法将一个整数转换成字符串。,李丽娟教材,p126,题6.46:,非递归方法的基本思想,对于给定的整数,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倍*/,非递归函数:,1234,n,1,2,3,4,a,j=i-1;,while(j=0),putchar(aj+0);,/*,将,aj,位置上的数字转换为对应的字符*/,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”,printf(“noutput:”);,if(num0;n/=10),num=num*10+n%10;,return num;,17、,将一个长度不超过4的数字字符串转换成一个整数。例如,字符串为“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 str ),int i;,printf(“n”);,for(i=0;sti!=0;i+),if(i%2=0)putchar(stri);,19、,输入一串字符以结束,如果它是大写字母,则转换为小写字母输出,如果是小写字母,则转换为大写字母输出,如果不是字母,则照直输出。,while(ch=getchar()!=#),if(ch=A&ch=a&ch=a&c=A&c=0,else if(c=|c=n|c=t)+nwhite;,else +norther;,printf(“nchar=%dn ndigit=%dn”,nchar,ndiget);,printf(“nwhite=%dn nother=%dn”,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;sti!=.;i+),if(sti=a&sti=A&sti=Z),sti=sti-A+27;,else if(sti=)sti=*;,*,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 name10;,float base,flow,out;,a3=zhao,240,400,75,,qian,360,120,50,sun,560,0,80;,main(),int i;,for(i=0;i3;i+),printf(name:%s”,ai.name);,printf(salary:%10.2f,ai.base+ai.flow-ai.out);,*,27、,编一个程序,输入10个员工的序号、姓名、基本工资、职务工资;求出其中“基本工资职务工资”最少的员工姓名并输出。,【分析及解答】,本题要定义有四个成员的结构体数组,并在该结构体数组中求最小值。程序中,用变量,flag,存放最少工资员工的序号,其初值为,0,。同样可使用结构体指针来完成。,程序如下:,#,include,struct worker,int no;,char name10;,float base,rank;,a10;,main(),int i,flag=0;,for(i=0;i10;i+),scanf(%s,ai.name);,scanf(%d,&ai.no);,scanf(%f%f,&ai.base,&ai.rank);,for(i=1;i10;i+),if(ai.base+ai.rank aflag.base+aflag.rank),flag=i;,printf(name:%s,aflag.name);,28、,编一个程序,输出10个学生的学号、姓名、门课程的成绩,求出总分最高的学生姓名并输出。,(此题与,李丽娟教材,p231,题9.38相似,),【分析及解答】本题与上题类似,只是将求最小值改为求最大值而已。同样是用变量,flag,存放最大值即最高分学生的序号,其初值也为,0,。程序如下:,#,include,struct student,int no;,char name10;,float chinese,math,eng;,a10;,void main(),int i,sum1,sum2,flag=0;,for(i=0;i10;i+),scanf(%s,ai.name);,scanf(%d,&ai.no);,scanf(%f%f%f,&ai.chinese,&ai.math,&ai.eng);,for(i=1;i sum1)flag=i;,printf(name:%s,aflag.name);,29、,编一个程序,输出下列学生成绩表中的数据,并用结构体数组存放。然后输出三门课程的名称和平均分数。,name,VF,VB,VC,Zhao,97.5,89.0,78.0,Qian,90.0,93.0,87.5,Sun,75.0,79.5,68.5,Li,82.5,69.5,54.0,【分析及解答】,本题解法与以上几题相似,只是增加了求平均值的运算。另外,在输出时,注意换行控制。,程序如下:,#,include,struct student,char name16;,float score3;,a4=Zhao,97.5,89,78,,Qian,90,93,87.5,,Sun,75,79.5,68.5,,Li,82.5,69.5,54 ;,char cases310=VF,VB,VC;,/*,cases0、cases1、cases2,用来存放课程名称*/,void main(),int i,j;,float sum;,for(i=0;i3;i+),printf(n Case:%st,casesi);,sum=0;,for(j=0;j4;j+),sum+=aj.scorei;,sum/=4;,printf(Avg score:%fn,sum);,30、,某专业本学期开设课程有:数学(,math)、,英语(,english)、,程序设计(,program),,根据你所在班的实际人数,设计5个函数:,(1)从键盘输入每一个同学的学号(,num)、,姓名(,name),及各门课程的成绩(,score);,(2),求出每个同学的总成绩。,(3)从屏幕输出总分最高的学生的学号、姓名、各单科成绩及总成绩。,(4)从屏幕输出某门课程、某个分数段的学生的学号、姓名和该门课程的成绩。,(5)按平均分从高到低顺序,输出全班同学的学号、姓名和平均分。,再编写一个主函数进行测试。,31、,编一个程序,从键盘输入200个字符,存入名为“,f1.t”,的磁盘文件中。,【分析及解答】,因为有文件操作,所以程序头部必须有一条语句:,#,include stdio.h”,程序先创建文件,f1.t,,然后从键盘每键入一个字符就往文件中写一个字符,直至完成。,程序主函数中定义了一个局部变量,int n,,用做计数器,键盘读取用库函数,int getchar()。,它定义了数据类型,FILE,和文件操作库函数的说明。,#,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;n200;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;n120;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 name10;,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,printf(nName:);scanf(%s,s1.name);,printf(n Seven Subject Score:);,s1.scoret=0;,for(j=0;j7;j+),scanf(%d,s1.scoret+=s1.subjj;,fwrite(,/*,以上输入学生信息,循环100次*/,fclose(f1);,if(f1=fopen(student.dat,rb)=NULL),printf(Cannot open file!n);,exit(0);,/*,以上先关闭文件,再以读的方式打开。下面是查找总分最高者,,m,存放最高总分,,n,存放最高总分学生的编号。*/,m=0;,for(j=0;jm),/*,当前学生总分更高,则更新,m,n,的值*/,m=s1.scoret;n=j;,fseek(f1,(long)n*sizeof(struct student),0);,fread(,/*,以上寻找完成,定位到总分最高的学生位置,读出信息。以 下完成显示并关闭文件。*/,printf(n Top student Number:%ld,s1.num);,printf(n Name:%s,s1.name);,printf(n Seven Subject Score:);,for(j=0;jb,r,为余数)。求,a/b,的余数,r;,若,r=0,,则,b,为最大公约数,若,r0,,执行第步;将,b,的值放在,a,中,将,r,的值放在,b,中;执行第步。,40.计算,e=1+,的值并输出(设,n=20)。,41.生成,Fibonacci,数列的前20项并输出。,Fibonacci,数列为:1,1,2,3,5,8,13,21,34,,
展开阅读全文