2018上C语言程序设计(高级)作业- 第2次作业
作业要求一
提交截图:
6-7:
6-8:
6-9:
7-1:
7-2:
7-3:
7-4:
7-5:
作业要求二
- 题目6-7删除字符中数字字符
1、设计思路:
(1)第一步:本题要求是删除字符中的数字字符,我的主要思路是通过数组遍历若遇到数字,就把其删除,把之后的非数字的字符向前移动;
第二步:根据此思路,首先定义两个循环变量i,j;通过while条件语句来进行判断数字字符,之后再逐一删除,前移;
2、实验代码:
#include "stdio.h"
void delnum(char *s)
{
int i = 0,j = 0;
while(s[i] != '\0') {
if (!(s[i] >= '0' && s[i] <= '9')) {
s[j] = s[i];
j++;
}
i++;
}
s[j] = '\0';
}
3、本题调试过程碰到问题及解决办法
本题是字符问题,当我在遇到这个问题的时候,只是有想法,知道怎么去做,但是却不知道怎么去用if条件来判断出数组中的是否含有数字字符。简单的说我只会构思,不会去写成代码。其主要问题是在
就是不会写这个条件;
改正方法:我去网站上找了下这个题,看了许多的大佬的程序,他们的代码方式写的有很多中,之后我自己找到了这个条件,之后就顺利写出这个题目了。
- 题目6-8 统计子串在母串出现的次数
1、设计思路:
(1)第一步:首先要遍历数组,若要找出子串在母串的出现次数,在遍历数组的时候,利用if条件语句进行逐一的判断;
第二步:在遍历的过程中,循环变量要逐一的相加,而不是看子串的字符个数,这样才能较为准确的去查找出现次数;(自我感觉自己的算法比较麻烦,但是实在是想不出简单的算法,就只能将就着用)
2、实验代码
(之前代码)
#include<stdio.h>
int fun(char *str,char *substr)
{
int result=0,i=0;
for(i=0;str[i]!='\0';i++)
{
if(substr[0]==str[i]&&substr[1]==str[i+1]&&substr[2]==str[i+2])
{
result++;
}
}
return result;
}
(改进后代码)
int fun(char *str,char *substr)
{
int result=0,i=0,j=0,f=0;
for(i=0;str[i]!='\0';i++)
{
j=0,f=i;
while(substr[j]==str[f])
{
if(substr[j+1]=='\0')
{
result++;
}
j++,f++;
}
}
return result;
}
3、本题调试过程碰到问题及解决办法
本题没有问题;
- 题目6-9字符串中除首尾字符外的其余字符按降序排列
1、设计思路:
(1)第一步:本题可按照之前的非字符的冒泡排序的方法去来实现这个问题,只是在遍历数组的时候,出去首尾两项;
第二步:根据这个思路,首先定义循环变量,之后遍历数组(注:在遍历数组的时候要注意不要包括首尾两项)之后再按照冒泡的方法进行排序即可;
2、实验代码
#include <stdio.h>
int fun(char *s,int num)
{
int i=1,j=1,max;
for(i=1;i<num-3;i++)
{
for(j=1;j<num-2;j++)
{
if(s[j]<s[j+1])
{
char swap;
swap=s[j];s[j]=s[j+1];s[j+1]=swap;
}
}
}
}
3、本题调试过程碰到问题及解决办法
本题没有问题;
题目7-1输出学生成绩
1、设计思路
(1)第一步:根据题意,首先要定义一些相关的变量,例如学生人数n,循环变量i,等等;
第二步:之后在创建内存动态存储;(这个我之后按照老师上课讲的照抄照搬,自己当时听懂的内容也是不是很多,后来我也去上网查了许多的有关动态存储的相关的教程,也算是略有了解,但还是理解的不够深刻)
第三步:在创建动态存储之后,之后就开始在数组中存储内容(成绩),在存储的同时可以进行求和,以便进行之后的求平均值的操作;
第四步:存储之后,求平均值,之后遍历数组进行找最大值和最小值;(此时应把最大值和最小值变量先初始化为数组的首地址元素,方便比较)之后根据数组遍历来找出最大值和最小值;
第五步:最后便可按照题目要求进行输出;
(2)流程图:
2、实验代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n=0,i=0,*p,sum=0,max=0,min=0;
double average=0;
scanf("%d",&n);
if((p=(int*)calloc(n,sizeof(int)))==NULL)
{
printf("Not able to allocate memory.\n");
exit(1);
}
for(i=0;i<n;i++)
{
scanf("%d",p+i);
sum=sum+*(p+i);
}
average=(double)(sum*1.0/n*1.0);
max=*p;min=*p;
for(i=0;i<n;i++)
{
if(max<*(p+i))
{
int swap=0;
swap=max;max=*(p+i);*(p+i)=swap;
}
}
for(i=0;i<n;i++)
{
if(min>*(p+i))
{
int tmp=0;
tmp=min;min=*(p+i);*(p+i)=tmp;
}
}
printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",average,(double)max,(double)min);
free(p);
return 0;
}
3、本题调试过程碰到问题及解决办法
错误信息1:
这个问题是我把max和min的初始化都放到了for循环里面了,导致在提交的时候总是有一个点过不去;
改正方法:在出现这个错误之后,当时我也很纳闷,因为我在输入例题啥的都正确但就是不能过那个点。之后我也尝试了老师所说的进行单步调试,在调试的过程中我发现了,每次在进行for循环的时候都会把max和min在初始化依次,当时只是略有怀疑,因为我还是很惯性的认为即使初始化也没啥问题,因为输出的结果还是正确的。但是它总是过不去这个点,之后我就去询问同学,在同学帮助下,也是指出了这个问题,最终我把max和min初始化放到了for之前了最后通过了。
题目7-2 计算职工工资
1、设计思路:
(1)第一步:首先先定义结构,根据题目要求,在定义的结构里定义职工的名字,基本工资,浮动工资和支出工资;(注意题目的精度要求)
第二步:定义完结构之后,在主函数里根据题目要求来创建各个所需变量;
第三步:创建所需变量之后,要做的就是要是给相应的变量赋初值,再根据题目的公式计算出所对于的实际工资,并输出;
(2)流程图:
2、实验代码:
#include<stdio.h>
struct workers
{
char name[10];
float bs;
float tfw;
float sw;
};
int main()
{
int n,i=0;
scanf("%d",&n);
struct workers w[n];
for(i=0;i<n;i++)
{
scanf("%s %f %f %f",w[i].name,&w[i].bs,&w[i].tfw,&w[i].sw);
}
for(i=0;i<n;i++)
{
printf("%s %.2f\n",w[i].name,w[i].bs+w[i].tfw-w[i].sw);
}
}
3、本题调试过程碰到问题及解决办法
错误信息1:在写本题的时候,我用了两个时间段,一个是在刚发下题的时候,一个是在星期的时候。为啥有俩时间段,主要是在第一个时间段我在刚听完老师讲课之后几乎是没怎么听懂,感觉就学了一个定义其他的应用一点也不会,之后拿到这个题也是很头疼,看老师的代码例子,看也看不懂。所以就写不出来;
解决方法:遇到这个题的时候我总感觉要用数组比较好,可老师没有讲这个问题,之后我就去书上往后看了几页找到用数组的例子,仿照例子就把这个问题解决了;
- 题目7-3计算平均成绩
1、设计思路:
(1)第一步:首先要定义结构,定义学生的学号,姓名和成绩;(主要学号是用字符串的形式而不是整数型)
第二步:之后在主函数中根据题目要求定义几个变量;
第三步:之后在给每个学生进行赋初值的操作,并且把各个学生的成绩进行求和操作;
第四步:求和之后即可求出平均值;
第五步:再进行遍历操作,找出在平均值下的学生,注意学生的成绩和平均值的类型不同,要进行强转,之后在进行比对找出在平均值下的学生;
2、实验代码:
#include<stdio.h>
struct student
{
char name[10];
char id[5];
int result;
};
int main()
{
int n=0,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].id,s[i].name,&s[i].result);
sum=sum+s[i].result;
}
average=(float)(sum*1.0/n*1.0);
printf("%.2f\n",average);
for(i=0;i<n;i++)
{
if((float)(s[i].result)<average)
{
printf("%s %s\n",s[i].name,s[i].id);
}
}
}
3、本题调试过程碰到问题及解决办法
本题在调试过程中没有碰到问题;
- 题目7-4按等级统计学生成绩
1、设计思路:
(1)第一步:根据题意,首先要找不及格的同学个数,故先定义循环变量j,和用来计数的变量result,之后经过遍历再加上if条件来判断不及格的人数;
第二步:若要依据每个人的成绩进行评判每个人的等级,首先需要遍历这个数组,之后再用if条件进行判断,在每个判断条件里进行grade的赋值操作;
第三步:因为在定义的函数里数组是用指针的方式,所以不需要进行返回,而所进行的找不及格的人数是int型的故需要返回值;
2、实验代码:
#include <stdio.h>
#define MAXN 10
int set_grade( struct student *p, int n )
{
int j=0,result=0;
for(j=0;j<n;j++)
{
if(p[j].score<60)
{
result++;
}
}
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 result;
}
3、本题调试过程碰到问题及解决办法
本题没有遇到太大的问题,只是在一开始写程序的时候,我用的还是以前的那种数组结构,没有用到指针,而指针用的不是太熟,之后我通过看上课时候代码,仿照代码把程序又改成用指针的形式;
题目7-5 结构体数组按总分排序
1、设计思路:
(1)第一步:本题首先需要计算总分,故先在定义的第一个函数里进行定义循环变量k,之后通过遍历数组来计算出总分;
第二步:在计算出总分之后,便开始根据总成绩进行排名。由此题目可仿照以前的一维数组中的冒泡排序的思路,根据分数这个变量进行判断;(注:在进行交换的时候,定义的交换变量需要是那个已定义的类型。自我感觉,之后这样才能通过主函数中的遍历数组方法来进行排名)
(2)流程图:
主函数:
第一个函数:
第二个函数:
2、实验代码:
void calc(struct student *p,int n)
{
int k=0;
for(k=0;k<n;k++)
{
(p+k)->sum=(p+k)->score[0]+(p+k)->score[1]+(p+k)->score[2];
}
}
void sort(struct student *p,int n)
{
int k=0,l=0;
struct student swap;
for(k=0;k<n;k++)
{
for(l=k+1;l<n;l++)
{
if(p[k].sum<p[l].sum)
{
swap=p[k];p[k]=p[l];p[l]=swap;
}
}
}
}
3、本题调试过程碰到问题及解决办法
错误信息1:在写这个程序的时候,我的思路一开始就比较的明确。所以在写的时候比较的顺利,但在第二个函数中出现了问题,当时我定义的用来交换的变量是float型的,还是按照以前的那种思路进行交换,但在运行的过程中发现,输出结果每个人对应的总成绩是不对应的。
改正方法:在遇到这个问题的时候,我当时也是很懵,但是确实不知道怎么改。但自从听了老师上课讲说上网查代码之类的对自己的逻辑分析能力提高不是很好,我就决定不到最难的时候不去查。其实我也很认可老师的观点。于是我就把上课讲的内容想了一遍,感觉这个是定义类型的问题,于是改了类型之后就很容易的通过了。通过这个错误,也许它不是什么难题,但对我来说却很为自己独立想出而高兴的。
作业要求三、学习总结和进度
1、总结两周里所学的知识点有哪些学会了?(可记录每道作业题目所用的知识点)哪些还没有学会?
这两周所学会的知识点:
这两周我学会了关于字符串的跟深层次的应用,并且比上两周在应用指针方面更加的熟练。这两周还学了有关结构的定义,对这个自己觉得运用的还是不够娴熟。对于结构这里的知识点,上课的内容现在也懂了,但在做题的时候总是不太喜欢用老师讲的那些方法。可能在理解上有些不同吧。
还没有学会的知识点:
这两周的课上知识点自己感觉学的还可以,只是在运用上很是欠佳,可能正如老师说那样,遇到问题自己多去思考,对方面自己很欠缺,逻辑能力不强,有很多问题其实很简单就是想不出来,当看了网上的那些代码之后就一下豁然开朗。在这逻辑方面还需要提升。
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。
Git地址:
Git地址
上传截图:
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业。
①点评的三位同学:
董欣
董雅洁
丰大为
②邀请三位同学点评:
董欣
董雅洁
执念丶。
4、请用表格和折线图呈现你本周(3/26 8:00~4/9 8:00)的代码行数和所用时间、博客字数和所用时间。
表格:
折线图:
2018上C语言程序设计(高级)作业- 第2次作业的更多相关文章
- 2018上C语言程序设计(高级)- 第0次作业成绩
作业链接: https://edu.cnblogs.com/campus/hljkj/CS201702/homework/1617 评分规则 本次作业作为本学期的第一次作业,大家态度较诚恳,篇幅都比较 ...
- 2018上C语言程序设计(高级)- 第1次作业成绩
作业地址 https://edu.cnblogs.com/campus/hljkj/CS2017-01/homework/1638 评分准则 第一次作业各项成绩包括三项: 完成PTA所有题目:20分 ...
- 2018上C语言程序设计(高级)- 第2次作业成绩
作业地址 评分准则 第一次作业各项成绩包括三项: 完成PTA所有题目:9分 总结和附加题目:15分 博客记录:70分 博客记录包含三次PTA,共8道题,有正确流程图题目12分,没有的8分: 设计思路2 ...
- 2018上C语言程序设计(高级)作业- 初步计划
C语言程序设计(高级)36学时,每周4学时,共9周.主要学习指针.结构和文件三部分内容.整个课程作业计划如下: PTA和博客的使用指南 若第一次使用PTA和博客,请务必先把PTA的使用简介和教师如何在 ...
- 2018上C语言程序设计(高级)作业- 第0次作业
准备工作(10分) 1.在博客园申请个人博客. 2.加入班级博客(2班班级博客链接地址)(1班班级博客链接地址) 3.关注邹欣老师博客.关注任课老师博客. 4.加入讨论小组,学习过程中遇到问题不要随意 ...
- 2018上C语言程序设计(高级)博客作业样例
要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...
- 2018上C语言程序设计(高级)作业- 第4次作业成绩及总结
作业地址 https://edu.cnblogs.com/campus/hljkj/CS2017-01/homework/1842 评分准则 第4次作业各项成绩包括三项: 完成WC项目:60分:基本功 ...
- 2018上C语言程序设计(高级)作业- 第3次作业
作业要求一 6-1 输出月份英文名 6-2 查找星期 6-3 计算最长的字符串长度 6-4指定位置输出字符串 6-5奇数值结点链表 6-6学生成绩链表处理 6-7链表拼接 作业要求二 题目6-1输出月 ...
- 2018上C语言程序设计(高级)作业- 第1次作业
未来两周学习内容 复习指针的定义和引用 指针的应用场景: 指针作为函数参数(角色互换) 指针作为函数的参数返回多个值 指针.数组和地址间的关系 使用指针进行数组操作 数组名(指针)作为函数参数(冒泡排 ...
- 2018上C语言程序设计(初级)作业- 第2次作业
一.预习作业 在课前或者课后观看浙江大学程序设计入门-C语言课程中第2周.第3周的判断部分和第4周的判断部分. 二.PTA作业 完成第7周.第8周和第9周和第10周共8次pta作业,将PTA作业中部分 ...
随机推荐
- C#隐式转换和显示转换举例--C#基础
高精度的数据类型转换为低精度的数据类型是显示转换,低精度的转换为高精度的是隐式转换. 温馨提示:不能说强制类型转换是从低精度到高精度. int a=666;float b=(float)a: 由a到b ...
- 初学 Java Web 开发,从 Servlet 开发
1. 基本要求:Java 编程基础 有良好的 Java 语言编程基础,这是必须的,在讨论 Web 开发技术时提了一个 Java 编程基础的问题会被鄙视的. 2. 环境准备 (Eclipse + Tom ...
- HiHocoder1419 : 后缀数组四·重复旋律4&[SPOJ]REPEATS:Repeats
题面 Hihocoder Vjudge Sol 题目的提示说的也非常好 我对求\(LCP(P - L + len \% l, P + len \% L)\)做补充 \(len=LCP(P, P + L ...
- Bzoj4869: [Shoi2017]相逢是问候
题面 传送门 Sol 摆定理 \[ a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\ a^b~~~~~~~~~~~~~~~~~ ...
- Entity Framework Core 之数据库迁移
前言 最近打算用.NET Core写一份开源的简易CMS系统,来练练手 所以又去深入研究了一下Entity Framework Core 发现其实有些细节园子里还是很少讲到. 特意整理了几个细节. 正 ...
- 原生jdbc操作mysql数据库详解
首先给大家说一下使用JDBC链接数据库的步骤 1.加载链接数据库驱动 2.建立数据库链接 3.创建数据库操作对象 4.编写sql语句,执行sql语句 5.获取结果集 6.释放资源 我这边采用的是mav ...
- Java equals() 和hashCode()方法详解
Java的Object类中定义了equals方法,Object类中的equals方法源代码如下,从源代码中可以看出Object类中的equals方法是用来返回判断两个对象是否指向同一个对象(引用地址) ...
- 自定义MVC框架---第一章
MVC基本介绍 介绍: mvc是一种编程思想,用来解决开发项目的时候,代码如何编写,项目如何架构的问题,更具体一点就是解决多人协同开发时,如何分工协作的问题,从而提升开发效率 举一个例子:有一个人想 ...
- 数据定义: CREATE、DROP、ALTER
CREATE DATABASE 句法 CREATE DATABASE [IF NOT EXISTS] db_name 数据库.表.索引.列和别名 中被给出. 如果数据库已经存在,并且你没有指定 IF ...
- hidden symbol `pthread_atfork'
gcc交叉编译时发生这种错误 /.. .../voice_demo: hidden symbol `pthread_atfork' in /opt/gcc-linaro-aarch64-linux-g ...