各位观众老爷,先上代码!!!(代码水平非常低,仅供参考
#include我们来解释一下这个struct是干什么的struct Student { char name[100]; char Class[100]; long long StudentID; }; void menu() // 菜单函数 { printf("==========学生打卡系统==========n"); printf("1. 录入打卡的学生(可连续录入)n"); printf("2. 查看打卡学生n"); printf("3. 录入完毕,统计打卡人数,并退出系统系统n"); } void setStudentClock(Student arr[100]) { for (int i = 0; i < 100; i++) { if (!arr[i].StudentID) { printf("请输入学生姓名:n"); scanf("%s", arr[i].name); printf("请输入学生班级:n"); scanf("%s", arr[i].Class); printf("请输入学生学号:n"); scanf("%lld", &arr[i].StudentID); printf("您还要继续输入吗?继续输入请输入1,反之输入0:n"); int flag; scanf("%d", &flag); if (flag == 0) return; } } } void getStudentClock(Student arr[100]) { printf("姓名tttt班级tttt学号ttttn"); for (int i = 0; i < 100; i++) // 因为总共只接受100名同学,不许要优化,计算机完全可以暴力遍历,以后可以优化, // 所以这里就遍历一百次 { if (!arr[i].StudentID) return; else { printf("%stttt", arr[i].name); printf("%sttt", arr[i].Class); printf("%lldttttn", arr[i].StudentID); } } } int getStudentnumber(Student arr[100]) { int num = 0; for (int i = 0; i < 100; i++) // 因为总共只接受100名同学,不许要优化,计算机完全可以暴力遍历,以后可以优化, // 所以这里就遍历一百次 { if (!arr[i].StudentID) break; else num++; } return num; } int main() { Student arr[100]; // 100个人我感觉够了,因为你们没学stl,也不能用c++ for (int i = 0; i < 100; i++) arr[i].StudentID = 0; while (true) { menu(); int n; // 选择1 2 3 scanf("%d", &n); switch (n) { case 1: // 1. 录入打卡的学生(可连续录入) setStudentClock(arr); break; case 2: // 2. 查看打卡学生 getStudentClock(arr); break; case 3: // 3. 录入完毕,统计打卡人数,并退出系统系统 printf("总共打卡%d个人n", getStudentnumber(arr)); printf("==============!!!退出程序!!!=============="); return 0; default: // 输入错误判断 break; } } return 0; }
** 不准确的说就是定义了一个新的类型,根据本文代码,定义了一个学生类型,所以说就可以跟int等类型一样的定义数组,数组的每一个元素都是一个学生的信息 **
--------------------我们来分析一下 --------------------
一、 先定义出所需的结构体(我还是喜欢Java的类,JavaYYDS)
struct Student
{
char name[100]; // 这也是低配的愿因
char Class[100]; // 这也是
long long StudentID; \ long long StudentID = 0; 这样写有些编译器不通过,所
\ 以说就有了下面for循环初始化
};
int main()
{
Student arr[100]; // 只有100个人就是低配版的原因之一,想升级一下可以用vector。
for (int i = 0; i < 100; i++) // 有些编译器不通过在结构体中直接初始化,所以只能这样了QAQ。
arr[i].StudentID = 0;
while (true)
{
menu();
int n; // 选择1 2 3
scanf("%d", &n);
switch (n)
{
case 1: // 1. 录入打卡的学生(可连续录入)
setStudentClock(arr);
break;
case 2: // 2. 查看打卡学生
getStudentClock(arr);
break;
case 3: // 3. 录入完毕,统计打卡人数,并退出系统系统
printf("总共打卡%d个人n", getStudentnumber(arr));
printf("==============!!!退出程序!!!==============");
return 0;
default: // 输入错误判断
printf("====输入1~3,不要瞎输====")
break;
}
}
return 0;
}
二、 写菜单(我感觉写菜单可以做为第一步)###
** 在main函数中反复调用就行了 **
void menu() // 菜单函数
{
printf("==========学生打卡系统==========n");
printf("1. 录入打卡的学生(可连续录入)n");
printf("2. 查看打卡学生n");
printf("3. 录入完毕,统计打卡人数,并退出系统系统n");
}
三、 接收打卡同学的输入和展示输出(至于为什么命名函数用get和set就不多说了,简明易懂)
void setStudentClock(Student arr[100])
{
for (int i = 0; i < 100; i++)
{
if (!arr[i].StudentID) // main函数中的初始化就是要在这儿用
{
printf("请输入学生姓名:n");
scanf("%s", arr[i].name);
printf("请输入学生班级:n");
scanf("%s", arr[i].Class);
printf("请输入学生学号:n");
scanf("%lld", &arr[i].StudentID);
printf("您还要继续输入吗?继续输入请输入1,反之输入0:n");
int flag;
scanf("%d", &flag);
if (flag == 0)
return;
}
}
}
void getStudentClock(Student arr[100])
{
printf("姓名tttt班级tttt学号ttttn");
for (int i = 0; i < 100; i++) // 因为总共只接受100名同学,不许要优化,计算机完全可以暴力遍历,以后可以优化,
// 所以这里就遍历一百次
{
if (!arr[i].StudentID)// main函数中的初始化就是要在这儿用
return;
else
{
printf("%stttt", arr[i].name);
printf("%sttt", arr[i].Class);
printf("%lldttttn", arr[i].StudentID);
}
}
}
四、 统计人数(这个就非常简单了)###
交给计算机遍历
int getStudentnumber(Student arr[100])
{
int num = 0;
for (int i = 0; i < 100; i++) // 因为总共只接受100名同学,不许要优化,计算机完全可以暴力遍历,以后可以优化,
// 所以这里就遍历一百次
{
if (!arr[i].StudentID)
break;
else
num++;
}
return num;
}
** 各位小白看见的话就留下你们的足迹,评论+点赞 **



