C语言第四次作业

上传人:xiao****1972 文档编号:245061154 上传时间:2024-10-07 格式:PPT 页数:24 大小:329.97KB
返回 下载 相关 举报
C语言第四次作业_第1页
第1页 / 共24页
C语言第四次作业_第2页
第2页 / 共24页
C语言第四次作业_第3页
第3页 / 共24页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,C语言作业解析,第三弹,寄语:本次作业比较变态。涉及到一些初等的算法,11级第四次作业-,删数问题1.,【问题描述】输入一个高精度的大正整数S(S最长可达240位),去掉其中任意N位数字后剩下的数字按原次序组成一个新的正整数S。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数S最小。【输入形式】输入有两行:1.第一行是大整数S。其中S最长可达240位。 2.第二行是整数N。S、N均以非0数字开头。【输出形式】输出有一行,是在S中删除N位后所得的最小数字S。【样例输入1】1785434【样例输出1】13,【样例输入2】10021【样例输出2】002【样例说明】样例1中输入整数S=178543,N=4,要求在178543中删除4位,使剩下的数字最小。正确答案为S = 13。样例2中输入整数S1002,N1,删完一位后S = 002,而不是2,即2之前的0也必须输出。【运行时限】程序一次运行的最长时间限制在15秒内,超出则认为程序错误。【评分标准】该题要求输出一个大整数的各位数字。结果完全正确得20分,每个测试点4分。上传C语言文件名为delete.c。,本题解析:,这道题主要的障碍存在于两个方面:1.怎么读入 2.怎么删。,读入的话简单的说就是将一个数以字符串的形式存储下来然后通过字符串处理对数字的每一位进行操作。,删除的方式比较精髓。这里介绍一个比较容易懂的方法:每次删除都搜索第一个第i位比第i+1位大的,然后把第i位删掉。重复m次就可以得到最优解了。,#include ,#include ,int main(),char s245;,int i,j,k;,int n,m;,scanf(%s,s);,scanf(%d,n=strlen(s);/*这里是上面string.h中的函数,就是求s的长度的意思*/,for (i=1;i=m;i+)/*总共删m个数*/,for (j=0;jsj+1)/*如果这个数比下一个数大那么这个数要删掉*/,for (k=j;k=n;k+)/*删除操作*/,sk=sk+1;,break; /*删除结束退出扫描,继续删除下一个数*/,printf(“%s”,s); /*输出*/,11级第四次作业-,扩展字符2.,【问题描述】编写一函数expand(s1,s2),用以将字符串s1中的缩记符号在字符串s2中扩展为等价的完整字符,例如将a-d扩展为abcd。该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与-a-z等类似的情况。在main函数中测试该函数:从键盘输入包含缩记符号的字符串,然后调用该函数进行扩展,输出扩展结果。(教材 P63:Exercise 3-3)注意:,待扩展字符串中有可能包含空格,例如:a-d x-z应扩展成:abcd xyz。所以读入待扩展字符串时,应能够读入包含空格的字符串。,只要缩记符号-之后的字符比之前的字符的ASCII码值大,就要将它们之间的所有字符扩展出来,例如:Z-a之间的字符也要扩展出来;,特殊情况:a-b-c将被扩展为:abc。a-a将被扩展为:a-a。,【输入形式】从键盘输入包含扩展符的字符串【输出形式】输出扩展后的字符串【输入样例】a-c-u-B【输出样例】abcdefghijklmnopqrstu-B,本题解析:,这个题目乍一看比较麻烦。其实是这次作业中比较简单的题目之一。因为特殊的字符只有一个,那就是-,只要判断好-这个题目就完成了。,这个方法比较朴素,就是用一个flag来表示前一个字符是不是-如果不是-那么就输出这个字符,如果是的话就进行判断,判断这个字符跟-前字符的关系,如果这个字符-前字符,那就输出-在输出这个字符。否则的话就从-前字符到这个字符循环输出即可。,#include ,#include ,void expands(char s1,char s2);,int main(),char s1200,s2200;,gets(s1);/*读入*/,expands(s1,s2);,printf(%s,s2);, /*这个程序写的微微有些长,下页还有*/,void expands(char s1,char s2),int flag;,char j;,int i,l;,int sum=-1;,l=strlen(s1);/*确定字符串长度*/,flag=0;,for (i=0;il;i+),if (s1i=-)flag=1;continue;/*如果这个字符是-那么将flag赋值为1*/,if (!flag) /*如果flag为0的话*/,sum+;s2sum=s1i;/*直接输出*/,else if (s1i=s1i-2)/*否则如果这个字符比-前的字符小*/,sum+=2;s2sum-1=-;s2sum=s1i;/*就先打一个-再打这个字符*/,else/*否则的话就应该从前一个字符打印到这个字符*/,for (j=s1i-2+1;j=s1i;j+)/*这里注意,前一个字符已经存在于数组中了就不需要再打印了,所以是从s1i-2+1开始而不是s1i-2*/,sum+;s2sum=j;,flag=0;,s2sum+1=0; /*在字符串的最后放一个0表示结束*/,寄语:这个题写起来比较繁琐。可能理解起来有些困难。有能力的同学可以分步调试一下来查看结果。实在不会的话就去中408找我吧,11级第四次作业-矩阵运算3.,【问题描述】对于多个N阶矩阵,依次进行加、减运算。,【输入形式】从标准输入读取输入。第一行只有一个整数N(1N10),代表矩阵的阶数。接下来是一个矩阵,是N行,每行有N个整数(可能是正、负整数),是矩阵的所有元素。然后一行只含一个字符“+”或“-”,代表加、减操作。然后用同样的方式输入另一个矩阵。后续仍然是运算符和矩阵。直至运算符为“#”时停止计算,将结果输出。【输出形式】向标准输出打印矩阵的操作结果。输出N行,每行对应矩阵在该行上的所有元素,每一行末均输出一个回车符。每个元素占5个字符宽度(包括负号),向右对齐,不足部分补以空格。,【输入样例】 31 -2 72 8 -53 6 9+3 5 7-1 2 63 7 10-1 -2 72 8 -53 6 9 #【输出样例】(下图中”-”代表空格)#3#5#7#-1#2#6#3#7#10,本题解析:,这个题。乍一看吓一跳。其实仔细读题以后发现这个题是比较水的。,首先是题目叙述问题:样例输出中,(下图中”-”代表空格),应该是打错了其实是#代表空格。,然后矩阵加法就是把矩阵中对应的元素相加,减法就是对应的元素相减。比如说答案中第一行第一个数的3就是1+3-1得到的,#include,int main(),int n;,int s1010;,int i,j,k;,char ch;,scanf(%d,for (i=0;in;i+),for (j=0;jn;j+),scanf(“%d”,/*读入矩阵*/,while (1),ch=getchar();/*这里两次getchar()的原因是读完矩阵中的数后行尾还有一个n,这时再读入读入的才是+-或者#*/,ch=getchar();,if (ch=#),for (i=0;in;i+),for (j=0;jn;j+),printf(“%5d”,sij);,/*%5d,输出5位位数不足的用空格补齐*/,printf(n);,return 0; /*退出*/,for (i=0;in;i+),for (j=0;jn;j+),/*这里是进行加减操作*/,scanf(%d,if (ch=+) sij+=k;,else sij-=k;,由于题目难度增加,可能有些程序不能够在一页以内打完。所以可能看起来稍微费劲,见谅,11级第四次作业-,魔方阵4.,【问题描述】输入一个自然数(1N9),要求输出如下的魔方阵,即边长为2*N-1,在中心出现一次,其余位置上的数字从外向中心逐渐增大。N=3时:1111112221123211222111111N=4时:1111111122222112333211234321123332112222211111111【输入形式】从标准输入读取一个整数N。【输出形式】向标准输出打印结果。输出符合要求的方阵,每个数字占一个字符宽度,在每一行末均输出一个回车符。,本题解析:,这个题有多种做法。其中一种做法是将这个大矩阵看做是n个正方形叠放在一起的,最后看每个位置的重叠次数就可以了。,面积重叠的计算方法也可以去看第三次作业的矩阵相交的那个题。基本一样,#include,int main(),int n;,int i,j,k;,int s2020;,scanf(%d,for (i=0;i=19;i+),for (j=0;j=19;j+),sij=0;/*数组初始化*/,for (i=1;i=n;i+) /*一共n个正方形*/,for (j=i;j=2*n-i;j+)/*边坐标从i到2*n-i*/,for (k=i;k=2*n-i;k+),sjk+=1;/*进行过面积填充*/,for (i=1;i=2*n-1;i+),for (j=1;j=2*n-1;j+),printf(“%d”,sij);/*输出*/,printf(n);,11级第四次作业-文件拷贝25.,【问题描述】写一程序将一个文件fcopy.in拷贝至另一个文件fcopy.out, 其中在所拷贝的文件中, 多个连续空白符(包括空格符、制表符)只拷贝一个空格符, 其它字符不变。【输入形式】源文件名和目标文件名分别为fcopy.in和fcopy.out,程序将从当前目录下读取fcopy.in文件。【输出形式】将fcopy.in文件内容拷贝至当前目录下的fcopy.out文件中。在所拷贝的文件中, 多个连续空白符(包括空格符、制表符)只拷贝一个空格符,若非空白符之间有一个制表符,则该制表符也要替换为空格符,其它字符不变。【输入样例】假如文件fcopy.in中内容如下:Alcatel providesend-to-end solutions.【输出样例】输出文件fcopy.out中内容为:Alcatel provides end-to-end solutions.【样例说明】将文件fcopy.in拷贝到fcopy.out,同时做适当的转换。【评分标准】其中在所拷贝的文件中, 多个连续空白符(包括空格符、制表符)只拷贝一个空格符,其它字符不变,完全符合要求得20分,每个测试点4分。提交程序名为copy.c。,本题解析:,这里涉及到文件输入输出。惭愧的是某个人上课没好好听文件。就用了一种比较方便的方法,先介绍一下,使用与否看各位喜好了,不需要指针!scanf不用改成fscanf!,#include ,Int main(),freopen(“test.in”,”r”,stdin);/*打开输入文件*/,freopen(“test.out”,”w”,stdout);/*打开输出文件*/,exit(0);/*关文件*/,本题解析:,这次是真的解析。这个题目比较好思考。就是一个字符一个字符的读入。如果这个字符是空格或者t的话就看它的上一个字符是不是空格或者t如果是的话就不输出,否则输出一个空格。如果这个字符不是空格或者t那么就直接将这个字符输出就可以了。,#include,#include,int main(),freopen(fcopy.in,r,stdin);,freopen(fcopy.out,w,stdout);,char s,s1;,int i;,s=getchar();,while (s!=EOF)/*没有读完的时候继续读*/,if (s= )|(s=t),if (s1!= )&(s1!=t),printf( );,else printf(%c,s);,s1=s;,s=getchar();,exit (0);,11级第四次作业-括号匹配6.,【问题描述】假设一个输入字符串中包含圆括号、方括号和花括号三种类型的括号,以及其它一些任意字符。编写程序,判别串中的括号是否正确匹配,即:1.各种左、右括号的个数要一致;2.不能先出现右括号;3.其它规则暂不考虑,例如:( ad ce ) ef 认为是正确的。【输入形式】从当前目录下correct.in文件中读入一行字符串。字符串最大长度80,不含空格。【输出形式】输出到当前目录下correct.out文件中。输出只有一个单词,如果括号匹配则输出“True”到文件中,否则输出“False”。在输出末尾要有一个回车符。,本题解析:,这个题目由于是一个不完全的匹配也就是说()是合法的那么只需要三个变量来分别计算圆括号方括号和花括号。,遇到左括号的时候那么对应的变量值加一,遇到右括号的时候对应的变量值减一,如果出现了某个变量值为-1的时候也就是说没有出现左括号就出现右括号的时候表示不匹配。或者到了最后三个变量值中有一个不为0也就是说左右括号数量不相等的时候也表示不匹配,否则就是匹配的,#include ,#include ,int main(),freopen(correct.in,r,stdin);,freopen(correct.out,w,stdout);,int a=0,b=0,c=0;,/*a,b,c分别表示圆括号方括号花括号*/,char s200;,int i,flag=1;,gets(s);/*将文字读入*/,for (i=0;istrlen(s);i+),switch(si),case (:a+=1;break;,case :b+=1;break;,case :c+=1;break;,case ):a-=1;break;,case :b-=1;break;,case :c-=1;break;,if (a0)|(b0)|(c0),/*如果a,b,c中有一个小于零则退出*/,flag=0;break;,if (a=0)&(b=0)&(c=0)&(flag),/*如果a,b,c都为0而且没有中间出现有a,b,c小于零的情况*/,printf(“Truen”);,/*那么他就是匹配的*/,else printf(Falsen);,exit(0);,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!