C 数组元素不完整
#include <stdio.h>#include <stdlib.h>
void in();
void show();
int menu();
#define LEN sizeof(struct student)
#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf\n"
#define DATA stu.num,stu.name,stu.elec,stu.expe,stu.requ,stu.sum
struct student stu; /////////// 错误在这里出现 !!!!!!!!!!!!!!!!!!!!!!!/////////////////////////
struct student{
int num;
char name;
double elec;
double expe;
double requ;
double sum;
};
int main()
{
system("color f0\n");
int n;
menu();
scanf("%d",&n);
while(n)
{
switch(n)
{
case 1:{
in();
break;}
}
getch();
menu();
scanf("%d",&n);
}
return 0;
}
/////////////////////////in
void in()
{
int i,m=0; //m是记录的条数
char ch;
FILE * fp; //定义指针文件
if ((fp=fopen("data.txt","a+")==NULL)) //打开失败
{
printf("打开失败!\n");
return;
}
while(!feof(fp)) //非零到结尾,,,此即没到结尾
{
if(fread(&stu,LEN,1,fp)==1) //读取文件数据,,返回值为读取的项的个数
m++; //统计当前记录条数
}
fclose(fp);
if(m==0)
{
printf("文件中没有任何记录!\n");
}
else
{
show(); //显示所有的信息
}
if((fp=fopen("data.txt","w+"))==NULL)
{
printf("文件不存在!\n");
return;
}
printf("输入学生信息:\n");
scanf("%s",ch);
while(strmcp(ch,"Y")==0||strcmp(ch,"y")==0)//注意!!相同返回0,此处是若选择yes
{
printf("输入学号num:\n");
scanf("%d",&stu.num);
//此处进行判断
for (i=0;i<m;i++)
{
if(stu.num == stu.num)
{
printf("学号已经存在!按任意键继续\n");
getch();
fclose(fp);
return;
}
}
printf("name:");
scanf("%s",stu.name);
printf("elective:");
scanf("%lf",&stu.elec);
printf("experiment:");
scanf("%lf",&stu.expe);
printf("required courese:");
scanf("%lf",&stu.requ);
stu.sum = stu.elec+stu.expe+stu.requ;
if (fwrite(&stu,LEN,1,fp)!=1)
{
printf("该文件不能被保存!\n");
getch();
}
else{
printf("%s被保存\n",stu.name);
m++;
}
printf("继续?y/n:\n");
scanf("%s",ch);
}
fclose(fp);
printf("OK1\n");
}
///////////////////////////menu
int menu ()
{
system("cls");
printf("\t-------学生信息管理系统------\n");
printf("\t\t\t 1、录入学生信息\n");
printf("\t\t\t 2、查找学生信息\n");
printf("\t\t\t 3、删除学生信息\n");
printf("\t\t\t 4、修改学生信息\n");
printf("\t\t\t 5、插入学生信息\n");
printf("\t\t\t 6、排序\n");
printf("\t\t\t 7、统计学生总数\n");
printf("\t\t\t 8、显示所有学生信息\n");
printf("\t\t\t 0、退出系统\n");
printf("\t\t请选择(0-8):");
return 0;
}
////////////////////////////show
void show()
{
FILE *fp;
int i,m=0;
fp = fopen("data.txt","rb"); //rb二进制读取
while(!feof(fp)) //非零为结尾
{
if(fread(&stu,LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
printf("numbername elective experiment required sum\t\n");
for(i=0;i<m;i++)
{
printf(FORMAT,DATA);
}
}
前十行里有一个错误;
这是一个学生信息管理系统,只是有录入信息和显示信息的功能,,但是在结构体数组那里出了一点问题大约在第十行,上面标出来了。。。。
什么问题啊,搞不清楚,按照例子来的啊;;;;;;;
本帖最后由 claws0n 于 2018-8-26 19:20 编辑
#include <stdio.h>
#include <stdlib.h>
void in();
void show();
int menu();
#define LEN sizeof(struct student)
#define FORMAT "%-8d%-15s%-12.1lf%-12.1lf%-12.1lf%-12.1lf\n"
#define DATA stu.num,stu.name,stu.elec,stu.expe,stu.requ,stu.sum
//struct student stu;
struct student{
int num;
char name;
double elec;
double expe;
double requ;
double sum;
}stu;
int main()
{
system("color f0\n");
menu();
int n = 100;
while(n)
{
scanf("%d", &n);
switch(n)
{
case 1:
in();
break;
}
menu();
}
return 0;
}
/////////////////////////in
void in()
{
int i, m = 0; //m是记录的条数
char ch; // 修改
FILE * fp; //定义指针文件
if ( (fp = fopen("data.txt","a+")) == NULL ) //打开失败
{
printf("打开失败!\n");
return;
}
while(!(fp)) // 修改
{
if(fread(&stu, LEN, 1, fp) == 1) //读取文件数据,,返回值为读取的项的个数
m++; //统计当前记录条数
}
fclose(fp);
if(m==0)
{
printf("文件中没有任何记录!\n");
}
else
{
show(); //显示所有的信息
}
if((fp=fopen("data.txt","w+"))==NULL)
{
printf("文件不存在!\n");
return;
}
printf("输入学生信息(y/n):\n"); // 修改
scanf("%s", &ch); // 修改
while(ch == 'Y' || ch == 'y') // 修改
{
printf(("输入学号num:\n");
scanf("%d", &stu.num);
//此处进行判断
for(i = 0; i < m; i++)
{
if(stu.num == stu.num)
{
printf("学号已经存在!按任意键继续\n");
getchar();
fclose(fp);
return;
}
}
printf("name:");
scanf("%s", &stu.name);
printf("elective:");
scanf("%lf",&stu.elec);
printf("experiment:");
scanf("%lf",&stu.expe);
printf("required courese:");
scanf("%lf",&stu.requ);
stu.sum = stu.elec + stu.expe + stu.requ;
if (fwrite(&stu,LEN,1,fp) != 1)
{
printf("该文件不能被保存!\n");
getchar();
}
else
{
printf("%s被保存\n",stu.name);
m++;
}
printf("继续?y/n:\n");
scanf("%s", &ch); /// 修改
}
fclose(fp);
printf("OK\n");
}
///////////////////////////menu
int menu ()
{
system("cls");
printf("\t-------学生信息管理系统------\n");
printf("\t\t\t 1、录入学生信息\n");
printf("\t\t\t 2、查找学生信息\n");
printf("\t\t\t 3、删除学生信息\n");
printf("\t\t\t 4、修改学生信息\n");
printf("\t\t\t 5、插入学生信息\n");
printf("\t\t\t 6、排序\n");
printf("\t\t\t 7、统计学生总数\n");
printf("\t\t\t 8、显示所有学生信息\n");
printf("\t\t\t 0、退出系统\n");
printf("\t\t请选择(0-8):");
return 0;
}
////////////////////////////show
void show()
{
FILE *fp;
int i, m = 0;
fp = fopen("data.txt","rb"); //rb二进制读取
while(!fp) //修改
{
if(fread(&stu, LEN, 1, fp) == 1)
{
m++;
}
}
fclose(fp);
printf("numbername elective experiment required sum\t\n");
for(i = 0; i < m; i++)
{
printf(FORMAT, DATA);
}
}
具体的功能还没有,但是至少没有报错了
结构还没有定义,也还没有实例化,当然报错~
getchar() 或 get() 不是 getch()
char ch 不是 char ch // 应该说不需要
!fp 不是 !feof(fp)
scanf("%?", &?)//一些地方少了 & 符号
strcmp() 没有必要吧?单一字符,直接比较就好,要用的话要 #include <string>
请加入适当的空格{:10_250:}
不好意思,乱码了,已修改~ 我这只报了一个error,就是 struct studentstu 这一行,说是元素类型不完整。。。
这里只是要实现录入信息和显示信息两个功能,,,主要想知道struct studentstu 这一行怎么改 ;;;;;
海绵爱上星 发表于 2018-8-26 19:16
我这只报了一个error,就是 struct studentstu 这一行,说是元素类型不完整。。。
这里只是要实 ...
代码 14 - 22 claws0n 发表于 2018-8-26 18:51
具体的功能还没有,但是至少没有报错了
结构还没有定义,也还没有实例化,当然报错~
getchar() 或 get( ...
我这只报了一个error,就是 struct studentstu 这一行,说是元素类型不完整。。。
这里只是要实现录入信息和显示信息两个功能,,,主要想知道struct studentstu 这一行怎么改 ;;;;;{:5_99:} 本帖最后由 海绵爱上星 于 2018-8-26 19:37 编辑
claws0n 发表于 2018-8-26 19:22
代码 14 - 22
按照你的提示改了,可以运行了(中间有个strcmp拼错了也改过来了,只改了这两个,别的没动能运行),但是输入1之后,程序就崩溃了,这是为什么,,,文件夹多了个data.txt,但是没有输出别的提示消息。。。
海绵爱上星 发表于 2018-8-26 19:35
按照你的提示改了,可以运行了(中间有个strcmp拼错了也改过来了,只改了这两个,别的没动能运行),但 ...
1. stu 本来是数组,而你声明 struct student,所以会有问题。但是你想要的确实是结构体。
2. 我改了不少东西,见 2 楼。主要是 scanf(), getchar()
3. 后续我没有改了…… 先有结构体,才会有结构体数组好吧。!~把先后顺序搞清
struct student{
int num;
char name;
double elec;
double expe;
double requ;
double sum;
};
struct student stu; 海绵爱上星 发表于 2018-8-26 19:35
按照你的提示改了,可以运行了(中间有个strcmp拼错了也改过来了,只改了这两个,别的没动能运行),但 ...
用VS吧
不知道是哪里访问违规了 海绵爱上星 发表于 2018-8-26 19:16
我这只报了一个error,就是 struct studentstu 这一行,说是元素类型不完整。。。
这里只是要实 ...
你把这个定义到main函数中就行了,也可以写到结构体最后 1、第一种改法
struct student{
int num;
char name;
double elec;
double expe;
double requ;
double sum;
}stu;
2、第二种改法
int main(void)
{
struct student stu;
}
页:
[1]