/* 数组版 */
#include <stdio.h>
#define N 10
struct student
{
int num;
char name[15];
float score1;
float score2;
float average;
};
int yorn(char * str); // [Y/N] 函数原型,输入了Y或y返回1,输入N或n返回0
int del(struct student * ar, int num, int * n); // 删除学好为num的那个学生的信息
int sorter(struct student * ar, int n); // 按平均分排序 >
void show(struct student * ar, int n); // 显示学生信息
void Input(struct student * p); // 输入学生信息
int main(void)
{
int ans, j, i = 0; /* i 统计数组中的数据个数,最多N条数据 */
int ch;
struct student stu[N];
while(ch != 'q') /* 即: 不退出 */
{
// Menu
printf("**** 学生信息 ****\n"
"A 添加 D 删除\n"
"S 显示 R 排序\n"
"Q 退出\n\n");
printf("请选择: ");
ch = getchar();
putchar('\n');
switch(ch)
{
case 'a':
case 'A':
ans = 1;
while(i < N && ans)
{
printf("请输入第%d个学员的信息:\n",i+1);
Input(&stu[i]); /* 输入信息 */
putchar('\n');
if((i + 1) < N)
ans = yorn("下一个学生");
i++;
}
break;
case 'd':
case 'D':
printf("删除那个学生的成绩: ");
scanf("%d", &j);
if(del(stu, j, &i) == 1)
puts("删除成功!");
else
puts("删除失败!");
break;
case 's':
case 'S':
show(stu, i);
putchar('\n');
break;
case 'r':
case 'R':
sorter(stu, i);
puts("排序结束.");
break;
case 'Q':
ch = 'q';
break;
default :
break;
}
fflush(stdin);
putchar('\n');
}
return 0;
}
int yorn(char * str)
{
int ch;
printf("%s [Y/N]... ", str);
while((ch = getchar()) == EOF
|| (ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N') )
{
printf("[Y/N]... ");
fflush(stdin);
}
fflush(stdin);
putchar('\n');
return ((ch == 'Y' || ch == 'y') ? 1 : 0);
}
void show(struct student * ar, int n)
{
int i;
putchar('\n');
if(n == 0)
puts("没有数据!");
for(i = 0; i < n; i++)
{
printf("%d号 %s : \n", ar[i].num, ar[i].name);
printf("C: %.1f分 Java: %.1f分\n\n", ar[i].score1, ar[i].score2);
}
}
void Input(struct student * p)
{
printf("学号:");
scanf("%d", &p->num);
fflush(stdin);
printf("姓名:");
gets(p->name);
printf("C课程成绩:");
scanf("%f", &p->score1);
fflush(stdin);
printf("java课程成绩:");
scanf("%f", &p->score2);
fflush(stdin);
p->average = (p->score1 + p->score2) / 2;
}
int sorter(struct student * ar, int n)
{
int i, j;
struct student temp;
if(ar == NULL || n == 0)
return 0;
for(i = 0; i < (n - 1); i++)
{
for(j = i + 1; j < n; j++)
{
if(ar[i].average < ar[j].average)
{
temp = ar[i];
ar[i] = ar[j];
ar[j] = temp;
}
}
}
return 1;
}
int del(struct student * ar, int num, int * n)
{
int i;
if(*n < 1)
return 0;
for(i = 0; i < *n; i++)
if(ar[i].num == num)
break;
if(i < *n)
{
while(i < (*n - 1))
{
ar[i] = ar[i + 1];
i++;
}
(*n)--;
return 1;
}
else
return 0;
}
// i 统计数组中的数据个数,最多N条数据
// 在输入学生完成绩后,函数计算该学生的平均分
// 删除操作的实现:用要删除项目后面的元素覆盖上去
//
[[italic] 本帖最后由 cosdos 于 2007-12-12 13:14 编辑 [/italic]]
#include <stdio.h>
#define N 10
struct student
{
int num;
char name[15];
float score1;
float score2;
float average;
};
int yorn(char * str); // [Y/N] 函数原型,输入了Y或y返回1,输入N或n返回0
int del(struct student * ar, int num, int * n); // 删除学好为num的那个学生的信息
int sorter(struct student * ar, int n); // 按平均分排序 >
void show(struct student * ar, int n); // 显示学生信息
void Input(struct student * p); // 输入学生信息
int main(void)
{
int ans, j, i = 0; /* i 统计数组中的数据个数,最多N条数据 */
int ch;
struct student stu[N];
while(ch != 'q') /* 即: 不退出 */
{
// Menu
printf("**** 学生信息 ****\n"
"A 添加 D 删除\n"
"S 显示 R 排序\n"
"Q 退出\n\n");
printf("请选择: ");
ch = getchar();
putchar('\n');
switch(ch)
{
case 'a':
case 'A':
ans = 1;
while(i < N && ans)
{
printf("请输入第%d个学员的信息:\n",i+1);
Input(&stu[i]); /* 输入信息 */
putchar('\n');
if((i + 1) < N)
ans = yorn("下一个学生");
i++;
}
break;
case 'd':
case 'D':
printf("删除那个学生的成绩: ");
scanf("%d", &j);
if(del(stu, j, &i) == 1)
puts("删除成功!");
else
puts("删除失败!");
break;
case 's':
case 'S':
show(stu, i);
putchar('\n');
break;
case 'r':
case 'R':
sorter(stu, i);
puts("排序结束.");
break;
case 'Q':
ch = 'q';
break;
default :
break;
}
fflush(stdin);
putchar('\n');
}
return 0;
}
int yorn(char * str)
{
int ch;
printf("%s [Y/N]... ", str);
while((ch = getchar()) == EOF
|| (ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N') )
{
printf("[Y/N]... ");
fflush(stdin);
}
fflush(stdin);
putchar('\n');
return ((ch == 'Y' || ch == 'y') ? 1 : 0);
}
void show(struct student * ar, int n)
{
int i;
putchar('\n');
if(n == 0)
puts("没有数据!");
for(i = 0; i < n; i++)
{
printf("%d号 %s : \n", ar[i].num, ar[i].name);
printf("C: %.1f分 Java: %.1f分\n\n", ar[i].score1, ar[i].score2);
}
}
void Input(struct student * p)
{
printf("学号:");
scanf("%d", &p->num);
fflush(stdin);
printf("姓名:");
gets(p->name);
printf("C课程成绩:");
scanf("%f", &p->score1);
fflush(stdin);
printf("java课程成绩:");
scanf("%f", &p->score2);
fflush(stdin);
p->average = (p->score1 + p->score2) / 2;
}
int sorter(struct student * ar, int n)
{
int i, j;
struct student temp;
if(ar == NULL || n == 0)
return 0;
for(i = 0; i < (n - 1); i++)
{
for(j = i + 1; j < n; j++)
{
if(ar[i].average < ar[j].average)
{
temp = ar[i];
ar[i] = ar[j];
ar[j] = temp;
}
}
}
return 1;
}
int del(struct student * ar, int num, int * n)
{
int i;
if(*n < 1)
return 0;
for(i = 0; i < *n; i++)
if(ar[i].num == num)
break;
if(i < *n)
{
while(i < (*n - 1))
{
ar[i] = ar[i + 1];
i++;
}
(*n)--;
return 1;
}
else
return 0;
}
// i 统计数组中的数据个数,最多N条数据
// 在输入学生完成绩后,函数计算该学生的平均分
// 删除操作的实现:用要删除项目后面的元素覆盖上去
//
[[italic] 本帖最后由 cosdos 于 2007-12-12 13:14 编辑 [/italic]]
—>〉Sun〈<—