永发信息网

C语言 菜单编程的问题

答案:2  悬赏:70  手机版
解决时间 2021-03-23 13:30
  • 提问者网友:战魂
  • 2021-03-23 09:13
C语言 菜单编程的问题
最佳答案
  • 五星知识达人网友:躲不过心动
  • 2021-03-23 09:19
这是一个指针函数的运用。
typedef void (*TPtr)(void* arg); 这一句是表示声明一个返回值为void、函数指针变量名为TPtr、参数表为void型的指针arg。在typedef以下说明可以用TPtr来定义这样一种指针函数。

TPtr SelectedItem;这一句是表示声明一个void (*TPtr)(void* arg);类型的指针函数,该函数的指针变量名为SelectedItem。(该语句放在外面的作用是声明)

typedef struct _TPage
{
……
TPtr SelectedItem;
……
} TPage;
表示在结构体里面声明一个指针变量函数。(我看他这样麻烦,如果不是编写内核程序,那么他用的编译器应该是比较原始的,因为VC6.0可以直接在结构体中定义函数,细节部分都可以交由编译器)

TPage gActivePage;表示定义一个struct _TPage类型的结构体,结构体名称为gActivePage。

gActivePage.SelectedItem(&gActivePage);表示调用该结构体的指针函数SelectedItem,传入参数gActivePage。
(在这里我要说一句,你定义一个结构体的话,你必须对他进行初始化~下面是我觉得比较方便的初始化方法:memset(&gActivePage,0,sizeof(TPage));)

那么最后我必须在告诉楼主一件事,定义的指针函数,必须对他赋值gActivePage.SelectedItem=。
如果你的这段程序里面没有赋值部分,~恩,我只能说他写错了,并且无法编译过去(要不就是你没有贴出来~)追问gActivePage.SelectedItem(&gActivePage);表示调用该结构体的指针函数SelectedItem,传入参数gActivePage。
也就是说 有个结构体里面有个指针函数 它的参数是它所在的结构体??好混乱@@追答你可以这样理解,这是一个递归调用,我觉得里面应该有一个结束条件,你代码不多,我只能猜测到这里。
全部回答
  • 1楼网友:琴狂剑也妄
  • 2021-03-23 10:33
先说下错误。
读取,文件是用a+方式打开,这读取数据,因为文件指针在最末的关系,读取出来的数据是空的,所以n永远为0。
其次,在写数据前,没有fclose文件就再fopen一次,这是正确的文件操作方式?
最后,老实说,看你的代码头很痛,不是说代码很难,而是这个格式实在太难看,很多时候,一看到这种混乱的代码,直接看都不看就关掉的。在诸多IDE的今天,写一段格式整齐的代码很难么,不要跟我说你是用windows记事本写代码的。
最最后,下面是整理并修改正确的代码:
#include
#include
#include
#ifndef MAX_NUM
#define MAX_NUM 100
#endif
typedef struct student
{
char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
}stu;
void main()
{
stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n) ;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)
{
if(strcmp(a[k].num,a[n].num) == 0)
{
printf("该学生已经存在,请重新输入");
break;
}
}
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)
{
printf("open file error!\n");
exit(0);
}
fseek(fp, 0, SEEK_SET);
for(i = 0; i <= n; i++)
fwrite(&a[i], 1, sizeof(a[0]), fp);
fclose(fp);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯