一、PTA实验作业
题目1:6-4 结构体数组按总分排序
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
定义函数calc(struct student *p,int n)
定义i,j
for i=0 to 5
(*(p+i)).sum=0;//先使sum为0
for j=0 to 3
使每个人每门成绩加到(*(p+i)).sum中
end for
end for
定义函数void sort(struct student *p,int n)
定义整形变量 i,j 及 结构体变量 student
for i=0 to 4
for j=i+1 to 5
判断(*(p+i)).sum与(*(p+j)).sum的大小//采用选择法排序
若小则交换两项的值
end for
end for
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
`
- 我在做这题的时候,在遇到
(*(p+i)).sum
的时候,我把它写成了(*p+i).sum
结果答案错误了,我一直找也没发现,后来才知道在(*p+i)
中p+i
也应该加上括号,不然就不是指位置而是加到了内容上。
题目2:7-2 时间换算
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
struct time {
int hour;
int min;
int sec;
};//该结构表示时间的小时分钟秒
定义变量 n代表经过的秒,i 及结构体变量 s
输入小时分钟秒到s中
输入经过的秒于n中
s.min+=(s.sec+n)/60;//将加上n秒后超过60秒的数存入s的分钟里
s.sec=(s.sec+n)%60;//将加上n秒后取余60后放入s的秒内
s.hour+=(s.min)/60;//同上 ,但是有一点是先储存小时,以防去分钟时造成改变
s.min=s.min%60;
s.hour=s.hour%24;
输出s中的小时分钟秒//输出时记得补0
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
-
这道题主要是我在表示时间都为0的地方,应该是有两个0,而我忘记了以前老师说过的补0的方法,最开始我是想用字符数组来达到输入两个0的情况,但是后来发现处理条件太麻烦,还要判断多个条件,后来在舍友提醒后可以用补0的方法才把这题解决。
-
第二个问题是我在处理超过60的秒或分加到上一级时应该先处理上上级的值,因为如果上一级加上后如果直接放入处理后的值,上上级的值也会改变。 用文字描述很绕口,以下是代码的截图,两者的结果是不一样的,执行的顺序改变。
题目3:7-6 通讯录的录入与显示
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
struct fri {
char name[999];
int year,mon,day;
char sex[999];
char gh[999];
char dh[999];
};//该结构体表示联系人的姓名 生日 性别 固话 手机
定义整形变量 n代表输入的人数,k代表选择的次数,i,chioce代表选择的输出
定义结构体变量 fri[999]
输入输入联系人的个数
for i=0 to n
分别输入 姓名 生日 性别 固话 手机于 fri[i]的各个数据中
end for
输入选择的次数k
for i=0 to k
输入选择的编号choice
判断选择的编号是否位于输入的联系人的范围内
若是 输出fri[chioce]的各个数据且换行
否则 输出Not Found并换行
end for
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
- 这题的难点在于输入时的空格控制,如在输入字符串时中间的空格可以不必考虑,而整数类型的中间要考虑处理空格的情况
即 scanf("%s%d/%d/%d %s%s%s" 。 - 还有就是在输出的时候后面都要加上换行符,不然会导致格式错误。
二、截图本周题目集的PTA最后排名。(2分)
三、阅读代码(2分)
- 题目1:
#include<stdio.h>
int days(struct date day);
struct date{
int year;
int month;
int day; };
void main()
{
struct date today,term;
Int yearday,year,day;
printf("Enter year/month/day:");
scanf("%d%d%d",&today.year
,&today.month,&today.day); /*输入日期*/
term.month=12; /*设置变量的初始值:月*/
term.day=31; /*设置变量的初始值:日*/
for(yearday=0,year=1990;year<today.year;year++)
{ term.year=year;
yearday+=days(term);
/*计算从1990年至指定年的前一年共有多少天*/
}
yearday+=days(today); /*加上指定年中到指定日期的天数*/
day=yearday%5;/*求余数*/
if(day>0&&day<4) printf("he was fishing at that day.\\n"); /*打印结果*/
elseprintf("He was sleeping at that day.\\n");
}
int days(struct date day)
{
staticintday_tab[2][13]= {{0,31,28,31,30,31,30,31,31,30,31,30,31,}, /*平均每月的天数*/ {0,31,29,31,30,31,30,31,31,30,31,30,31,}, };
inti,lp;
lp=day.year%4==0&&day.year%100!=0||day.year%400==0; /*判定year为闰年还是平年,p=0
为平年,非0为闰年*/
for(i=1;i<day.month;i++)/计算本年中自1月1日起的天数*/
day.day+=day_tab[lp];
returnday.day;
}
这道题要计算某天是打渔还是晒网,所以采用结构体来定义年份月份日期更为简便,因为年份分为闰年,月份的天数也都不一样,所以如果没有用结构体的话会导致要用许多判断条件来区分,而如果用结构体的话,统一起来,输入的时候直接输入时间,在结构体中我们可以分开来分析,一个一个判断再来计算天数更为简便。
- 题目2:
double fn( double x, int n ){
int i; int y=1;
if(n==1)return x;
else return x-x*fn(x, n-1 );
}
之所以找这题是因为刚开始我做这道题时我是先判断符号的正负,再来相加,结果写了20行,而这个解答是直接运用了递归的特殊性,每次的相减可以使减号直接变为加号,不用判断符号,只要在递归中一直减就可以达到加减交替的情况,所以采用了3行,十分巧妙。
四、本周学习总结(1分)
1.总结本周学习内容。
结构体、共用体、枚举这种构造数据类型特点。
- 结构体
结构体类似数组,但与数组不同的是结构体可以将多种数据类型整合在一起,实现多种数据的整合。
如我们要设计一个包含学生信息的变量我们就可以采用结构体来整合包括整数、字符、数组等等的数据类型。
如:
struct stdudens{
int num;
char name[10];
char sex[2];
} ;
- 共用体
公用题的基本结构与结构体相同,对共用体的成员的引用与结构体成员的引用相同。
但是有几点是其特有的,首先结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间,还有就是共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。所以共用体的好处就是可以大大降低编程时内存的占用,但是使用时也要格外小心,不同于结构体数据所占内存不同,共同体占的内存相同,取值只取最后存放的数。
- 枚举
枚举是一个数据的集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。
枚举类型中的元素如果没有对他赋值则会对第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。如果一个有赋值后一个没有的话会自动对其加1,所以枚举值是常量,不是变量。
- 递归函数原理
递归主体为递归出口和递归式子。递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。
一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:
(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。
2.罗列本周一些错题。
- 这题我只考虑到了++的问题,却忽视了语法的问题,(p)->str是错误的,应该写成p->str 或者(p).str
- 这题也是忽视了符号的优先级,箭号的优先级是大于自增符的应该要加上括号。