2019春第五周作业
这个作业属于哪个课程 | c语言程序设计2 |
---|---|
这个作业要求在哪 | 2019年春季学期第五周作业 |
我在这个课程的目标是 | 掌握字符(串)数组的相关知识 |
这个作业在哪个具体方面帮助我实现目标 | 通过PTA作业学习字符(串)数组使用方法并对代码进行检测 |
参考文献 | C语言程序设计 |
预习题:7-1 统计一行文本的单词个数 (15 分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
1).实验代码
#include<stdio.h>
int main()
{
int n=0;
char a,m=' ';
while(a!='\n'){
scanf("%c",&a);
if(a==' '&&m!=' '||a=='\n'&&m!=' '){
n++;
}
m=a;
}
printf("%d",n);
return 0;
}
2).设计思路
主要思路:有一个空格就有一个单词,连续多个空格只算一个单词,末尾没有空格也要算一个单词。
第一步:定义两个字符变量,一个用来存输入的字符,一个用来存上一个输入的字符,再定义一个整型变量计数器记录单词个数。
第二步:输入一个字符判断一个,当输入字符为换行符时结束循环,当输入的字符为空格且上一个字符不是空格或输入的字符为换行符且上一个字符不是空格时计数器+1。
第三步:输出计数器的值。
3).本题调试过程碰到的问题以及解决办法
根据提示,连续多个空格时所有空格均会算一个单词,故需要改变算一个单词的条件,将第8行if(a32&&a!=m){改为if(a' '&&m!=' '){。
整理了一下,问题如下:1.以空格开头会算一个单词。2.结尾没有空格所以最后一个单词没加。都是判断条件问题。将if(a' '&&m!=' '){改为if(a' '&&m!=' '||a=='\n'&&m!=' '){,将第5行m改为m=' ',将11行改为m=a;,问题得以解决。
4).运行结果截图
基础作业:7-1 英文单词排序 (25 分)
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple
输出样例:
red blue green yellow purple
博客要求:1)通过以自己名字命名的文件输入英文单词,(2)英文单词输入的结束标记为你学号最后一位数+37所对应的ASCII字符。(例如:你的学号最后一位为9,则结束标记为9+37=46所对应的ASCII字符“.”)(3)在不删除原有内容的情况下,将排序后的单词输出到文件。
1).实验代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main (void)
{
FILE*fp;
char ch[20][10],a[20];
int h,l,n;
if((fp=fopen("D:\\helei.txt","a+"))==NULL){
printf("File open error!\n");
exit(0);
}
while(1){
fscanf(fp,"%s", ch[n]);
if(ch[n][0]==','){
break;
}
n++;
}
for(h=0;h<n-1;h++)
for(l=0;l<n-1;l++)
{
if(strlen(ch[l])>strlen(ch[l+1]))
{
strcpy(a,ch[l]);
strcpy(ch[l],ch[l+1]);
strcpy(ch[l+1],a);
}
}
fprintf(fp,"\n",ch[h]);
for(h=0;h<n;h++)
{
fprintf(fp,"%s ",ch[h]);
}
if(fclose(fp)){
printf("Can not close the file!\n");
exit(0);
}
}
2).设计思路
第一步:通过while循环逐行输入字符串,当输入的字符为7+37对应的“,”时结束循环。
第二步:通过两个for嵌套实现字符串的调用和长度对比,如果下标较小的字符串的长度大于下标较大的字符串的长度,则用strpy函数配合中间字符变量将内容交换,经过多轮循环下标从小到大的字符串的长度也变成从小到大。
第三步:用for循环将字符串下标从小到大的顺序依次输出。
3).本题调试过程碰到的问题以及解决办法
除了测试点4其它都错了,根据提示以及运行结果,仔细检查代码后发现第14、15行中应为<n-1,否则循环会进行到字符为'\n'才结束,从而导致答案错误,修改后问题得以解决。
4).运行结果截图
挑战作业:
继续挑战第二周的挑战作业:返回整数数组中最大子数组的和,本周,我们要求二维数组的子数组必须是矩形的。
具体要求参看邹欣老师博客 现代程序设计作业2
1).实验代码
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE*fp;
int b=0,m=0,k=0,i=0,x=0,y=0,z=0,n=0,sum2=0,sum3=0,h=0,l=0,c=0,d=0,e=0;
int a[10][10];
if((fp=fopen("D:\\helei.txt","a+"))==NULL){
printf("File open error!\n");
exit(0);
}
fscanf(fp,"%d",&n);
for(i=0;i<n;i++){
for(m=0;m<n;m++) {
fscanf(fp,"%d",&a[i][m]);
sum3=a[0][0]-1;
}
}
for(x=0;x<n;x++){
for(k=0;k<n;k++){
if(x<=k){
c=n-k;
}
if(x>k){
c=n-x;
}
for(b=0;b<c;b++){
for(z=x;z<=b+x;z++){
for(y=k;y<=b+k;y++){
sum2=sum2+a[z][y];
}
}
if(sum2>sum3){
h=x;
d=x;
l=b;
i=k;
e=k;
sum3=sum2;
}
sum2=0;
}
}
}
fprintf(fp,"\n");
for(h;h<=d+l;h++){
for(i=e;i<=e+l;i++){
fprintf(fp,"%d ",a[h][i]);
}
fprintf(fp,"\n");
}
fprintf(fp,"%d",sum3);
return 0;
}
2).设计思路
用穷举法将所有情况求和,并保留最大和以及取到最大和时对应矩阵的行列数起点和终点。
3).本题调试过程碰到的问题以及解决办法
碰到的问题太多了,然后也没截图,确定思路是对的后,经过3个多小时的编写和调试后终于对了。
把矩形当成正方形了>_<|||,就一直按照正方形的思路在编写,应该差别不大不想改了。
4).运行结果截图
预习作业:
本周预习作业为选择题,提交至博客的具体内容可调整为:1.预习的主要内容,2.完成情况截图(要求有题目和答案),3.预习中存在的疑惑(至少写出2条)
1.预习了指针的相关知识。
2.
3.指针具体是一个怎样的存在?指针能用在哪写具体的问题上?指针真有别人说的那么好用吗?
二、学习进度统计
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
3/2-3/8 | 2h | 23行 | 数组 | 无 |
3/9-3/11 | 3h | 29行 | 读取文件数据 | 无 |
3/12-3/18 | 5h | 70行 | 用数组输出矩阵 | 无 |
3/19-3/25 | 8h | 140行 | 多种排序方法 | 无 |
3/26-4/1 | 5h | 82行 | 字符(串)数组的相关知识 | 无 |
三、学习感悟
这周学习了字符(串)数组的相关知识,新知识的学习提升了我的能力,以后可以解决更多问题了。
四、结对编程过程和结对编程的优缺点
忘了拍照了。。
队员优点:1.对不懂的问题善于寻求帮助2.有灵性3.冷静不浮躁
缺点:不主动和队友交流
结对编程的优点:(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。
不适合结对编程的情况:
并不是所有的项目都适合结对编程,下面是一些不适合使用的例子。
1)处于探索阶段的项目,需要深入地研究,在这种情况下,一个人长时间的独立钻研是有必要的。
2)在做后期维护的时候,如果维护的技术含量不高,只需要做有效的复审即可,不必拘泥于形式,硬拉一个人来结对唱二人转。
3)如果验证测试需要运行很长时间,那么两个人在那里等待结果是有点浪费时间。
4)如果团队的人员要在多个项目中工作,不能充分保证足够的结对编程时间,那么成员要经常处于等待的状态,反而影响效率。
5)关键是如何最大限度地发挥“领航员”的作用,如果用处不大,也就无需结对。