第2次作业
2018-04-01 18:43 金海宽 阅读(246) 评论(4) 编辑 收藏 举报PTA
6-7 删除字符串中数字字符
1.实验代码
void delnum(char *s)
{
int i=0,j=0;
for(;s[i]!='\0';i++)
{
if(s[i]>'9'||s[i]<'0')
{
*(s+j++)=*(s+i);
}
}
*(s+j)='\0';
}
2.设计思路
第一步:设置循环,查看字符串中元素,判断字符是否为数字。
第二步:将不是数字的元素留下。
第三步:将'\0'赋给最后字符串的最后一项。
3.流程图
4.本题调试过程碰到问题及解决办法
错误信息:
错误原因:将'\0'写成'/0'。
改正方法:改了过来,写成'\0'。
6-8 统计子串在母串出现的次数
1.实验代码
int fun(char *str,char *substr)
{
int num=0,i;
for(i=0;*(str+i)!='\0';i++)
{
if((str[i]==substr[0])&&(str[i+1]==substr[1])&&(str[i+2]==substr[2])){
num++;
}
}
return (num);
}
2.设计思路
第一步:设置一个循环体,查看字符串。
第二步:设置if语句,当遇到第一个字符匹配时,判断第二个字符和第三个字符是否相等。如果满足if条件,计数器num+1。
3.本题调试过程碰到问题及解决办法
错误原因:设置循环体的条件时出错,导致运行超时。
改正方法:将循环体条件改成str[i]!='\0'或*(str+i)!='\0'。
6-9 字符串中除首尾字符外的其余字符按降序排列
1.实验代码
int fun(char*s,int num)
{
char t;
int i,j;
for(i=1;i<num-2;i++){
for(j=i+1;j<num-1;j++){
if(s[i]<s[j])
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
2.设计思路
第一步:首尾字符要排外,所以下标要从1开始循环。
第二步:依次取得数组元素,如果后一个元素大于前一个元素,则进行交换。
3.本题调试过程碰到问题及解决办法
无问题。
7-1 输出学生成绩
1.实验代码
#include<stdio.h>
float max_a(float x,float y);
float min_a(float x,float y);
int main()
{
int N,flag=1,D;
float average,max,min,sum=0.0;
scanf("%d",&N);
int i=0;
for(;i<N;i++){
scanf("%d",&D);
sum=sum+D;
if (flag==1)
{
max=D;
min=D;
flag--;
}
max=max_a(max,D);
min=min_a(min,D);
}
average=sum/N;
printf("average = %.2f\nmax = %.2f\nmin = %.2f",average,max,min);
return 0;
}
float max_a(float x,float y)
{
float z;
if(x>y)
z=x;
else
z=y;
return(z);
}
float min_a(float x,float y)
{
float z;
if(x<y)
z=x;
else
z=y;
return(z);
}
2.设计思路
第一步:编写主函数,定义所需要的变量。
1.设flag=1;
2.把第一个输入的数赋给max和min,flag-1。只进行一次对max和min的初始化。
3.使用max_a函数,将max_a函数的返回值赋给max;使用min_a函数,将min_a函数的返回值赋给min。
4.计算平均值。
5.输出各值。
第二步:编写max_a函数。设置if-else语句,比较两个数的大小。将较大的数赋给变量z并返回。
第三步:和第二步相同,编写min_a函数,比较两个数的大小。将较小的数赋给变量z并返回。
3.本题调试过程碰到问题及解决办法
错误原因:定义类型错误。
改正方法:将每次输入的数字D改为整形。
7-1 计算职工工资
1.实验代码
#include<stdio.h>
struct{
char name[10];
double basic;
double flow;
double pay;
}p;
int main()
{
int N,i=0;
float fact;
scanf("%d",&N);
for(;i<N;i++){
scanf("%s %lf %lf %lf",&p.name,&p.basic,&p.flow,&p.pay);
fact=(p.basic+p.flow-p.pay)*1.00;
printf ("%s %.2f\n", p.name, fact);
}
return 0;
}
2.设计思路
第一步:定义struct类型。
第二步:输入N;设置循环,输入职工的姓名、基本工资、浮动工资和支出.
第三步:定义实发工资。
第四步:输出各员工的姓名和实发工资。
3.流程图
4.本题调试过程碰到问题及解决办法
这道题pta上显示我的代码没有任何问题,但我总觉得不太好。
7-2 计算平均成绩
1.实验代码
#include<stdio.h>
struct _student{
char num[6];
char name[11];
int grade;
};
int main()
{
int N,i=0,sum=0;
double average;
scanf("%d",&N);
struct _student stu[N];
for(;i<N;i++){
scanf("%s %s %d",stu[i].num,stu[i].name,&stu[i].grade);
sum=sum+stu[i].grade;
}
average=(sum*1.00)/N;
printf("%.2f\n",average);
for(i=0;i<N;i++){
if(stu[i].grade<average){
printf("%s %s\n",stu[i].name,stu[i].num);}
}
return 0;
}
2.设计思路
第一步:定义struct _student类型
第二步:设置循环,计算总分。
第三步:计算平均成绩。
第四步:输出平均线以下的学生的姓名和学号。
3.本题调试过程碰到问题及解决办法
错误原因:在第二次循环时没有对计数器i进行初始化,导致第二个循环没有进行。
改正方法:将i初始化。
6-1 按等级统计学生成绩
1.实验代码
int set_grade( struct student *p, int n )
{
int i=0,j=0,count=0;
for(i=0;i<n;i++){
if (p[i].score<=100&&p[i].score>=85){
p[i].grade='A';
}
if (p[i].score<=84&&p[i].score>=70){
p[i].grade='B';
}
if (p[i].score<=69&&p[i].score>=60){
p[i].grade='C';
}
if (p[i].score<=59&&p[i].score>=0){
p[i].grade='D';
count++;
}
}
return count;
}
2.设计思路
第一步:根据题目要求,设置多个if,判断每名同学的等级。
第二步:当分数在0~59时,计数器count++。
第三步:返回不及格人数的计数器count。
3.流程图
4.本题调试过程碰到问题及解决办法
无
学习总结和进度
学习总结:学习了定义结构,加深了对指针的理解。