2018第二次作业
一.PTA
作业1:
1.删除字符串中数字字符
1).设计思路
(1).主要描述题目算法
第一步:定义主函数
第二步:定义数组,用do while语句判断字符是否为数字,不是则s[j]=s[i];j++;循环后将最后一位赋值‘\0’
(2).流程图
2).实验代码
、
#include<stdio.h>
void delnum(char *s)
{
int i=0,j=0;
do
{
if(!(s[i]>='0'&&s[i]<='9'))
{
s[j]=s[i];
j++;
}
i++;
}
while(s[i]!='\0');
s[j]='\0';
}
、
3).遇到的问题及解决方法
开始出现思路错误,换一种思路后没有遇到问题。
2. 统计子串在母串出现的次数
1).设计思路
主要描述题目算法
第一步:定义主函数
第二步:定义指针,循环变量i和总数num,当字符不为空字符时,如果字符为'a','s','d'的一种,则num++,统计出num的值,最后返回num
2).实验代码
、
#include<stdio.h>
int fun(char *str,char *substr)
{
int i=0,num=0;
while(*(str+i)!='\0')
{
if(*(str+i)=='a'&&*(str+i+1)=='s'&&*(str+i+2)=='d')
{
num++;
}
i++;
}
return num;
}
3).遇到的问题及解决方法
本题没有问题。
3.字符串中除首尾字符外的其余字符按降序排列
1).设计思路
主要描述题目算法
第一步:定义主函数
第二步:定义指针,循环变量i,j,置换字符temp,用for循环判断两个字符数值大小,将数值大的字符置换至前面,再用一个for循环排除首末位,输出字符串。
2).实验代码
、
#include <stdio.h>
int fun(char *s,int num)
{
int i,j;
char temp;
for(i=0;i<num;i++)
for(j=1;j<num-2;j++)
{
if(s[j]<s[j+1])
{temp=s[j]; s[j]=s[j+1]; s[j+1]=temp;}
}
}
、
3).遇到的问题及解决方法
在第二个for循环去掉首末位时出现几次错误,尝试几次后错误排除。
4.输出学生成绩
1).设计思路
主要描述题目算法
第一步:定义变量,输入学生人数
第二步:for循环判断成绩的大小,得出最大最小值和总和
第三步:输出最高成绩,最低成绩,平均成绩
2).实验代码
、
#include<stdio.h>
int main()
{
int n,i;
float max,min=200,sum=0,cj;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%f ",&cj);
if(cj>max)
{
max=cj;
}
if(cj<min)
{
min=cj;
}
sum=sum+cj;
}
printf("average = %.2f\n",sum/n);
printf("max = %.2f\n",max);
printf("min = %.2f",min);
return 0;
}
、
作业2:
5.计算职工工资
1).设计思路
(1).主要描述题目算法
第一步:定义结构体,数组,变量
第二步:输入人数,引用结构体
第三步:用for循环输入数据,输出结果
(2).流程图
2).实验代码
、
#include<stdio.h>
struct work
{
char name[10];
float jiben;
float fudong;
float zhichu;
float sum;
};
int main()
{
int n,i;
scanf("%d",&n);
struct work a[n];
for(i=0;i<n;i++)
{
scanf("%s %f %f %f",&a[i].name,&a[i].jiben,&a[i].fudong,&a[i].zhichu);
a[i].sum=(a[i].jiben+a[i].fudong)-a[i].zhichu;
printf("%s %.2f\n",a[i].name,a[i].sum);
}
}
、
3).遇到的问题及解决方法
本题没有问题。
6.计算平均成绩
1).设计思路
主要描述题目算法
第一步:定义结构体,数组,变量
第二步:输入人数,引用结构体
第三步:for循环输入数据,计算平均成绩并输出,另一个for循环比较成绩与平均数成绩的大小,如果成绩小于平均成绩则输出姓名学号
2).实验代码
、
#include<stdio.h>
struct student
{
char xuehao[6];
char name[10];
int grade;
};
int main()
{
int n,i,sum=0;
float average;
scanf("%d",&n);
struct student a[n];
for(i=0;i<n;i++)
{
scanf("%s %s %d",a[i].xuehao,a[i].name,&a[i].grade);
sum=sum+a[i].grade;
average=1.0*(sum/n);
}
printf("%.2f\n",average);
for(i=0;i<n;i++)
{
if(a[i].grade<average)
{
printf("%s %s\n",a[i].name,a[i].xuehao);
}
}
}
、
3).遇到的问题及解决方法
开始将学号的字符串定义为5位导致无法结束字符串,修改位数后输出正常。
作业3:
7.按等级统计学生成绩
1).设计思路
(1).主要描述题目算法
第一步:观察主函数定义
第二步:定义循环变量,不及格人数,for循环判断是否不及格,不及格则num++,另一个for循环判断分数等级
(2).流程图
2).实验代码
、
#include <stdio.h>
#define MAXN 10
int set_grade( struct student *p, int n )
{
int j=0,num=0;
for(j=0;j<n;j++)
{
if(p[j].score<60)
{
num++;
}
}
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 num;
}
3).遇到的问题及解决方法
本题没有问题。
8.结构体数组按总分排序
1).设计思路
主要描述题目算法
第一步:观察主函数定义
第二步:第一个函数for循环求出分数总和,第二个函数for循环比较两人分数总和,分数高的置换到前面。
2).实验代码
、
void calc(struct student *p,int n)
{
int i;
for(i=0;i<n;i++)
{
(p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2];
}
}
void sort(struct student *p,int n)
{
int i,j=0;
struct student t;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(p[i].sum<p[j].sum)
{
t=p[i];
p[i]=p[j];
p[j]=t;
}
}
}
}
、
3).遇到的问题及解决方法
第二个函数的for循环j的初始值最初出现错误,修改后正确。
二.学习总结
1.这两周学习了指针及结构,主要学习了结构数组,结构指针等知识,在结构指针方面须加强。
2.git地址:https://coding.net/u/q807443119/p/zuoye/git/tree/master/?public=true
3.点评
郭钊毅 http://www.cnblogs.com/nothingistrue/p/8747979.html
班庆泽 http://www.cnblogs.com/wsbqz/p/8746704.html
丰大为 http://www.cnblogs.com/DavidPark/p/8664273.html