一、PTA实验作业
题目1:计算职工工资
1. 本题PTA提交列表
2. 设计思路
定义结构体变量 struct salary
{char name[999];
float base;float flo;float spent;}
定义人数N,i,并输入N;
定义实发工资float sum[N];
定义结构体变量 struct salary s[N];
for(i=0;i<N;i++)
输入s[i].base,s[i].flo,s[i].spent;
for(i=0;i<N;i++)
计算sum[i]= s[i].base+s[i].flo-s[i].spent;
for (i=0;i<N;i++)
输出s[i].name,sum[i] ;
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
一开始在定义基本工资和浮动工资的时候用了int型定义,导致结果出错,后面在输出总工资的时候忘记保留两位有效数字。
题目2: 时间换算
1. 本题PTA提交列表
2. 设计思路
定义结构体变量 struct time{
int hour;int minute;int second;};
定义结构体变量struct time t;
定义加入时间 int n;
输入t.hour,t.minute,t.second ;
if(t.second+n>=60){//六十进一
t.second=t.second+n-60;t.minute+=1;
if(t.minute>=60){//六十进一
t.minute=t.minute-60; t.hour+=1;
if(t.hour>=24){//24小时为00时
t.hour=00;}}
输出t.hour,t.minute,t.second;}
else 输出t.hour,t.minute,t.second+n//没有进一的情况
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
忘了没有进一的情况,后面提交提示我,我没有考虑没有进一的情况。
题目3:通讯录的录入与显示
1. 本题PTA提交列表
2. 设计思路
定义结构体变量struct infor{
char name[10];
int year;
int month;
int day;
char sex;
char stand[99];
char mobile[99];};
定义N,i;输入人数N;
定义结构体变量struct infor s[N];
for(i=0;i<N;i++) 输入信息 ;
定义查询数量K,并输入k;定义q;
for(i=0;i<K;i++) {
输入q;
if(q<0||q>=N) printf("Not Found
");
else 输出s[q].name,s[q].stand,s[q].mobile,s[q].sex,s[q].year,s[q].month,s[q].day
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
一开始在输出字符串%s%s中间没加空格,导致答案出错,后面发现输出日期时不能用%s,用%s一直过不了,后面用%d来定义年月日,然后就解决了问题。
二、截图本周题目集的PTA最后排名。
三、阅读代码
1.运用指针来转置二维数组
#include <stdio.h> main()
{
int t,a[4][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6},{1,5,6,0}};
int (*p)[4],i,j,x;
p=a;
for (p;p<a+4;p++)
{
x=p-a; //相当于i
for (j=x+1;j<4;j++)
{
t=*(*p+j); //相当于t=a[i][j]
*(*p+j)=*(*(a+j)+x); //相当于a[i][j]=a[j][i]
*(*(a+j)+x)=t;
}
}
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
printf("%d",a[i][j]);
printf("
");
}
}
这一题通过指针来对二维数组进行转置,他先将指针指向
二维数组的地址,然后通过例如二维数组的方法来转置,
也就形成了与二维数组一样的转置,指针的便捷在于可以
优化代码,同时也可以比较容易找出错在哪里。
2.实现学生信息输入,输出,查询
#include<stdio.h>
#define NUM 3
//日期结构体
typedef struct{
int year;
int month;
int day;
}DATE;
//学生信息结构体
typedef struct{
int num;
char name[20];
DATE birthday;
char department[50];
char major[50];
}STUDENT;
//输入信息函数
void inputStudent(STUDENT[]);
//输出信息函数
void outputStudent(STUDENT[]);
//查询信息函数
void searchStudent(STUDENT[],DATE);
void main(){
STUDENT s[NUM];
DATE date;
inputStudent(s);
outputStudent(s);
printf("
Enter a date(month,day)
");
scanf("%d%d",&date.month,&date.day);
searchStudent(s,date);
}
void inputStudent(STUDENT s[]){
int i;
for(i=0;i<NUM;i++){
printf("
Enter a student infomation
");
s[i].num = i+1;
scanf("%s",&s[i].name);
scanf("%d%d%d",&s[i].birthday.year,&s[i].birthday.month,&s[i].birthday.day);
scanf("%s",&s[i].department);
scanf("%s",&s[i].major);
}
}
void outputStudent(STUDENT s[]){
int i;
printf("
printf all student infomation");
for(i=0;i<NUM;i++){
printf("
%4d%10s%8d%3d%3d%8s%8s",s[i].num,s[i].name,s[i].birthday.year,s[i].birthday.month,s[i].birthday.day,s[i].department,s[i].major);
}
}
void searchStudent(STUDENT s[], DATE date){
int i;
printf("
searched in all student infomation");
for(i=0;i<NUM;i++){
if(s[i].birthday.month>date.month){
printf("
%4d%10s%8d%3d%3d",s[i].num,s[i].name,s[i].birthday.year,s[i].birthday.month,s[i].birthday.day);
continue;
}
if(s[i].birthday.month==date.month && s[i].birthday.day>date.day){
printf("
%4d%10s%8d%3d%3d",s[i].num,s[i].name,s[i].birthday.year,s[i].birthday.month,s[i].birthday.day);
}
}
printf("
");
}
本题运用结构体来输入查询学生的信息,结构体可以一次定义多个变量,
本题调用了多个函数,如果每个函数都来定义新的变量的话,不利于储存
和运用,这使得了有多级函数时使结构分明清晰,使主函数的语言较为
直观,知道他的目的是什么,他是先void inputStudent(STUDENT s[])
来输入学生信息,然后用void searchStudent(STUDENT s[], DATE date)
函数来查询某个学生的信息,然后再用void outputStudent(STUDENT s[])
函数输出学生信息,这是代码的可读性变得更高。
四、本周学习总结
1.总结本周学习内容。
结构体、共用体、枚举这种构造数据类型特点。
-
结构体:关键词:struct
概念:结构体时一种构造数据类型
用途:把不同类型的数据组合成一个整体
内存:各成员所占内存空间的累加 -
共用体:关键词:union
构造数据类型,也叫联合体。
用途: 使几个不同类型的数据共占一段内存(相互覆盖) -
枚举体:关键词:enum
用途:列举所有选项
举例:day = {Sunday,Monday,Tuesday,Wednesday,Thusday,Friday,Saturday};
结尾有分号,如果个枚举常量没有赋值,则默认值为其下标(参考一维数组),比如此时Tuesday = 2
递归函数原理
递归就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。
(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体。
递归函数只有具备了这两个要素,才能在有限次计算后得出结果。
一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。