程序设计基础课程设计.docx
《程序设计基础课程设计.docx》由会员分享,可在线阅读,更多相关《程序设计基础课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
程序设计基础课程设计
《程序设计基础课程设计》实验报告
班级:
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
#defineN5//文件中字符的行数
intmain()
{
FILE*fp1,*fp2;//文件指针
charstr1[N][80],str2[N][80];
charA[N][80],B[N][80];
inti,k,flag=0;
printf("PleaseenterthefirsttextA:
\n");
if(fp1=fopen("num1.text","w")==NULL)//建立文本文件
{
printf("cannotopenthefile!
");
exit(0);
}
for(i=0;i{
gets(str1[i]);
fputs(str1[i],fp1);
fputs("\n",fp1);
}
printf("\n");
printf("PleaseenterthesecondtextB:
\n");
if(fp2=fopen("num2.text","w")==0)//
{
printf("cannotopenthefile!
\n");
exit(0);
}
for(i=0;i{
gets(str2[i]);
fputs(str2[i],fp2);
fputs("\n",fp2);
}
fclose(fp1);
fclose(fp2);
fp1=fopen("num1.text","r");//打开文件
fp2=fopen("num2.text","r");
for(i=0;i{
fgets(str1[i],80,fp1);
fgets(str2[i],80,fp2);
if(strcmp(str1[i],str2[i])!
=0)
{
k=i;
flag=1;
break;
}
}
if(flag)//如果存在不同行
{
printf("\nThefirstdifferentrowbetweenAandB:
\n");//分别输出不同行
printf("A:
%s\n",str1[k]);
printf("B:
%s\n",str2[k]);
}
else
printf("Thetwotexthavethesamecontents!
!
\n");
fclose(fp1);//关闭文件
fclose(fp2);
return0;
}
测试数据:
第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
#defineN1
structStudent//定义前两个文件内容的结构体,结构体元素是姓名和分数
{
charname[10];
doublescore;
};
structStudent1//定义第三个文件内容的结构体,元素是姓名和分数数组(含三个元素)
{
charname[10];
doublescore[3];
};
intmain()
{
FILE*fp1,*fp2,*fp3;
structStudentstu[2][N];//定义二维结构体数组
structStudent1stu1[N];
inti,j,k=0;
intflag=0;
//输入
printf("Pleaseinputdb1.txt:
\n");
fp1=fopen("db1.txt","w");
for(i=0;i{
scanf("%s%lf",stu[0][i].name,&stu[0][i].score);
fwrite(&stu[0][i],sizeof(structStudent),1,fp1);//读取结构体中的一元素存入文件
}
printf("\nPleaseinputdb2.txt:
\n");
fp2=fopen("db2","w");
for(i=0;i{
scanf("%s%lf",stu[1][i].name,&stu[1][i].score);
fwrite(&stu[1][i],sizeof(structStudent),1,fp2);
}
fp1=fopen("db1.txt","r");//打开文件,只写
fp2=fopen("db2,txt","r");
for(i=0;i{
fread(&stu[0][i],sizeof(structStudent),1,fp1);
for(j=0;j{
fread(&stu[1][j],sizeof(structStudent),1,fp2);
if(strcmp(stu[0][i].name,stu[1][j].name)==0)
{
flag=1;
strcpy(stu1[k].name,stu[1][i].name);
stu1[k].score[0]=stu[0][i].score;
stu1[k].score[1]=stu[1][j].score;
stu1[k].score[2]=(stu1[k].score[0]+stu1[k].score[1])/2;
k++;
}
}
}
printf("\n");
//输出
if(flag)
{
fp3=fopen("db3.txt","w");
printf("NamesMathsEnglishAverage\n");
for(i=0;i{
fwrite(&stu1[i],sizeof(structStudent1),1,fp3);
printf("%s",stu1[i].name);
for(j=0;j<3;j++)
printf("%10.2f",stu1[i].score[j]);
printf("\n");
}
fclose(fp3);
}
else
printf("Maybethelistsaretakenbymistake!
!
\n");
fclose(fp1);
fclose(fp2);
return0;
}
测试数据:
第2_2题:
统计一个英文文本文件中26个英文字母出现次数并按英文字母序输出统计结果,查找并替换此英文文本文件中某字符串。
算法描述:
建立文本文件并输入数据(二维字符数组的形式),存储于文件,打开文件读出字符!
!
用
个英文字符与从文件读出的文件比较,建立累加器对每个字母出现的次数赋值!
源程序:
no2_2.c
#include
#include
#include
#defineN2
intmain()
{
FILE*fp1,*fp2;
inti,j,k,cout;
charstr[N][80],ch,c;
printf("Pleaseinputfile_num1:
\n");
fp1=fopen("num1","w");//建立文件并写入数据
for(i=0;i{
gets(str[i]);
fputs(str[i],fp1);
fputs("\n",fp1);
}
printf("\n");
//打开文件并读出数据
fp2=fopen("num1","r");
for(i=0;ifgets(str[i],80,fp2);
printf("Theshowingtimesofletters:
\n");
for(ch='a',k=1;ch<='z';ch++)
{
cout=0;
for(i=0;i{
for(j=0;j{
if(isalpha(str[i][j]))
{
c=tolower(str[i][j]);//大写转化小写
if(ch==c)
cout++;
}
}
}
if(cout)
{
printf("%c:
%2d",ch,cout);
k++;
if(k%4==0)
printf("\n");
}
}
//查找并替换字符串my->my
printf("\nTheadvertedarticle:
\n");
for(i=0;i{
for(j=0;j{
if(str[i][j]=='m'&&str[i][j+1]=='y')
str[i][j+1]='e';
}
printf("%s\n",str[i]);
}
return0;
}
测试数据:
第3_1题:
将输入的2进制字符串转换为10进制数输出。
算法描述:
输入二进制的字符串,每个字符减去0字符就是他们的十进制数值,在乘以2的n-1次方,再加和!
源程序:
no3_1.c
#include
#include//为strlen函数提供原型
#include//为pow函数提供原型
intmain()
{
charstr[10];
inti,sum=0;
printf("Pleaseinputbinarynumber:
\n");
gets(str);
for(i=0;i{
sum+=(str[i]-'0')*pow(2,i);//计算每个位上的字符再加和
}
printf("Thedecimalnumberis:
\n");
printf("%d\n",sum);//输出所对应的十进制数
return0;
}
测试数据:
第3_2题:
设计一个复数类型,输入实部和虚部生成一个复数,可进行两个复数求和、两个复数求差、两个复数求积运算。
算法描述:
复数分为实部和虚部,因此一个复数的输入是要分两部分的,输出也是,输出时在虚部后加i.
源程序:
no3_2.c
#include
intmain()
{
inta,b,c,d;
charch;
printf("Pleaseentertwocomplexnumbers:
\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("\n1)calculatethesum\n2)calculatethediff\n3)calculatetheproduct\n");
printf("Pleasechoose1,2or3:
(qtoquit):
\n");//选择模式
getchar();
while((ch=getchar())!
='q')//循环
{
while(getchar()!
='\n');
switch(ch)
{
case'1':
printf("%d+%di\n",a+c,b+d);
break;
case'2':
if(b-d>=0)
printf("%d+%di\n",a-c,b-d);
else
printf("%d%di\n",a-c,b-d);
break;
case'3':
printf("%d+%di\n",a*c-b*d,a*d+b*c);
break;
default:
break;
}
}
return0;
}
测试数据:
第3_3题:
用一个整型数组表示10进制大整数,数组的每个元素存储大整数的一位数字,将这个大整数转换为2进制数输出。
算法描述:
存入大整数时,将数值的各个位上的数分离存到数组中。
因为整数数值大,一定注意了溢出,,在计算时,再用数组下标与数值各个位上的关系,整合再输出所对应的二进制数!
源程序:
No3_3.c
#include
#include
#defineN20
intmain()
{
voidto_base_n(longlongn,unsignedintbase);
inta[N],i=0,j,k,m;
charch;
longlongn=0;
printf("请输入数字(#结束):
\n");
printf("\n");
while(scanf("%d",&a[i])==1)
{
i++;
}
j=i-1;
for(i=0;i<=j;i++)
{
for(k=j;k>=0;k--)
{
n+=a[i]*pow(10,k);
}
}
printf("\n转换过后的等值二进制数:
\n");
printf("\n");
to_base_n(n,2);
printf("\n");
return0;
}
voidto_base_n(longlongn,unsignedintbase)//进制转换超级函数
{
intr;
r=n%base;
if(n>=base)
to_base_n(n/base,base);
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
intmain()
{
intn,sum,a[10];
inti,cout=0;
printf("请输入数字N:
");
scanf("%d",&n);
printf("\n数据链:
\n");
while(n!
=1)
{
printf("%d->",n);
sum=0;
i=0;
while(n>0)//对每次的各位数字平方和再拆
{
a[i]=n%10;
if(a[0]==1)
cout++;//统计末尾数字为1的计数器
sum+=a[i]*a[i];
n=n/10;
i++;
}
n=sum;
}
printf("%d\n",1);
printf("\n数据链末尾数字为1的数字个数:
\n");
printf("%d\n",cout);
return0;
}
测试数据:
第5_1题:
程序自动生成一个位于99内的随机数,要求用户猜这个数。
用户输入一个数后,程序有三种应答:
toobig,toosmall,youwin。
算法描述:
播下产生随机数的种子,随时间不同每次生成的随机数不同,用户根据提示进行猜数游戏。
源程序:
no5_1.c
#include
#include//为rand函数提供原型
#include//为种子提供原型
intmain()
{
intn,m;
printf("Ready?
Let'sgo!
!
!
\nInputthecorrectnumberyouthought:
\n");
scanf("%d",&n);
srand(time(NULL));//种子
m=rand()%100;
while(n!
=m)//猜数进行时的提示
{
if(n>m)
printf("Toobig!
Comeon,do'tgiveup!
\n");
else
printf("Toosmall!
Whyareyousosilly!
!
\n");
printf("Tryagain:
\n");
scanf("%d",&n);
}
printf("%c%cYouwin!
Youaresosmart!
!
\n",1,1);
return0;
}
测试数据:
第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
#defineN10
intmain()
{
inta[N],n,i,j,k;
intflag=1;
n=N;
srand(time(NULL));
while(flag)
{
for(i=0;ia[i]=rand()%100;
for(i=0;i{
for(j=0;j{
if(a[i]==a[j]&&i!
=j)//判断的数组中是否有重复数字,若有,就重新产生
{
flag=0;
break;
}
}
}
if(!
flag)
flag=1;
else
{
flag=0;
printf("产生的不重复的随机数:
\n");
printf("\n");
for(i=0,k=1;i{
printf("%-4d",a[i]);
if(k%10==0)
printf("\n");
}
}
}
return0;
}
测试数据: