您的位置:首页 > 编程语言 > C语言/C++

C语言博客作业--结构体

2017-12-24 17:09 405 查看

一、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
;
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选项中数组越界





本题填空题应该定义结构体数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: