保研练习题(5)
流程练习题,基本不涉及什么算法。
要求:
学生有(学号,姓名,性别,年龄),初始化三个学生的信息
(10,wes,f,23)(20,ert,f,45)(30,str,t,89),然后对学生信息进行插入和删除处理
例如
I12,rt,f,67表示插入12,rt,f,67
D10 表示删除学号为10的学生的信息
每次操作完成以后输出所有学生的信息按学号从小到大排序
输入:
I12,rt,f,67
输出
(10,wes,f,23) (12,rt,f,67) (20,ert,f,45) (30,str,t,89)
输入:
D10
输出
(12,rt,f,67) (20,ert,f,45) (30,str,t,89)
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 // 学生信息 6 struct student 7 { 8 int num; 9 char name[30]; 10 char sex; 11 int age; 12 }; 13 14 int main() 15 { 16 struct student t; 17 struct student stu[50]; 18 char cmd,sex,name[30]; 19 int num,age,i,j,k; 20 21 // 初始化 22 stu[0].num = 10; 23 strcpy(stu[0].name,"wes"); 24 stu[0].sex = 'f'; 25 stu[0].age = 23; 26 27 stu[1].num = 20; 28 strcpy(stu[1].name,"ert"); 29 stu[1].sex = 'f'; 30 stu[1].age = 45; 31 32 stu[2].num = 30; 33 strcpy(stu[2].name,"str"); 34 stu[2].sex = 't'; 35 stu[2].age = 89; 36 37 // 输入 38 for (i=2; ;){ 39 scanf("%c",&cmd); 40 if (cmd == 'I'){ // 插入 41 i += 1; 42 scanf("%d,%[^,]%*c%c,%d",&stu[i].num,stu[i].name,&stu[i].sex,&stu[i].age); 43 // 排序 共i+1个 44 for (j=0; j<i; j++){ 45 for (k=0; k<i-j; k++){ 46 if (stu[k].num > stu[k+1].num){ 47 t = stu[k]; 48 stu[k] = stu[k+1]; 49 stu[k+1] = t; 50 } 51 } 52 } 53 // 输出结果 54 for (j=0; j<=i; j++){ 55 printf("(%d,%s,%c,%d) ",stu[j].num,stu[j].name,stu[j].sex,stu[j].age); 56 } 57 printf("\n"); 58 } 59 else if (cmd == 'D'){ // 删除 60 scanf("%d",&num); 61 for (j=0; j<=i; j++){ // 定位到要删除的节点 62 if (stu[j].num == num){ 63 break; 64 } 65 } 66 for (k=j; k<i; k++){ // 删除节点 把以后的都向前移一个 67 stu[k] = stu[k+1]; 68 } 69 i -= 1; // 删除后节点数减一 70 // 输出结果 71 for (j=0; j<=i; j++){ 72 printf("(%d,%s,%c,%d) ",stu[j].num,stu[j].name,stu[j].sex,stu[j].age); 73 } 74 printf("\n"); 75 } 76 } 77 return 0; 78 }