《程序设计语言综合设计》解题报告学号031302539姓名许佳钰班级五班(正文)(一)题目:实验目的:学习指针构造链表,操作链表。实验内容:输入两个非降序列,转换成两个非升序列,合并成一个非升序列。基本要求:用链表实现,完成解题报告。分析(解题思路及流程图):定义Structline{intnum;structline*next;};创建两个非降链表Head=creat();Headt=creat();Structline*creat()p=pt=(structline*)malloc(LEN);;n=0;head初始NULL;输入p-num;n++;p=(structline*)malloc(LEN);输入转折符号?否释放多开辟的空间;并返回链表头headhead标记为链表头;N=1?是否head=turnback(head);headt=turnback(headt);pt-next=p;pt=p;p=(structline*)malloc(LEN);是istructline*turnback(structline*head)/*链表反指,实现非降转非升*/p=NULL;下一个不为NULL?pt=head;head=pt-next;pt-next=p;p=pt;head-next=p;并返回head;是否开始连接下页左程序代码(核心代码):while(headt-next){pt=headt-next;if(pt-nump-num){headt-next=p;headt=p;p=pt;}else{headt=pt;print(head);print(headt);head=together(head,headt);structline*together(structline*head,structline*headt)head标记两链表头中最大的;headt=head;p标记另一条链表头;headt-next!=NULL?pt=headt-next;pt-nump-num?headt-next=p;headt=p;p=pt;headt=pt;headt-next=p;并返回head;是否否是print(head);结束voidprint(structline*head)head!=NULL?printf(%d,head-num);head=head-next;printf(\n);是否}}测试方案:2345582565881352598100输入:2345582565881352598100输出:88652585543210098255311009888652525855543321心得:在函数together中,p/headt/head三者关系一开始没有处理好(二)题目:实验目的:学习数组的应用。实验内容:高精度整数的四则运算(200位以内)。基本要求:对给定的大整数,做相关运算。必做:+(加法)-(减法)×(乘法);选做:÷(除法)%(求余)gcd(最大公约数)lcm(最小公倍数)完成解题报告。分析(解题思路及流程图):开始num1[0]=length(s1);num2[0]=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,num2,num5);printf(两数和为%s\n两数之差%s\n两数之积%s\n,s3,s4,s5);结束/*简单函数Length函数:测量数字除去符号(负号)的长度;Compare函数:比较两个数字s1,s2对应大整数的绝对值大小,并返回较大的编号;e函数:通过导入0,1,2,3对应返回1,10,100,1000的*/change2函数:与putin相反;即实现把num[t]~num[1]找到飞零,然后开始单个存放voidsum(char*s1,char*s2,char*s3,int*num1,int*num2,int*num3)Voidputin(char*s,int*num,intbase,inti)t=0;dec=num[0];/*putin函数实现把字符串反过来base位从num[1]开始存放,不足四位,前面补零,i=0表示s[0]不是负号,i=1表示s[0]是负号*/deci?Temp=0;add=0;addbase&&deci?Temp=Temp+(s[dec-1]-‘0’)*e[add];add++;dec--;dec--;t++;num[t]=temp;回到调用该函数的地方否是否是num1,num2清零;负+负正+正s3[0]='-';i=1;num1[0]++;num2[0]++;putin(s1,num1,4,i);putin(s2,num2,4,i);num1[0]--;num2[0]--;t=dealsum(num1,num2,num3);i=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);且确定s3[0];change2(num3,s3,t,i);if(length(s3)==0)s3[0]='0';/*处理-0=0*/voiddelete1(char*s1,char*s2,char*s4,int*num1,int*num2,int*num4)num1,num2清零;负-正正-负S4[0]='-';i=1;num1[0]++;putin(s1,num1,4,i);putin(s2,num2,4,0);num1[0]--;t=dealsum(num1,num2,num4);i=1;num1[0]++;putin(s1,num1,4,i);putin(s2,num2,4,0);num1[0]--;s4[0]='-';t=dealsum(num1,num2,num4);正+负负+正经处理putin(s1,num1,4,i);putin(s2,num2,4,0);通过compare函数,决定t=dealdelete1(num1,num2,num4);还是t=dealdelete1(num2,num1,num4);且判断s3[0]是否为‘-’;change2(num4,s4,t,i);if(length(s4)==0)s4[0]='0';/*处理-0=0*/voidmultiplication(char*s1,char*s2,char*s5,int*num1,int*num2,int*num5)num1[0]=length(s1);num2[0]=length(s2);两数同号?i=0;s5[0]='-';i=1;t=dealmult(num1,num2,num5);change2(num5,s5,t,i);if(if(length(s5)==0))s5[0]='0';否是intdealmult(int*num1,int*num2,int*num5)t1=(num1[0]+3)/4;t2=(num2[0]+3)/4;add1=1;add1t1+t2+2?temp=0;len=add1-1;add2=1;add2t2+1?len++;temp=temp+num5[len]+num1[add1]*num2[add2];num5[len]=temp%10000;temp/=10000;add2++;num5[len+1]=temp;add1++;temp=0;add1=1;add1len+2?temp=temp+num5[add1];num5[add1]=temp%10000;temp=temp/10000;add1++return(t1+t2+1);否否是是是否intdealsum(int*n1,int*n2,int*n3)n1[0]n2[0]?t=(n1[0]+3)/4;t=(n2[0]+3)/4;inc=1;temp=0;inct+2?temp=n1[inc]+n2[inc]+temp;n3[inc]=temp%10000;temp=temp/10000;inc++;return(t+1);是否是否intdealdelete1(int*num1,int*num2,int*num4)num1[0]num2[0]?t=(num2[0]+3)/4;t=(num1[0]+3)/4;inc=1;inct+1?num1[inc]num2[inc]?temp=10000;num1[inc+1]--;num1[inc+1]--;temp=0;temp=temp+num1[inc]-num2[inc];num4[inc]=temp%10000;inc++;num4[t]==0?return(t-1);return(t);是是否否是否程序代码(核心代码):temp=n1[inc]+n2[inc]+temp;n3[inc]=temp%10000;temp=temp/10000;.........if(num1[inc]num2[inc]){temp=10000;num1[inc+1]--;}elsetemp=0;temp=temp+num1[inc]-num2[inc];num4[inc]=temp%10000;测试方案:-9999999/-9999999/9999999/-13541354613/16411131/10000/-10000输入:9999999-13541354613输出:两数之和为-13531354614两数之差13551354612两数之积-135413532588645387心得:①在程序中num[0]被用于标记s除去负号的长度,在使用的时候,多次被当做数组num的长度,造成程序错误;②没有考虑到两数和差积为-0造成输出错误;(三)题目:实验目的:学习递归的使用实验内容:N(N16)皇后问题(8皇后问题:在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。))基本要求:输入一个整数N,输出解的个数及所有可行的解法,完成解题报告。分析(解题思路及流程图):开始结束a[0]=0;Queens(a,1);printf(thetotalnumberis%d\n,a[0]);/*说明N=8;Judge函数:与前面已经放好的皇后进行比较,冲突,返回终止此条路径搜索的指令0,否则返回继续搜索下一个的指令1程序代码(核心代码):for(i=1;i=N;i++){a[n]=i;voidQueens(int*a,intn)i=1;i=N?a[n]=i;judge(a,n)&&n+1=N?Queens(a,n+1);n==N&&judge(a,n)?inc=1;inc=Nprintf(%d,%d-,inc,a[inc]);inc++;printf(end);a[0]++;printf(\n);返回主函数是否是否是否是否i++;intjudge(int*a,intn)add=1addn?a[n]和a[add]冲突?return0;return1;add++;是否是否if(judge(a,n)&&n+1=N)/*若符合条件*/{Queens(a,n+1);/*进行下一行的存放寻找*/}if(n==N&&judge(a,n))/*judge*/{for(inc=1;inc=N;inc++){printf(%d,%d-,inc,a[inc]);}printf(end);a[0]++;printf(\n);}}测试方案:N=