题目要求:定义一个包含学生信息(学号,姓名,成绩)的顺序表(采用结构体数组存储),使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
我把每个功能都分成函数了,但是第七个统计学生个数的函数就是无法输出。还有一个问题就是,我在第五个函数中插入了一个学生信息,但在第六个删除函数中,删除的数组还是基于原来的结构体数组,并不是基于插入后的,若我想基于插入后的删除应该如何呢?
#include<stdio.h>
#include<string.h>
typedef struct
{
char no[8];//8位学号
char name[20];//姓名
int price;//成绩
}Student;
int main()
{
void Input(Student stu[], int n);
void Print(Student stu[], int n);
int Name_Search(Student stu[], int n);
Student* Designate(Student stu[], int n);
void Insert(Student stu[], int n);
void Delete(Student stu[], int n);
void State(Student stu[], int n);
Student stu[1000], * p;
int n, place = -1;
printf("How many students?");
scanf_s("%d", &n);
//根据指定学生个数,逐个输入学生信息
Input(stu, n);
//逐个显示学生表中所有学生的相关信息
Print(stu, n);
//根据姓名进行查找,返回此学生的学号和成绩
place = Name_Search(stu, n);
if (place >= 0)
printf("Result:\nNO.:%8s NAME:%10s SCORE:%5d\n", stu[place].no, stu[place].name, stu[place].price);
//根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
p = Designate(stu, n);
printf("Print:\nNO.:%8s NAME:%10s SCORE:%5d\n", p->no, p->name, p->price);
//给定一个学生信息,插入到表中指定的位置
Insert(stu, n);
//删除指定位置的学生记录
Delete(stu, n);
//统计表中学生个数
State(stu, n);
return 0;
}
void Input(Student stu[],int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("NO.:");
scanf_s("%s", stu[i].no, 8);
printf("NAME:");
scanf_s("%s", stu[i].name, 20);
printf("SCORE:");
scanf_s("%d", &stu[i].price);
}
}
void Print(Student stu[], int n)
{
int i;
printf("-------Student List--------\n");
printf("NO. NAME SCORE\n");
for (i = 0; i < n; i++)
printf("%-10s%-10s%-5d\n", stu[i].no, stu[i].name, stu[i].price);
}
int Name_Search(Student stu[], int n)
{
int i, find = 0, place = -1;//find标志是否找到,place标记位置
char search_name[20], c;
while (!find)
{
printf("You want to find:");
scanf_s("%s", search_name, 20);
for (i = 0; i < n; i++)
if (strcmp(search_name, stu[i].name) == 0)
{
find = 1;
place = i;
return place;
}
if (find == 0)
printf("Cannot found!\n");
getchar();
printf("found again?(N/Y)");
scanf_s("%c", &c, 1);
if (c == 'y' || c == 'Y')
find = 0;
else if ((c == 'n' || c == 'N') && find == 0)
return place;
}
}
Student* Designate(Student stu[], int n)
{
Student* p = NULL;
int i = 0, design_locate, flag = 0;//design_locate指定位置,flag标志输入是否有效
while (!flag)
{
printf("You want to print:");
scanf_s("%d", &design_locate);
if (design_locate >= 0 && design_locate < n)
flag = 1;
else
printf("Data error.again!\n");
}
p = stu;
while (i != design_locate)
{
i++;
p = stu + i;
}
return p;
}
void Insert(Student stu[], int n)
{
Student insert, t1, t2;//insert为插入学生信息
int i, insert_appoint;//insert_appoint为指定插入位置
printf("insert information:\n");
printf("NO.:");
scanf_s("%s", insert.no, 8);
printf("NAME:");
scanf_s("%s", insert.name, 20);
printf("SCORE:");
scanf_s("%d", &insert.price);
printf("the information locate on:");
scanf_s("%d", &insert_appoint);
if (insert_appoint < 0 || insert_appoint > n)
printf("Data error!\n");
else
{
t2 = insert;
for (i = insert_appoint; i < n; i++)
{
t1 = stu[i];
stu[i] = t2;
t2 = t1;
}
stu[i] = t2;
n = n + 1;
printf("-------New Student List-------\n");
printf("NO. NAME SCORE\n");
for (i = 0; i < n ; i++)
printf("%-10s%-10s%-5d\n", stu[i].no, stu[i].name, stu[i].price);
}
}
void Delete(Student stu[], int n)
{
int i, delete_appoint;//delete_appoint为指定删除位置
printf("delete information:");
scanf_s("%d", &delete_appoint);
if (delete_appoint < 0 || delete_appoint >= n)
printf("Data error!\n");
else
{
for (i = delete_appoint; i + 1 < n; i++)
stu[i] = stu[i + 1];
printf("-------New Student List-------\n");
printf("NO. NAME SCORE\n");
for (i = 0; i < n - 1; i++)
printf("%-10s%-10s%-5d\n", stu[i].no, stu[i].name, stu[i].price);
}
}
void State(Student stu[], int n)
{
int num = 0, i = 0;//num为统计的表中学生人数
while (stu[i].no)
{
num++;
i++;
}
printf("The number of students: %d", num);
}