C程序第二次作业
2-1删除字符串中数字字符
1.设计思路
(1)主要描述题目算法
第一步:遍历指针s所指的s数组。
第二步:如果 * (s+i)在0至9之间的话,则跳过此 * (s+i)。
第三步:如果* (s+i)不在0至9之间的话,使得 * (s+j) = * (s+i),j++。
第四步:千万不要忘记最后 * (s+j) = '\0。
(2)流程图
2.实验代码
void delnum(char *s)
{
int i=0,j=0;
for(i=0;*(s+i) != '\0';i++)
{
if(*(s+i)>='0'&&*(s+i)<='9') {
continue;
} else {
*(s+j) = *(s+i);
j++;
}
}
*(s+j) = '\0';
}
3.本题调试过程碰到问题及解决办法
无
2-2统计子串在母串出现的次数
1.设计思路
(1)主要描述题目算法
第一步:遍历数组,如果 * (str+i) 与 * (str+i+1) , * (str+i+2)连续符合要求的话,则出现的次数加1。
第二步:如果不符合其中一项要求的话,则i++,如果都符合的话,则i = i+3。
第三步:返回k的值。
(2)流程图
2.实验代码
/*int fun(char *str,char *substr)
{
int i=0,k=0;
while(*(str+i) != '\0') {
if(*(str+i) == 'a'&& *(str+i+1) == 's') {
if(*(str+i+2)== 'd') {
k++;
i = i+3;
} else {
i++;
}
}else {
i++;
}
}
return(k);*/
int fun(char *str,char *substr)
{
int i=0,k=0,m=0;
char *p = substr;
for(i=0;*(str+i) != '\0';i++) {
for(m = 0;*(str+i+m) == *(p+m);m++) {
if(*(p+m+1)=='\0') {
k++;
}
}
}
return k;
}
3.本题调试过程碰到问题及解决办法
错误点1:在 第一个else里写continue,导致i一直为3,最后没有输出结果。
解决方法:在进行单步调试后,发现自己的症结点,将其改成i++。
2-3字符串中除首尾字符外的其余字符按降序排列
1.设计思路
(1)主要描述题目算法
第一步:调用函数中指针型s用来接收主函数的字符型数组s,num=7。
第二步:使用冒泡法,用ASCII的值来比较输入字符的大小,但注意i的值,因其首尾不需要比较。
(2)流程图
2.实验代码
int fun(char *s,int num)
{
char tmp;
int i=0,j;
for(i=1;i<6;i++) {
for(j=1;j<6-i;j++) {
if(*(s+j) < *(s+j+1)) {
tmp = *(s+j);
*(s+j) =*(s+j+1);
*(s+j+1) = tmp;
}
}
}
return 0;
}
3.本题调试过程碰到问题及解决办法
错误点1:使i=0,j=0,导致最后结果错误。
解决方法:再调试后重新阅读了一遍题目,自己的粗心和惯性思维造成的。
pta提交列表:
2-4输出学生成绩
1.设计思路
(1)主要描述题目算法
第一步:对N进行整型定义,指针型p指向double类型,max,avg,min一样指向double类型。
第二步:对p的数据进行动态分配内存的操作,若不进行分配则指针型p为空指针,调试时则会报错。
第三步:使用for循环,用指针型p接受输入的数据,得到sum的值。
第四步:再使用for循环,使max = *p,min= *p,即为p[0],与其他数据进行比较,最后输出结果。
(2)流程图
2.实验代码
#include<stdio.h>
int main ()
{
int N;
double *p,max,avg,min;
scanf("%d",&N);
if((p=(double*)calloc(N,sizeof(double)))==NULL){
exit(1);
}
int i=0;
double sum=0;
for(i=0;i<N;i++) {
scanf("%lf",p+i);
sum = sum + *(p+i);
}
max = *p;
min = *p;
for(i=0;i<N;i++) {
if(max<*(p+i)) {
max = *(p+i);
}
if(min>*(p+i)){
min = *(p+i);
}
}
avg = sum/N;
printf("average = %.2f\n",avg);
printf("max = %.2f\n",max);
printf("min = %.2f\n",min);
return 0;
}
3.本题调试过程碰到问题及解决办法
错误点1:指针p指向为int类型,导致最后输出打的只能是整数;在动态分配内存中,指针型p指向double类型,因此(p=(double)calloc(N,sizeof(double)))==NULL而不为(p=(int)calloc(N,sizeof(int)))。
解决方法:疑惑以后,突然灵光一现,部分错误的话代表我的代码没有语法错误,随意输入数之后,发现即便avg答案是小数最后也输出为整数,然后发现自己的问题并改正。
pta提交列表:
2-5计算职工工资
1.设计思路
(1)主要描述题目算法
第一步:使用结构体类型进行结构体变量的引用。
第二步:使用for循环,输入s1[i].name,s1[i].ji,&s1[i].fu,s1[i].spare对用i的值,且需要注意字符串的话,输入时不用加 “&”。
第三步:最后再遍历数组,输出要输出的值。
(2)流程图
2.实验代码
#include <stdio.h>
struct money {
char name[10];
float ji;
float fu;
float spare;
} s1[1000];
int main ()
{
int N,i;
scanf("%d",&N);
float shing[N];
for(i=0;i<N;i++) {
scanf("%s %f %f %f",s1[i].name,&s1[i].ji,&s1[i].fu,&s1[i].spare);
shing[i] = s1[i].ji+s1[i].fu-s1[i].spare;
}
for(i=0;i<N;i++) {
printf("%s %.2f\n",s1[i].name,shing[i]);
}
return 0;
}
3.本题调试过程碰到问题及解决办法
错误点1:在将s1[1000]改成s1[100]后,会出现段错误。
解决方法:,因一开始定义为1000,所以并没有错误,但在看过姚舜禹同学的问题后,自己换成较小值会出现相同的错误。
在自己写代码时并没有遇到什么大的问题,但本题在看到姚舜禹同学在小组中提到的问题及我班两位同学的回复后,觉得自己的代码虽然提交正确了,但觉得自己的代码还是存在着很大的不足:最好是不要用是s1[1000]这种方式,极有可能因为数组的溢出而造成段错误,比如若我将1000改成100答案则是错误的,可以直接在输入n后写上struct money s1[n]就可以正常使用,可以看书自己以后需要向同学学习的地方还有很多,也觉得这种有错误时可以在小组里讨论也是十分好的。
2-6计算平均成绩
1.设计思路
(1)主要描述题目算法
第一步:使用结构体类型进行结构体变量的引用,且根据题意后面应为s1[10]。
第二步:输入N的值,遍历数组,输入s1[i].number,s1[i].name,s1[i].score并将它们储存起来,计算出sum的值。
第三步:在for循环中,判断s1[i].score与avg的大小,最后按要求输出元素。
(2)流程图
2.实验代码
#include <stdio.h>
struct score {
char number[6];
char name[10];
int score;
} s1[10];
int main ()
{
int N,i,sum=0;
float avg;
scanf("%d",&N);
for(i=0;i<N;i++) {
scanf("%s %s %d",s1[i].number,s1[i].name,&s1[i].score);
sum = sum + s1[i].score;
}
avg = sum/N;
printf("%.2f\n",avg);
for(i=0;i<N;i++) {
if(s1[i].score<avg) {
printf("%s %s\n",s1[i].name,s1[i].number);
}
}
return 0;
}
3.本题调试过程碰到问题及解决办法
错误点1:输出时将s1[i].number的%s写成%d。
解决方法:在单步调试后知道错误的代码行,重新观察后找出问题所在。
pta提交列表:
2-7按等级统计学生成绩
1.设计思路
(1)主要描述题目算法
第一步:首先需要定义一个整型变量,为最后函数的返回值,使他在分数小于60的情况下++。
第二步:想到使用for循环,遍历完整个p指针,根据不同的分数情况对p指针里不同元素定义不同的等级。
第三步:最后返回主函数。
2.实验代码
int set_grade( struct student *p, int n )
{
int k = 0,i=0;
for(i=0;i<n;i++) {
if((p+i)->score >= 85) {
(p+i)->grade = 'A';
} else if((p+i)->score>=70 && (p+i)->score < 85) {
(p+i)->grade = 'B';
} else if((p+i)->score>=60 && (p+i)->score < 70) {
(p+i)->grade = 'C';
} else {
(p+i)->grade = 'D';
k++;
}
}
return k;
}
3.本题调试过程碰到问题及解决办法
因本题思路较简单,并无问题。
2-8结构体数组按总分排序
1.设计思路
(1)主要描述题目算法
第一步:调用calc(struct student *p,int n),sort(struct student *p,int n) 分别接收calc(stu,5),sort(stu,5)的值。
第二步:因其calc函数目的为求出每名学生的总分,所以要用到for循环语句一个一个循环后算出其中每个元素的总值。
第三步:sort函数的目的是为了让每名学生的总分从高到低对这组数据进行排序,想到用选择排序法或者是冒泡排序法,进行调换后。最后返回主函数。
(2)流程图
2.实验代码
void calc(struct student *p,int n) {
int i=0,j=0;
for(i=0;i<5;i++) {
(p+i)->sum = (p+i)->score[0] +(p+i)->score[1]+(p+i)->score[2];
}
}
void sort(struct student *p,int n) {
int a=0,b=0;
struct student tmp;
for(a=0;a<4;a++) {
for(b=0;b<4-a;b++) {
if((p+b)->sum <(p+b+1)->sum) {
tmp = p[b];
p[b] = p[b+1];
p[b+1] = tmp;
}
}
}
}
3.本题调试过程碰到问题及解决办法
遇到的问题1:将p[b+1].sum与p[b].sum的大小值进行后直接进行交换,导致最后输出的
结果其它的不变,只是sum值发生了改变。
解决方法:在将dev c++上的输出结果和要求的输出结果对比后,发现了自己错误的地方,并改正。
遇到的问题2:在修改过第一个问题后,dev c++编译时出现了上述图片中出现的问题。
解决的方法:在翻译错误提示后,尝试性的将原先定义的 int tmp改成了struct student tmp,结构编译成功,然后理解到此时的p[b]为结构类型,要使得tmp可以成为它们之间的交换介质,类型必须要相等,因此tmp的类型必须改成struct student。
关于'->':此符号只能用于指针上,如a.sum不能用a->sum来表示。
pta提交列表:
学习总结和进度
1、总结两周里所学的知识点有哪些学会了?(可记录每道作业题目所用的知识点)哪些还没有学会?
答:在这两周总的来说自己复习了指针及学习了结构类型,按照每道作业的知识点的话,可分为:
在第一次作业中主要考查的知识点对我来说应该是指针及对输出不同要求字符串的方法,及最后一题的动态分配内存,前面三题自己是一下过的,但最后一题卡了很多次,说明自己对这个点的掌握并不是很熟练。
在第二次作业中觉得主要考查的是对结构类型函数的应用及结构类型函数元素中数组的使用,关于数组的方面自己是看教科书和上网查询后才最终解决的问题,但现在的话觉得自己对这个点掌握的相对熟练。
在第三次作业中对我自身而言,主要考查的则是结构类型数据和子函数的调用的混搭,两道题的算法并不是很难,但值得注意的是如果是结构类型的元素进行交换时,交换介质必须也为相同的类型。
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。
git地址:(https://git.coding.net/exo07/disizhouzuoye.git)
3、点评3个同学的本周作业
张金禹:( http://www.cnblogs.com/17-1/p/8687764.html)
高立彬:(http://www.cnblogs.com/gao628526/p/8665187.html)
徐铭博:(http://www.cnblogs.com/xmb1547828350/p/8657376.html)
4、请用表格和折线图呈现你本周(3/26 8:00~4/9 8:00)的代码行数和所用时间、博客字数和所用时间