#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define MAXSIZE 1000
int renshu;
typedef struct Student{ //存放学生姓名的表
char name[20]; //姓名
int num;//学号
char sex[10];
int dianhua;
char place[20];
}Student;
typedef struct{
Student elem[MAXSIZE]; //线性表占用的数组空间
int last; //最后一个元素的下标
}SeqList;
//顺序表的输入
void InList(SeqList *L,int i){ //逐个输入学生信息
int x;
printf("请输入学生数量:");
scanf("%d",&x);
renshu=x;
for(i=1;i<=x;i++){
printf("第%d位学生信息\n",i);
printf("———————————————\n");
printf("姓名:");
scanf("%s",&L->elem[i].name);
printf("———————————————\n");
printf("学号:");
scanf("%d",&L->elem[i].num);
printf("———————————————\n");
printf("性别:");
scanf("%s",&L->elem[i].sex);
printf("———————————————\n");
printf("电话:");
scanf("%d",&L->elem[i].dianhua);
printf("———————————————\n");
printf("籍贯:");
scanf("%s",&L->elem[i].place);
}
L->last=x;
printf("\n");
}
//输出顺序表
void PrintList(SeqList *L,int i){ //输出总成绩
for(i=1;i<=L->last;i++){
printf("姓名:%s 学号:%d 性别:%s 电话:%d 籍贯:%s\n",L->elem[i].name,L->elem[i].num,L->elem[i].sex,L->elem[i].dianhua,L->elem[i].place);
}
}
//顺序表的查询
void Find(SeqList *L){ //顺序表的查询,按照学号查询该学生成绩
int i=1;
int n;
if(L->last<1){ //判断是否为空表
printf("没有该同学\n");
return;
}
printf("输入要查找学生的学号\n");
scanf("%d",&n);
while(i<=L->last && L->elem[i].num!=n){ //循环查找对应学号的下标
i++;
}
if(i<=L->last){
printf("该学生姓名为:%s 学号为:%d 性别为:%s 电话为:%d 籍贯为:%s\n",L->elem[i].name,L->elem[i].num,L->elem[i].sex,L->elem[i].dianhua,L->elem[i].place);
return;
}
if(i>L->last){
printf("学号错误,未查询到该学生\n");
return;
}
}
//顺序表的删除
int Delete(SeqList *L, int i){ //从L中删除指定位序i的元素,该元素数组下标为i
int j;
int k;
int error;
printf("请输入要删除的学生学号:");
scanf("%d",&i);
if(L->last<1){ //检查是否为空表
printf("空表!");
return error;
}
for(k=1;k<=L->last;k++){
if(L->elem[k].num==i)
break;
}
if(k>L->last){
printf("未找到该学生!\n");
return error;
} else{
for(j=k;j<=L->last;j++)
L->elem[j]=L->elem[j+1]; //将位序j+1及以后的元素前移
L->last--; //last仍指向最后元素
return true;
}
}
//顺序表的插入
int Insert(SeqList *L,int i,Student e){ //在L的指定位序i中插入一个新元素e;位序i元素的数组位置下表是i
int j;
if(L->last==MAXSIZE){ //表空间已满,不能插入
printf("表满\n");
return 0;
}
if(i<1 || i>L->last+2){ //检查插入位序的合法性:是否在1~n。n为当前元素个数,即last
printf("位序不合法\n");
return 0;
}
for(j=L->last;j>=i-1;j--) //last指向序列最后元素
L->elem[j+1]=L->elem[j];
L->elem[i]=e;
L->last++;
return 1;
}
int main(){
int N=1,i,j;
SeqList L;
Student e,g,q;
int renshu,a;
printf("**********************\n");
printf("*------选择操作------*\n");
printf("*------1 登记--------*\n");
printf("*------2 输出--------*\n");
printf("*------3 查询--------*\n");
printf("*------4 删除--------*\n");
printf("*------5 插入--------*\n");
printf("*------0 退出--------*\n");
printf("**********************\n");
while(N){
printf("请选择操作\n");
scanf("%d",&N);
if(N==1){ //登记成绩
InList(&L,i);
}
else if(N==2){ //输出成绩
PrintList(&L,i);
}
else if(N==3){ //查询
Find(&L);
}
else if(N==4){ //删除
if(Delete(&L,j)){
renshu--;
printf("删除成功\n");
}else {
printf("删除失败\n");
}
}
else if(N==5){ //插入
printf("请输入要插入的位置:");
scanf("%d",&a);
printf("请输入学生姓名:");
scanf("%s",&g.name);
printf("请输入学生学号:");
scanf("%d",&g.num);
printf("请输入学生性别:");
scanf("%s",&g.sex);
printf("请输入学生电话:");
scanf("%d",&g.dianhua);
printf("请输入学生籍贯:");
scanf("%s",&g.place);
if(Insert(&L,a,g)){
renshu++;
printf("插入成功\n");
}else {
printf("插入失败\n");
}
}else if(N==0){
printf("退出成功,按任意键结束\n");
exit(0);
}
}
return 0;
}
如何在此代码上增加一个统计学生生源的功能?(语言-c语言)
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
4条回答 默认 最新
关注#include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <locale.h> #define MAXSIZE 1000 typedef struct Student { wchar_t name[20]; int num; wchar_t sex[10]; wchar_t dianhua[20]; wchar_t place[20]; } Student; typedef struct { Student elem[MAXSIZE]; int last; } SeqList; void InList(SeqList *L, int i) { int x; printf("请输入学生数量:"); scanf("%d", &x); L->last = x; for (i = 1; i <= x; i++) { printf("第%d位学生信息\n", i); printf("———————————————\n"); printf("姓名:"); scanf("%ls", L->elem[i].name); printf("———————————————\n"); printf("学号:"); scanf("%d", &L->elem[i].num); printf("———————————————\n"); printf("性别:"); scanf("%ls", L->elem[i].sex); printf("———————————————\n"); printf("电话:"); scanf("%ls", L->elem[i].dianhua); printf("———————————————\n"); printf("籍贯:"); scanf("%ls", L->elem[i].place); } printf("\n"); } void PrintList(SeqList *L, int i) { for (i = 1; i <= L->last; i++) { printf("姓名:%ls 学号:%d 性别:%ls 电话:%ls 籍贯:%ls\n", L->elem[i].name, L->elem[i].num, L->elem[i].sex, L->elem[i].dianhua, L->elem[i].place); } } void Find(SeqList *L) { int i = 1; int n; if (L->last < 1) { printf("没有该同学\n"); return; } printf("输入要查找学生的学号\n"); scanf("%d", &n); while (i <= L->last && L->elem[i].num != n) { i++; } if (i <= L->last) { printf("该学生姓名为:%ls 学号为:%d 性别为:%ls 电话为:%ls 籍贯为:%ls\n", L->elem[i].name, L->elem[i].num, L->elem[i].sex, L->elem[i].dianhua, L->elem[i].place); return; } if (i > L->last) { printf("学号错误,未查询到该学生\n"); return; } } int Delete(SeqList *L, int i) { int j; int k; int error; printf("请输入要删除的学生学号:"); scanf("%d", &i); if (L->last < 1) { printf("空表!"); return error; } for (k = 1; k <= L->last; k++) { if (L->elem[k].num == i) break; } if (k > L->last) { printf("未找到该学生!\n"); return error; } else { for (j = k; j <= L->last; j++) L->elem[j] = L->elem[j + 1]; L->last--; return 1; } } int Insert(SeqList *L, int i, Student e) { int j; if (L->last == MAXSIZE) { printf("表满\n"); return 0; } if (i < 1 || i > L->last + 2) { printf("位序不合法\n"); return 0; } for (j = L->last; j >= i - 1; j--) L->elem[j + 1] = L->elem[j]; L->elem[i] = e; L->last++; return 1; } void CountPlace(SeqList *L) { wchar_t place[20]; printf("请输入要统计生源的籍贯:"); scanf("%ls", place); int count = 0; for (int i = 1; i <= L->last; i++) { if (wcscmp(L->elem[i].place, place) == 0) { count++; } } printf("籍贯为%ls的学生数量为%d\n", place, count); } void CountAllPlaces(SeqList *L) { wchar_t places[MAXSIZE][20]; int count[MAXSIZE] = {0}; int uniqueCount = 0; for (int i = 1; i <= L->last; i++) { int found = 0; for (int j = 0; j < uniqueCount; j++) { if (wcscmp(L->elem[i].place, places[j]) == 0) { count[j]++; found = 1; break; } } if (!found) { wcscpy(places[uniqueCount], L->elem[i].place); count[uniqueCount]++; uniqueCount++; } } for (int i = 0; i < uniqueCount; i++) { printf("%ls %d\n", places[i], count[i]); } } int main() { setlocale(LC_ALL, ""); int N = 1, i, j; SeqList L; Student e, g, q; int renshu, a; printf("**********************\n"); printf("*------选择操作------*\n"); printf("*------1 登记--------*\n"); printf("*------2 输出--------*\n"); printf("*------3 查询--------*\n"); printf("*------4 删除--------*\n"); printf("*------5 插入--------*\n"); printf("*------6 统计生源----*\n"); printf("*------7 统计所有生源----*\n"); printf("*------0 退出--------*\n"); printf("**********************\n"); while (N) { printf("请选择操作\n"); scanf("%d", &N); if (N == 1) { InList(&L, i); } else if (N == 2) { PrintList(&L, i); } else if (N == 3) { Find(&L); } else if (N == 4) { if (Delete(&L, j)) { renshu--; printf("删除成功\n"); } else { printf("删除失败\n"); } } else if (N == 5) { printf("请输入要插入的位置:"); scanf("%d", &a); printf("请输入学生姓名:"); scanf("%ls", g.name); printf("请输入学生学号:"); scanf("%d", &g.num); printf("请输入学生性别:"); scanf("%ls", g.sex); printf("请输入学生电话:"); scanf("%ls", g.dianhua); printf("请输入学生籍贯:"); scanf("%ls", g.place); if (Insert(&L, a, g)) { renshu++; printf("插入成功\n"); } else { printf("插入失败\n"); } } else if (N == 6) { CountPlace(&L); } else if (N == 7) { CountAllPlaces(&L); } else if (N == 0) { printf("退出成功,按任意键结束\n"); exit(0); } } return 0; }本回答被题主选为最佳回答 , 对您是否有帮助呢?评论 打赏 举报 编辑记录解决 1无用