C语言第四次作业教学教材_第1页
C语言第四次作业教学教材_第2页
C语言第四次作业教学教材_第3页
C语言第四次作业教学教材_第4页
C语言第四次作业教学教材_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

C语言第四次作业本题解析:

这道题主要的障碍存在于两个方面:1.怎么读入2.怎么删。

读入的话简单的说就是将一个数以字符串的形式存储下来然后通过字符串处理对数字的每一位进行操作。

删除的方式比较精髓。这里介绍一个比较容易懂的方法:每次删除都搜索第一个第i位比第i+1位大的,然后把第i位删掉。重复m次就可以得到最优解了。

#include<stdio.h>#include<string.h>intmain(){chars[245];inti,j,k;intn,m;scanf("%s",s);scanf("%d",&m);n=strlen(s);/*这里是上面string.h中的函数,就是求s的长度的意思*/for(i=1;i<=m;i++)/*总共删m个数*/{for(j=0;j<=n-1;j++)/*从头到尾扫描*/{if(s[j]>s[j+1])/*如果这个数比下一个数大那么这个数要删掉*/{for(k=j;k<=n;k++)/*删除操作*/s[k]=s[k+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:Exercise3-3)注意:待扩展字符串中有可能包含空格,例如:a-dx-z应扩展成:abcdxyz。所以读入待扩展字符串时,应能够读入包含空格的字符串。

只要缩记符号-之后的字符比之前的字符的ASCII码值大,就要将它们之间的所有字符扩展出来,例如:Z-a之间的字符也要扩展出来;

特殊情况:a-b-c将被扩展为:abc。a-a将被扩展为:a-a。

【输入形式】

从键盘输入包含扩展符的字符串

【输出形式】

输出扩展后的字符串

【输入样例】

a-c-u-B

【输出样例】

abcdefghijklmnopqrstu-B

本题解析:

这个题目乍一看比较麻烦。。其实是这次作业中比较简单的题目之一。因为特殊的字符只有一个,那就是‘-’,只要判断好’-’这个题目就完成了。

这个方法比较朴素,就是用一个flag来表示前一个字符是不是‘-’如果不是‘-‘那么就输出这个字符,如果是的话就进行判断,判断这个字符跟’-‘前字符的关系,如果这个字符≤’-‘前字符,那就输出’-‘在输出这个字符。否则的话就从‘-’前字符到这个字符循环输出即可。

#include<stdio.h>#include<string.h>voidexpands(chars1[],chars2[]);intmain(){chars1[200],s2[200];gets(s1);/*读入*/expands(s1,s2);printf("%s",s2);}/*这个程序写的微微有些长,下页还有*/voidexpands(chars1[],chars2[]){intflag;charj;inti,l;intsum=-1;l=strlen(s1);/*确定字符串长度*/flag=0;for(i=0;i<l;i++){if(s1[i]==‘-’){flag=1;continue;}/*如果这个字符是‘-‘那么将flag赋值为1*/if(!flag)/*如果flag为0的话*/{sum++;s2[sum]=s1[i];}/*直接输出*/elseif(s1[i]<=s1[i-2])/*否则如果这个字符比’-‘前的字符小*/{sum+=2;s2[sum-1]=‘-’;s2[sum]=s1[i];}/*就先打一个’-‘再打这个字符*/else/*否则的话就应该从前一个字符打印到这个字符*/{for(j=s1[i-2]+1;j<=s1[i];j++)/*这里注意,前一个字符已经存在于数组中了就不需要再打印了,所以是从s1[i-2]+1开始而不是s1[i-2]*/{sum++;s2[sum]=j;}flag=0;}}s2[sum+1]=‘\0’;/*在字符串的最后放一个’\0’表示结束*/}寄语:这个题写起来比较繁琐。可能理解起来有些困难。有能力的同学可以分步调试一下来查看结果。实在不会的话就去中408找我吧~11级第四次作业---矩阵运算3.【问题描述】

对于多个N阶矩阵,依次进行加、减运算。【输入形式】

从标准输入读取输入。第一行只有一个整数N(1≤N≤10),代表矩阵的阶数。

接下来是一个矩阵,是N行,每行有N个整数(可能是正、负整数),是矩阵的所有元素。

然后一行只含一个字符“+”或“-”,代表加、减操作。

然后用同样的方式输入另一个矩阵。

后续仍然是运算符和矩阵。直至运算符为“#”时停止计算,将结果输出。

【输出形式】

向标准输出打印矩阵的操作结果。输出N行,每行对应矩阵在该行上的所有元素,每一行末均输出一个回车符。每个元素占5个字符宽度(包括负号),向右对齐,不足部分补以空格。

【输入样例】

3

1-27

28-5

369

+

357

-126

3710

-

1-27

28-5

369

#【输出样例】

(下图中”-”代表空格)

####3####5####7

###-1####2####6

####3####7###10

本题解析:

这个题。。乍一看吓一跳。。其实仔细读题以后发现这个题是比较水的。。

首先是题目叙述问题:样例输出中(下图中”-”代表空格)应该是打错了…其实是’#’代表空格。。

然后矩阵加法就是把矩阵中对应的元素相加,减法就是对应的元素相减。比如说答案中第一行第一个数的3就是1+3-1得到的…#include<stdio.h>intmain(){intn;ints[10][10];inti,j,k;charch;scanf("%d",&n);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf(“%d”,&s[i][j]);/*读入矩阵*/while(1){ch=getchar();/*这里两次getchar()的原因是读完矩阵中的数后行尾还有一个’\n‘,这时再读入读入的才是’+’’-’或者’#’*/ch=getchar();

if(ch=='#'){for(i=0;i<n;i++){for(j=0;j<n;j++)printf(“%5d”,s[i][j]);/*%5d,输出5位位数不足的用空格补齐*/printf("\n");}return0;/*退出*/}for(i=0;i<n;i++)for(j=0;j<n;j++){/*这里是进行加减操作*/scanf("%d",&k);if(ch=='+')s[i][j]+=k;elses[i][j]-=k;}}}由于题目难度增加,可能有些程序不能够在一页以内打完。所以可能看起来稍微费劲,见谅~11级第四次作业---魔方阵4.【问题描述】输入一个自然数N(1≤N≤9),要求输出如下的魔方阵,即边长为2*N-1,N在中心出现一次,其余位置上的数字从外向中心逐渐增大。

N=3时:

11111

12221

12321

12221

11111

N=4时:

1111111

1222221

1233321

1234321

1233321

1222221

1111111

【输入形式】从标准输入读取一个整数N。

【输出形式】向标准输出打印结果。输出符合要求的方阵,每个数字占一个字符宽度,在每一行末均输出一个回车符。

本题解析:

这个题有多种做法。其中一种做法是将这个大矩阵看做是n个正方形叠放在一起的,最后看每个位置的重叠次数就可以了。

面积重叠的计算方法也可以去看第三次作业的矩阵相交的那个题。基本一样#include<stdio.h>intmain(){intn;inti,j,k;ints[20][20];scanf("%d",&n);for(i=0;i<=19;i++)for(j=0;j<=19;j++)s[i][j]=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++)s[j][k]+=1;/*进行过面积填充*/for(i=1;i<=2*n-1;i++){for(j=1;j<=2*n-1;j++)printf(“%d”,s[i][j]);/*输出*/printf("\n");}}11级第四次作业---文件拷贝25.【问题描述】

写一程序将一个文件fcopy.in拷贝至另一个文件fcopy.out,其中在所拷贝的文件中,多个连续空白符(包括空格符、制表符)只拷贝一个空格符,

其它字符不变。

【输入形式】

源文件名和目标文件名分别为fcopy.in和fcopy.out,程序将从当前目录下读取fcopy.in文件。

【输出形式】

将fcopy.in文件内容拷贝至当前目录下的fcopy.out文件中。在所拷贝的文件中,多个连续空白符(包括空格符、制表符)只拷贝一个空格符,若非空白符之间有一个制表符,则该制表符也要替换为空格符,其它字符不变。

【输入样例】

假如文件fcopy.in中内容如下:

Alcatel

provides

end-to-endsolutions.

【输出样例】

输出文件fcopy.out中内容为:

Alcatelprovidesend-to-endsolutions.

【样例说明】

将文件fcopy.in拷贝到fcopy.out,同时做适当的转换。

【评分标准】

其中在所拷贝的文件中,多个连续空白符(包括空格符、制表符)只拷贝一个空格符,其它字符不变,完全符合要求得20分,每个测试点4分。提交程序名为copy.c。

本题解析:

这里涉及到文件输入输出。惭愧的是…某个人上课没好好听文件。就用了一种比较方便的方法,先介绍一下,使用与否看各位喜好了~

不需要指针!scanf不用改成fscanf!…#include<stdio.h>Intmain(){freopen("test.in”,”r”,stdin);/*打开输入文件*/freopen("test.out”,”w”,stdout);/*打开输出文件*/

exit(0);/*关文件*/}本题解析:

这次是真的解析。这个题目比较好思考。就是一个字符一个字符的读入。如果这个字符是空格或者’\t’的话就看它的上一个字符是不是空格或者’\t’如果是的话就不输出,否则输出一个空格。如果这个字符不是空格或者’\t’那么就直接将这个字符输出就可以了。

#include<stdio.h>#include<string.h>intmain(){freopen("fcopy.in","r",stdin);freopen("fcopy.out","w",stdout);chars,s1;inti;s=getchar();while(s!=EOF)/*没有读完的时候继续读*/{if((s=='')||(s=='\t')){if((s1!='')&&(s1!='\t'))printf("");}elseprintf("%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<stdio.h>#include<st

温馨提示

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

最新文档

评论

0/150

提交评论