C语言博客作业--结构体
一、PTA实验作业
题目1:
1. 本题PTA提交列表
2. 设计思路
void calc(struct student *p,int n){
for i=0 to i=n-1
累加三门成绩存于sum
end for;
}
void sort(struct student *p,int n){
定义结构体变量tmp;
/*选择法*/
for i=0 to i=n-2
定义变量index=i;
for j=i+1 to j=n-1
判断数组最大数,并将下标存于index;
end for
交换p[i]与p[index]的位置
end for
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
碰到的问题:最开始用冒泡法,排序反了
解决方法:改变冒泡法内层循环的判断条件,改为 小于时调换位置 if(p[j].sum < p[j+1].sum);或者用选择法做
题目2:有理数比较
1. 本题PTA提交列表
2. 设计思路
定义结构体 fraction{
包含分子,分母
}; //该结构体表示分数
int main()
{
定义结构体数组 s[2];
定义整形数组 real[2];
for i=0 to i=2
输入每个分数
计算分数的大小存于real[i]中;
end for
判断real[0]与real[1]的大小,输出相应的情况
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
本题没有碰到问题
题目3:通讯录的录入与显示
1. 本题PTA提交列表
2. 设计思路
定义结构体 info{
包含姓名,出生年月日,性别,固定电话和手机
};//该结构体存放朋友的信息
int main()
{
定义变量
输入要录入的人数n;
定义结构体数组 s[n];
for i=0 to i=n-1
输入每个人的信息;
end for
输入查询次数k
定义数组num[11],存放查询的序号;
for i=0 to i=k-1
输入num[i];
end for
for i=0 to i=k-1
判断输入的序号num[k]是否在有效,若有效输出对应信息,否则输出Not found
end for
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
碰到的问题:数组越界,刚开始定义电话num长度为16,没有考虑到结束符;
解决办法:将数组长度定义为20
二、截图本周题目集的PTA最后排名。
三、阅读代码
1.刽子手游戏
游戏规则:
1、答案单字写在纸上(每个字元一张纸),并且被盖起来,玩家每次猜一个英文字元(letter)。
2、如果这个英文字元猜中(在答案的英文单字中有出现),被猜中的字元就被翻开。例如:答案是book,如果你猜o,book中的两个o就会被视为已猜中。
3、如果这个英文字元未出现在答案的单字中,就会在hangman的图中多加一划。要完成hangman图共需7划,如下图。注意:同一个猜错的字元只能再图上画一划,例如:答案是book,第一次你猜a(未猜中)会在图上画一划,但第二次以后再猜a并不会再多画。
4、如果在hangman图完成之前,玩家已猜中所有答案中的字元,则玩家赢(win)。
5、如果玩家尚未猜中所有答案中的字元而hangman图完成了,,则玩家输(lose)。
6、如果玩家在还没输赢的情况之下就不玩了,那我们说玩家胆小放弃了(chicken out)
代码:
#include<stdio.h>
#include<string.h>
#define maxn 100
int left ,chance; //还需猜left个位置,错chance次后输
char s[maxn],s2[maxn]; //答案字符串s,玩家猜的字母序列s2
int win,lose; //win=1 表示赢了,lose=1 表示输了
void guess (char ch);
int main(){
int rnd;
while(scanf("%d%s%s",&rnd,s,s2)==3&&rnd!=-1){
printf("Round %d\n",rnd);
win=lose=0; //求解一组新数据是初始化
left=strlen(s);
chance=7;
for(int i=0;i<strlen(s2);i++){
guess(s2[i]); //猜一个字母
if(win||lose) break; //检查状态
}
//根据结构进行输出
if(win) printf("You win.\n");
else if(lose) printf("You lose.\n");
else printf("You chickened out.\n");
}
return 0;
}
void guess(char ch){
int bad=1;
for(int i=0;i<strlen(s);i++)
if(s[i]==ch) {
left--;
s[i]=' '; //将以猜过的字母改为空格
bad=0;
}
if(bad) --chance;
if(!chance) lose=1;
if(!left) win=1;
}
- 对于本题来说,需要维护的的内容比较多,例如:是否赢了或输了,以及剩余的机会数等,代码中用了全局变量来解决,如果不用全局变量,则它们都要传给函数guess,其中有些参数会被guess修改。
- 题目中说的猜过的字母再猜一次算错,代码中并没有保存已经猜过的字母,若要保存需要在程序中增加一个字符数组,让guessed[ch]标识字母ch是否已经猜过。但程序中有一个更好的方法,就是将已经猜过的字母改成空格
2.设计函数char *insert(s1,s2,n),用指针实现在字符串s1中的指定位置n处插入 字符串s2
代码:
#include<stdio.h>
char* insert(char *s1,char *s2,int n)
{
int j=0;
char *ss=new char[100];
char *tsptr=ss;
for(int i=0;i<n;i++)
*ss++=*s1++; //s1前n-1个存于新数组 ss
while(*s2!=0)
*ss++=*s2++; //将s2存入新 ss
while(s1!=0)
*ss++=*s1++ //将 s1 剩余的字符存入 ss
*ss==0; //添加结束符
return tsptr;
}
void main()
{
char s1[]="123456789";
char s2[]="1234";
char *ss=intsert(s1,s2,4); //调用函数
printf("%s",ss);
}
本题函数中用指针,代码里大大减少
四、本周学习总结
1.总结本周学习内容。
1.结构体
struct 结构名{
类型名 结构成员名1;
类型名 结构成员名2;
……
类型名 结构成员名n;
}结构变量1,结构变量2,……;
2.共用体
union 结构名{
类型名 结构成员名1;
类型名 结构成员名2;
……
};
特点:
- 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种
- 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用
- 共用体变量的地址和它的各成员的地址都是同一地址
- 不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化
- 不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针
- 共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员
3.枚举
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
特点:
- 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
- DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
- 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。
- 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
- 枚举型是预处理指令#define的替代。
- 类型定义以分号;结束。
注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量.
既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明.
方法一:枚举类型的定义和变量的声明分开:
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY yesterday;
enum DAY today;
enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY
enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY
方法二:类型定义与变量声明同时进行:
enum //跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //变量workday的类型为枚举型enum DAY
enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days;
enum BOOLEAN { false, true } end_flag, match_flag; //定义枚举类型并声明了两个枚举型变量
方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:
typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此处的workday为枚举型enum workday的别名
workday today, tomorrow;
2.罗列本周一些错题。
本题没注意到D选项中数组越界
本题填空题应该定义结构体数组