PTA作业第一部分
6-7 删除字符串中数字字符(10 分)
删除一个字符串中的所有数字字符。
函数接口定义:
void delnum(char *s);
其中 s
是用户传入的参数。 函数的功能是删除指针 s
所指的字符串中的所有数字字符。
裁判测试程序样例:
#include "stdio.h"
void delnum(char *s);
int main ()
{ char item[80];
gets(item);
delnum(item);
printf("%s\n",item);
return 0;
}
/* 请在这里填写答案 */
输入样例:
a0bc+d496df
输出样例:
abc+ddf
1.设计思路:
(1).题目算法描述
第一步:定义i,j 并初始化为0
第二步:遍历s
第三步:判断s中每个元素是否为数字如果是数字则覆盖此元素
第四步:将s的最后一个元素赋值为'\0'
(2).流程图
2.实验代码
void delnum(char *s)
{
int i = 0,j = 0;
while(s[i] != '\0') {
if (!(s[i] >= '0' && s[i] <= '9')) {
s[j++] = s[i];
}
i++;
}
s[j] = '\0';
}
2.错误调试
无
答案正确
6-8 统计子串在母串出现的次数(10 分)
编写一个函数,该函数可以统计一个长度为3的字符串在另一个字符串中出现的次数。例如,假定输入的字符串为:asdasasdfgasdaszx67asdmklo,字符串为:asd,则应输出n=4。。
函数接口定义:
int fun(char *str,char *substr);
其中str
和 substr
是用户传入的参数。函数统计substr
指针所指的字符串在str
指针所指的字符串中出现的次数,并返回次数。
裁判测试程序样例:
#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
int n;
n=fun(str,substr);
printf("n=%d\n",n);
return 0;
}
/* 请在这里填写答案 */
输出样例:
n=4
1.设计思路:
(1).题目算法描述
第一步:定义i,j , k, n并初始化为0
第二步:从母串开始遍历
第三步:母串的每个字符串与子串进行比较
第四步:当子串遍历完的时候统计次数用的n加一
第五步:返回n
(2).流程图
略
2.实验代码
int fun(char *str,char *substr)
{
int i=0,j=0,k=0,n=0;
for(i=0;str[i]!='\0';i++)//从母串开始遍历
{
for(j=i,k=0;str[j]==substr[k];j++,k++)//每次遍历的当前字符串都要和子串的第一个字符进行比较把子串遍历完次数加一
{
if(substr[k+1]=='\0')
{
n++;
}
}
}
return n;
}
3.错误调试
无
答案正确
6-9 字符串中除首尾字符外的其余字符按降序排列(10 分)
请编写函数fun,对字符串中除首、尾字符外的其余字符按降序排列。例如,原来的字符串为CEAedca,排序后输出为CedcEAa。
函数接口定义:
int fun(char *s,int num);
其中s
和 num
都是用户传入的参数。函数对字符指针s
所指的字符串中除首、尾字符外的其余字符按降序排列。
裁判测试程序样例:
#include <stdio.h>
int fun(char *s,int num);
int main()
{
char s[10];
gets(s);
fun(s,7);
printf("%s",s);
return 0;
}
/* 请在这里填写答案 */
输入样例:
CEAedca
输出样例:
CedcEAa
1.设计思路:
PS:此处不太理题目中给出的num的含义,如果说num代表的是字符串的长度那么难道每个测试字符串的长度都是7吗,而如果说num不是字符串的长度那么num代表什么含义,是内存空间的浪费吗?
(1).题目算法描述
第一步:定义i,j,k,n,t
第二步:遍历统计字符串长度
第三步:遍历字符串进行排序(遍历过程中除去首位字符串)
(2).流程图
略
2.实验代码
int fun(char *s,int num)
{
int i=0, j=0, k=0, n=0, t=0;
n=strlen(s);
n--;//去掉末位元素
for(i=1;i<n;i++)
{
for(j=i;j<n-1;j++)
{
for(k=j;k<n;i++)
{
if(*(s+j)<*(s+k))
{
t=*(s+j);
*(s+j)=*(s+k);
*(s+k)=t;
}
}
}
}
}
2.错误调试
错误提示:运行超时
错误改正:关于字符串长度统计函数使用时必须包含string.h头文件;变量t应该定义为char类型;循环混乱
修改后的代码:
int fun(char *s,int num)
{
int i=0, j=0, k=0, n=0;
char t;
for(n=0;;n++)
{
if(*(s+n)=='\0')break;
}
n--;
for(i=1;i<n-1;i++)
{
for(j=i;j<n;j++)
{
if(*(s+i)<*(s+j))
{
t=*(s+i);
*(s+i)=*(s+j);
*(s+j)=t;
}
}
}
}
答案正确
7-1 输出学生成绩(20 分)
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
输入格式:
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
输出格式:
按照以下格式输出:
average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。
输入样例:
3
85 90 95
输出样例:
average = 90.00
max = 95.00
min = 85.00
1.设计思路:
(1).题目算法描述
第一步:定义N读入N
第二步:定义数组
第三步:遍历数组找最值并求和
第四步:求平均值
第五步:输出
(2).流程图
略
2.实验代码
#include <stdio.h>
int main()
{
int N,i;
float sum=0, average=0, max=0, min=0;
scanf("%d",&N);
int a[N];
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
max = a[0];
min=a[0];
for(i=0;i<N;i++)
{
sum = sum + a[i];
if(a[i]>max){
max=a[i];
}
if(a[i]<min){
min=a[i];
}
}
average=sum/N;
printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min);
return 0;
}
本题的动态内存分配实现方法有待继续学习
2.错误调试
无
答案正确
关于动态内存分配相关内容的参考:
https://baike.baidu.com/item/动态分配内存/2968252?fr=aladdin
(来源:百度百科)
关于alloc函数:
https://blog.csdn.net/msdnwolaile/article/details/51695361
1.设计思路:
(1).题目算法描述
第一步:定义N读入N
第二步:使用动态内存分配定义数组
第三步:遍历数组找最值并求和
第四步:求平均值
第五步:释放动态内存分配的空间
第六步:按要求输出结果
(2).流程图
略
2.实验代码
#include <stdio.h>
#include <stdlib.h>//使用malloc函数的头文件
int main()
{
int N,i;
float sum=0,average=0,max=0,min=0;
scanf("%d",&N);
float *p;
p = (float *)malloc(N);//指针指向动态分配内存
for(i=0;i<N;i++)
{
scanf("%f",(p+i));
sum+=*(p+i);
}
max=*(p+0);
min=*(p+0);
for(i=0;i<N;i++)
{
if(min>*(p+i)){
min=*(p+i);
}
if(max<*(p+i)){
max=*(p+i);
}
}
average=sum/N*1.0;
free(p);//释放空间
printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min);
return 0;
}
2.错误调试
无
7-1 计算职工工资(15 分)
给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。
输入格式:
输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。
输出格式:
按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。
输入样例:
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80
输出样例:
zhao 565.00
qian 430.00
zhou 630.00
1.设计思路:
(1).题目算法描述
第一步:定义结构
第二步:定义N,i
第三步:读入N
第四步:遍历输入数据
第五步:遍历输出数据
(2).流程图
2.实验代码
#include <stdio.h>
struct money
{
char name[10];
float jmoney;
float fmoney;
float zmoney;
float mony;
};
int main()
{
int N,i=0;
scanf("%d",&N);
struct money s[N];
for(i=0;i<N;i++)
{
scanf("%s %f %f %f",&s[i].name,&s[i].jmoney,&s[i].fmoney,&s[i].zmoney);
s[i].mony=s[i].jmoney+s[i].fmoney-s[i].zmoney;
}
for(i=0;i<N;i++)
{
printf("%s %.2f\n",s[i].name,s[i].mony);
}
return 0;
}
2.错误调试
错误提示:多种错误
改正方法:将struct money s[i]换成struct money s[N]
刚开始定义的时候i=0 struct money s[i]相当于 struct money s[0] 当进入for循环后i的值改变导致导致出现错误
答案正确
7-2 计算平均成绩(15 分)
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。
输出格式:
首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。
输入样例:
5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60
输出样例:
80.00
zhang 00001
chen 21987
1.设计思路:
(1).题目算法描述
第一步:定义结构
第二步:定义N,i, sum
第三步:读入N
第四步:遍历输入数据
第五步:计算average
第六步:输出average
第七步:遍历判断每个学生的分数是否大于平均值输出低于平均分的学生信息
(2).流程图
略
2.实验代码
#include <stdio.h>
struct student{
char num[6];
char name[11];
int score;
};
int main()
{
int N,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].num,s[i].name,&s[i].score);
sum=sum+s[i].score;
}
average = sum/N*1.0;
printf("%.2f\n",average);
for(i=0;i<N;i++)
{
if(s[i].score<average){
printf("%s %s\n",s[i].name,s[i].num);
}
}
return 0;
}
2.错误调试
错误提示:输出错误
错误的输出样式
改正方法:定义结构的时候将char num[5];
改为char num[6];
学号信息的长度为5定义的字符串长度也为5无法读入'\0'
由此联想到名字变量也无法读入‘/0’将char name[10]
改为char name[11]
答案正确:
6-1 按等级统计学生成绩(20 分)
本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。
函数接口定义:
int set_grade( struct student *p, int n );
其中p
是指向学生信息的结构体数组的指针,该结构体的定义为:
struct student{
int num;
char name[20];
int score;
char grade;
};
n
是数组元素个数。学号num
、姓名name
和成绩score
均是已经存储好的。set_grade
函数需要根据学生的成绩score
设置其等级grade
。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade
还需要返回不及格的人数。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
struct student{
int num;
char name[20];
int score;
char grade;
};
int set_grade( struct student *p, int n );
int main()
{ struct student stu[MAXN], *ptr;
int n, i, count;
ptr = stu;
scanf("%d\n", &n);
for(i = 0; i < n; i++){
scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
}
count = set_grade(ptr, n);
printf("The count for failed (<60): %d\n", count);
printf("The grades:\n");
for(i = 0; i < n; i++)
printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78
输出样例:
The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B
1.设计思路:
(1).题目算法描述
第一步:定义i,x
第二步:指针遍历结构
第三步:根据分数判断等级
第四步:用x记录不及格学生人数
第五步:返回x
(2).流程图
2.实验代码
int set_grade( struct student *p, int n )
{
int i,x;
for(i=0;i<n;i++,p++)
{
if((p->score>=85)&&(p->score<=100))
{
p->grade ='A';
}else if((p->score>=70)&&(p->score<=84))
{
p->grade ='B';
}else if((p->score>=60)&&(p->score<=69))
{
p->grade='C';
}else{
p->grade='D';
x++;
}
}
return x;
}
2.错误调试
错误提示:答案错误
错误原因:定义x的时候没有初始化
改正方法:定义x的时候将其初始化为0
答案正确:
6-2 结构体数组按总分排序(10 分)
有一组学生数据,每个数据中含有三门课成绩,请按成绩总和从高到低对这组数据进行排序。 编写函数calc求出每名学生的总分。 编写函数sort按每名学生的总分从高到低对这组数据进行排序
函数接口定义:
void calc(struct student *p,int n);
void sort(struct student *p,int n);
其中 p
和 n
都是用户传入的参数。 函数calc求出p
指针所指的结构体数组中 n
名学生各自的总分。 函数sort对p
指针所指的结构体数组的学生数据按总分降序排序。
裁判测试程序样例:
#include <stdio.h>
struct student
{
int num;
char name[15];
float score[3];
float sum;
};
void calc(struct student *p,int n);
void sort(struct student *p,int n);
int main()
{
struct student stu[5];
int i,j;
float f;
for(i=0;i<5;i++)
{
scanf("%d%s",&stu[i].num,stu[i].name);
for(j=0;j<3;j++)
{
scanf("%f",&f);
stu[i].score[j]=f;
}
}
calc(stu,5);
sort(stu,5);
for(i=0;i<5;i++)
{
printf("%5d%15s",stu[i].num,stu[i].name);
printf(" %.1f %.1f %.1f %.1f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].sum);
}
return 0;
/* 请在这里填写答案 */
输入样例:
1 zhang 89 87 85
2 liu 92 98 96
3 li 74 71 72
4 xion 95 98 99
5 liu 99 100 100
输出样例:
5 liu 99.0 100.0 100.0 299.0
4 xion 95.0 98.0 99.0 292.0
2 liu 92.0 98.0 96.0 286.0
1 zhang 89.0 87.0 85.0 261.0
3 li 74.0 71.0 72.0 217.0
1.设计思路:
(1).题目算法描述
第一个函数:
第一步:定义i;
第二步:遍历数组求出每个学生成绩的总和
第二个函数:
第一步:定义i,j 和用做交换变量的t
第二步:运用冒泡排序根据学生成绩进行排序
(2).流程图
略
2.实验代码
void calc(struct student *p,int n)
{
int i;
for(i=0;i<n;i++,p++)
{
p->sum = p->score[0]+p->score[1]+p->score[2];
}
}
void sort(struct student *p,int n)
{
int i=0,j=0;
struct student t;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(p[j].sum < p[j+1].sum)
{
t = p[j];
p[j] = p[j+1];
p[j+1] = t;
}
}
}
}
2.错误调试
错误提示:多次尝试在Cold::Blocks 中无法运行出正确的结果,但是在PTA中提交结果正确
错误原因:我调试第一个函数的时候将主函数中将调用第二个函数的代码注释掉了,在PTA提交的过程中只提交了函数的部分所以显示结果正确
答案正确:
作业要求三:
1.所学知识点总结
(1)复习了指针相关的定义和引用,与上次作业总结的内容基本相同就不重复罗列了
(2)学习了相关动态内存分配的内容,但是上课时听的并不是很明白,在课下自行通过网络进行了相关问题的解决,具体的链接已经附在了前面的博客中
(3)学习了结构的定义与使用等相关的知识
(4)学习了用指针操作结构的相关知识
2.代码托管
我的Github地址:https://github.com/XINJY/The-homework-of-C
上传成功截图:
3.点评同学作业
李伍壹(http://www.cnblogs.com/chenxidream/p/8654245.html)
姜健(http://www.cnblogs.com/jj990519/p/8667152.html)
王文博(http://www.cnblogs.com/wwb986187/p/8727528.html)
袁中(http://www.cnblogs.com/2719610441qqcom/p/8660431.html)
申怡苗(http://www.cnblogs.com/Vinecy/p/8660124.html)
4.表格和折线图
表格:
折线图: