C语言作业解析——第四弹。。原来真正变态的是这两作业哇~原本是做完第五次作业等大家数分期中考完以后给大家,结果直接出了第六次。就顺便做了。买一送一还包邮哦亲~虽然这两次作业比较难。理解起来困难无比。。不过考试的时候不会有这么变态的题目啦~放心当前编程题:11级第五次作业---凸多边形面积1.【问题描述】给出平面上一组顶点的坐标,计算出它们所围成的凸多边形的面积。【输入形式】从标准输入读取顶点坐标。格式为:第一行是点的个数N(3≤N≤15),后面紧接着N行,每行两个数字(由空格隔开),分别表示该点的X、Y坐标(0≤X,Y≤32767)。所有点的坐标互不相同,且按顺时针次序给出。输入数据确保该多边形是一个凸多边形。【输出形式】向标准输出打印一个浮点数,是该多边形的面积。该浮点数保留两位小数。【输入样例】433301012【输出样例】5.00【样例说明】输入数据表示了如图所示的四边形。其面积为5.00。提示:求三角形面积可用海伦公式,求平方根可用math.h头文件中定义的sqrt函数。【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:points.c。本题解析:这个题是把凸n边形面积分成n-2个三角形面积和来做的。用海伦公式S=sqrt(p*(p-a)*(p-b)*(p-c))P=(a+b+c)/2a,b,c为三边长例如n边形点为a1a2…an那S=∑(Sa1akak+1)(2≤K≤N-1)边长则为两点间距离。#includestdio.h#includemath.hintmain(){intn;floatx[15],y[15];inti;floatdx,dy;floattot=0;floata,b,c,p;scanf(%d,&n);for(i=0;in;i++)scanf(%f%f,&x[i],&y[i]);for(i=1;in-1;i++){dx=x[0]-x[i];dy=y[0]-y[i];a=sqrt(dx*dx+dy*dy);/*两点间距离公式*/dx=x[i]-x[i+1];dy=y[i]-y[i+1];b=sqrt(dx*dx+dy*dy);dx=x[i+1]-x[0];dy=y[i+1]-y[0];c=sqrt(dx*dx+dy*dy);p=(a+b+c)/2;tot+=sqrt(p*(p-a)*(p-b)*(p-c));/*海伦公式*/}printf(%.2f,tot);return0;}当前编程题:11级第五次作业---整数的N进制字符串表示【问题描述】编写函数itob(n,s,b),用于把整数n转换成以b为基的字符串并存储到s中.编写程序,使用函数itob(n,s,b)将输入的整数n,转换成字符串s,将s输出.转换后的字符串从最高的非零位开始输出。如果n为负数,则输出的字符串的第一个字符为’-’。b为大于1小于37的任意自然数值。当b=2时,输出字符只可能是’0’和’1’;当b=16时,输出字符串中可能含有字符为’0’-’9’,’a’-’f’(字母以小写输出)。b还可以是其它数值。比如输入n=33,b=17,则输出33的17进制值为1g。【输入形式】控制台输入整数n和b,其中n可以为负数。n和b以空格分隔.【输出形式】控制台输出转化后的字符串s.【样例输入】52【样例输出】101【样例说明】5的二进制就是101【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:itob.c本题解析:十进制转换为其他进制的方法是不断除目标进制的数取余数,然后倒序输出。例如5变为二进制就是5%2=1;5/2=2;2%2=0;2/2=1;1%2=1;得到101倒序得到101即为正解。十进制以上则是若目标大于10就变为相应的字母即可。如果目标数为负数,则先忽略负号求解最后加上一个负号就可以了#includestdio.h#includestring.hvoiditob(intn,chars[],intb){intflag=1;intsum=0;inti,j;charch;if(n0){flag=0;n=-n;}memset(s,‘\0’,sizeof(s));/*数组初始化*/while(n0)/*不断除b取余*/{s[sum++]=n%b;n=n/b;}for(i=0,j=sum-1;ij;i++,j--)/*将数字倒序存放*/{ch=s[i];s[i]=s[j];s[j]=ch;}for(i=0;isum;i++){if(s[i]10)s[i]+='0';elses[i]+='a'-1;}if(!flag){for(i=sum;i0;i--)s[i]=s[i-1];s[0]='-';}}intmain(){intn,b;chars[100];scanf(%d%d,&n,&b);itob(n,s,b);printf(%s,s);return0;}当前编程题:11级第五次作业---求两组整数的异或集3.【问题描述】从标准输入中输入两组整数(每行不超过20个整数,每组整数中元素不重复),合并两组整数,去掉在两组整数中都出现的整数,并按从大到小顺序排序输出(即两组整数集“异或”)。【输入形式】首先输入第一组整数,以一个空格分隔各个整数;然后在新的一行上输入第二组整数,以一个空格分隔,行末有回车换行。【输出形式】按从大到小顺序排序输出合并后的整数集(去掉在两组整数中都出现的整数,以一个空格分隔各个整数)。【样例输入】51432879-65287101【样例输出】87321098742-6【样例说明】第一组整数为51432879-6,第二组整数分别为5287101。将第一组和第二组整数合并(去掉在两组整数中都出现的整数5和1),并从大到小顺序排序后结果为87321098742-6。【评分标准】该题要求输出两组整数的异或集,共有5个测试点,提交程序文件名为xor.c。本题解析:求异或,同时降序输出。那么将问题简化后可以发现如果将两个数组中的数都读进同一个数组然后降序排序若是数组中存在相同元素则不输出,若只出现一次则输出。那么结果与题目要求就相同了。#includestdio.hintmain(){inta[100];inti,j,k;intsum=0;charch;inttot=0;scanf(%d,&a[sum++]);while(1){ch=getchar();if(ch=='\n')tot+=1;if(tot==2)break;scanf(%d,&a[sum++]);}/*这里是进行读入,由于一共有两行那么每读完一个数就读入一个字符判断这个字符是不是换行符,当出现两个换行符的时候读入结束*/for(i=0;isum;i++)for(j=i+1;jsum;j++)if(a[i]a[j]){k=a[i];a[i]=a[j];a[j]=k;}/*降序排序*/a[sum]=5257;/*保证a[sum]不与前面的数相同*/intflag=0;/*flag表示已经输出了多少数,若为0则不需要先输出空格,否则输出空格与前面输出的数字隔开*/for(i=0;isum;i++){if(i==0)if(a[i]!=a[i+1]){if(flag)printf();printf(%d,a[i]);flag++;}if(i!=0)if((a[i]!=a[i+1])&&(a[i]!=a[i-1])){if(flag)printf();printf(%d,a[i]);flag++;}}}当前编程题:11级第五次作业---字符串中字符排序4.【问题描述】编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。【输入形式】用户在第一行输入一个字符串。【输出形式】程序按照字符(ASCII)顺序从小到大排序字符串,并删除重复的字符进行输出。【样例输入】badacgegfacb【样例输出】abcdefg【样例说明】用户输入字符串badacgegfacb,程序对其进行按从小到大(ASCII)顺序排序,并删除重复的字符,最后输出为abcdefg【评分标准】结果完全正确得20分,每个测试点4分。提交源程序名为stringsort.c本题解析:这个题做法比较多。一种简单的做法是:由于一共只有255个ascii码的值。那么开一个300的数组aa[i]表示ascii码为i的字符出现的次数,输出时从0到255(或255以上,例如300)循环,若a[i]不为0则输出对应的字符。#includestdio.h#includestring.hintmain(){inta[300];inti,j;chark;chars[200];memset(a,0,sizeof(a));scanf(%s,s);for(i=0;istrlen(s);i++)a[s[i]]++;for(j=0;j260;j++)if(a[j]){k=j;printf(%c,k);}}当前编程题:11级第五次作业---最长升序子串5.【问题描述】输入一行字符串,该字符串只由小写英文字母a-z组成,且其中的字符可以重复,最长不超过10000个字符。从该字符串中按顺序挑选出若干字符(不一定相邻)组成一个新串,称为“子串”。如果子串中每两个相邻的字符或者相等,或者后一个比前一个大,则称为“升序子串”。编程求出输入字符串的最长升序子串的长度。例如,由输入字符串abdbch可以构成的升序子串有:abd、abch、bbch、abbch等。其中最长的升序子串是abbch,其长度为5。【输入形式】从标准输入读取一行字符串,该串不含空格,以回车符结束。【输出形式】向标准输出打印一个正整数,是字符串中最长的升序子串的长度,在行末要输出一个回车符。【输入样例】abdbch【输出样例】5【样例说明】abdbch中最长子串是abbch,长度是5。【评分标准】结果完全正确得20分,每个测试点4分。上传c语言源程序为up.c。本题解析:这道题是从出现作业为止最难得题目。涉及到一些动态规划的思想。(我只想到这一种做法,欢迎大家有简单做法的来分享~)用f[i][j]表示到字符串s中的第i个字符为止最高位为j(用1-26分别代替’a’-’z’)的最长字串的字符数。动态转移方程为:F[i][j]=F[i-1][j](s[i]≠j)F[i][j]=max(f[i-1][k])+1(1≤k≤j)(s[i]=j)这个题目不是很好讲清楚,如果想透彻的理解的话可以来找我(中408JRC)不过。。不保证一定能讲清楚。。#includestdio.h#includestring.hintmain(){chars[10001];intf[10001][27];inti,j,k,l;scanf(%s,s);l=strlen(s);memset(f,0,sizeof(f));/*f数组初始化*/f[0][s[0]-‘a’+1]=1;/*f[0][s[0]]对应的值应该是1,因为以s[0]为终结的最长字串长度为1*/for(i=1;il;i++)for(j=1;j=26;j++){if(j==s[i]-'a'+1){for(k=1;k=j;k++)if(f[i][j]f[i-1][k]+1)f[i][j]=f[i-1][k]+1;}elsef[i][j]=f[i-1][j];}intmax=0;for(i=1;i=26;i++)if(f[l-1][i]max)max=f[l-1][i];printf(%d,max);}当前编程题:11级第五次作业---字符串替换(新)6.【问题描述】编写程序将一个指定文件中某一字符串替换为另一个字符串。要求:(1)被替换字符串若有多个,均要被替换;(2)指定的被替换字符串,大小写无关。【输入形式】给定文件名为filein.txt。从控制台输入两行字符串(不含空格,行末尾都有回车换行符),分别表示被替换的字符串和替换字符串。【输出形式】将替换后的结果输出到文件fileout.txt中。【评分标准】该题要求