《程序设计基础实验报告(共36页).doc》由会员分享,可在线阅读,更多相关《程序设计基础实验报告(共36页).doc(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上程序设计基础课程设计实验报告班级:姓名:宋之鑫学号:所选题目:1_1 , 1_2 , 2_1 , 3_1 , 3_2 , 3_3 , 3_4 , 4-1 , 5_1 , 5_2 第1_1题 算法描述:首先定义两个二维字符数组,两个维数分别代表行数和文本中每行的字符的个数,用for循环和fgets函数把两个文本中的数据一行一行地复制到数组中,完毕后用for循环和strcmp函数比较两个数组中的不同的行,遇到不同行输出不同行,若没有不相等的行则输出:这两个文本文件相同!完毕源程序:no1_1.c #include#include #includeint main()int
2、 i;char a680,b680; /用于存储文件中的字符串FILE * fp1;FILE * fp2;if(fp1=fopen(1.txt,r)=NULL)/打开文件printf(cant open file!n);exit(0);if(fp2=fopen(2.txt,r)=NULL)/打开文件printf(cant open file!n);exit(0); for(i=0;i6;i+)/把文件中的数据录入到字符串数组中fgets(bi,81,fp2);fgets(ai,81,fp1); for(i=0;i6;i+)if(strcmp(ai,bi)!=0) break;/比较此行数据是否
3、相同if(i=6) printf(这两个文件相同!n); elseprintf(不同行是第%d行n1.txt的第%d行是%snb.txt的第%d行是%sn,i+1,i+1,ai,i+1,bi); 测试数据(输入、输出):两个不同的文本文件1.txt和2.txt第1_2题 算法描述:有三个文件,前两个里面有一串数字,把前面两个文件中的数字格式化输入到一个整型数组中,写一个冒泡排序函数把这个整型数组从大到小排序,最后平用fprint输入到第三个文件中,完毕源程序:no1_2.c #include #include #include int paixu(int *arr, int jishu) /冒
4、泡排序,把数组中的数组排序 int i=0,j=0,tmp; for (i=0;ijishu;i+) /冒泡排序,从大到小 for(j=i+1; jarrj) tmp=arri; arri=arrj; arrj=tmp; return 0; int main() int a300=0; /初始化 int jishu=0; /初始化 int i=0; FILE *fp1=fopen(1.txt,r); FILE *fp2=fopen(2.txt,r); FILE *fp3=fopen(3.txt, w+); if (fp1=NULL|fp2=NULL) /判断打开是否成功 printf(文件打开
5、失败n); return 0; while (!feof(fp1) fscanf(fp1, %d, &ajishu+);/把文件1中各数字输入到数组中 fclose(fp1); while (!feof(fp2) /把文件二中各数字输入到数组中 fscanf(fp2, %d, &ajishu+); fclose(fp2); paixu(a, jishu); for (i=0; ijishu; i+) fprintf(fp3, %d , ai); /把排完序的数字输入到文件3中 fclose(fp3); printf(操作成功.); return 0; 测试数据(输入、输出):输入:输出:第2-
6、1题 算法描述:有一个带有注释的c源程序,首先把它按行录入到二维数组中,有两种情况/型和/*/型,第一/分两种情况,处理方法,找到/所在数组行,把这行/削去,/之后赋值为0,/*/情况,找出/*所在行一直削去,直到遇到*/,把处理后的数组重新放入c源程序中,(放之前c的打开方式是wb+:为了把之前的数据删除)完毕源程序:No2_1.c /1. 将合法 C 源程序每行前加上行号并删除其所有注释。#include#includeint main()printf(这是一个将c源程序每行加行号且删除其所有注释的程序); int i=0,j,k; char duqu1001000,ch;/用这个来储存c
7、程序,这个程序 不大于100行,且每行不大于1000个字符 FILE *fp=fopen(1.cpp,r+);if(fp=NULL) printf(打开文件失败n);return 0; while(!feof(fp)fgets(duqui,1000,fp);i+; /读取的行数 for(k=i-1;k=0;k-) /把注释消掉 for(j=0;j1000;j+)if(duqukj=/ & duqukj-1!=* & (duqukj+1=/ | duqukj+1=* ) ) /这是/*情况和 / 情况 if(k!=0 & j!=0) duqukj=n;/防止下面的第一行是注释,消除完后,第一行变
8、空 else duqukj=0;duqukj+1=0; else if(duqukj=/ & duqukj-1=*) duquk0=0; /*/的这种情况 fclose(fp);/把原来的c内容删掉 fp=fopen(1.cpp,wb+); /同上 if(fp=NULL) printf(打开文件失败n);return 0; for(j=0,k=1;ji-1;j+,k+)/这个是加行号的 (i-1是因为前面有个i+,多加了一个1) if(strlen(duquj)=0) k-;/如果第一行为空,则跳过这次,并且不能使第一行行号变成2;所以要减去1 continue; fputs(/*,fp);f
9、printf(fp, %d,k);fputs(*/,fp);fputs(duquj,fp); fclose(fp);return 0;测试数据(输入、输出):1:没操作之前2:操作之后第3_1题 算法描述:输入的是一个字符串,首先把这个字符串转化为整型数组中的数,再根据二进制转化为十进制的方法求出,具体实现过程用for循环完成,其中定义一个数学关于几的几次方的函数方便计算源程序:No3_1.c #include#include#includeint pow(int a,int b)/次数函数 int sum=1;for(b;b0;b-) sum*=a;return sum;int main()
10、int a100;char b10;printf(这是一个将一个二进制的字符串转化十进制的数的程序n请输入二进制字符串:n);gets(b);int n=strlen(b);int i,j,k,m,sum=0;for(i=0;i=0;i-,j+)/把二进制的数转化为十进制的数 sum+=pow(2,j)*ai;printf(转化的结果为:%d,sum);测试数据(输入、输出):第3_2题 算法描述:首先定义一个复数的结构体,内部分别为复数的实部和虚部,有三个分支,分别为三种运算,加减乘,根据运算法则,做出c中的运算规则,如果输入错误则从新输入,最后输出结果源程序:No3_2.c #includ
11、e#include #includeint main()int m,n,p,q;struct fushuint i;/实部 int j;/虚部 a,b,c;/c是昨晚运算的结构体 char start=y;/标志,当start=n时退出 for(;1;)printf(请分别输入两个复数的实部,虚部(用空格间隔)n);printf(请输入第一个复数:n);scanf(%d%d,&a.i,&a.j);/第一个复数 fflush(stdin);/释放数据 printf(请输入第二个复数:n);scanf(%d%d,&b.i,&b.j);fflush(stdin);xing:printf(你希望这两个
12、复数做什么运算?n求和运算请输入1.n求差运算请输入2.n求乘积运算请输入3.n);scanf(%d,&m);/选择运算方式 fflush(stdin);if(m=1)/求和 c.i=a.i+b.i;c.j=a.j+b.j;else if(m=2)/求差 c.i=a.i-b.i;c.j=a.j-b.j;else if(m=3)/求积 c.i=a.i*b.i-a.j*b.j;c.j=a.i*b.j+a.j*b.i;else printf(输入错误,请重新输入n);goto xing;/如果输入错误的话则重新输入数据 printf(运算结果是:%d+%dinn,c.i,c.j);printf(你是
13、否要继续使用?(y/n)n);scanf(%c,&start);fflush(stdin);if(start=n) exit(0); 测试数据(输入、输出):1. 加法运算,减法运算,乘法运算第3_3题 算法描述:按本程序要求,首先把十进制的数放到字符串中,为了要把十进制转化为二进制必须把这个字符串转化到整型数组,所以定义一个转化函数,再根据,十进制转化为二进制的数学方法,编出相应法则(本程序定义了,x乘以10的n次方的函数方便计算)完毕源程序:No3_3.c #include#includeint pow(int a,int b)/计算a乘以10的b次方的值 int sum=1;for(b;
14、b0;b-)sum*=10;return a*sum;int zhuanhua(int sum)/将十进制转化为二进制 int y,c=1,b100;/y是余数 int i;for(i=0,y=0;sum!=0;i+)bi=sum%2;sum=(sum-bi)/2;y+;/计数 printf(结果是:); for(i=0;iy;i+) printf(%d,by-i-1);/输出二进制的数int main()int a100,i,j,k,sum=0;char b100;printf(这是一个将一个十进制数转化为二进制的数的程序n请输入一个十进制的数:n);gets(b);/先把是十进制的数放到一
15、个字符串数组里面int n=strlen(b);/b是十进制数的位数for(i=0;in;i+) ai=bi-48;/把十进制数放到整型数组里面for(i=0;in;i+)/计算大整数的值 sum+=pow(ai,n-1-i);/printf(sum=%d,sum); zhuanhua(sum);测试数据(输入、输出):第3_4题 算法描述:先判断输入的数的位数(这是一个子程序),再写一个子程序,按是判断一个数是否为链运算后是否为为一,如果为一,返回1给主函数,主函数中有一个变量记录链运算为1的数的个数 ps:(按照题目给的链运算规则写第一个子程序)完毕源程序:No3_4.c #include
16、#includeint weishu(int n)/判断输入的N的位数 int i;for(i=1;1;i+)n=n/10;if(n=0)return i;/返回位数int xunhuan(int n)/判断链运算后是否某为1 int a100,i,k;int j=weishu(n);for(;n=10;)/44-32-13-10-1for(i=0;ij;i+)/把各个数字取出来,放到数组里 ai=n%10;n=(n-ai)/10;for(i=0;i0;n-)if(xunhuan(n)=1) m+;/记录数据用的printf(结果是:%d,m);测试数据(输入、输出):第4_1题 算法描述:K
17、tv点歌系统主要的是把主体框架搭建起来,这里实现多种功能要用到switch语句,各种case连接着一个有功能的子程序,每个功能结束返回主菜单,歌曲信息的读取还需要结构体的定义,歌曲的信息(歌曲名,歌手,风格)放到一个文本文件中,歌曲的删除添加需要加一个密码功能,结构体有一个标记变量,这个变量用于删除歌曲时把删除的歌曲做标记源程序:No4_1.c #include#include#include#define SIZE 1000 /最多有1000首歌曲 struct musicdate/定义歌曲信息的结构体变量char name15;char singer15;char style10;int
18、flag=1;/用于删除时标记的musicSIZE;void mimaServe1()/这是密码服务1,开启密码服务的FILE *fp=fopen(mima.txt,ab+);if(fp=NULL) printf(cont open this file!);exit(0);char mima6=0;/给密码初始化fgets(mima,7,fp);/把密码读到mima数组中/if(strlen(mima)=0) printf(您还没有设置密码n);/printf(*%s*,mima);if(strlen(mima)!=0) /如果开启就不用再开启,直接结束就okayprintf(密码服务已开启,
19、无需再次开启nn);return;else restar:printf(请输入密码,按回车键结束(密码共六位,可以是字母或数字);/密码由六位字符组成gets(mima);if(strlen(mima)!=6)/如果不是六位则密码是设置错误printf(n格式错误,请重新输入!(密码共六位,可以是字母或数字)nn);goto restar;fflush(stdin);printf(n请再次出入密码);char check6=0; /防止第一次密码出入错误,第二次验证 gets(check);if(strcmp(check,mima)=0) fputs(mima,fp);elseprintf(n
20、n两次输入的不一致,请重新设置密码nn);goto restar; printf(nn密码设置成功!nn);fclose(fp);void mimaServe2()/密码服务的2,用于关闭密码服务FILE *fp=fopen(mima.txt,ab+);if(fp=NULL) printf(cont open this file!);exit(0);char mima6=0;fgets(mima,7,fp);/if(strlen(mima)=0) printf(您还没有设置密码n);/printf(*%s*,mima);if(strlen(mima)=0)/如果之前没有开启密码服务,则没有必要
21、关闭printf(密码服务已关闭,请勿重新关闭nn);return; if(strlen(mima)!=0)/需要输入原密码才能关闭! char formerMima6;for(int i=0;i3;i+) printf(请输入原密码:);gets(formerMima);if(strcmp(formerMima,mima)=0)/如果原密码与输入密码相同,则关闭 printf(n密码关闭成功!nn);fclose(fp);fp=fopen(mima.txt,wb+);/打开文件时初始化 fclose(fp); return; printf(输入错误请重新输入!nn);printf(您已出入错
22、误三次;再见!);/如果密码输入错误超过三次,则结束程序exit(0); void mimaServe3()/密码服务第三种功能,修改密码FILE *fp=fopen(mima.txt,ab+);if(fp=NULL) printf(cont open this file!);exit(0);char mima6=0;fgets(mima,7,fp);/if(strlen(mima)=0) printf(您还没有设置密码n);/printf(*%s*,mima);if(strlen(mima)=0) /之前已经录入密码 printf(未开启密码服务!请开启!n); return; for(in
23、t i=0;i3;i+)/如果跳出去则密码输入错误超过三次 printf(n请输入原来的密码:); char formerMima6; gets(formerMima);fflush(stdin); if(strcmp(formerMima,mima)=0)/如果输入正确则整个if都在改密码 printf(n输入正确!n);restar1:printf(n请输入新密码:);char new16;gets(new1);if(strlen(new1)!=6)/判断新密码位数 printf(n格式错误,请重新输入!(密码共六位,可以是字母或数字)nn); goto restar1; fflush(s
24、tdin);printf(n请再次输入新密码:);char check6;gets(check);if(strcmp(check,new1)!=0)printf(n前后输入不一致,请重新输入:n);goto restar1; else/进行录入 fclose(fp);fp=fopen(mima.txt,wb+);if(fp=NULL) printf(cont open this file!);exit(0);fputs(new1,fp);/录入fclose(fp); printf(n密码修改成功!nnn);return; printf(n密码输入错入,请重新输入n) ; printf(n密码输
25、入错误三次!再见!); fclose(fp); exit(0); / 添加和删除管理员模式/*删除歌曲或添加歌曲是,只能由管理员进行操作,这个是添加密码服务,只有管理员知道密码*/int guanli()FILE *fp=fopen(mima.txt,ab+);if(fp=NULL) printf(cont open this file!);exit(0);char mima6,mima16;fgets(mima,7,fp);if(strlen(mima)=0) return 1;printf(此项功能只允许管理员使用,请输入管理员密码:); /m没有放到最前面是因为,如果没有设置密码则不需要
26、输入密码 for(int i=0;i3;i+)gets(mima1);fflush(stdin);if(strcmp(mima1,mima)=0) printf(n输入正确,请继续操作。n);fclose(fp);return 1; else printf(输入错误,请重新输入!n此项功能只允许管理员使用,请输入管理员密码:); printf(您已输入三次错误!再见!);fclose(fp);exit(0); /*在点歌时,如果用户输入歌曲,系统就要检查这首歌是否存于music.txt文件中,如果不存在则系统没有该歌曲。所以就不可以点歌,之后返回主菜单*/ int jiancha(char n
27、ame15)/点歌时检查是否存在该歌曲,如果存在则返回1;并且输出歌曲信息 FILE *fp=fopen(music.txt,ab+); if(fp=NULL) printf(cont open this file.);exit(0);int i,j;for(i=0;!feof(fp);i+)fread(&musici,sizeof(struct musicdate),1,fp);把歌曲信息读取到结构体数组中for(j=0;ji;j+)if(strcmp(musicj.name ,name)=0)/和dete相同 ,如果有则输出了歌曲信息 printf(歌手:%s 风格:%sn,musicj.
28、singer ,musicj.style ); return 1;/有该歌曲返回1,如果没有则引用该函数的函数输出,不存在该歌曲请添加return 0;fclose(fp); /*本子函数功能是添加歌曲,并把歌曲信息填入到music.txt文件中,核心是用fwrite函数*/void add()FILE *fp=(fopen(music.txt,ab+);if(fp=NULL) printf(cont open this file.);exit(0); printf(请输入要添加歌曲的数量:n);/添加多个歌曲int i,j;scanf(%d,&i);for(j=0;j=0;i-)printf
29、(name:%s singer:%s style:%sn,musici.name,musici.singer ,musici.style );printf(请输入要删除的歌曲名称:n);gets(name);int a=jiancha(name);/检查歌曲是否存在 if(a=0) system(cls);printf(不存在该歌曲,操作失败!nnn); return;/检查 是否存在此歌曲 for(j=0;ji;j+)if(strcmp(musicj.name ,name)=0) musicj.flag=0;fclose(fp);fp=fopen(music.txt,wb);/把原来的歌曲信
30、息从music.txt中删除if(fp=NULL) printf(cont open this file.);exit(0);for(j=0;ji-1;j+)if(musicj.flag!=0) fwrite(&musicj,sizeof(struct musicdate),1,fp);/选择性重新录入歌曲信息 system(cls);printf(删除成功n);fclose(fp);/*这个子函数功能是点歌,(只有在music.txt里面存了该歌曲才可以打开该歌词,否则就算歌词存在也没有用 ),输入歌曲名字,如果music.txt中有与之相对应的歌曲名则打开该歌曲歌词*/void choos
31、e1()printf(请输入要点的歌曲名称:n);char name15;/用于储存用户输入的歌曲名称char geci5050;/储存读取歌词int i,j;gets(name); int a=jiancha(name);/检查该歌曲是否存在,如果存在则函数返回1if(a=0)printf(不存在该歌曲,请添加!nnn); return;/检擦是否纯在 该歌曲,若存在输出歌曲信息,若不存在printf(该歌曲不存在,请添加n);结束 该分支 strcat(name,.txt); /该操作是把歌曲名末尾加上.txr这是为了之后打开歌曲文件用FILE* fp=fopen(name,r);/打开歌
32、曲文件if(fp=NULL) printf(不存在这首歌的歌词,请添加!n);/printf(cont open this file.);exit(0);/歌词不存在时打不开 for(i=0;!feof(fp);i+)/输出歌词 fgets(gecii,50,fp);printf(%sn,gecii);fclose(fp);/*本子函数功能是按歌手点歌,输入歌手名字,输出该歌手所有歌曲,然后函数跳到choose1函数,进行点歌,具体功能实现与之前函数基本相同*/void choose2()/同理,copy dete中的读取,判断情况/这是按歌手来点歌/输入歌手,输出歌手所有的歌曲,然后跳到ch
33、oose1;进行点歌 char singer15;printf(请输入歌手的名字:); gets(singer);FILE *fp=fopen(music.txt,ab+);/if(fp=NULL) printf(cont open this file.);if(fp=NULL) printf(cont open this file.);exit(0);int i,j,k=0;/k用来记是否有该歌手歌曲 for(i=0;!feof(fp);i+)/读取歌曲信息fread(&musici,sizeof(struct musicdate),1,fp);for(j=0;ji;j+)if(strcmp(musicj.singer ,singer)=0)printf(歌曲:%sn,musicj.name );k+;/用于标记是否有歌曲if(k=0)printf(没有该歌手的歌曲;n);else choose1();fclose(fp); /*本子函数功能和浏览所有歌曲,实现方法与choose2如出一辙,所以就不具体介绍了(输出系统中所有的歌曲)*/void scan()FILE *fp=fopen(music.txt,ab+);/if(fp=NULL) printf(cont open this
限制150内