2022年程序设计方案基础学习课程设计方案 .pdf
程序设计基础课程设计实验报告班级: 1403013 姓名:熊清锋学号: 14030130063 所选题目: 1_1, 1_3, 2_2, 3_1, 3_2 ,3_3, 3_4, 5_1, 5_2, 第 1_1 题:比较两个文本文件并打印出它们第一个不相同的行(文件每行字符数不多于80)。算法描述 : 定义两个不同的指针,建立两个不同的文本文件并存入字符;打开文本文件并一行一行的比较,定义一个计数器,若发现了不同行,立即跳出循环,分别打印两个不同文件中计数器所指的行;源程序:no1_1.c #include #include #include #define N 5/ 文件中字符的行数int main() FILE *fp1,*fp2。/文件指针 char str1N80,str2N80。 char AN80,BN80。 int i,k,flag=0 。 printf(Please enter the first text A:n) 。 if(fp1=fopen(num1.text,w)=NULL)/建立文本文件 printf(cannot open the file!)。 exit(0) 。 for(i=0 。 iN。 i+)/ 输入字符并写入文件 gets(str1i) 。 fputs(str1i,fp1) 。 fputs(n,fp1) 。 printf(n) 。 printf(Please enter the second text B:n) 。 if(fp2=fopen(num2.text,w)=0)/ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 13 页 printf(cannot open the file!n)。 exit(0) 。 for(i=0 。 iN。 i+) gets(str2i) 。 fputs(str2i,fp2) 。 fputs(n,fp2) 。 fclose(fp1) 。 fclose(fp2) 。 fp1=fopen(num1.text,r)。/打开文件 fp2=fopen(num2.text,r)。 for(i=0 。 iN。 i+)/ 对两个文件中的字符进行行比较 fgets(str1i,80,fp1) 。 fgets(str2i,80,fp2) 。 if(strcmp(str1i,str2i)!=0) k=i 。 flag=1 。 break。 if(flag)/ 如果存在不同行 printf(nThe first different row between A and B:n)。/分别输出不同行 printf(A: %sn,str1k)。 printf(B: %sn,str2k)。 else printf(The two text have the same contents!n)。 fclose(fp1) 。 /关闭文件 fclose(fp2) 。 return 0。 测试数据:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 13 页第 1_3 题: 现有两个文本文件db1.txt和 db2.txt。 db1.txt中第一列为姓名,第二列为英语成绩;db2.txt中第一列为姓名,第二列为数学成绩。通过姓名字段将db1.txt文件关联到db2.txt文件生成db3.txt文件。 db3.txt文件第一列为姓名,第二列为英语成绩,第三列为数学成绩,第四列为平均成绩算法描述:定义三个文件指针,输入数据分别存在两个文件文本,输入时用结构存储数字和字符的混合输入;打开文件,对文件中的结构体存储的字符比较遇到两个文件中相同的name ,将两个文件对应该name的内容整合,写到第三个文件中,并在屏幕输出文件内容。源程序:no1_3.c #include #include #include #define N 1 struct Student/定义前两个文件内容的结构体,结构体元素是姓名和分数 char name10。 double score。struct Student1/定义第三个文件内容的结构体,元素是姓名和分数数组(含三个元素) char name10。 double score3。int main() FILE *fp1,*fp2,*fp3。 struct Student stu2N。 / 定义二维结构体数组 struct Student1 stu1N。 int i,j,k=0。 int flag=0。 /输入 printf(Please input db1.txt:n)。 fp1=fopen(db1.txt,w)。 for(i=0。 iN 。 i+) scanf(%s%lf,stu0i.name,&stu0i.score)。 fwrite(&stu0i,sizeof(struct Student),1,fp1)。/ 读取结构体中的一元素存入文件 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 13 页 printf(nPlease input db2.txt:n)。 fp2=fopen(db2,w)。 for(i=0。 iN 。 i+) scanf(%s%lf,stu1i.name,&stu1i.score)。 fwrite(&stu1i,sizeof(struct Student),1,fp2)。 fp1=fopen(db1.txt,r)。 / 打开文件,只写 fp2=fopen(db2,txt,r)。 for(i=0。 iN 。 i+) fread(&stu0i,sizeof(struct Student),1,fp1)。 for(j=0。 jN 。 j+) fread(&stu1j,sizeof(struct Student),1,fp2)。 if(strcmp(stu0i.name,stu1j.name)=0) flag=1。 strcpy(stu1k.name,stu1i.name)。 stu1k.score0=stu0i.score。 stu1k.score1=stu1j.score。 stu1k.score2=(stu1k.score0+stu1k.score1)/2。 k+。 printf(n)。 /输出 if(flag) fp3=fopen(db3.txt,w)。 printf(Names Maths English Averagen)。 for(i=0。 ik 。 i+) fwrite(&stu1i,sizeof(struct Student1),1,fp3)。 printf(%s ,stu1i.name)。 for(j=0。 j3 。 j+) printf(%10.2f,stu1i.scorej)。 printf(n)。 fclose(fp3)。 else 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 13 页 printf(Maybe the lists are taken by mistake!n)。 fclose(fp1)。 fclose(fp2)。 return 0。 测试数据:第 2_2 题:统计一个英文文本文件中26 个英文字母出现次数并按英文字母序输出统计结果,查找并替换此英文文本文件中某字符串。算法描述 : 建立文本文件并输入数据(二维字符数组的形式),存储于文件,打开文件读出字符!用个英文字符与从文件读出的文件比较,建立累加器对每个字母出现的次数赋值!源程序:no2_2.c #include #include #include #define N 2 int main() FILE *fp1,*fp2。 int i,j,k,cout 。 char strN80,ch,c 。 printf(Please input file_num1:n)。 fp1=fopen(num1,w)。/建立文件并写入数据 for(i=0 。 iN。 i+) gets(stri) 。 fputs(stri,fp1) 。 fputs(n,fp1) 。 printf(n) 。 /打开文件并读出数据 fp2=fopen(num1,r)。 for(i=0 。 iN。 i+)。 fgets(stri,80,fp2) 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 13 页 printf(The showing times of letters:n)。 for(ch=a,k=1 。 ch=z。 ch+) cout=0。 for(i=0 。 iN。 i+) for(j=0 。 jmy printf(nThe adverted article:n)。 for(i=0 。 iN。 i+) for(j=0 。 jstrlen(stri) 。 j+) if(strij=m&strij+1=y) strij+1=e 。 printf(%sn,stri)。 return 0。 测试数据:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 13 页第 3_1 题:将输入的2 进制字符串转换为10 进制数输出。算法描述:输入二进制的字符串,每个字符减去0 字符就是他们的十进制数值,在乘以2的 n-1 次方,再加和!源程序:no3_1.c #include #include/为 strlen函数提供原型#include/为 pow函数提供原型int main() char str10。 int i,sum=0。 printf(Please input binary number:n)。 gets(str)。 for(i=0。istrlen(str)。i+) sum+=(stri-0)*pow(2,i)。/ 计算每个位上的字符再加和 printf(The decimal number is:n )。 printf(%dn,sum)。/ 输出所对应的十进制数 return 0。 测试数据:第 3_2 题:设计一个复数类型,输入实部和虚部生成一个复数,可进行两个复数求和、两个复数求差、两个复数求积运算。算法描述:复数分为实部和虚部,因此一个复数的输入是要分两部分的,输出也是,输出时在虚部后加 i. 源程序:no3_2.c 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 13 页#include int main() int a,b,c,d。 char ch。 printf(Please enter two complex numbers:n)。 scanf(%d%d%d%d,&a,&b,&c,&d)。 printf(n1)calculate the sumn2)calculate the diffn3)calculate the productn)。 printf(Please choose 1,2 or 3:(q to quit):n)。/ 选择模式 getchar()。 while(ch=getchar()!=q)/循环 while(getchar()!=n)。 switch(ch) case1: printf(%d+%din,a+c,b+d)。 break。 case2: if(b-d=0) printf(%d+%din,a-c,b-d)。 else printf(%d%din,a-c,b-d)。 break。 case3: printf(%d+%din,a*c-b*d,a*d+b*c)。 break。 default: break。 return 0。 测试数据:第 3_3 题:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 13 页用一个整型数组表示10 进制大整数,数组的每个元素存储大整数的一位数字,将这个大整数转换为2 进制数输出。算法描述:存入大整数时,将数值的各个位上的数分离存到数组中。因为整数数值大,一定注意了溢出,在计算时,再用数组下标与数值各个位上的关系,整合再输出所对应的二进制数!源程序:No3_3.c #include #include #define N 20 int main() void to_base_n(long long n, unsigned int base) 。 int aN,i=0,j,k,m。 char ch。 long long n=0。 printf(请输入数字(#结束) :n)。 printf(n)。 while(scanf(%d,&ai)=1) i+。 j=i-1。 for(i=0。 i=0 。 k-) n+=ai*pow(10,k)。 printf(n转换过后的等值二进制数:n) 。 printf(n)。 to_base_n(n,2)。 printf(n)。 return 0。 void to_base_n(long long n, unsigned int base)/进制转换超级函数 int r。 r = n % base。 if (n = base) to_base_n(n / base, base)。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 13 页 putchar(0 + r)。 return。 测试数据:第 3_4 题:根据输入的数字N,计算 N以内(包括N )数据链并统计数据链末尾数字是1 的数据个数。例如 N=44 ,则数字链为:44-32-13-10-1,其规则为: 4*4+4*4=32 ,3*3+2*2=13 ,1*1+3*3=10 ,1*1+0*0=1 。算法描述:对输入数字进行各个位拆分并计算各个位上数字的平方和,每计算一次的和与1 进行比较,知道等于1 时程序结束。源程序:no3_4.c #include int main() int n,sum,a10。 int i,cout=0。 printf(请输入数字 N: ) 。 scanf(%d,&n)。 printf(n数据链 :n)。 while(n!=1) printf(%d-,n)。 sum=0。 i=0。 while(n0)/对每次的各位数字平方和再拆 ai=n%10。 if(a0=1) cout+。/ 统计末尾数字为1 的计数器 sum+=ai*ai。 n=n/10。 i+。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 13 页 n=sum。 printf(%dn,1)。 printf(n数据链末尾数字为1 的数字个数 :n)。 printf(%dn,cout)。 return 0。 测试数据:第 5_1 题:程序自动生成一个位于99 内的随机数,要求用户猜这个数。用户输入一个数后,程序有三种应答: too big,too small,you win 。算法描述:播下产生随机数的种子,随时间不同每次生成的随机数不同,用户根据提示进行猜数游戏。源程序:no5_1.c #include #include/为 rand 函数提供原型#include/为种子提供原型int main() int n,m。 printf(Ready? Lets go!nInput the correct number you thought:n)。 scanf(%d,&n)。 srand(time(NULL)。 / 种子 m=rand()%100。 while(n!=m)/猜数进行时的提示 if(nm) printf(Too big! Come on,dot give up!n)。 else printf(Too small! Why are you so silly!n)。 printf(Try again:n)。 scanf(%d,&n)。 printf(%c%c You win! You are so smart!n,1,1)。 return 0。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 13 页 测试数据:第 5_2 题:产生一组随机数,要求每个数字不能重复。例如:1,20,3,17, 80,4, 35,88 符合要求, 3 ,20,1,17,80, 3,35, 88 不符合要求算法描述:Rand 函数一次只能产生一个随机数,于是使用循环结构让其多产生几个随机数,为了对随机数是否重复进行判断,将产生的随机数存放在数组中。源程序:no5_2.c #include #include #include #define N 10 int main() int aN,n,i,j,k。 int flag=1。 n=N。 srand(time(NULL)。 while(flag) for(i=0。 in 。 i+)/多次产生随机数并存到数组 ai=rand()%100。 for(i=0。 in 。 i+) for(j=0。 jn 。 j+) if(ai=aj&i!=j)/判断的数组中是否有重复数字,若有,就重新产生 flag=0。 break。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 13 页 if(!flag) flag=1。 else flag=0。 printf(产生的不重复的随机数:n) 。 printf(n)。 for(i=0,k=1。 in 。 i+,k+) printf(%-4d,ai)。 if(k%10=0) printf(n)。 return 0。 测试数据:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 13 页