2018上C语言程序设计(高级)作业- 第2次作业
作业要求一
提交截图:
6-7:
6-8:
6-9:
7-1:
7-2:
7-3:
7-4:
7-5:
作业要求二
- 题目6-7删除字符中数字字符
1、设计思路:
(1)第一步:本题要求是删除字符中的数字字符,我的主要思路是通过数组遍历若遇到数字,就把其删除,把之后的非数字的字符向前移动;
第二步:根据此思路,首先定义两个循环变量i,j;通过while条件语句来进行判断数字字符,之后再逐一删除,前移;
2、实验代码:
#include "stdio.h"
void delnum(char *s)
{
int i = 0,j = 0;
while(s[i] != '\0') {
if (!(s[i] >= '0' && s[i] <= '9')) {
s[j] = s[i];
j++;
}
i++;
}
s[j] = '\0';
}
3、本题调试过程碰到问题及解决办法
本题是字符问题,当我在遇到这个问题的时候,只是有想法,知道怎么去做,但是却不知道怎么去用if条件来判断出数组中的是否含有数字字符。简单的说我只会构思,不会去写成代码。其主要问题是在
就是不会写这个条件;
改正方法:我去网站上找了下这个题,看了许多的大佬的程序,他们的代码方式写的有很多中,之后我自己找到了这个条件,之后就顺利写出这个题目了。
- 题目6-8 统计子串在母串出现的次数
1、设计思路:
(1)第一步:首先要遍历数组,若要找出子串在母串的出现次数,在遍历数组的时候,利用if条件语句进行逐一的判断;
第二步:在遍历的过程中,循环变量要逐一的相加,而不是看子串的字符个数,这样才能较为准确的去查找出现次数;(自我感觉自己的算法比较麻烦,但是实在是想不出简单的算法,就只能将就着用)
2、实验代码
(之前代码)
#include<stdio.h>
int fun(char *str,char *substr)
{
int result=0,i=0;
for(i=0;str[i]!='\0';i++)
{
if(substr[0]==str[i]&&substr[1]==str[i+1]&&substr[2]==str[i+2])
{
result++;
}
}
return result;
}
(改进后代码)
int fun(char *str,char *substr)
{
int result=0,i=0,j=0,f=0;
for(i=0;str[i]!='\0';i++)
{
j=0,f=i;
while(substr[j]==str[f])
{
if(substr[j+1]=='\0')
{
result++;
}
j++,f++;
}
}
return result;
}
3、本题调试过程碰到问题及解决办法
本题没有问题;
- 题目6-9字符串中除首尾字符外的其余字符按降序排列
1、设计思路:
(1)第一步:本题可按照之前的非字符的冒泡排序的方法去来实现这个问题,只是在遍历数组的时候,出去首尾两项;
第二步:根据这个思路,首先定义循环变量,之后遍历数组(注:在遍历数组的时候要注意不要包括首尾两项)之后再按照冒泡的方法进行排序即可;
2、实验代码
#include <stdio.h>
int fun(char *s,int num)
{
int i=1,j=1,max;
for(i=1;i<num-3;i++)
{
for(j=1;j<num-2;j++)
{
if(s[j]<s[j+1])
{
char swap;
swap=s[j];s[j]=s[j+1];s[j+1]=swap;
}
}
}
}
3、本题调试过程碰到问题及解决办法
本题没有问题;
-
题目7-1输出学生成绩
1、设计思路
(1)第一步:根据题意,首先要定义一些相关的变量,例如学生人数n,循环变量i,等等;
第二步:之后在创建内存动态存储;(这个我之后按照老师上课讲的照抄照搬,自己当时听懂的内容也是不是很多,后来我也去上网查了许多的有关动态存储的相关的教程,也算是略有了解,但还是理解的不够深刻)
第三步:在创建动态存储之后,之后就开始在数组中存储内容(成绩),在存储的同时可以进行求和,以便进行之后的求平均值的操作;
第四步:存储之后,求平均值,之后遍历数组进行找最大值和最小值;(此时应把最大值和最小值变量先初始化为数组的首地址元素,方便比较)之后根据数组遍历来找出最大值和最小值;
第五步:最后便可按照题目要求进行输出;
(2)流程图:
2、实验代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n=0,i=0,*p,sum=0,max=0,min=0;
double average=0;
scanf("%d",&n);
if((p=(int*)calloc(n,sizeof(int)))==NULL)
{
printf("Not able to allocate memory.\n");
exit(1);
}
for(i=0;i<n;i++)
{
scanf("%d",p+i);
sum=sum+*(p+i);
}
average=(double)(sum*1.0/n*1.0);
max=*p;min=*p;
for(i=0;i<n;i++)
{
if(max<*(p+i))
{
int swap=0;
swap=max;max=*(p+i);*(p+i)=swap;
}
}
for(i=0;i<n;i++)
{
if(min>*(p+i))
{
int tmp=0;
tmp=min;min=*(p+i);*(p+i)=tmp;
}
}
printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",average,(double)max,(double)min);
free(p);
return 0;
}
3、本题调试过程碰到问题及解决办法
错误信息1:
这个问题是我把max和min的初始化都放到了for循环里面了,导致在提交的时候总是有一个点过不去;
改正方法:在出现这个错误之后,当时我也很纳闷,因为我在输入例题啥的都正确但就是不能过那个点。之后我也尝试了老师所说的进行单步调试,在调试的过程中我发现了,每次在进行for循环的时候都会把max和min在初始化依次,当时只是略有怀疑,因为我还是很惯性的认为即使初始化也没啥问题,因为输出的结果还是正确的。但是它总是过不去这个点,之后我就去询问同学,在同学帮助下,也是指出了这个问题,最终我把max和min初始化放到了for之前了最后通过了。
-
题目7-2 计算职工工资
1、设计思路:
(1)第一步:首先先定义结构,根据题目要求,在定义的结构里定义职工的名字,基本工资,浮动工资和支出工资;(注意题目的精度要求)
第二步:定义完结构之后,在主函数里根据题目要求来创建各个所需变量;
第三步:创建所需变量之后,要做的就是要是给相应的变量赋初值,再根据题目的公式计算出所对于的实际工资,并输出;
(2)流程图:
2、实验代码:
#include<stdio.h>
struct workers
{
char name[10];
float bs;
float tfw;
float sw;
};
int main()
{
int n,i=0;
scanf("%d",&n);
struct workers w[n];
for(i=0;i<n;i++)
{
scanf("%s %f %f %f",w[i].name,&w[i].bs,&w[i].tfw,&w[i].sw);
}
for(i=0;i<n;i++)
{
printf("%s %.2f\n",w[i].name,w[i].bs+w[i].tfw-w[i].sw);
}
}
3、本题调试过程碰到问题及解决办法
错误信息1:在写本题的时候,我用了两个时间段,一个是在刚发下题的时候,一个是在星期的时候。为啥有俩时间段,主要是在第一个时间段我在刚听完老师讲课之后几乎是没怎么听懂,感觉就学了一个定义其他的应用一点也不会,之后拿到这个题也是很头疼,看老师的代码例子,看也看不懂。所以就写不出来;
解决方法:遇到这个题的时候我总感觉要用数组比较好,可老师没有讲这个问题,之后我就去书上往后看了几页找到用数组的例子,仿照例子就把这个问题解决了;
- 题目7-3计算平均成绩
1、设计思路:
(1)第一步:首先要定义结构,定义学生的学号,姓名和成绩;(主要学号是用字符串的形式而不是整数型)
第二步:之后在主函数中根据题目要求定义几个变量;
第三步:之后在给每个学生进行赋初值的操作,并且把各个学生的成绩进行求和操作;
第四步:求和之后即可求出平均值;
第五步:再进行遍历操作,找出在平均值下的学生,注意学生的成绩和平均值的类型不同,要进行强转,之后在进行比对找出在平均值下的学生;
2、实验代码:
#include<stdio.h>
struct student
{
char name[10];
char id[5];
int result;
};
int main()
{
int n=0,i=0,sum=0;
float average;
scanf("%d",&n);
struct student s[n];
for(i=0;i<n;i++)
{
scanf("%s %s %d",s[i].id,s[i].name,&s[i].result);
sum=sum+s[i].result;
}
average=(float)(sum*1.0/n*1.0);
printf("%.2f\n",average);
for(i=0;i<n;i++)
{
if((float)(s[i].result)<average)
{
printf("%s %s\n",s[i].name,s[i].id);
}
}
}
3、本题调试过程碰到问题及解决办法
本题在调试过程中没有碰到问题;
- 题目7-4按等级统计学生成绩
1、设计思路:
(1)第一步:根据题意,首先要找不及格的同学个数,故先定义循环变量j,和用来计数的变量result,之后经过遍历再加上if条件来判断不及格的人数;
第二步:若要依据每个人的成绩进行评判每个人的等级,首先需要遍历这个数组,之后再用if条件进行判断,在每个判断条件里进行grade的赋值操作;
第三步:因为在定义的函数里数组是用指针的方式,所以不需要进行返回,而所进行的找不及格的人数是int型的故需要返回值;
2、实验代码:
#include <stdio.h>
#define MAXN 10
int set_grade( struct student *p, int n )
{
int j=0,result=0;
for(j=0;j<n;j++)
{
if(p[j].score<60)
{
result++;
}
}
for(j=0;j<n;j++)
{
if(((p+j)->score)>=85&&((p+j)->score)<=100)
{
((p+j)->grade)='A';
}else if(((p+j)->score)>=70&&((p+j)->score)<=84)
{
((p+j)->grade)='B';
}else if(((p+j)->score)>=60&&((p+j)->score)<=69)
{
((p+j)->grade)='C';
}else if(((p+j)->score)>=0&&((p+j)->score)<=59)
{
((p+j)->grade)='D';
}
}
return result;
}
3、本题调试过程碰到问题及解决办法
本题没有遇到太大的问题,只是在一开始写程序的时候,我用的还是以前的那种数组结构,没有用到指针,而指针用的不是太熟,之后我通过看上课时候代码,仿照代码把程序又改成用指针的形式;
-
题目7-5 结构体数组按总分排序
1、设计思路:
(1)第一步:本题首先需要计算总分,故先在定义的第一个函数里进行定义循环变量k,之后通过遍历数组来计算出总分;
第二步:在计算出总分之后,便开始根据总成绩进行排名。由此题目可仿照以前的一维数组中的冒泡排序的思路,根据分数这个变量进行判断;(注:在进行交换的时候,定义的交换变量需要是那个已定义的类型。自我感觉,之后这样才能通过主函数中的遍历数组方法来进行排名)
(2)流程图:
主函数:
第一个函数:
第二个函数:
2、实验代码:
void calc(struct student *p,int n)
{
int k=0;
for(k=0;k<n;k++)
{
(p+k)->sum=(p+k)->score[0]+(p+k)->score[1]+(p+k)->score[2];
}
}
void sort(struct student *p,int n)
{
int k=0,l=0;
struct student swap;
for(k=0;k<n;k++)
{
for(l=k+1;l<n;l++)
{
if(p[k].sum<p[l].sum)
{
swap=p[k];p[k]=p[l];p[l]=swap;
}
}
}
}
3、本题调试过程碰到问题及解决办法
错误信息1:在写这个程序的时候,我的思路一开始就比较的明确。所以在写的时候比较的顺利,但在第二个函数中出现了问题,当时我定义的用来交换的变量是float型的,还是按照以前的那种思路进行交换,但在运行的过程中发现,输出结果每个人对应的总成绩是不对应的。
改正方法:在遇到这个问题的时候,我当时也是很懵,但是确实不知道怎么改。但自从听了老师上课讲说上网查代码之类的对自己的逻辑分析能力提高不是很好,我就决定不到最难的时候不去查。其实我也很认可老师的观点。于是我就把上课讲的内容想了一遍,感觉这个是定义类型的问题,于是改了类型之后就很容易的通过了。通过这个错误,也许它不是什么难题,但对我来说却很为自己独立想出而高兴的。
作业要求三、学习总结和进度
1、总结两周里所学的知识点有哪些学会了?(可记录每道作业题目所用的知识点)哪些还没有学会?
这两周所学会的知识点:
这两周我学会了关于字符串的跟深层次的应用,并且比上两周在应用指针方面更加的熟练。这两周还学了有关结构的定义,对这个自己觉得运用的还是不够娴熟。对于结构这里的知识点,上课的内容现在也懂了,但在做题的时候总是不太喜欢用老师讲的那些方法。可能在理解上有些不同吧。
还没有学会的知识点:
这两周的课上知识点自己感觉学的还可以,只是在运用上很是欠佳,可能正如老师说那样,遇到问题自己多去思考,对方面自己很欠缺,逻辑能力不强,有很多问题其实很简单就是想不出来,当看了网上的那些代码之后就一下豁然开朗。在这逻辑方面还需要提升。
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。
Git地址:
Git地址
上传截图:
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业。
①点评的三位同学:
董欣
董雅洁
丰大为
②邀请三位同学点评:
董欣
董雅洁
执念丶。
4、请用表格和折线图呈现你本周(3/26 8:00~4/9 8:00)的代码行数和所用时间、博客字数和所用时间。
表格:
折线图: