编写的程序如下:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 2
struct stu_info
{
int id; /*学号*/
char name[20]; /*姓名*/
char major[20]; /*专业*/
float score; /*分数*/
}student[20],*p=student,one;
FILE *fp;
/*输入模块*/
int save()
{
int i;
int number=0;
if((fp=fopen("student.dat","wb+"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
printf("请输入N个同学的信息:\n");
printf("学号 姓名 专业 分数\n");
for(i=1;i<N+1;i++)
{
scanf(" %d %s %s %f",&student.id,student.name,student.major,&student.score);
fwrite(&student,sizeof(struct stu_info),1,fp);
number++;
}
printf("输入结束!\n");
fclose(fp);
return 0;
}
/*输出模块*/
int show()
{
int i=1;
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
printf("文件已经打开,现在显示所有同学的信息.\n");
while(fread(&one,sizeof(struct stu_info),1,fp)!=NULL)
{
printf(" 学号 姓名 专业 分数\n");
printf("%d %s %s %.2f\n",one.id,one.name,one.major,one.score);
i++;
}
fclose(fp);
return 0;
}
/*建立文件模块*/
int select_id(int sid)
{
int flag=0;
struct stu_info t;
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
while(fread(&t,sizeof(struct stu_info),1,fp)!=NULL && flag==0)
if(sid==t.id)
{
printf("%d\t%s\t%s\t\t%.2f\n",t.id,t.name,t.major,t.score);
flag=1;
break;
}
if(flag==0)
printf("这里没有有关的记录.\n");
fclose(fp);
return 0;
}
int select_major(char smajor[])
{
int flag=0;
struct stu_info t;
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
while(fread(&t,sizeof(struct stu_info),1,fp)!=NULL)
if (strcmp(smajor,t.major)==0)
{
printf("%d\t%s\t%s\t\t%.2f\n",t.id,t.name,t.major,t.score);
flag=1;
}
if(flag==0)
printf("这里没有有关的记录.\n");
fclose(fp);
return 0;
}
/*查询模块*/
int search()
{
int k,sid;
char smajor[20];
printf("选择查询方式:\n");
printf("1.通过学生的学号查询.\n");
printf("2.通过学生的专业查询.\n");
printf("请输入1或2进行查询:\n");
scanf("%d",&k);
switch(k)
{
case 1: printf("请输入学号:\n");
scanf("%d",&sid);
select_id(sid);
break;
case 2: printf("请输入专业:\n");
scanf("%s",smajor);
select_major(smajor);
break;
default: printf("输入有误.\n");
exit(0);
}
return 0;
}
/*添加模块*/
int append()
{
struct stu_info t;
printf("请输入添加的学生记录信息.\n");
scanf("%d%s%s%.2f",&t.id,t.name,t.major,&t.score);
if((fp=fopen("student.dat","ab+"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
fseek(fp,sizeof(struct stu_info),1);
fwrite(&t,sizeof(struct stu_info),1,fp);
printf("记录已经被添加.\n");
fclose(fp);
return 0;
}
/*修改模块*/
int amend()
{
int flag=0;
struct stu_info t;
int sid;
char smajor[15];
float sscore;
if((fp=fopen("student.dat","rb+"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
printf("请输入要修改的学生的学号:\n");
scanf("%d",&sid);
while(fread(&t,sizeof(struct stu_info),1,fp)!=NULL && flag==0)
if(sid==t.id)
{
printf("原来的记录是 %d\t%s\t%s\t%.2f\n",t.id,t.name,t.major,t.score);
printf("请输入正确的专业:\n");
scanf("%s",smajor);
printf("请输入正确的分数:\n");
scanf("%f",&sscore);
strcpy(t.major,smajor);
t.score=sscore;
printf("现在的记录是 %d\t%s\t%s\t%.2f\n",t.id,t.name,t.major,t.score);
fseek(fp,-sizeof(struct stu_info),1);
fwrite(&t,sizeof(struct stu_info),1,fp);
flag=1;
printf("记录已经被修改.\n");
break;
}
if(flag==0)
printf("这里没有需要添加的信息.\n");
fclose(fp);
return 0;
}
/*删除模块*/
int deleted()
{
int sid;
int del_id=0;
int i=0,j;
int number=0;
printf("请输入需要删除的学生的学号:\n");
scanf("%d",&sid);
if((fp=fopen("student.dat","rb+"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
while(fread(&student,sizeof(struct stu_info),1,fp)!=NULL)
{
if(sid==student.id)
{
printf("find the nrecord:%d\t%s\t%s\t%.2f\n",student.id,student.name,student.major,student.score);
i--;
}
i++;
number++;
}
if(i==number)
printf("这里没有需要添加的信息.\n");
else
{
printf("最新的文件有 %d 记录.\n",i);
rewind(fp);
for(j=0;j<i;j++)
{
printf("the writing record:%d\t%s\t%s\t%.2f\n",student[j].id,student[j].name,student[j].major,student[j].score);
fwrite(&student[j],sizeof(struct stu_info),1,fp);
}
printf("记录已经被删除.\n");
}
fclose(fp);
return 0;
}
int main()
{
int choice;
while(1)
{
printf(" ***************学生管理系统***************\n\n\n");
printf(" 1.输入N个学生信息.\n\n");
printf(" 2.显示学生的信息.\n\n");
printf(" 3.寻找学生的信息.\n\n");
printf(" 4.修改学生的信息.\n\n");
printf(" 5.添加学生的信息.\n\n");
printf(" 6.删除学生的信息.\n\n");
printf(" 0.退出学生管理系统.\n\n");
printf(" 请选择(0-6):\n");
scanf("%d",&choice);
switch(choice)
{
case 1: save();break; /*输入模块*/
case 2: show();break; /*输出模块*/
case 3: search();break; /*查询模块*/
case 4: amend();break; /*修改模块*/
case 5: append();break; /*添加模块*/
case 6: deleted();break; /*删除模块*/
case 0: break;
default:printf("输入的数字有误.\n");
exit (0);
}
}
return 0;
}
但是在编译时出现下面错误:
zyh@zyh-ThinkPad-E420:~$ cd 桌面
zyh@zyh-ThinkPad-E420:~/桌面$ gcc xuesheng.c
xuesheng.c: 在函数‘save’中:
xuesheng.c:53:30: 错误: 在非结构或联合中请求成员‘id’
xuesheng.c:53:41: 错误: 在非结构或联合中请求成员‘name’
xuesheng.c:53:54: 错误: 在非结构或联合中请求成员‘major’
xuesheng.c:53:69: 错误: 在非结构或联合中请求成员‘score’
xuesheng.c: 在函数‘show’中:
xuesheng.c:89:47: 警告: 比较指针和整数 [默认启用]
xuesheng.c: 在函数‘select_id’中:
xuesheng.c:127:45: 警告: 比较指针和整数 [默认启用]
xuesheng.c: 在函数‘select_major’中:
xuesheng.c:169:45: 警告: 比较指针和整数 [默认启用]
xuesheng.c: 在函数‘append’中:
xuesheng.c:251:1: 警告: 格式字符串中出现无效的类型转换字符‘.’ [-Wformat]
xuesheng.c: 在函数‘amend’中:
xuesheng.c:305:45: 警告: 比较指针和整数 [默认启用]
xuesheng.c: 在函数‘deleted’中:
xuesheng.c:377:51: 警告: 比较指针和整数 [默认启用]
xuesheng.c:381:16: 错误: 在非结构或联合中请求成员‘id’
xuesheng.c:385:53: 错误: 在非结构或联合中请求成员‘id’
xuesheng.c:385:64: 错误: 在非结构或联合中请求成员‘name’
xuesheng.c:385:77: 错误: 在非结构或联合中请求成员‘major’
xuesheng.c:385:91: 错误: 在非结构或联合中请求成员‘score’
zyh@zyh-ThinkPad-E420:~/桌面$ ./a.out
hello,world!
zyh@zyh-ThinkPad-E420:~/桌面$ ^C
zyh@zyh-ThinkPad-E420:~/桌面$
这是怎么回事?该怎么解决呢?
在ubuntu下用C语言编写一个学生管理系统,编译时出错,紧急求救!!!
-
- 帖子: 4
- 注册时间: 2011-11-26 11:58
- tangboyun
- 帖子: 701
- 注册时间: 2009-07-25 1:57
- 联系:
Re: 在ubuntu下用C语言编写一个学生管理系统,编译时出错,紧急求救!!!
急急复急急,急急何其多。我生待急急,万事急急急。
自己检查student定义。
自己检查student定义。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
-
- 帖子: 3
- 注册时间: 2007-12-02 15:54
Re: 在ubuntu下用C语言编写一个学生管理系统,编译时出错,紧急求救!!!
/*
* 已经将错误改正.
* 建议 id 为字符串型, 加入检测是否惟一. 可以加入很多功能, 希望能做得更好.
* 最好是图形界面的.
* Welcome to mysite http://www.atzjg.net
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define N 2
struct stu_info{
int id; /*学号*/
char name[20]; /*姓名*/
char major[20]; /*专业*/
float score; /*分数*/
};
struct stu_info student[20];
struct stu_info *p;
struct stu_info temp;
FILE *fp;
/*输入模块*/
int save(){
if((fp=fopen("student.dat","w+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
printf("请依次输入 %d 个同学的信息:\n",N);
printf("学号\t姓名\t专业\t分数\n");
for(p=student;p<student+N;p++){
scanf(" %d %s %s %f",&(p->id),p->name,p->major,&(p->score));
fwrite(p,sizeof(struct stu_info),1,fp);
}
printf("输入结束!\n");
fclose(fp);
return 0;
}
/*输出模块*/
int show(){
if((fp=fopen("student.dat","r"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
printf("文件已经打开,现在显示所有同学的信息.\n");
p=student;
printf("学号\t姓名\t专业\t分数\n");
while(fread(p,sizeof(struct stu_info),1,fp)!=0){
printf("%d\t%s\t%s\t%f\n",p->id,p->name,p->major,p->score);
p++;
}
fclose(fp);
return 0;
}
/*建立文件模块*/
int select_id(int sid){
int flag=0;
struct stu_info temp;
if((fp=fopen("student.dat","r"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
while(fread(&temp,sizeof(struct stu_info),1,fp)!=0 && flag==0){
if(sid==temp.id){
printf("%d\t%s\t%s\t\t%.2f\n",temp.id,temp.name,temp.major,temp.score);
flag=1;
break;
}
}
if(flag==0){
printf("这里没有学号为 %d 的记录.\n", sid);
}
fclose(fp);
return 0;
}
int select_major(char smajor[]){
int flag=0;
struct stu_info temp;
if((fp=fopen("student.dat","r"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
while(fread(&temp,sizeof(struct stu_info),1,fp)!=0){
if (strcmp(smajor,temp.major)==0){
printf("%d\t%s\t%s\t%f\n",temp.id,temp.name,temp.major,temp.score);
flag=1;
}
}
if(flag==0){
printf("这里没有专业为 %s 的有关记录.\n", smajor);
}
fclose(fp);
return 0;
}
/*查询模块*/
int search(){
int k,sid;
char smajor[20];
printf("选择查询方式:\n");
printf("1.通过学生的学号查询.\n");
printf("2.通过学生的专业查询.\n");
printf("请输入1或2进行查询:\n");
scanf("%d",&k);
switch(k){
case 1: printf("请输入学号:\n");
scanf("%d",&sid);
select_id(sid);
break;
case 2: printf("请输入专业:\n");
scanf("%s",smajor);
select_major(smajor);
break;
default: printf("输入有误.\n");
exit(0);
}
return 0;
}
/*添加模块*/
int append(){
struct stu_info temp;
printf("请输入添加的学生记录信息.\n");
scanf("%d\t%s\t%s\t%f",&(temp.id),temp.name,temp.major,&(temp.score));
if((fp=fopen("student.dat","a+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
fseek(fp,sizeof(struct stu_info),1);
fwrite(&temp,sizeof(struct stu_info),1,fp);
printf("记录已经被添加.\n");
fclose(fp);
return 0;
}
/*修改模块*/
int amend(){
int flag=0;
struct stu_info temp;
int sid;
char smajor[15];
float newscore;
if((fp=fopen("student.dat","r+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
printf("请输入要修改的学生的学号:\n");
scanf("%d",&sid);
while(fread(&temp,sizeof(struct stu_info),1,fp)!=0 && flag==0)
if(sid==temp.id){
printf("原来的记录是 %d\t%s\t%s\t%.2f\n",temp.id,temp.name,temp.major,temp.score);
printf("请输入正确的专业:\n");
scanf("%s",smajor);
printf("请输入正确的分数:\n");
scanf("%f",&newscore);
strcpy(temp.major,smajor);
temp.score=newscore;
printf("现在的记录是 %d\t%s\t%s\t%.2f\n",temp.id,temp.name,temp.major,temp.score);
fseek(fp,-sizeof(struct stu_info),1);
fwrite(&temp,sizeof(struct stu_info),1,fp);
flag=1;
printf("记录已经被修改.\n");
break;
}
if(flag==0)
printf("这里没有需要添加的信息.\n");
fclose(fp);
return 0;
}
/*删除模块*/
int deleted(){
int sid;
//int del_id=0;
int i=0,j;
int number=0;
printf("请输入需要删除的学生的学号:\n");
scanf("%d",&sid);
if((fp=fopen("student.dat","r+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
p=student;
while(fread(p,sizeof(struct stu_info),1,fp)!=0){
if(sid==p->id){
printf("以下记录将被删除:\n%d\t%s\t%s\t%.2f\n",p->id,p->name,p->major,p->score);
i--;
}
i++;
number++;
}
if(i==number)
printf("这里没有需要添加的信息.\n");
else{
printf("最新的文件有 %d 记录.\n",i);
rewind(fp);
for(j=0;j<i;j++){
printf("%d\t%s\t%s\t%.2f\n",student[j].id,student[j].name,student[j].major,student[j].score);
fwrite(&student[j],sizeof(struct stu_info),1,fp);
}
printf("记录已经被删除.\n");
}
fclose(fp);
return 0;
}
/* main program */
int main(){
p=student;
int choice;
while(1){
printf(" ***************学生管理系统***************\n\n\n");
printf(" 1.输入 %d 个学生信息.\n\n", N);
printf(" 2.显示学生的信息.\n\n");
printf(" 3.寻找学生的信息.\n\n");
printf(" 4.修改学生的信息.\n\n");
printf(" 5.添加学生的信息.\n\n");
printf(" 6.删除学生的信息.\n\n");
printf(" 0.退出学生管理系统.\n\n");
printf(" 请选择(0-6):\n");
scanf("%d",&choice);
switch(choice){
case 1: save();break; /*输入模块*/
case 2: show();break; /*输出模块*/
case 3: search();break; /*查询模块*/
case 4: amend();break; /*修改模块*/
case 5: append();break; /*添加模块*/
case 6: deleted();break; /*删除模块*/
case 0: exit(0);
default:printf("输入的数字有误.\n");
}
}
return 0;
}
* 已经将错误改正.
* 建议 id 为字符串型, 加入检测是否惟一. 可以加入很多功能, 希望能做得更好.
* 最好是图形界面的.
* Welcome to mysite http://www.atzjg.net
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define N 2
struct stu_info{
int id; /*学号*/
char name[20]; /*姓名*/
char major[20]; /*专业*/
float score; /*分数*/
};
struct stu_info student[20];
struct stu_info *p;
struct stu_info temp;
FILE *fp;
/*输入模块*/
int save(){
if((fp=fopen("student.dat","w+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
printf("请依次输入 %d 个同学的信息:\n",N);
printf("学号\t姓名\t专业\t分数\n");
for(p=student;p<student+N;p++){
scanf(" %d %s %s %f",&(p->id),p->name,p->major,&(p->score));
fwrite(p,sizeof(struct stu_info),1,fp);
}
printf("输入结束!\n");
fclose(fp);
return 0;
}
/*输出模块*/
int show(){
if((fp=fopen("student.dat","r"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
printf("文件已经打开,现在显示所有同学的信息.\n");
p=student;
printf("学号\t姓名\t专业\t分数\n");
while(fread(p,sizeof(struct stu_info),1,fp)!=0){
printf("%d\t%s\t%s\t%f\n",p->id,p->name,p->major,p->score);
p++;
}
fclose(fp);
return 0;
}
/*建立文件模块*/
int select_id(int sid){
int flag=0;
struct stu_info temp;
if((fp=fopen("student.dat","r"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
while(fread(&temp,sizeof(struct stu_info),1,fp)!=0 && flag==0){
if(sid==temp.id){
printf("%d\t%s\t%s\t\t%.2f\n",temp.id,temp.name,temp.major,temp.score);
flag=1;
break;
}
}
if(flag==0){
printf("这里没有学号为 %d 的记录.\n", sid);
}
fclose(fp);
return 0;
}
int select_major(char smajor[]){
int flag=0;
struct stu_info temp;
if((fp=fopen("student.dat","r"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
while(fread(&temp,sizeof(struct stu_info),1,fp)!=0){
if (strcmp(smajor,temp.major)==0){
printf("%d\t%s\t%s\t%f\n",temp.id,temp.name,temp.major,temp.score);
flag=1;
}
}
if(flag==0){
printf("这里没有专业为 %s 的有关记录.\n", smajor);
}
fclose(fp);
return 0;
}
/*查询模块*/
int search(){
int k,sid;
char smajor[20];
printf("选择查询方式:\n");
printf("1.通过学生的学号查询.\n");
printf("2.通过学生的专业查询.\n");
printf("请输入1或2进行查询:\n");
scanf("%d",&k);
switch(k){
case 1: printf("请输入学号:\n");
scanf("%d",&sid);
select_id(sid);
break;
case 2: printf("请输入专业:\n");
scanf("%s",smajor);
select_major(smajor);
break;
default: printf("输入有误.\n");
exit(0);
}
return 0;
}
/*添加模块*/
int append(){
struct stu_info temp;
printf("请输入添加的学生记录信息.\n");
scanf("%d\t%s\t%s\t%f",&(temp.id),temp.name,temp.major,&(temp.score));
if((fp=fopen("student.dat","a+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
fseek(fp,sizeof(struct stu_info),1);
fwrite(&temp,sizeof(struct stu_info),1,fp);
printf("记录已经被添加.\n");
fclose(fp);
return 0;
}
/*修改模块*/
int amend(){
int flag=0;
struct stu_info temp;
int sid;
char smajor[15];
float newscore;
if((fp=fopen("student.dat","r+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
printf("请输入要修改的学生的学号:\n");
scanf("%d",&sid);
while(fread(&temp,sizeof(struct stu_info),1,fp)!=0 && flag==0)
if(sid==temp.id){
printf("原来的记录是 %d\t%s\t%s\t%.2f\n",temp.id,temp.name,temp.major,temp.score);
printf("请输入正确的专业:\n");
scanf("%s",smajor);
printf("请输入正确的分数:\n");
scanf("%f",&newscore);
strcpy(temp.major,smajor);
temp.score=newscore;
printf("现在的记录是 %d\t%s\t%s\t%.2f\n",temp.id,temp.name,temp.major,temp.score);
fseek(fp,-sizeof(struct stu_info),1);
fwrite(&temp,sizeof(struct stu_info),1,fp);
flag=1;
printf("记录已经被修改.\n");
break;
}
if(flag==0)
printf("这里没有需要添加的信息.\n");
fclose(fp);
return 0;
}
/*删除模块*/
int deleted(){
int sid;
//int del_id=0;
int i=0,j;
int number=0;
printf("请输入需要删除的学生的学号:\n");
scanf("%d",&sid);
if((fp=fopen("student.dat","r+"))==NULL){
printf("文件打开失败!\n");
exit(0);
}
p=student;
while(fread(p,sizeof(struct stu_info),1,fp)!=0){
if(sid==p->id){
printf("以下记录将被删除:\n%d\t%s\t%s\t%.2f\n",p->id,p->name,p->major,p->score);
i--;
}
i++;
number++;
}
if(i==number)
printf("这里没有需要添加的信息.\n");
else{
printf("最新的文件有 %d 记录.\n",i);
rewind(fp);
for(j=0;j<i;j++){
printf("%d\t%s\t%s\t%.2f\n",student[j].id,student[j].name,student[j].major,student[j].score);
fwrite(&student[j],sizeof(struct stu_info),1,fp);
}
printf("记录已经被删除.\n");
}
fclose(fp);
return 0;
}
/* main program */
int main(){
p=student;
int choice;
while(1){
printf(" ***************学生管理系统***************\n\n\n");
printf(" 1.输入 %d 个学生信息.\n\n", N);
printf(" 2.显示学生的信息.\n\n");
printf(" 3.寻找学生的信息.\n\n");
printf(" 4.修改学生的信息.\n\n");
printf(" 5.添加学生的信息.\n\n");
printf(" 6.删除学生的信息.\n\n");
printf(" 0.退出学生管理系统.\n\n");
printf(" 请选择(0-6):\n");
scanf("%d",&choice);
switch(choice){
case 1: save();break; /*输入模块*/
case 2: show();break; /*输出模块*/
case 3: search();break; /*查询模块*/
case 4: amend();break; /*修改模块*/
case 5: append();break; /*添加模块*/
case 6: deleted();break; /*删除模块*/
case 0: exit(0);
default:printf("输入的数字有误.\n");
}
}
return 0;
}