#include<stdio.h> #include<string.h> typedef struct nodelink { long num; char name[20]; int Chinese; int Math; int English; float aver; }stu; int main() { stu b[10]; FILE *pf; pf=fopen("stud.txt","a"); stu a[10]; for(int i=0;i<3;i++) { printf("请输入第%d个学生的学号,姓名,语文成绩,数学成绩,英语成绩:\n", i + 1); scanf("%ld", &a[i].num); getchar(); fgets(a[i].name, 20, stdin); a[i].name[strlen(a[i].name) - 1] = '\0'; scanf("%d%d%d", &a[i].Chinese, &a[i].Math, &a[i].English); a[i].aver=(a[i].Chinese+a[i].Math+a[i].English)/3.0; fprintf(pf,"%ld\t%s\t%d\t%d\t%d\t%.1f\n",a[i].num,a[i].name,a[i].Chinese,a[i].Math,a[i].English,a[i].aver); } for(int i=0;i<3;i++) { fscanf(pf,"%ld\t%s\t%d\t%d\t%d\t%.1f\n",&b[i].num,b[i].name,&b[i].Chinese,&b[i].Math,&b[i].English,&b[i].aver); printf("%ld\t%s\t%d\t%d\t%d\t%.1f\n",b[i].num,b[i].name,b[i].Chinese,b[i].Math,b[i].English,b[i].aver); } fclose(pf); FILE *pf1; pf1=fopen("studsort.txt","a"); stu k; for(int i=0;i<3;i++) for(int j=i;j<3;j++) { if(b[i].aver>b[j].aver) { b[i]=k; b[i]=b[j]; b[j]=k; } } for(int i=0;i<3;i++) { fprintf(pf1,"%ld\t%s\t%d\t%d\t%d\t%.1f\n",b[i].num,b[i].name,b[i].Chinese,b[i].Math,b[i].English,b[i].aver); } fclose(pf1); return 0; }
时间: 2023-12-06 22:41:36 浏览: 33
这段代码是一个简单的学生信息管理系统,可以输入学生的学号、姓名、语文成绩、数学成绩、英语成绩,计算出平均分,并将这些信息写入到一个名为"stud.txt"的文件中。然后从文件中读取这些信息,并将学生信息按照平均分排序,将排序后的信息写入到另一个名为"studsort.txt"的文件中。
具体实现过程是:
1. 定义了一个结构体nodelink,用来存储学生的学号、姓名、语文成绩、数学成绩、英语成绩和平均分。
2. 在main函数中,定义了一个结构体数组a来存储输入的学生信息,并打开了一个名为"stud.txt"的文件,将学生信息写入到这个文件中。
3. 接着定义了一个结构体数组b来存储从文件中读取出来的学生信息,并将文件中的信息读取到数组b中。
4. 然后使用冒泡排序算法,将学生信息按照平均分排序,并将排序后的信息写入到名为"studsort.txt"的文件中。
5. 最后关闭文件,程序结束。
需要注意的是,这段代码存在一些问题。例如,定义了一个结构体变量k,但没有给它赋值,就直接将它赋值给b[i],这会导致程序出错。另外,排序算法也有问题,需要进行修改。
相关问题
#include<stdio.h> #include<string.h> #include<stdlib.h> #define LEN sizeof(struct nodelink) struct nodelink { long num; char name[20]; struct nodelink *next; }; struct nodelink *create() { struct nodelink *p,*q,*head=NULL; p=q=(struct nodelink*)malloc(LEN); for(int i=0;i<10;i++) { scanf("%ld",&p->num); scanf("%c",p->name); if(i==0) head=p; else p->next=q; p=q; q=(struct nodelink*)malloc(LEN); } p->next=NULL; free(q); return head; } int main() { struct nodelink *head; head=create(); return 0; }
这段代码存在一些问题:
1. 在输入姓名时,应该使用 `scanf("%s", p->name)`,而不是 `scanf("%c", p->name)`。因为 `%c` 只能读取一个字符,而 `%s` 可以读取一个字符串。
2. 在创建链表时,应该先将新节点的指针域设为 NULL,再将上一个节点的指针域指向新节点。因为如果先将上一个节点的指针域指向新节点,再将新节点的指针域设为上一个节点,那么新节点的指针域就会丢失,链表就会断开。
3. 在输入姓名时,应该忽略掉姓名后面的空格和回车符。可以在读取数字后加上一个 `getchar()`。
下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(struct nodelink)
struct nodelink {
long num;
char name[20];
struct nodelink *next;
};
struct nodelink *create() {
struct nodelink *p, *q, *head = NULL;
p = q = (struct nodelink*)malloc(LEN);
for(int i = 0; i < 10; i++) {
scanf("%ld", &p->num);
getchar(); // 忽略掉数字后面的回车符
scanf("%s", p->name);
if(i == 0) {
head = p;
} else {
q->next = p;
}
q = p;
p = (struct nodelink*)malloc(LEN);
}
p->next = NULL;
free(p);
return head;
}
int main() {
struct nodelink *head;
head = create();
return 0;
}
```
阅读全文