《计算机上机实习报告.doc》由会员分享,可在线阅读,更多相关《计算机上机实习报告.doc(14页珍藏版)》请在三一办公上搜索。
1、改错题第1题一、 题目要求 函数fun的功能是:用递归算法计算斐波拉契级数数列中第n项的值。从第l项起,斐波拉契级数序列为1、1、2、3、5、8、13、21、;例如:当给n输入7,该项的斐波拉契级数值为13。#include long fun(int g)/*found*/ switch(g); case 0:return 0;/*found*/ case 1;case 2: return 1; return (fun(g-1)+fun(g-2);main() long fib; int n; printf(input n: ); scanf(%d,&n); printf(n=%dn,n);
2、fib=fun(n); printf(fib=%dnn,fib);二、 错误分析语句swich(g);错误,swich(表达式)后不应该带有“;”,应该为:swich(g)语句case 1;case 2: return 1;错误,case语句常量后应该是“:”,应该为:case:case:return 1;第2题一、题目要求下列给定程序中,函数fun的功能是:将字符串p中的所有字符复制到字符串b中,要求每复制三个字符之后插入一个空格。例如,在调用fun函数之前给字符串a输入ABCDEFGHIJK,调用函数之后,字符串b中的内容则为ABC DEF GHI JK。#include void fun
3、(char *p,char *b) int i,k=0; while(*p)/*found*/ i=1;/*found*/ while(i3 | *p) bk=*p; k+;p+;i+; if(*p)/*found*/ bk= ; bk=0;main() char a80,b80; printf(enter a string ); gets(a); printf(the original string: ); puts(a); fun(a,b); printf(nthe string after insert space: ); puts(b); printf(nn);二、错误分析题目中p是指
4、针型变量作函数参数,因此给bk赋值时出现错误。应改为bk=*p;题目要求赋值3个字符后加一个空格,所以应该是先给bk赋值空格,然后变量k再加1。应改为bk= ;k+第3题一、题目要求下列给定程序中,函数fun的功能是:用冒泡法对6个字符串按由小到大的顺序进行排序。#include #include #define MAXLINE 20fun ( char *pstr6) int i, j ; char *p ; for (i = 0 ; i 5 ; i+ ) for (j = i + 1; j 0) p = *(pstr + i) ;/*found*/ *(pstr + i) = pstr +
5、 j ; *(pstr + j) = p ; main( ) int i ; char *pstr6, str6MAXLINE ; clrscr( ) ; for(i = 0; i 6 ; i+) pstri = stri ; printf( nEnter 6 string(1 string at each line): n ) ; for(i = 0 ; i 6 ; i+) scanf(%s, pstri) ; fun(pstr) ; printf(The strings after sorting:n) ; for(i = 0 ; i 6 ; i+) printf(%sn, pstri)
6、;二、错误分析根据for语句的格式,各表达式之间应用;割开,应该为for (j = i + 1; j 6; j+)根据用指针表示数组元素的方法,*(pstrI)表示pstr所指向数组的第I个元素,同理*(pstrj)表示pstr所指向数组的第j个元素。所以应该为)*(pstr + i) = *(pstr + j) ;第4题一、题目要求下列给定程序中函数fun的功能是:计算正整数num的各位上的数字之积。例如,若输入252,则输出应该是20。若输入202,则输出应该是0。#include #include long fun (long num)/*found*/ long k; do k*=nu
7、m%10;/*found*/ num=10; while(num); return (k);main( ) long n ; clrscr() ; printf(Please enter a number:); scanf(%ld,&n) ; printf(n%ldn,fun(n) ;二、错误分析k用来存放各位数字的积,初始值应为1,应该为long k=1;除号应用/来表示,所以应改为num/=10;第5题一、题目要求下列给定程序中,fun函数的功能是:求出以下分数序列的前n项之和。和值通过函数值返回main()函数。 例如,若n=5,则应输出8.391667。#include #includ
8、e /*found*/fun(n)int n ; int a=2,b=1 ,c,k ; double s=0.0 ; for(k =1;k=n;k+ ) s=s+1.0*a/b ;/*found*/ c=a; a+=b;b+=c; return(s) ;main( ) int n = 5 ; clrscr( ) ; printf( nThe value of function is: %lfn,fun(n) ;二、错误分析由语句return(s)和变量s定义为double数据类型可知,该函数定义时其类型标识符为double类型。所以应该为double fun(int n)注意数据类型doubl
9、e的书写格式。所以应该为s=s+(double)a/b;第6题一、题目要求下列给定程序中,函数fun的功能是:通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。例如变量a中的值原为8,b中的值原为3。程序运行后a中的值为3,b中的值为8。#include #include int fun(int *x,int y) int t;/*found*/ t=x;x=y;/*found*/ return(y);main() int a=3, b=8; clrscr(); printf(%d %dn,a,b); b=fun(&a,b); printf(%d %dn,a,b);二、错误分析变量
10、t作为中间变量,然后进行数据交换,因参数x是指针变量,交换时应使用*x,所以应该为t=*x;*x=y;确定返回值,根据代码bfun(8a,b)可以知道返回值将赋给变量b,而b中应存放交换前*中的值,所以函数应返回变量t,所以应该为return(t);第7题一、题目要求下列给定程序中,函数fun的功能是:求出两个非零正整数的最大公约数,并作为函数值返回。例如,若给numl和num2分别输入49和2l,则输出的最大公约数为7;若给numl和num2分别输入27和81,则输出的最大公约数为27。#include int fun(int a, int b) int r,t; if(ab)/*found
11、*/ t=a;b=a;a=t; r=a%b; while(r!=0) a=b;b=r;r=a%b;/*found*/ return(a); main() int num1,num2,a; printf(input num1 num2: );scanf(%d%d,&num1,&num2); printf(num1=%d num2=%dnn,num1,num2); a=fun(num1,num2); printf(the maximun common divisor is %dnn,a);二、错误分析将a、b的值互换,应先将a的值赋给中间变量t,再将b的值赋给a,最后将t的值赋给b,所以应该为t=
12、a; a=b; b=t;当余数r为0时,除数b即为所求的最大公约数,所以函数应返回b,所以应该为return(b);第8题一、题目要求下列给定程序中函数fun的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为87653142时,t中的数为7531。#include #include void fun (long s, long *t) int d; long sl=1;/*found*/ t = 0; while ( s 0) d = s%10;/*found*/ if (d%2 = 0) *t = d * sl + *t;s
13、l *= 10; s /= 10;main() long s, t; clrscr(); printf(nPlease enter s:); scanf(%ld, &s); fun(s, &t); printf(The result is: %ldn, t);二、错误分析变量t是指针变量,所以对t进行赋初值0是不对的。因为t指向的是存放新数的变量,所以此处应给新数赋初值0,即*t0;变量d表示数s各个位上的数,此处的if条件应为判断d是否为奇数,所以此处应为if (d%2 != 0)第9题一、题目要求下列给定程序中,函数fun的功能是:将一个由八进制数字字符组成的字符串转换为与其面值相等的十进
14、制整数。规定输入的字符串最多只能包含5位8进制数字。例如,若输入77777,则输出将是32767。#include int fun(char *p) int n;/*found*/ n=*p-o; p+; while(*p!=0)/*found*/ n=n*7+*p-o; p+; return n; main() char s6; int i; int n; printf(enter a string(ocatal digits):); gets(s); if(strlen(s)5)printf(error: string too longer!nn); exit(0); for(i=0;si
15、;i+) if(si7) printf(error:%c not is ocatal digits!nn,si); exit(0); printf(the original string:); puts(s); n=fun(s); printf(n%s is convered to integer number: %dnn,s,n);二、错误分析0和1是字符串中的数字字符,为了进行数字运算,必须要将数字字符转换为数字,用数字字符减去字符0的ASCII码,就得到对应的数字。题中给出的是o,不是0,所以此处为n= *P-0;要在一个八进制数的最后加上一位,原来各个位上的数上升一位,只需将原数乘以8
16、再加上个位数,所以此处为n=n*8+*P-0;第10题一、题目要求 下列给定程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。k的值由主函数传入,若k的值为500,则函数值为4622。#include #include int fun( int k ) int m=0,mc=0,j,n; while(k =2) & (mc10) /*found*/ if(k%13=0) | (k%17 =0) m = m+ k; mc+; k-; return m;/*found*/_main ( ) printf(%dn,fun (500); 二、错误分析if(k%13
17、=0) | (k%17 =0)目的是判断K能否整除13或17而“=”是赋值号应该改为:if(k%13=0) | (k%17=0) “_”应该改为“”填空题第1题一、 题目要求 函数fun的功能是:把形参a所指数组中的最小值放在元素a0中,接着把形参a所指数组中的最大值放在a1中,再把a所指数组中的次小值放在a2中,把a所指数组中的次大值放在a3;其余依此类推。例如:若a所指数组中的数据最初排列为:9、l、4、2、3、6、5、8、7,则按规则移动后,数据排列为1、9、2、8、3、7、4、6、5,形参n中存放a所指数组中数据的个数。#include #define N 9void fun(int
18、a, int n) int i,j, max, min, px, pn, t; for (i=0; in-1; i+=2) /*found*/ max = min = _1_; px = pn = i; for (j=i+1; jn; j+) /*found*/ if (max_3_) min = aj; pn = j; if (pn != i) t = ai; ai = min; apn = t; if (px = i) px =pn; if (px != i+1) t = ai+1; ai+1 = max; apx = t; main() int bN=9,1,4,2,3,6,5,8,7,
19、 i; printf(nThe original data :n); for (i=0; iN; i+) printf(%4d , bi); printf(n); fun(b, N); printf(nThe data after moving :n); for (i=0; iN; i+) printf(%4d , bi); printf(n);二、算法分析 本程序完成的功能是找出指定数组中的最小值和最大值依次放入a0、a1中,再依次找出剩余数中的最小和最大值放入数组,从而得到一个新数组。for循环语句循环体中对max和min赋值,第一个空白处应为:“_ai_”。通过一次for循环,找到数组中
20、的最大值,第二个空白处应为:“_aj_”。通过一次for循环,找到数组中的最小值,第三个空白处应为:“_aj_”。第2题一、 题目要求函数fun的功能是进行数字字符转换。若形参ch中是数字字符09,则0转换成9,1转换成8,2转换成7, 9转换成0;若是其它字符则保持不变;并将转换后的结果作为函数值返回。#include /*found*/_1_ fun(char ch)/*found*/ if (ch=0 & _2_)/*found*/ return 9- (ch-_3_); return ch ;main() char c1, c2; printf(nThe result :n); c1=
21、2; c2 = fun(c1); printf(c1=%c c2=%cn, c1, c2); c1=8; c2 = fun(c1); printf(c1=%c c2=%cn, c1, c2); c1=a; c2 = fun(c1); printf(c1=%c c2=%cn, c1, c2);二、算法分析 本程序完成的功能是进行数字字符转换。对函数fun()的定义,函数名前是返回值的数据类型,第一个空白处应为:“_char_”。判断ch是否是数字字符,第二个空白处应为:“_ch=9_”。进行数字字符的转换,第三个空白处应为:“_0_”。第3题一、题目要求给定程序中,函数fun的功能是:求ss所指
22、字符串数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长N。#include #include #define M 5#define N 20int fun(char (*ss)N, int *n) int i, k=0, len= N;/*found*/ for(i=0; i_1_; i+) len=strlen(ssi); if(i=0) *n=len;/*found*/ if(len _2_ *n) *n=len; k=i; /*found*/ return(_3_);main()char ssMN=shangh
23、ai,guangzhou,beijing,tianjing,chongqing; int n,k,i; printf(nThe original strings are :n); for(i=0;iM;i+)puts(ssi); k=fun(ss,&n); printf(nThe length of shortest string is : %dn,n); printf(nThe shortest string is : %sn,ssk);二、算法分析本函数的功能是求一字符串数组中长度最长的字符串所在的行下标,并作为函数值返回。ss所指字符串数组中共有M个字符串,所以第一个空白处为:“_M_”
24、。求长度最短的字符串,*n中存放的是已知字符串中长度最短的字符串的长度,这里将当前字符串长度与*n比较,若小于*n,则将该长度值赋给*n,因此第二处空白为:“_”。将最短字符串的行下标作为函数值返回,变量k储存行下标的值,所以第三处空白为:“_k_”。第4题一、题目要求给定程序中,函数fun的功能是:将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序。例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:defadhkjsdf3537。#include void fun(char *s) int i, j=0, k=0; cha
25、r t180, t280; for(i=0; si!=0; i+) if(si=0 & si=9) /*found*/ t2j=si; _1_; else t1k+=si; t2j=0; t1k=0;/*found*/ for(i=0; ik; i+) _2_;/*found*/ for(i=0; i_3_; i+) sk+i=t2i;main() char s80=ba3a54j7sd567sdffs; printf(nThe original string is : %sn,s); fun(s); printf(nThe result is : %sn,s);二、算法分析本程序的功能是将一
26、数组中所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序。根据函数fun中的内容可知,数组t1存储了s中的非数字字符,数组t2存储了s中的数字字符,为了存储下一个数字字符,下标j要进行加1操作,所以第一个空白处应为:“_i+_”。将s串中的数字与非数字字符分开后,要先将非数字字符放入字符串s中,所以第二个空白处应为:“_si=t1i_”。最后要将数字字符加到s串之后,并且i要小于数字的个数j,所以第四处空白应为: “_j_”。第5题一、题目要求给定程序的功能是将既在字符串s中出现、又在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串
27、中字符顺序排列,但去掉重复字符。例如,当s=“122345”,t=“2467”时,u中的字符串为:“24”。#include #include void fun (char *s, char *t, char *u) int i, j, sl, tl, k, ul=0; sl = strlen(s); tl = strlen(t); for (i=0; isl; i+) for (j=0; jtl; j+) if (si = tj) break; if(jtl) for (k=0; k=ul)/*found*/ uul+=_2_ ; /*found*/ _3_ = 0;main() char
28、s100, t100, u100; printf(nPlease enter string s:); scanf(%s, s); printf(nPlease enter string t:); scanf(%s, t); fun(s, t, u); printf(The result is: %sn, u);二、算法分析程序的功能是将既在字符串s中出现、又在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,但去掉重复字符。重复字符时结束本次循环,去掉重复字符。第一个空白处应为:“_=_”。既在字符串s中出现、又在字符串t中出现的字符si赋给uul+第二个空白处
29、应为:“_si_”。为u添加字符串结束标志。第三个空白处应为:“_uul_”。 第6题一、题目要求给定程序中,函数fun的功能是;统计形参s所指字符串中数字字符出现的次数,并存放在形参t所指的变量中,最后在主函数中输出。例如,形参s所指的字符串为:abcdef35adgh3kjsdf7。输出结呆为;4。#include void fun(char *s, int *t) int i, n; n=0;/*found*/ for(i=0; _1_ !=NULL; i+)/*found*/ if(si=0&si= _2_ ) n+;/*found*/ _3_ ;main() char s80=abc
30、def35adgh3kjsdf7; int t; printf(nThe original string is : %sn,s); fun(s,&t); printf(nThe result is : %dn,t);二、算法分析统计某一形参所指的字符串中数字字符出现的次数。通过for循环语句,来判断是否到字符串结尾,变量i用来存放字符串数组下标,则第一个空白处应为: “_si_”。根据题目要求此处为判断数字字符,所以第二个空白处应为: “_9_”。将数字字符个数存入变量t中,所以第三个空白处应为: “_*t=n_”。第7题一、题目要求函数fun的功能是;把形参a所指数组中的奇数按原顺序依次存放
31、到aO、a1、a2、中,把偶数从数组中删除,奇数个数通过函数值返回。例如:若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除偶数后a所指数组中的数据为:9、1、3、5、7,返回值为5。#include #define N 9int fun(int a, int n) int i,j; j = 0; for (i=0; in; i+)/*found*/ if (ai%2=_1_) /*found*/ aj = ai; _2_; /*found*/ return _3_;main() int bN=9,1,4,2,3,6,5,8,7, i, n; printf(nThe or
32、iginal data :n); for (i=0; iN; i+) printf(%4d , bi); printf(n); n = fun(b, N); printf(nThe number of odd : %d n, n); printf(nThe odd number :n); for (i=0; in; i+) printf(%4d , bi); printf(n);二、算法分析本题考查:if语句条件表达式;自增/自减运算符;函数返回值。进行奇偶数的判定,可以通过if条件语句来判断数组元素是否是奇数,如果元素不能被2整除,则为奇数,所以第一个空白处应为: “_if (ai%21)_
33、”。将为奇数的元素重新存放到数组的前面,同时下标增1, 所以第二个空白处应为: “_9_”。函数返回值需要返回数组中奇数的个数,因此返回变量j, 所以第二个空白处应为: “_j_”。第8题一、题目要求函数fun的功能是:逆置数组元素中的值。例如:若a所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则逆置后依次为:9、8、7、6、5、4、3、2、1。形参n给出数组中数据的个数。#include void fun(int a, int n) int i,t;/*found*/ for (i=0; i_1_; i+) t=ai;/*found*/ ai = an-1-_2_;/*foun
34、d*/ _3_ = t; main() int b9=1,2,3,4,5,6,7,8,9, i; printf(nThe original data :n); for (i=0; i9; i+) printf(%4d , bi); printf(n); fun(b, 9); printf(nThe data after invert :n); for (i=0; i9; i+) printf(%4d , bi); printf(n);二、算法分析本题主要考查for循环语句以及变量交换算法。逆置数组元素中的值,将a0与an1对换位置,依此类推,那么需要对换n/2次,所以第一个空白处应为: “_n
35、/2_”。将a0与an1对换位置,a1与an2对换位置,依次类推,则aian1i, 所以第一个空白处应为: “_i_”。普通的调换位置程序,显然填入ani1, 所以第一个空白处应为: “_an1i_”。第9题一、题目要求给定程序的功能是;调用函数fun将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值是1,失败时返回值为0。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中,目标文件名放在变量tfname中。 #include #include int fun(char *source, char *target) FILE *fs,*ft; char ch;/*found*/ if(fs=fopen(source, _1_)=NULL) return 0; if(ft=fopen(target, w)=NULL) return 0; printf(nThe data in file :n); ch=fgetc(fs);/*found*/ while(!feof(_2_) putchar( ch );/*found*