要求一:完成PTA作业
答:作业已经完成!
要求二:pta作业编程题目的解题思路和调试过程记录
C高级第二次作业(1)
完成情况如图:
第一题:删除字符串中数字字符
1.设计思路:
(1)算法:
第一步:把i,j设置为整形变量,i=0;
第二步:当s[i]不是 的时候(若是 ,则返回主函数),判断s[i]是否是数字,如果不是,则i++,再重新循环;
第三步:如果s[i]是数字,把i赋值给j,再当s[j]不是 的时候,把s[j+1]赋值给s[j],再j++,然后返回主函数,如果s[j]是 的时候,则直接返回主函数,(因此用continue)。
(2)流程图:
略。
2.实验代码:
void delnum(char *s)
{
int i = 0,j;
while(s[i]!=' ') {
if(s[i] >= '0' && s[i] <= '9') {
j = i;
while(s[j]!=' ') {
s[j] = s[j+1];
j++;
}
continue;
}
i++;
}
}
3.本题调试过程碰到问题及解决的办法:
问题:本题最开始忘写了i++
解决办法:后来补充上,正确。
第二题:统计子串在母串出现的次数
1.设计思路:
(1)算法:
第一步:定义i,j,k,num为整形变量,num=0;
第二步:写第一个for循环遍历母串,第二个for循环是找到母串与子串相等的加一;
第三步:在第二个for循环里判断substr[k+1]是否为 ,若是,则num++,跳出循环;
第四步:返回num的值。
注意:本题当遇到substr[k]==str[j]时不能加一,因为此时只是一个元素相等,需要等到字串轮玩一遍都相等时才可以加一。
(2)流程图:
略。
2.实验代码:
int fun(char *str,char *substr)
{
int i,j,k,num=0;
for(i=0;str[i]!=' ';i++)
for(j=i,k=0;substr[k]==str[j];k++,j++)
if(substr[k+1]==' ')
{
num++;
break;
}
return(num);
}
3.本题调试过程碰到问题及解决的办法:
问题:本题一开始写的当substr[k]==str[j]时我就计数了。
解决办法:后来读题分析,懂得只有字串全轮一遍都相等才能计数,改正即可。
第三题:字符串中除首尾字符外的其余字符按降序排列
1.设计思路:
(1)算法:
第一步:设a=0, b=0, k=0, n=0,且为整形变量,t为字符变量;
第二步:第一个for循环,如果s[n]是' ',则跳出循环,此步骤表明了n的大小;
第三步:采用排序法降序;
(2)流程图:
略。
2.实验代码:
int fun(char *s,int num)
{
int a=0, b=0, k=0, n=0;
char t;
for(n=0;;n++)
{
if(*(s+n)==' ')break;
}
n--;
for(a=1;a<n-1;a++)
{
for(b=a;b<n;b++)
{
if(*(s+a)<*(s+b))
{
t=*(s+a);
*(s+a)=*(s+b);
*(s+b)=t;
}
}
}
}
3.本题调试过程碰到问题及解决的办法:
问题:对于排序法不太熟练,由于首尾不用排,造成了错误。
解决办法:首尾不用排,因此a=1,从1开始,结尾到n,就是到s[n],而不是s[n+1]。
第四题:输出学生成绩
1.设计思路:
(1)算法:
①由于提交前不会动态分配内存,因此本题用一般方法写的;
②本题是学生成绩,成绩最高是100分,所以设的min开始值为100。
第一步:定义n,i为整形变量,max,min,sum,a为double型,且max,min,sum为0;
第二步:输入n,n为学生人数,用for循环输入学生成绩再用if语句,当遇到比max大的数就赋值给max,比min小的数就赋值给min;
第三步:在for中求和,出for循环用sum除以人数就是平均数,输出平均数,最大最小值。
注意:最后输出的结果要保留两位小数。
(2)流程图:
2.实验代码:
#include <stdio.h>
int main()
{
int n,i;
double max=0,min=100,sum=0,a;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf",&a);
if(a>max){
max=a;
}
if(a<min){
min=a;
}
sum=sum+a;
}
printf("average = %.2lf
",sum/n);
printf("max = %.2lf
",max);
printf("min = %.2lf",min);
return 0;
}
3.本题调试过程碰到问题及解决的办法:
问题:本题的for循环的括号未把求和括进在内。
解决办法:把sum求和括进去,修改成功。
C高级第二次作业(2)
完成情况如图:
第一题:计算职工工资
1.设计思路:
(1)算法:
第一步:该题用到新学的知识结构。先创建一个结构,包含名字,基本工资,实发工资,浮动工资,支出;
第二步:定义几个整形变量,n为人数。输入n,再用结构定义一个数组a[n],用for循环输入工作者的信息;
第三步:求出实发工资写入循环里,再用一个for循环输出。
(2)流程图:
略
2.实验代码:
#include <stdio.h>
struct people{
char name[10];
double sfgz,jbgz,fdgz,zc;
};
int main()
{
int i,n,j;
scanf ("%d", &n);
struct people a[n];
for(i=0;i<n;i++){
scanf ("%s%lf%lf%lf",&a[i].name,&a[i].fdgz,&a[i].jbgz,&a[i].zc);
a[i].sfgz=a[i].fdgz+a[i].jbgz-a[i].zc;
}
for(j=0;j<n;j++){
printf("%s %.2lf
",a[j].name,a[j].sfgz);
}
return 0;
}
3.本题调试过程碰到问题及解决的办法:
问题:
解决办法:问题是由于我不明白数组有多少个,后来想到先在前面写输入员工个数n,那么数组元素个数就迎刃而解了。
第二题:计算平均成绩
1.设计思路:
(1)算法:
第一步:读题。通过题目可得,本题是计算学生的平均成绩,并写出平均线以下的学生的信息;
第二步:先创建一个结构,定义a[n]为结构变量,i,j,n为整形变量,n为学生人数,sum,average为浮点型变量;
第三步:通过for循环读入学生信息,并且求出学生成绩之和;
第四步:求出平均值(总和除以人数),在通过for循环,使得每名学生的成绩与平均值比较,如果比平均值小则输出其学生的部分信息。
(2)流程图:
2.实验代码:
#include <stdio.h>
struct student{
char name[10],num[5];
double chengji;
};
int main()
{
int i,j,n;
double sum=0,average;
scanf("%d",&n);
struct student a[n];
for(i=0;i<n;i++){
scanf("%s %s %lf",&a[i].num,&a[i].name,&a[i].chengji);
sum=sum+a[i].chengji;
}
average=1.0f*sum/n;
printf("%.2lf
",average);
for(j=0;j<n;j++){
if(average>a[j].chengji){
printf("%s %s
",a[j].name,a[j].num);
}
}
return 0;
}
3.本题调试过程碰到问题及解决的办法:
问题:
解决办法:经过检查,就是最后少了一个},补充上即可。
C高级第二次作业(3)
完成情况如图:
第一题:按等级统计学生成绩
1.设计思路:
(1)算法:
第一步:读题目和子函数。题目是让写出子函数。而子函数起的作用就是统计低于60分以下的个数和给不同分数的学生划分层次;
第二步:统计60分以下的人数的算法。统计此人数就是设一个整形变量为0,期待计数器的作用,然后通过for循环得到的所有学生信息,再用if语句遇到低于60分的成绩计数器就加1;
第三步:划分等级也是用if语句。在for循环里,85-100为A,70-84为B,60-69为C,0-59为D,用if语句一一列出即可。
①本题用到了新学的知识,即->,本题p是指针,p->score就是指结构数组中score的地址所存储的值;
②注意本题的p++,表示每循环一次p加1,即表示此时结构数组到下一个元素。
(2)流程图:
略。
2.实验代码:
int set_grade( struct student *p, int n )
{
int count=0,i;
for(i = 0; i < n; i++,p++){
if(p->score>=85&&p->score<=100){
p->grade='A';
}
if(p->score>=70&&p->score<=84){
p->grade='B';
}
if(p->score>=60&&p->score<=69){
p->grade='C';
}
if(p->score>=0&&p->score<=59){
p->grade='D';
count++;
}
}
return count;
}
3.本题调试过程碰到问题及解决的办法:
问题:
解决办法:经过思考得到。由图中看出,我所写的是有很大问题的。在循环学生信息的时候,要想循环到下一个,i加1是没用的,关键是p要加1,这样才能循环到下一位同学信息,否则只能是一个同学的信息循环十次。想要实现p+1,可以在for循环中写上p++,也可以在每一个有p的代码中写p+i,这样都保证了每轮循环结束后p都加1。
第二题:结构体数组按总分排序
1.设计思路:
(1)算法:
第一步:读题目。本题有两个调用函数,一个是要求每名同学的成绩总和;一个是把学生总分按照从大到小排序;
第二步:看主函数。主函数主要就是输入学生的信息,再通过调用函数对信息进行处理后输出;
第三步:写的调用函数。求总和。为了不再有局限性,用for循环求学科总和,不能学科一多就一直写个没完;排序用的选择排序法。
注意:在用循环学科求总和的时候,p->sum是没赋值的,要让每位同学最开始的和为0,做一个赋值。我在书写中习惯在最开始的循环写p++,这样省着以后麻烦(和在循环里面写p+i效果一样),因此在我的代码中 for(i=0;i<n;i++,p++){p->sum=0;}有这样一个赋值。再一个要注意的点就是排序的是根据总分排,而且是整体排,不能只排分数。
(2)流程图:
主函数:
被调函数calc:
被调函数sort:
2.实验代码:
void calc(struct student *p,int n)
{
int i,j;
for(i=0;i<n;i++,p++)
{
p->sum=0;
for(j=0;j<3;j++)
{
p->sum =p->sum + p->score[j];
}
}
}
void sort(struct student *p,int n)
{
int i,k,b;
struct student temp;
for(i=0;i<n;i++){
k=i;
for(b=k+1;b<n;b++){
if((p+k)->sum < (p+b)->sum){
k=b;}
}
if(i!=k){
temp=*(p+i);
*(p+i)=*(p+k);
*(p+k)=temp;
}
}
}
3.本题调试过程碰到问题及解决的办法:
问题:都画在图中了,都是通过dev-c++找到的。
解决办法:思考。赋值是错的,这么写就相当于定义一个新的变量赋值为0,而不是每位同学在累加成绩前的总和为0,应该改为 p->sum=0,这么写的前提是for循环里存在i++,p++;在一个就是if语句那里多写了个符号,删掉即可。
要求三:学习总结和进度
1、总结两周来所有PTA作业中每个题目所使用的知识点。(我学到了什么,未学会什么?)
这两周复习指针 学习了结构以及结构数组和结构概念,还学习了动态分配内存。作业1主要是指针,动态分配内存,作业2是结构数组,作业三是结构指针。这两周我学到了结构这一概念,懂得用结构数组和结构指针进行做题,未学到的是对于这些知识点不熟练,希望熟能生巧,另外不会动态分配内存。
2、将PTA作业的源代码使用git提交到托管平台上。
(1)提交证明:
(2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git
3、点评3个同学的本周作业
1.徐铭博:http://www.cnblogs.com/xmb1547828350/p/8657376.html
2.高立彬:http://www.cnblogs.com/gao628526/p/8665187.html
3.史泽文:http://www.cnblogs.com/shilcz/p/8696341.html
4、学习进度表