C程序设计语言综合设计》 解题报告_第1页
C程序设计语言综合设计》 解题报告_第2页
C程序设计语言综合设计》 解题报告_第3页
C程序设计语言综合设计》 解题报告_第4页
C程序设计语言综合设计》 解题报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序设计语言综合设计解题报告 学号 姓名 许佳钰 班级 五班 (正文) (一)题目:实验目的:学习指针构造链表,操作链表。 实验内容:输入两个非降序列,转换成两个非升序列,合并成一个非升序列。 基本要求:用链表实现,完成解题报告。分析(解题思路及流程图):定义Struct lineint num;struct line*next;创建两个非降链表Head=creat();Headt=creat();Struct line*creat()p=pt=(struct line*)malloc(LEN);;n=0;head初始NULL;输入p-num;n+;p=(struct line*)malloc

2、(LEN);输入转折符号?否释放多开辟的空间;并返回链表头headhead标记为链表头;N=1?是否head=turnback(head);headt=turnback(headt);pt-next=p;pt=p;p=(struct line*)malloc(LEN);是i struct line* turnback(struct line *head)/*链表反指,实现非降转非升*/p=NULL;下一个不为NULL?pt=head;head=pt-next;pt-next=p;p=pt;head-next=p;并返回head;是否开始连接下页左print(head);print(headt)

3、;head=together(head,headt);struct line*together(struct line *head,struct line*headt)head标记两链表头中最大的;headt=head; p标记另一条链表头;headt-next!=NULL?pt=headt-next;pt-num num?headt-next=p;headt=p;p=pt;headt=pt;headt-next=p;并返回head;是否否是print(head);结束void print(struct line*head)head!=NULL?printf(%d ,head-num);hea

4、d=head-next;printf(n);是否程序代码(核心代码):while(headt-next) pt=headt-next; if (pt-numnum) headt-next=p; headt=p; p=pt; else headt=pt; 测试方案:2 3 4 5 5 8 25 65 881 3 5 25 98 100输入:2 3 4 5 5 8 25 65 881 3 5 25 98 100输出:88 65 25 8 5 5 4 3 2100 98 25 5 3 1100 98 88 65 25 25 8 5 5 5 4 3 3 2 1心得:在函数together 中,p/he

5、adt/head三者关系一开始没有处理好(二)题目:实验目的:学习数组的应用。实验内容:高精度整数的四则运算(200位以内)。基本要求:对给定的大整数,做相关运算。必做:+(加法)-(减法)(乘法);选做:(除法)%(求余)gcd(最大公约数)lcm(最小公倍数)完成解题报告。分析(解题思路及流程图):开始num10=length(s1);num20=length(s2);scanf(%s%s,s1,s2);Sun(s1,s2,s3,num1,num2,num3);Delete1(s1,s2,s4,num1.num2.num4);Multiplication(s1,s2,s5,num1,num

6、2,num5);printf(两数和为%sn两数之差%sn两数之积%sn,s3,s4,s5);结束/*简单函数Length函数:测量数字除去符号(负号)的长度;Compare函数:比较两个数字s1,s2对应大整数的绝对值大小,并返回较大的编号;e 函数:通过导入0,1,2,3对应返回1,10,100,1000的*/change2函数:与putin相反;即实现把numtnum1找到飞零,然后开始单个存放void sum(char*s1,char*s2,char*s3,int*num1,int*num2,int*num3)Void putin(char* s,int*num,int base,in

7、t i)t=0;dec=num0;/*putin函数实现把字符串反过来base位从num1开始存放,不足四位,前面补零, i=0表示s0不是负号,i=1表示s0是负号*/dec i?Temp=0;add=0;addi?Temp=Temp+(sdec-1-0)*eadd;add+;dec-;dec-;t+;numt=temp;回到调用该函数的地方否是否是num1,num2清零;负+负正+正s30=-; i=1;num10+;num20+;putin(s1,num1,4,i);putin(s2,num2,4,i);num10-;num20-;t=dealsum(num1,num2,num3);i=

8、0;putin(s1,num1,4,i);putin(s2,num2,4,i);t=dealsum(num1,num2,num3);正+负负+正经处理Putin(s1); Putin(s2);通过compare函数,决定t=dealdelete1(num1,num2,num3);还是t=dealdelete1(num2,num1,num3);且确定s30;change2(num3,s3,t,i);if (length(s3)=0) s30=0; /* 处理 -0 =0 */void delete1(char*s1,char*s2,char*s4,int*num1,int*num2,int*nu

9、m4)num1,num2清零;负-正正-负S40=-; i=1;num10+;putin(s1,num1,4,i);putin(s2,num2,4,0);num10-;t=dealsum(num1,num2,num4);i=1;num10+;putin(s1,num1,4,i);putin(s2,num2,4,0);num10-;s40=-;t=dealsum(num1,num2,num4); 正+负负+正经处理putin(s1,num1,4,i);putin(s2,num2,4,0);通过compare函数,决定t=dealdelete1(num1,num2,num4);还是t=dealde

10、lete1(num2,num1,num4);且判断s30是否为-;change2(num4,s4,t,i);if (length(s4)=0) s40=0; /* 处理-0=0 */void multiplication(char*s1,char*s2,char*s5,int*num1,int*num2,int*num5)num10=length(s1);num20=length(s2);两数同号?i=0;s50=-; i=1;t=dealmult(num1,num2,num5);change2(num5,s5,t,i);if (if (length(s5)=0)s50=0;否是int dea

11、lmult(int*num1,int*num2,int*num5)t1=(num10+3)/4;t2=(num20+3)/4; add1=1;add1t1+t2+2?temp=0; len=add1-1; add2=1;add2t2+1?len+;temp=temp+num5len+num1add1*num2add2;num5len=temp%10000;temp/=10000;add2+;num5len+1=temp; add1+;temp=0; add1=1;add1n20?t=(n10+3)/4;t=(n20+3)/4;inc=1;temp=0;inct+2?temp=n1inc+n2i

12、nc+temp;n3inc=temp%10000;temp=temp/10000;inc+;return (t+1);是否是否int dealdelete1(int*num1,int*num2,int*num4)num10num20?t=(num20+3)/4;t=(num10+3)/4;inc=1;inct+1?num1incnum2inc?temp=10000;num1inc+1-;num1inc+1-;temp=0;temp=temp+num1inc-num2inc;num4inc=temp%10000; inc+;num4t=0?return (t-1);return (t);是是否否

13、是否程序代码(核心代码): temp=n1inc+n2inc+temp;n3inc=temp%10000;temp=temp/10000;. . .if (num1incnum2inc)temp=10000;num1inc+1-;else temp=0;temp=temp+num1inc-num2inc; num4inc=temp%10000;测试方案:- /- / /- / /10000 /-10000输入:-输出:两数之和为-两数之差两数之积-心得:在程序中num0被用于标记s除去负号的长度,在使用的时候,多次被当做数组num的长度,造成程序错误;没有考虑到两数和差积为-0造成输出错误;(

14、三)题目:实验目的:学习递归的使用 实验内容:N(N16)皇后问题(8皇后问题:在一个88国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。) 基本要求:输入一个整数N,输出解的个数及所有可行的解法,完成解题报告。分析(解题思路及流程图):开始结束a0=0;Queens(a,1);printf(the total number is %dn,a0);/*说明N=8;Judge函数:与前面已经放好的皇后进行比较,冲突,返回终止此条路径搜索的指令0,否则返回继续搜索下一个的指令1void Queen

15、s(int*a,int n)i=1;i=N?an=i;judge(a,n)&n+1=N?Queens(a,n+1);n=N&judge(a,n)?inc=1;inc,inc,ainc);inc+;printf(end);a0+;printf(n);返回主函数是否是否是否是否i+;int judge(int*a,int n)add=1addn?an和aadd冲突? return 0;return 1;add+;是否是否程序代码(核心代码):for(i=1;i=N;i+) an=i; if (judge(a,n)&n+1=N)/*若符合条件*/ Queens(a,n+1);/*进行下一行的存放寻找

16、*/ if (n=N&judge(a,n)/*judge*/ for (inc=1;inc,inc,ainc); printf(end); a0+; printf(n); 测试方案:N=4输入:. . . .输出:1,2-2,4-3,1-4,3-end1,3-2,1-3,4-4,2-endThe total number is 2心得:. . . .(四)题目:实验目的:学习文件的使用 实验内容:解N元一次方程(1N30) 基本要求:从文件读入整数N,然后读入N*(N+1)矩阵得到解并输出到文件中,完成解题报告。分析(解题思路及流程图):n=open(num);i=upper(num,n);w

17、rite(num,n,i);开始结束open函数:用文件打开数据,并导入。upper函数:把系数矩阵整理为上三角矩阵,增广矩阵同时变化。有judge从而得到解,返回指令 1有唯一解把系数矩阵变换成对角矩阵,增广矩阵同时变换,并存放在num0。返回指令2无穷多解。返回指令3 无解。write函数:把所得的解,存入文件中。findno0函数:若找到line列里面一个非零的数的add行,并把add行和line行交换/*或*/若line列全为0,进行findno0(line+1);judge函数:判断系数矩阵和增广矩阵秩相同否 /*函数说明int open(float(*num)N+1)FILE*fp

18、;(fp=fopen(F:xujiayuC+numberdestination.txt,r)=NULLprintf(can not open thie filen);exit(0);fscanf(fp,%d,&n);row=0rown?line=0;linen+1?fscanf(fp,%f,&numrowline);line+;Row+;fclose(fp);return n;是否是否是否int judge(float(*num)N+1,int n)row=n-1;mark2=0;;rown?line=0;mark1=0;linen?numrowline!=0mark1=1;line+;num

19、rown!=0mark2=1;(mark1*mark2)=1return 1;mark1!=mark2return 0;row-;return 1;是是否否是否是否是是否否int upper(float(*num)N+1,int n)line=0;linen?line=findno0(num,n,line);row=line+1;line1=line;head=numrowline;rown;?line1n+1?temp=numrowline1*numlineline;temp-=head*numlineline1;numrowline1=temp;line1+;line+;row+;row-

20、1?line=row+1;linen?line1=row,head=numrowlineline1n+1?temp=numrowline1*numlineline;temp-=head*numlineline1;line1+; numrowline1=temp;line+;row-;row=0rown?num0row=numrown/numrowrow;return 1;count1?return 2;return 3;是否是否是否是否是否是否int findno0(float(*num)N+1,int n,int line)add=line;addn?numaddline!=0inc=0;incn+1&add!=line?temp=numlineinc;numlineinc=numaddinc;numaddinc=temp;inc+;return line;add+;linen?return(findno0(n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论