2019年春季学期第五周作业
这个作业属于哪个课程 | C语言程序设计2 |
这个作业要求在哪里 | 2019年春季学期第四周作业 |
我在这个课程的目标是 | 我希望能够通过学习C语言的知识,能够解决部分有关字符,和字符串的问题。 |
这个作业在哪个具体方面帮助我实现目标 | 这个作业让我知道了字符型数组的简单使用,字符数组与字符串的区别,二维字符数组的输入及简单判断,对指针的初步了解,让我对数组的知识有了更加深入的了解。 |
参考文献 | strlen函数;%s与%c的区别;二维字符数组输入字符串;strcpy函数动态规划——寻找子矩阵最大和;最大子矩阵和(详解) |
第四周预习作业
题目
7-1 统计一行文本的单词个数 (15 分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
1)实验代码
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,count;
char op[10000];
count=0;
i=0;
while((op[i]=getchar())!='\n')
i++;
op[i]='\0';
if(op[0]==' ')
count=0;
else
count=1;
for(j=0;j<i-1;j++)
{
if(op[j]==' '&&op[j+1]!=' ')
count++;
}
printf("%d",count);
return 0;
}
2)设计思路
3)本题调试过程中碰到的问题及其解决办法
1.for循环遍历字符时,循环控制条件写成op[j]!='\0';
解决办法:把循环条件改成j<i-1。
2.for循环内的判断条件op[j]==' '少写了个=,导致未考虑多个空格,长、短字符串,有标点,词间空1格等问题,答案错误;
解决办法:把少了的=加上。
4)运行截图
第五周基础作业
题目
7-1 英文单词排序 (25 分)
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple
#
输出样例:
red blue green yellow purple
1)实验代码
代码这里我把PTA和博客园的要求结合在了一起,输入结束的标志是按照博客园上的要求确定的,我这里是')'.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *wenjian;
int i,j,index,num;
char a[21][11],temp[11];
num=0;
if((wenjian=fopen("D:\\creative\\Leemay.txt","a+"))==NULL)
{
printf("File open error!\n");
exit(0);
}
while(1)
{
fscanf(wenjian,"%s",&a[num]); //一行一行的输入字符串;
if(a[num][0]==')')
break;
num++; //num计算单词个数;
}
fprintf(wenjian,"\n");
for(i=0;i<num-1;i++) //用选择排序法,对单词排序;
{
index=i;
for(j=i+1;j<num;j++)
{
if(strlen(a[j])<strlen(a[index]))
{
index=j;
}
}
strcpy(temp,a[index]); //交换两个单词的位置;
strcpy(a[index],a[i]);
strcpy(a[i],temp);
}
for(i=0;i<num;i++)
{
fprintf(wenjian,"%s ",a[i]);
}
if(fclose(wenjian)){
printf("Can not close the file!\n");
exit(0);
}
return 0;
}
2)设计思路
3)本题调试过程中碰到的问题及其解决办法
1.在pta上完成时多个测试点答案错误,有并列,全等长,顺序无并列等;
解决办法:仔细调试,整理思路,发现错误在使用选择排序法对单词进行排序,对两个单词进行交换位置时,交换的单词的下标写错了,本应使用外层循环的下标,但用的是内层循环的下标。
2.在文件中输入时运行结果无反应;
解决办法:在文件中的单词没有按要求输入,改正输入的格式即可。
4)运行截图
挑战作业
题目
返回整数数组中最大子数组的和,本周,我们要求二维数组的子数组必须是矩形的。
1)实验代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *wenjian;
int a[100][100];
int temp,max,sum,i,j,k,h,l;
char op;
if((wenjian=fopen("D:\\creat\\Leemay.txt","a+"))==NULL)
{
printf("File open error!\n");
exit(0);
}
fscanf(wenjian,"%d\n%d",&h,&l);
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
{
fscanf(wenjian,"%d%c",&a[i][j],&op);
}
}
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
{
a[i][j]=a[i][j]+a[i-1][j];
}
}
temp=0;
max=a[0][0];
for(i=0;i<h;i++)
{
for(j=i;j<h;j++)
{
sum=0;
for(k=0;k<l;k++)
{
temp=a[j][k]-a[i-1][k];
if(sum>=0)
sum+=temp;
else
sum=0+temp;
if(sum>max)
max=sum;
}
}
}
fprintf(wenjian,"\n%d ",max);
if(fclose(wenjian)){
printf("Can not close the file!\n");
exit(0);
}
return 0;
}
2)设计思路
3)本题调试过程中碰到的问题及其解决办法
1.在计算矩阵的和时,当sum和为负数就把sum赋值为0,但在之后忘了加上其后一位数temp,导致最后的最大值为0;
解决办法:sum=0之后加上temp。
4)运行截图
预习作业
1.预习的主要内容
地址和指针的概念;指针变量的定义;指针的基本运算;指针变量的初始化。
2.完成情况截图
3.预习中存在的疑惑
1.指针变量在哪些情况下运用;
2.指针怎样在自定义函数中返回多个值;
3.*&a这样的表达形式合法吗,如果合法,它和*(&a)有什么区别。
学习感悟
本周学习了字符型数组的简单使用,字符数组与字符串的区别,二维字符数组的输入及简单判断,对指针的初步了解,还有了解了strlen函数,strcpy函数。本周的学习中,对二维字符数组的运用我觉得是个难点,还有本次挑战作业中找二维数组的最大子数组之和,为此我在网上查看了许多文章,相关文章虽然有很多,但是针对的人群又大不相同,虽然看了那么多文章,完全看懂了的却很少,也因此我在看这些文章的同时还要去查各种之前没见过的函数的用法,虽然过程麻烦,但是益处也很大。
结对编程
本周和搭档的结对编程,其实我觉得还有待改善,因为本次题目对目前的我们来说并不容易,此次我们都算是单方面输出的感觉,我给搭档讲解他的疑惑,他和我分享他的思路。结对编程的优点就是我们能解决彼此的疑惑,在讲解的同时也能把自己的思路理得更加顺畅清晰,加深理解,缺点是我们都有双方无法解答的问题。
学习进度
时间进度条
日期 | 这周所花时间 | 代码行 | 学到的知识点 | 问题 |
---|---|---|---|---|
3.15-3.22 | 10个小时 | 130 | 选择排序,冒泡排序,二维数组 | 输出完一行数后会自动换行吗 |
3.22-3.29 | 13个小时 | 200 | 字符型数组的简单使用,字符数组与字符串的区别,二维字符数组的输入及简单判断,对指针的初步了解 | 指针怎样在自定义函数中返回多个值 |