一、PTA实验作业
题目1:结构体数组中查找指定编号人员
1. 本题PTA提交列表
2. 设计思路
struct student{
char num[10];
int year,month,day ;
};//该结构体表示学生的姓名与出生年月日
struct student fun(struct student *std, char *num)//进入函数
int i;
struct student a 定义一个结构体变量
for i=0 to i<N
if(strcmp((std+i)->num,num)==0)即找到指定编号人员
a=*(std+i)让a保存这个人的信息
break
return a返回这个人的信息
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 一开始这么写,虽然也对但是没有用到函数的特点而且不够精简。其他没有问题。
题目2:时间换算
1.本题PTA提交列表
2.设计思路
struct time{
int h;
int m;
int s;
};//该结构体表示时间的小时,分钟和秒
int n,n 存放一会儿要加的整数秒
struct time t 定义一个结构体变量t
输入小时,分钟和秒,以及n
if(t.s+n>=60秒需要进位)
t.m=t.m+(t.s+n)/60 计算秒进位后的分钟
t.s=(t.s+n)%60 计算秒进位后剩下的秒
if(t.m>=60 即分钟需要进位)
t.h=t.h+t.m/60 计算分钟进位后的小时
t.m=t.m%60; 计算分钟进位后剩余的分钟
if(如果小时大于等于24)
t.h=0 回到一天的开始
else即没有进位的话
t.s=t.s+n;
输出小时,分钟和秒
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 一开始忘记了没有进位的情况导致错误,很快就发现了错误。
题目3:通讯录的录入与显示
1.本题PTA提交列表
2.设计思路
struct people{
char name[20];
int year;
int month;
int day;
char sex;
char tel[20];
char phone[20];
};//该结构体包含了一个人的名字,出生年也日,性别,固话和电话
int N,K,num,i
输入N
定义一个结构体数组 a[n]
for i=0 to i<N
输入第i个人的名字,出生年月日,性别,固话和电话
输入K
for i=0 to i<K
输入num
if(num是数组的某一个下标) 则输出这个人的姓名 固话 手机 性别 生日
else 输出Not Found
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 没有判断输入num的数是否可以小于零导致错误。
- 没有将出生年月日不足两位时前补零至两位。
二、截图本周题目集的PTA最后排名
三、阅读代码
1.判断回文字符串
#include<stdio.h>
#include<string.h>
int fun( char *str,int len)
{
char *p = str; //令p指向字符首位
char *q = str+len - 1; //令j指向数组最后一位
while(p < q)
{
if(*p != *q) //如果不是回文字符则返回0
return 0;
p++;//p指针从前向后
q--;//q指针从后向前
}
return 1; //走到这一步肯定是回文字符
}
int main()
{
char str[100] ;
int x;
gets(str);
x=fun(str,strlen(str));
if(x==1) printf("yes");
else printf("no");
return 0;
}
我做这道题的时候是这样的
该题代码优点:
- 十二行代码就判断出了是否为回文字符串,而我写了32行可以看出很简洁。
- 运用两个指针一个从前到后一个从后到前,很机智的代码,并且可读性高。
2.让n个数后移m个位置,超过数组大小的数字移动到前面
#include <stdio.h>
void main()
{
void move(int *, int, int);
int number[20], n, m, i;
printf("how many numbers?\n");
scanf("%d", &n);
printf("input %d numbers:\n", n);
for(i = 0; i < n; i++)
scanf("%d", number+i); //数组名的又一种应用
printf("how many place you want move?\n");
scanf("%d", &m);
move(number, n, m);//调用自定义函数
printf("Now, they are: \n");
for(i = 0; i < n; i++)
printf("%3d", *(number+i)); //指针法输出数组的新内容
printf("\n");
}
void move(int * array, int n, int m)
{
int *p, array_end;
array_end = *(array+n-1);
for(p = array+n-1; p > array; p--)
*p = *(p-1);//数组后移一位
*array = array_end;
m--;
// recursive call the move function until m reduce to 0
if(m>0)
move(array, n, m); //递归调用
}
优点:运用了递归使函数效率更高。运用函数传递指针和指针偏移实现使代码的可读性更高,效率也高。
四、本周学习总结
1.总结本周学习内容
结构体:
结构类型是一种允许程序员把一些数据分量聚合成一个整体的数据量。与数组的不同在于:数组中所有元素的数据类型必须相同,而结构中各成员的数据类型可以不同。
定义格式为struct 结构名{ 类型名 结构成员1;类型名 结构成员2;···类型名 结构成员n; }结构变量名表;
结构体变量的定义可以跟在结构体定义的后面,也可以在main函数中定义,格式为struct 结构名 结构变量名;
共用体:
共用体是C语言中的一种数据类型,是指将不同类型的数据项存放于同一段内存单元的一种构造数据类型。特点:节省空间。
定义格式为union 共用体类型名 {类型名 成员1; 类型名 成员2;···类型名 成员n;;} 共用体变量名表 ;
与结构体一样,公用体变量的定义可以跟在结构体定义的后面,也可以在main函数中定义,格式为union 公用体名 共用体变量名
枚举:
枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数。枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。特点:第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。可以 人为设定枚举成员的值,从而自定义某个范围内的整数。
定义格式为enum 枚举名 {枚举元素1,枚举元素2,…枚举元素n}枚举类型变量名表;
与结构体一样,枚举类型变量的定义可以跟在枚举结构的后面,也可以在main函数中定义,格式为enum 枚举名 枚举类型变量名
注意点:结构体,共用体和枚举在定义时都需要在最后加上
;
。递归函数:
递归函数需要两个基本元素 递归出口和递归式子。工作原理为:(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址。
(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。
2.罗列本周一些错题
课堂派的第四题
我今天才知道原来 scanf("%s",s[i].name)
不用加取地址符。实在是很细节的东西没有记好。