2022年程序设计方案基础学习课程设计方案.docx
精选学习资料 - - - - - - - - - 程序设计基础课程设计试验报告班级: 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<stdio.h> #include<stdlib.h> #include<string.h> #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" ; iffp1=fopen"num1.text","w"=NULL/ 建立文本文件 ; printf"cannot open the file." exit0 ; fori=0 ; i<N ; i+/ 输入字符并写入文件 getsstr1i ; fputsstr1i,fp1 ; fputs"n",fp1 ; printf"n" ; printf"Please enter the second text B:n" ; iffp2=fopen"num2.text","w"=0/ 名师归纳总结 - - - - - - -第 1 页,共 13 页精选学习资料 - - - - - - - - - printf"cannot open the file.n"; exit0 ; fori=0 ; i<N ; i+ getsstr2i ; fputsstr2i,fp2 ; fputs"n",fp2 ; fclosefp1 ; fclosefp2 ; fp1=fopen"num1.text","r";/打开文件 fp2=fopen"num2.text","r"; fori=0 ; i<N ; i+/ 对两个文件中的字符进行行比较 fgetsstr1i,80,fp1 ; fgetsstr2i,80,fp2 ; ifstrcmpstr1i,str2i.=0 k=i ; flag=1 ; break; ifflag/ 假如存在不同行 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"; fclosefp1 ; /关闭文件 fclosefp2 ; 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<stdio.h> #include<stdlib.h> #include<string.h> #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"; fori=0; i<N ; i+ scanf"%s%lf",stu0i.name,&stu0i.score; fwrite&stu0i,sizeofstruct Student,1,fp1 存入文件 ;/ 读取结构体中的一元素名师归纳总结 - - - - - - -第 3 页,共 13 页精选学习资料 - - - - - - - - - printf"nPlease input db2.txt:n"; fp2=fopen"db2","w"; fori=0; i<N ; i+ scanf"%s%lf",stu1i.name,&stu1i.score; fwrite&stu1i,sizeofstruct Student,1,fp2; fp1=fopen"db1.txt","r"; / 打开文件,只写 fp2=fopen"db2,txt","r"; fori=0; i<N ; i+ fread&stu0i,sizeofstruct Student,1,fp1; forj=0; j<N ; j+ fread&stu1j,sizeofstruct Student,1,fp2; ifstrcmpstu0i.name,stu1j.name=0 flag=1; strcpystu1k.name,stu1i.name stu1k.score0=stu0i.score; stu1k.score1=stu1j.score; stu1k.score2=stu1k.score0+stu1k.score1/2 k+; printf"n"; / 输出 ifflag fp3=fopen"db3.txt","w"; printf"Names Maths English Averagen"; fori=0; i<k ; i+ fwrite&stu1i,sizeofstruct Student1,1,fp3; printf"%s ",stu1i.name; forj=0; j<3 ; j+ printf"%10.2f",stu1i.scorej printf"n"; fclosefp3; else 名师归纳总结 - - - - - - -第 4 页,共 13 页精选学习资料 - - - - - - - - - printf"Maybe the lists are taken by mistake.n"; fclosefp1; fclosefp2; return 0 测试数据:第 2_2 题:统计一个英文文本文件中 26 个英文字母显现次数并按英文字母序输出统计结果,查找并替换此英文文本文件中某字符串;算法描述 : 建立文本文件并输入数据(二维字符数组的形式),储备于文件,打开文件读出字符!用 个英文字符与从文件读出的文件比较,建立累加器对每个字母显现的次数赋值!源程序:no2_2.c #include<stdio.h> #include<ctype.h> #include<string.h> #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";/建立文件并写入数据 fori=0 ; i<N ; i+ getsstri ; fputsstri,fp1 ; fputs"n",fp1 ; printf"n" ; /打开文件并读出数据; fp2=fopen"num1","r" fori=0 ; i<N ; i+ ; fgetsstri,80,fp2 ;名师归纳总结 - - - - - - -第 5 页,共 13 页精选学习资料 - - - - - - - - - printf"The showing times of letters:n"; forch='a',k=1 ; ch<='z'; ch+ cout=0; fori=0 ; i<N ; i+ forj=0 ; j<strlenstri ; j+ ifisalphastrij ;/大写转化小写 c=tolowerstrij ifch=c cout+ ; ifcout printf"%c: %2d ",ch,cout; k+ ; ifk%4=0 printf"n" ; /查找并替换字符串 my->my printf"nThe adverted article:n"; fori=0 ; i<N ; i+ forj=0 ; j<strlenstri ; j+ ifstrij='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<stdio.h> #include<string.h>/ 为 strlen 函数供应原型 #include<math.h>/ 为 pow 函数供应原型 int main char str10; int i,sum=0; printf"Please input binary number:n"; getsstr; fori=0;i<strlenstr;i+ sum+=stri-'0'*pow2,i;/ 运算每个位上的字符再加和 printf"The decimal number is:n "; printf"%dn",sum;/ 输出所对应的十进制数 return 0; 测试数据:第 3_2 题:设计一个复数类型,输入实部和虚部生成一个复数,可进行两个复数求和、两个复数求 差、两个复数求积运算;算法描述:复数分为实部和虚部,因此一个复数的输入是要分两部分的,输出也是,输出时在虚部后 加 i. 源程序:no3_2.c 名师归纳总结 - - - - - - -第 7 页,共 13 页精选学习资料 - - - - - - - - - #include<stdio.h> 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"n1calculate the sumn2calculate the diffn3calculate the productn"; printf"Please choose 1,2 or 3:q to quit:n";/ 挑选模式 getchar; whilech=getchar.='q'/ 循环 whilegetchar.='n'; switchch case'1': printf"%d+%din",a+c,b+d; break; case'2': ifb-d>=0 printf"%d+%din",a-c,b-d; else printf"%d%din",a-c,b-d; break; case'3': 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<stdio.h> #include<math.h> #define N 20 int main void to_base_nlong long n, unsigned int base ; int aN,i=0,j,k,m; char ch; long long n=0; printf" 请输入数字( #终止) :n"; printf"n" whilescanf"%d",&ai=1 i+; j=i-1; i<=j; i+ fori=0 fork=j; k>=0 ; k- n+=ai*pow10,k; printf"n转换过后的等值二进制数:n" ; printf"n"; to_base_nn,2; printf"n"; return 0; void to_base_nlong long n, unsigned int base/ 进制转换超级函数 int r; r = n % base; if n >= base 名师归纳总结 to_base_nn / 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<stdio.h> int main int n,sum,a10; int i,cout=0; printf" 请输入数字 N: " ; scanf"%d",&n; printf"n 数据链 :n"; whilen.=1 printf"%d->",n; sum=0; i=0; whilen>0/ 对每次的各位数字平方和再拆 ai=n%10; ifa0=1 cout+;/ 统计末尾数字为1 的计数器 sum+=ai*ai; n=n/10 i+; 名师归纳总结 - - - - - - -第 10 页,共 13 页精选学习资料 - - - - - - - - - n=sum; printf"%dn",1;1 的数字个数 :n"; printf"n数据链末尾数字为 printf"%dn",cout; return 0; 测试数据:第 5_1 题:程序自动生成一个位于 99 内的随机数,要求用户猜这个数;用户输入一个数后,程序有三种应答: too big,too small,you win ;算法描述:播下产生随机数的种子,随时间不同每次生成的随机数不同,用户依据提示进行猜数游戏;源程序:no5_1.c #include<stdio.h> #include<stdlib.h>/ 为 rand 函数供应原型#include<time.h>/ 为种子供应原型int main int n,m; printf"Ready. Let's go.nInput the correct number you thought:n"; scanf"%d",&n; srandtimeNULL; / 种子 m=rand%100; whilen.=m/ 猜数进行时的提示 ifn>m printf"Too big. Come on,do't 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;第 11 页,共 13 页 return 0;- - - - - - -精选学习资料 - - - - - - - - - 测试数据:第 5_2 题:产生一组随机数,要求每个数字不能重复;例如:1,20,3,17, 80,4, 35,88 符合要求, 3 ,20,1,17,80, 3,35, 88 不符合要求算法描述:Rand 函数一次只能产生一个随机数,于是使用循环结构让其多产生几个随机数,为了对随机数是否重复进行判定,将产生的随机数存放在数组中;源程序:no5_2.c #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 10 int main int aN,n,i,j,k; int flag=1; n=N; srandtimeNULL; whileflag fori=0; i<n ; i+/ 多次产生随机数并存到数组; ai=rand%100 fori=0; i<n ; i+ forj=0; j<n ; j+ 产生 名师归纳总结 - - - - - - -第 12 页,共 13 页精选学习资料 - - - - - - - - - if.flag flag=1; else flag=0;产生的不重复的随机数:n" ; printf" printf"n"; fori=0,k=1; i<n ; i+,k+ printf"%-4d",ai; ifk%10=0 printf"n"; return 0; 测试数据:名师归纳总结 - - - - - - -第 13 页,共 13 页