C高级第二次作业
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.表格和折线图
表格:
折线图:
C高级第二次作业的更多相关文章
- C高级第二次PTA作业
6-7 删除字符串中数字字符 1.设计思路: (1)算法: 第一步:定义一个字符数组item,输入一个字符串赋给字符数组item.调用函数delnum, 第二步:在函数delnum中定义循环变量i=0 ...
- 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)
相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ...
- 软件工程(GZSD2015)第二次作业小结
第二次作业,从4月7号开始,陆续开始提交作业.根据同学们提交的作业报告,相比第一次作业,已经有了巨大改变,大家开始有了完整的实践,对那些抽象的名词也开始有了直观的感受,这很好.然后有一些普遍存在的问题 ...
- 软件工程(GZSD2015) 第二次作业小结
第二次作业,从4月7号开始,陆续开始提交作业.根据同学们提交的作业报告,相比第一次作业,已经有了巨大改变,大家开始有了完整的实践,对那些抽象的名词也开始有了直观的感受,这很好.然后有一些普遍存在的问题 ...
- MathExam第二次作业
第二次作业:MathExam 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 30 • ...
- 第二次作业:卷积神经网络 part 2
第二次作业:卷积神经网络 part 2 问题总结 输出层激活函数是否有必要? 为什么DnCNN要输出残差图片?图像复原又该如何操作? DSCMR中的J2损失函数效果并不明显,为什么还要引入呢? 代码练 ...
- 耿丹CS16-2班第二次作业汇总
-- Deadline: 2016-09-28 12:00 -- 作业内容:http://www.cnblogs.com/huangjunlian/p/5891726.html -- 第二次作业总结: ...
- JAVA第二次作业展示与学习心得
JAVA第二次作业展示与学习心得 在这一次作业中,我学习了复选框,密码框两种新的组件,并通过一个邮箱登录界面将两种组件运用了起来.具体的使用方法和其他得组件并没有什么大的不同. 另外我通过查阅资料使用 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
随机推荐
- CEF 右键添加开发者选项菜单项
在项目开发过程中,有时候需要进行调试测试,然后我们可以在cef上下文菜单中添加自定义开发者工具菜单项,这样会比较方便,最后效果: 实现过程: 让自己的MyClientHandler来继承 CefCon ...
- Android添加百分比布局库时显示Failed to resolve: com.android.support.percent:问题
这是看第一行代码中遇到的问题,要添加百分比布局库的依赖时要在app下的bulid.gradle添加以下代码 implementation fileTree(dir:'libs',include:['* ...
- Win32汇编学习(5):绘制文本2
这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...
- 【2.0】SpringBoot连接MySql 8.0的url设置
jdbc:mysql://localhost:3306/enterprise?useUnicode=true&&useSSL=false&&characte ...
- HTML基础【1】:认识 HTML
什么是HTML HTML其实是 HyperText Markup Language 的缩写,超文本标记语言 HTML的作用 1.首先利用记事本保存了一个标题和两段描述, 然后修改纯文本文件的扩展名 ...
- linux 新建用户、用户组 以及为新用户分配权限的基本操作
分享下Linux系统中创建用户.设置密码.修改用户.删除用户的命令: 创建用户:useradd testuser 创建用户testuser设置密码:passwd testuser 给已创建的用户t ...
- java笔记 -- 类与对象
封装: 从形式上看, 封装是将数据和行为组合在一个包中, 并对对象的使用者隐藏了数据的实现方式. 对象中的数据称为实例域, 操纵数据的过程称为方法. 对于每个特定的类实例(对象)都有一组特定的实例域值 ...
- 《Blue Flke》团队项目的原型设计与开发
实验目的: 1.掌握软件原型开发技术 2.学习使用软件原型开发工具 实验过程和步骤: 任务1.针对实验六团队项目选题,采用适当的原型开发工具设计团队项目原型. 任务2.在团队博客发布博文,陈述团队项目 ...
- MySQL连接java
1.创建一个java project,建一个lib文件. 下载MySQL-connecor. 将下载好的文件打开,将mysql-connector-java-5.0.8-bin.jar文件粘贴复制到l ...
- spring 配置Value常量(不支持到static上)
spring 配置Value常量(不支持到static上) 看代码吧,语言表达有问题. package com.variflight.xzair.rest.constant; import org.s ...