1、1国二C语言上机题库1、上机改错题的特点和注意事项1上机改错的试题中通常包含两个(或三个)错误需要修改。2试题中用 “*found*/“来提示在下一行( 或下面第二行) 有错。3错误的性质基本分 语法错 和逻辑错两种,也有些试题要求把语句添加在下划线处4要注意的是:只能在出错的行上进行修改,不要改动程序行的顺序,更不要自己另编程序。二、C编程时常犯的错误1. 书写标识符时,忽略了大小写字母的区别。main()int a=5;printf(“%d“,A);编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,
2、以增加可读性。2. 忽略了变量的类型,进行了不合法的运算。main()float a,b;printf(“%d“,a%b);%是求余运算,得到 a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。3. 将字符常量与字符串常量混淆。char c;c=“a“;在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符: a和,而把它赋给一个字符变量是不行的。4. 忽略了“=” 与“=” 的区别。2在许多高级语言中,用“=”符
3、号作为关系运算符“等于” 。如在BASIC程序中可以写if (a=3) then 但C语言中, “=”是赋值运算符, “=”是关系运算符。如:if (a=3) a=b;前者是进行比较,a是否和3相等,后者表示如果a和3 相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。5. 忘记加分号。分号是C语句中不可缺少的一部分,语句末尾必须有分号。a=1b=2编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。 z=x y;t=z/100;printf(“%f
4、“,t);对于复合语句来说,最后一个语句中最后的分号不能忽略不写。6. 多加分号。对于一个复合语句,如: z=x y;t=z/100;printf(“%f“,t);复合语句的花括号后不应再加分号,否则将会画蛇添足。又如:if (a%3=0);I ;本是如果3 整除a,则I加1 。但由于if (a%3=0)后多加了分号,则if语句到此结束,程序将执行I 语句,不论3 是否整除 a,I 都将自动加1。再如:for (I=0;I=2)位的整数,函数求出w的后n-1位的数作为函数值返回。例如:w值为5923,则函数返回923;w值为923则函数返回23。unsigned fun( unsigned w
5、 ) if(w=10000) return w000;if(w=1000) return w00;if(w=100) return w0;return w;注:由于unsigned型整数在 0-65535这间,只要它大于10000则对10000求余即得出后面4位,否则如果大于 1000则对1000 求余得出后3位数,这样一层一层往小的判断。由于return的作用除了返回值以外,还有当执行到return时就跳出该程序,所以可以连续的用if()语句。64、请编一函数 void fun(int ttMN,int ppN),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指
6、一维数组中,二维数组中的数已在主函数中赋予。#define M 3#define N 4void fun(int ttMN,int ppN) int i, j;for(i=0;i pp=tt0;for(j=0;j if(ttj 5、请编一个函数 fun,其中n所指存储单元中存放了数组中元素的个数。函数的功能是:删除所有值为y的元素。数组元素中的值和 y的值由主函数通过健盘读入。试题程序。#define M 20 void fun (int bb, int *n,int y) int i,j=0;for( i=0; i void fun(unsigned long *n) unsigned lo
7、ng x=0, i; int t; i=1; while(*n) t=*n % _1_; if(t%2!= _2_) x=x+t*i; i=i*10; *n =*n /10; *n=_3_; main() unsigned long n=-1; while(n99999999|n double fun ( int n ) double result = 1.0 ; if n = = 0 return 1.0 ; while( n 1 /* len为串长, t为正负标识 */ long x=0; len=strlen(p); if(p0=-) t=-1; len-; p+; else t=1;
8、/* 以下完成数字字符串转换为一个数字 */ 11return x*t; main() /* 主函数 */ char s6; long n; printf(“Enter a string:n“) ; gets(s); n = fun(s); printf(“%ldn“,n); NONO ( ); NONO ( ) /* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *fp, *wf ; int i ; char s20 ; long n ; fp = fopen(“c:testin.dat“,“r“) ; wf = fopen(“c:testout.dat“,“
9、w“) ; for(i = 0 ; i #include long fun ( char *p) int i, len, t; /* len为串长, t为正负标识 */ long x=0; 12len=strlen(p); if(p0=-) t=-1; len-; p+; else t=1; /* 以下完成数字字符串转换为一个数字 */ while(*p) x = x*10-48+(*p+); return x*t; main() /* 主函数 */ char s6; long n; printf(“Enter a string:n“) ; gets(s); n = fun(s); print
10、f(“%ldn“,n); NONO ( ); NONO ( ) /* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *fp, *wf ; int i ; char s20 ; long n ; fp = fopen(“c:testin.dat“,“r“) ; wf = fopen(“c:testout.dat“,“w“) ; for(i = 0 ; i void fun(char *s, int a, double f) _1_ fp; char ch; fp = fopen(“file1.txt“, “w“); fprintf(fp, “%s %d %fn“,
11、 s, a, f); fclose(fp); fp = fopen(“file1.txt“, “r“); printf(“nThe result :nn“); ch = fgetc(fp); while (!feof(_2_) putchar(_3_); ch = fgetc(fp); putchar(n); fclose(fp); main() char a10=“Hello!“; int b=12345; double c= 98.76; fun(a,b,c); 第一处:定义文本文件类型变量,所以应填:FILE *。 第二处:判断文件是否结束,所以应填:fp。 第三处:显示读出的字符,所以
12、应填:ch。 * 给定程序MODI1.C中函数fun的功能是: 依次取出字符串中所有数字字符, 形成新的字符串, 并取代原字符串。 #include void fun(char *s) 14 int i,j; for(i=0,j=0; si!=0; i+) if(si=0 for(i=0; i 16#define N 5 typedef struct student long sno; char name10; float score3; STU; void fun(char *filename, STU n) FILE *fp; fp = fopen(_1_, “rb+“); fseek(_
13、2_, -1L*sizeof(STU), SEEK_END); fwrite( fclose(fp); main() STU tN= 10001,“MaChao“, 91, 92, 77, 10002,“CaoKai“, 75, 60, 88, 10003,“LiSi“, 85, 70, 78, 10004,“FangFang“, 90, 82, 87, 10005,“ZhangSan“, 95, 80, 88; STU n=10006,“ZhaoSi“, 55, 70, 68, ssN; int i,j; FILE *fp; fp = fopen(“student.dat“, “wb“);
14、fwrite(t, sizeof(STU), N, fp); fclose(fp); fp = fopen(“student.dat“, “rb“); fread(ss, sizeof(STU), N, fp); fclose(fp); printf(“nThe original data :nn“); for (j=0; j #include typedef struct aa int data; struct aa *next; NODE; NODE *Creatlink(int n, int m) NODE *h=NULL, *p, *s; int i; p=(NODE )malloc(
15、sizeof(NODE); h=p; p-next=NULL; for(i=1; idata=rand()%m; s-next=p-next; p-next=s; p=p-next; return p; outlink(NODE *h) 18 NODE *p; p=h-next; printf(“nnTHE LIST :nn HEAD “); while(p) printf(“-%d “,p-data); p=p-next; printf(“n“); main() NODE *head; head=Creatlink(8,22); outlink(head); 第一处: 指向刚分配的结构指针,
16、所以应改为:p=(NODE *)malloc(sizeof(NODE); 第二处: 在动态分配内存的下一行语句是,使用临时结构指针变量h 保存p 指针的初始位置,最后返回不能使用p,是因为p 的位置已经发生了变化,所以应改为返回h。 * 请编写函数fun, 函数的功能是: 统计一行字符串中单词的个数,作为函数值返 回。一行字符串在主函数中输入, 规定所有单词由小写字母组成 ,单词之间由若干 个空格隔开, 一行的开始没有空格。 #include #include #define N 80 int fun( char *s) main() char lineN; int num=0; printf
17、(“Enter a string :n“); gets(line); num=fun( line ); printf(“The number of word is : %dnn“,num); NONO(); 191. 利用while循环语句和指针变量,当字符为空格时,则单词数k 加1。 2. 循环结束返回k。 参考答案: int fun( char *s) int k = 1 ; while(*s) if(*s = ) k+ ; s+ ; return k ; 第04 套: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功
18、能是从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。 #include #define N 5 typedef struct student long sno; char name10; float score3; STU; void fun(char *filename) FILE *fp; int i, j; STU sN, t; fp = fopen(filename, _1_); fread(s, sizeof(STU), N, fp); fclose(fp); for (
19、i=0; i。 21第三处:把已排序的结构数据,重新写入文件,所以应填:fwrite。 * 给定程序MODI1.C中函数fun的功能是: 在字符串的最前端加入 n个*号, 形成新串, 并且覆盖原串。 注意: 字符串的长度最长允许为79。 #include #include void fun ( char s, int n ) char a80 , *p; int i; s=p; for(i=0; i #define N 50 #define M 11 void fun( int *a, int *b) double rnd() static t=29,c=217,m=1024,r=0; r=(
20、r*t+c)%m; return(double)r/m); main() int ageN, i, dM; for(i=0; i 10) bM - 1+ ; else bj+ ; 23 double rnd() static t=29,c=217,m=1024,r=0; r=(r*t+c)%m; return(double)r/m); 第05 套: 给定程序中,函数 fun的功能是将参数给定的字符串、整数、浮点数写到文本 文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof 将 字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 #include #include
21、void fun(char *s, int a, double f) _1_ fp; char str100, str1100, str2100; int a1; double f1; fp = fopen(“file1.txt“, “w“); fprintf(fp, “%s %d %fn“, s, a, f); _2_ ; fp = fopen(“file1.txt“, “r“); fscanf(_3_,“%s%s%s“, str, str1, str2); fclose(fp); a1 = atoi(str1); f1 = atof(str2); printf(“nThe result :
22、nn%s %d %fn“, str, a1, f1); main() char a10=“Hello!“; int b=12345; double c= 98.76; fun(a,b,c); 解题思路: 本题是考察先把给定的数据写入到文本文件中,再从该文件读出并转换成相应的整数、浮24点数显示在屏幕上。 第一处:定义文本文件类型变量,所以应填:FILE *。 第二处:关闭刚写入的文件,所以应填:fclose(fp)。 第三处:从文件中读出数据,所以应填:fp。 * 给定程序MODI1.C中函数fun的功能是: 对N 名学生的学习成绩,按从高到低的顺序找出前m(m10)名学生来, 并将这些学生数
23、据存放在一个动态分配的连续存储区中, 此存储区的首地址作为函数值返回。 #include #include #include #define N 10 typedef struct ss char num10; int s; STU; STU *fun(STU a, int m) STU bN, *t; int i,j,k; t=(STU *)calloc(sizeof(STU),m) for(i=0; i bj.s) j=i; t(k)=b(j); bj.s=0; return t; outresult(STU a, FILE *pf) int i; for(i=0; i10 ) print
24、f(“nGive the number of the students who have better score: “); scanf(“%d“, pOrder=fun(a,m); printf(“* THE RESULT *n“); printf(“The top :n“); for(i=0; i #define N 80 int fun(int a, int n) 26 main() int aN=2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10,i,n=20; printf(“The original data :n“); for(i=0; i d
25、ouble f1(double x) return x*x; double f2(double x, double y) return x*y; _1_ fun(int i, double x, double y) if (i=1) 27return _2_(x); else return _3_(x, y); main() double x1=5, x2=3, r; r = fun(1, x1, x2); r += fun(2, x1, x2); printf(“nx1=%f, x2=%f, x1*x1+x1*x2=%fnn“,x1, x2, r); 解题思路: 本题是根据给定的公式来计算函
26、数的值。 第一处:程序中使用双精度double类型进行计算,所以函数的返回值类型也为double,所以应填:double。 第二处:当i 等于1 时,则返回 f1函数的值,所以应填:f1。 第三处:如果i不等于1 ,则返回 f2函数的值,所以应填:f2。 * 给定程序MODI1.C中函数fun的功能是: 比较两个字符串,将长的那个字符串的首地址作为函数值返回。 #include char fun(char *s, char *t) int sl=0,tl=0; char *ss, *tt; ss=s; tt=t; while(*ss) sl+; (*ss)+; while(*tt) tl+;
27、(*tt)+; if(tlsl) return t; else return s; 28main() char a80,b80,*p,*q; int i; printf(“nEnter a string : “); gets(a); printf(“nEnter a string again : “); gets(b); printf(“nThe longer is :nn“%s“n“,fun(a,b); 第一处: 试题要求返回字符串的首地址,所以应改为:char *fun(char *s,char *t) 第二处: 取字符串指针 ss的下一个位置,所以应改为:ss+;。 第三处:取字符串指针
28、tt的下一个位置,所以应改为: tt+;。 * 请编写函数fun,函数的功能是: 移动字符串中的内容,移动的规则如下: 把第1到第m个字符, 平移到字符串的最后, 把第 m+1到最后的字符移到字符串的前部。 例如, 字符串中原有的内容为: ABCDEFGHIJK, m的值为3, 则移动后, 字符串中的内容应该是: DEFGHIJKABC。 #include #include #define N 80 void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */ int i; char t; t=w0; for(i=0;i typedef struct int
29、num; char name9; char sex; struct int year,month,day ; birthday; float score3; STU; void show(STU _1_) int i; printf(“n%d %s %c %d-%d-%d“, tt.num, tt.name, tt.sex, tt.birthday.year, tt.birthday.month, tt.birthday.day); 30for(i=0; i #define N 20 int fun ( int * a, int n ) int i, m, t, k ; for(i=0;iam) k=m; t=ai;ai=am;am=t; main( ) int x, bN=11,5,12,0,3,6,9,7,10,8, n=10, i; for ( i=0; in; i+ ) printf(“%d “, bi); printf(“n“); fun ( b, n ); for ( i=0; in; i+ ) printf(“%d “, bi); printf(“n“);