一、PTA实验作业
题目1:结构体数组中查找指定编号人员
1.本题PTA提交列表
2.设计思路
int 循环变量i
for i=0 to N-1
if(用strcmp对比std[i]编号和num是否相同?)
return std[i]
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
刚开始没想到用strcmp函数对比编号比较方便,使用了循环一次次的对比每一个字符,不正确就跳出循环指向下一个结构变量,这样的方法太麻烦了,而且实验过程中容易出现错误,导致运行出错
题目2:有理数比较
1.本题提交列表
2.设计思路
struct Rational
{
double deno存放分母
double mune存在分子
}
定义结构体变量s1、s2
输入s1、s2相关数据(分子和分母)
if(s1>s2)
四舍五入输出s1>s2
if(s1=s2)
四舍五入输出s1=s2
if(s1<s2)
四舍五入输出s1<s2
return 0
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
输入和输出的结构类型写错导致输出错误,把%f错写成%d
题目3:通讯录的录入与显示
1.本题提交列表
2.设计思路
struct friends
{
char name[20]存放姓名,birthday[20]存放生日,sex[20]存放性别,tel[20]存放固话,phone[20]存放手机号码
}
int 循环变量i,n存放记录个数,K存放输入的查询个数
int num[20]存放查询编码
定义结构体变量s[20]
输入n
for i=0 to n-1
输入s[i]的相关信息(姓名、生日、性别、固话、手机号码)
输入K
for i=0 to K-1
输入num[i]
for i=0 to K-1
if(num[i]>0且num[i]<n)
输出s[i]相关信息(姓名、固话、手机号码、性别、生日)
else
输出Not Found
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
将最后的循环条件i<K写成了i<n,导致输出三个结果,多出一个Not Found
二、截图本周题目集的PTA最后排名
三、阅读代码
题目1:猜数
#include <stdio.h>
#include <time.h>
void creat(int *secretp)
{
srand(time(NULL));
*secretp = rand() % 100 + 1;
}
void guess(int secret)
{
int cnt = 0, a;
while(1)
{
printf("please input a num:");
scanf("%d", &a);
cnt++;
if(a == secret)
{
printf("cnt = %d\n", cnt);
break;
}
else if(a > secret)
printf("input a small one\n");
else
printf("input a big one\n");
}
}
int main(void)
{
int secret;
creat(&secret);
guess(secret);
return 0;
}
首先生成一个介于1-100之间的整数,从键盘不断输入数值直到该数值与生成的那个数相符为止,并打印出猜数的次数。该代码使用了两个函数,guess函数封装判断猜的数和猜的次数,creat函数里面负责生产随机数,可读性高
题目2:生成26个排列好的英文字母
#include <stdio.h>
#include <time.h>
#define N 26
void ch_sort(char *p, int n)
{
int i = 0, tmp;
srand(time(NULL));
while(i < n)
{
tmp = rand() % N;
if(*(p + tmp) == 0)
{
*(p + tmp) = 'a' + tmp;
i++;
}
}
for(i = 0; i < N; i++)
printf("%c ", *(p + i));
printf("\n");
}
int main(void)
{
char a[N] = {0};
ch_sort(a, N);
return 0;
}
首先随机生成一个字符,再判断它是否是英文字母字符,是的话输出,否则继续判断直到满足二十六个字母,这题用指针很好的解决了问题,极大的精简的代码量,否则用平时的循环判断需要定义很多变量,占用的内存更大且效率低
四、本周学习总结
1.总结本周学习内容
结构体、共用体、枚举这种构造数据类型特点
结构体
1.结构的概念与定义
结构是C语言中一种新的构造数据类型,它能够将不同数据的类型汇聚成一个整体;同时,结构又是一个变量的聚合,可以按照对基本数据类型的操作方法单独使用其成员变量,如
struct student
{
int num;
char name[10];
int computer,English,math;
double everage;
};
其中,结构的定义要以分号结束,因为C语言把它看做是一条语句
2.结构的嵌套定义
struct address
{
char city[10];
char street[20];
int code;
int zip;
};
struct student
{
int num;
char name[10];
struct address addr;
int computer,english,math;
double average;
};
其中需要注意的是,在定义嵌套循环的结构类型中,必须先定义其成员的结构类型,再定义主结构类型
3.结构变量的定义和初始化
#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;
int set_grade( struct student *p, int n )
{
int i,count=0;
for(i=0;i<n;i++)
{
if(p->score>=85) //级别A
p->grade=65;
else if(p->score>=70&&p->score<=84) //级别B
p->grade=66;
else if(p->score>=60&&p->score<=69) //级别C
p->grade=67;
else if(p->score<60) //级别D
{
p->grade=68;
count++; //不及格人数
}
p++;
}
return count;
}
}
使用结构体指针可传递多个数据的地址,使参数传递的形式比较简单,但是效率较低
共用体
union data /*共用体* /
{
int a;
float b;
double c;
char d;
}stud
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
}
main ( )
{
struct stud student
printf("%d,%d",sizeof(struct stud),sizeof(union data));
形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间,对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存
枚举
1,枚举的定义
枚举是C语言中一种基本数据类型,可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。比如可以用枚举来表示季节,春天,夏天,秋天,冬天。
2,定义形式:
enum 枚举名称 {元素1,元素2,元素3,...};
例如:
enum Season {spring,summer,autumn,winter};
3,枚举变量的定义有3种方式
a,先定义枚举类型,再定义枚举变量
enum Season {spring,summer,autumn,winter};
enum Season s;
b,定义枚举类型的同时定义枚举变量
enum Season {spring,summer,autumn,winter} s;
c,省略枚举名称,直接定义枚举变量
enum {spring,summer,autumn,winter} s;
使用以上3中方式中的任何一种方式都是可以的。
4,基本操作
a,赋值操作
enum Season {spring, summer, autumn, winter} s;
s = spring; // 等价于 s = 0;
s = 3; //等价于 s = winter;
b,遍历
enum Season {spring, summer, autumn, winter} s;
// 遍历枚举元素
for (s = spring; s <= winter; s++)
{
printf("枚举元素:%d \n", s);
}
输出结果 , 0 ,1,2,3
注意事项
- 枚举值是常量不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举Season的元素再作以下赋值,如spring=5;summer=2;spring=summer;等都是错误的
- 枚举元素本身由系统定义了一个表示序号的数值从0 开始顺序定义为012„。如在Season中,spring值为0,summer值为1
- 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如b=summer;a=spring; 是正确的。而a=0;b=1; 是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如,a=(enum Season)2;其意义是将顺序号为2的枚举元素赋予枚举变量a相当a=autumn; 还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号
2.罗列本周错题
- 本题犯了很多的错误,如sum没定义就拿来用;下面的累加求和算法也错写成偶数求和;累加的做法也不对(当时脑抽了不知道在写什么),没有用结构体的形式去写
- 图中第二个空格应该填写struct student*,代表函数的返回值,而不是struct student