(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录
这题和上一题的 http://t.csdn.cn/wRK6M代码表示:
第1关:结构体变量的初始化和引用:
题目:
本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。
测试输入:
14308100238 xiaowang 99
15408122584 xiaoli 78预期输出:
14308100238 xiaowang 99
代码思路:
结构体的定义
定义格式为:
struct <结构体类型名> { <成员表> }; //分号结束定义例如,以下是一个描述学生信息的结构体类型定义:
struct student { long number; char name[20]; char sex; float score; };在这个结构体定义中,结构体类型名为
student,该结构体由4个成员组成。第一个成员为number,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应该注意在花括号后的分号是不可少的声明结构体变量
声明结构体变量有四种方式,他们在本质上没什么区别,可根据自己习惯和要求选择你喜欢的方式:
1.先定义结构体,再声明结构体变量
struct student{ long number; char name[20]; char sex; float score; }; //先定义结构体 struct student s1,s2;//声明结构体变量2. 在定义结构体类型的同时声明结题变量
struct student{ long number; char name[20]; char sex; float score; }s1,s2; //在定义结构体的同时定义结构体变量3.直接声明结构体变量
struct { //省去结构体名 long number; char name[20]; char sex; float score; }s1,s2; //直接给出结构体变量4.
typedef引用别名来定义typedef struct student STUDENT; //给结构体student定义别名 struct student { long number; char name[20]; char sex; float score; }; STUDENT s1,s2; //使用别名STUDENT定义结构体结构体变量初始化
在定义结构体变量的同时可以对其进行初始化,格式与数组变量初始化类似,用花括号吧每个成员的初始值括起来,每个初始值与相应的成员对应。
例如,对
student结构体类型的变量s1进行初始化:struct student s1={2010001,"lili",'F',97};在定义结构体类型是不能对其成员进行初始化,因为类型不是程序运行时的实体,不会给他们分配内存空间,因此,对其初始化没有意义。
在了解完结构体的相关知识点后,本题就迎刃而解了,这里我采用的是结构体数组,在创建完结构体后在main函数中将数据输入其中即可
代码表示:
#include<stdio.h>
struct Student
{
long int num;
char name[20];
int score;
} student[2];
int main()
{
for (int i = 0; i < 2; i++)
{
scanf("%ld %s %d", &student[i].num, student[i].name, &student[i].score);
}
if (student[0].score > student[1].score)
{
printf("%ld %s %d", student[0].num, student[0].name, student[0].score);
}
else if (student[0].score < student[1].score)
{
printf("%ld %s %d", student[1].num, student[1].name, student[1].score);
}
return 0;
}第2关:结构体排序
题目:
本关任务:有
n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。测试输入:
5
10101 Zhang 78
10103 Wang 98
10106 Li 86
10108 Ling 73
10110 Sun 100预期输出:
10110 Sun 100
10103 Wang 98
10106 Li 86
10101 Zhang 78
10108 Ling 73
代码思路:
这题和上一题的相比,数组内元素的比较更难一点,我们这里采用冒泡排序(http://t.csdn.cn/0XtSa)的方法,将结构体中的成绩进行排序,最后将其打印
这题和上一题的 http://t.csdn.cn/wRK6M代码表示:
#include<stdio.h>
struct student
{
int num;
char name[20];
int score;
};
void input(int n, struct student s[])
{
int i;
for (i = 0; i < n; i++)
{
scanf("%d %s %d", &s[i].num, s[i].name, &s[i].score);
}
}
void swap(int n, struct student s[])
{
int i, j, t;
struct student temp;
for (j = 0; j < n - 1; j++)
{
for (i = 0; i < n - 1 - j; i++)
if (s[i].score < s[i + 1].score)
{
temp = s[i];
s[i] = s[i + 1];
s[i + 1] = temp;
}
}
for (i = 0; i < n; i++)
{
printf("%d %s %d", s[i].num, s[i].name, s[i].score);
printf("\n");
}
}
int main()
{
int n;
scanf("%d", &n);
struct student s[100];
void input(int n, struct student s[]);
void swap(int n, struct student s[]);
input(n, s);
swap(n, s);
return 0;
}第3关:结构体存储数据:
题目:
本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。
三个候选人为"
Li", "Zhang","Sun"。测试输入:
10
Li
Li
Sun
Zhang
Zhang
Sun
Li
Sun
Zhang
Li预期输出:
Li:4
Zhang:2
Sun:3
代码思路:
这题的难点在于如何判断并打印出得票数,我们可以直接在结构体中创建一个得票数,将其初始化为0,再用for循环统计每个人的投票,然后用strcmp()函数判断投票的对象,并将其的number++,最后打印即可
代码表示:
#include<stdio.h>
#include<string.h>
struct voter
{
char name[20];
int number;
};
int main(void)
{
struct voter v[3] = { {"Li",0},{"Zhang",0},{"Sun",0} };
int i, j;
char lover[20];
int n;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s", lover);
for (j = 0; j < 3; j++)
{
if (strcmp(lover, v[j].name) == 0)
v[j].number++;
}
}
for (i = 0; i < 3; i++)
printf("%s:%d\n", v[i].name, v[i].number);
return 0;
}第4关:结构体存储学生信息:
题目:
本关任务:使用结构体储存学生信息(包括学号,姓名,
3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。测试输入:
10 3
1 Siyu 90 90 90
2 Amy 60 70 94
3 Jack 60 60 98
4 Jack 77 90 60
5 Banana 60 60 40
6 White 60 60 60
7 Pinkman 60 60 60
8 Fring 60 60 70
9 Ehrmantraut 80 63 61
10 Schrader 99 66 100
1 Jack
2 1 100 100 100
3 10预期输出:
3 Jack 60 60 98 218
4 Jack 77 90 60 227
1 Siyu 100 100 100 300
2 Amy 60 70 94 224
3 Jack 60 60 98 218
4 Jack 77 90 60 227
5 Banana 60 60 40 160
6 White 60 60 60 180
7 Pinkman 60 60 60 180
8 Fring 60 60 70 190
9 Ehrmantraut 80 63 61 204
10 Schrader 99 66 100 265
1 Siyu 100 100 100 300
2 Amy 60 70 94 224
3 Jack 60 60 98 218
4 Jack 77 90 60 227
5 Banana 60 60 40 160
6 White 60 60 60 180
7 Pinkman 60 60 60 180
8 Fring 60 60 70 190
9 Ehrmantraut 80 63 61 204
代码思路:
我们先来分析一下题意吧,题目要求我们首先输入n和q,n表示学生的总数,q表示额外操作的数量,如上例题,n=10,表示要输入10个学生的信息,q=3,即有3个额外操作。
而额外操作又分为三种:
当输入1时,表示通过姓名查找学生信息
当输入2时,表示通过学号修改学生信息
当输入3时,表示通过学号删除学生信息
这题的主函数代码题目已经给出,我们只需要补全结构体代码即可
查找学生信息:只需要在遍历时用strcmp判断学生姓名与结构体中的name是否相同,然后打印出相同情况(我们这里暂时不考虑找不到name的情况)
删除学生信息:只需要通过for循环用strcmp找到对应的学号,然后break跳出循环,并将该学号后面的学号依次前移,覆盖前面一个学号,达到删除的目的(也暂时不考虑找不到的情况)
修改学生信息:和上面一样,通过遍历和strcmp找到对应的学号,将其内容修改即可。
如果大家向更加深入探讨有关储存信息类的问题(考虑找不到信息的情况),可以看我之前的博客通讯录(http://t.csdn.cn/I0kVV)
代码表示:
#include<stdio.h>
#include<string.h>
int Count;
struct student
{
char sno[20], name[20];
int math, english, chinese, sum;
};
void print(struct student stu)
{
printf("%s %s %d %d %d %d\n", stu.sno, stu.name, stu.math, stu.english, stu.chinese, stu.sum);
}
void query_stu(struct student s[], char* name)
{
for (int i = 0; i < Count; i++)
{
if (strcmp(s[i].name, name) == 0)
print(s[i]);
}
}
void delete_stu(struct student s[], char* sno)
{
int i = 0;
for (; i < Count; i++)
{
if (strcmp(s[i].sno, sno) == 0)
break;
}
for (; i < Count - 1; i++)
{
s[i] = s[i + 1];
}
}
void update_stu(struct student s[], char* sno, int math, int english, int chinese)
{
for (int i = 0; i < Count; i++)
{
if (strcmp(s[i].sno, sno) == 0)
{
s[i].math = math;
s[i].english = english;
s[i].chinese = chinese;
s[i].sum = s[i].math + s[i].english + s[i].chinese;
}
}
}
int main(void)
{
int n, q;
struct student students[50];
scanf("%d%d", &n, &q);
Count = n;
for (int i = 0; i < n; i++)
{
scanf("%s%s%d%d%d", students[i].sno, students[i].name, &students[i].math, &students[i].english, &students[i].chinese);
students[i].sum = students[i].math + students[i].english + students[i].chinese;//求总成绩
}
while (q--)
{
int op;
scanf("%d", &op);
char sno[20], name[20];
if (op == 1)
{
scanf("%s", name);
query_stu(students, name);
}
else if (op == 2)
{
int a, b, c;
scanf("%s%d%d%d", sno, &a, &b, &c);
update_stu(students, sno, a, b, c);
for (int i = 0; i < Count; i++)
print(students[i]);
}
else
{
scanf("%s", sno);
delete_stu(students, sno);
for (int i = 0; i < Count - 1; i++)
print(students[i]);
}
}
return 0;
}