C语言高手 进
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言高手 进相关的知识,希望对你有一定的参考价值。
废话不多说,直接问题:
比如在一个头文件rbcg121cb.h中,有如下定义:
>1:static int g121pf01();
>2:static int g121yninp();
>3:TIPcallbacks tipCallbacks[] =
>4: "g121pf01", g121pf01 ,
>5: "g121yninp", g121yninp ,
>6: 0
>7:;
其中第一行,第二行中g121pf01和g121yninp 都已经作为了函数,为什么可以像第四行第五行下面那么使用?
这个g121pf01 和g121yninp 到底是什么意思,他到底是什么类型。
还有TIPcallbacks 这个结构体应该怎么定义(第3行)
>1:typedef struct
>2: char title[100];
>3: ?;
>4: TIPcallbacks;
我试过了,如果填写 int i,
警告:initialization makes integer from pointer without a cast
如果填写 int *i
警告:initialization from incompatible pointer type
高手啊,希望帮忙,万分感谢。
>2: char title[100];
>3: int (*func)();
>4: TIPcallbacks;
说白了就是函数指针;
简单来说,比如 int add(int, int); int min(int, int);等等参数和返回值都一样的函数,你想用一个通用的方式处理,就定义一个函数指针:
int (*function)(int, int);
这样这个函数指针就可以引用到任何一个真实定义的函数:
function = &add; 或者 function = &min;
函数指针 函数指针是指向函数的指针变量。
因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为:
数据类型标志符 (指针变量名)(形参列表);
注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
注2:函数括号中的形参可有可无,视情况而定。
下面的程序说明了函数指针调用函数的方法:
例一、
#include<stdio.h>
int max(int x,int y) return(x>y?x:y);
void main()
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。
不过,在某些编译器中这是不能通过的。这个例子的补充如下。
应该是这样的:
1.定义函数指针类型:
typedef int (*fun_ptr)(int,int);
2.申明变量,赋值:
fun_ptr max_func=max;
也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。
例二、
#include<stdio.h>
void FileFunc()
printf("FileFunc\n");
void EditFunc()
printf("EditFunc\n");
void main()
void (*funcp)();
funcp=FileFunc;
(*funcp)();
funcp=EditFunc;
(*funcp)();
指针函数和函数指针的区别
1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
其定义格式如下所示:
返回类型标识符 *返回名称(形式参数表)
函数体
返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子:
#include
float *find();
main()
static float score[][4]=60,70,80,90,56,89,34,45,34,23,56,45;
float *p;
int i,m;
printf("Enter the number to be found:");
scanf("%d",&m);
printf("the score of NO.%d are:\n",m);
p=find(score,m);
for(i=0;i<4;i++)
printf("%5.2f\t",*(p+i));
float *find(float(*pionter)[4],int n)/*定义指针函数*/
float *pt;
pt=*(pionter+n);
return(pt);
学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向 score的第一行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score数组的首地址传给pointer.
2,“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。
函数指针的说明方法为:
数据类型标志符 (*指针变量名)(参数);
注1:函数括号中的参数可有可无,视情况而定。下面的程序说明了函数指针调用函数的方法:
#include
int max(int x,int y) return(x>y?x:y);
void main()
int (*ptr)();
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把 哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。
关于函数指针数组的定义
关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。
第一种,标准方法:
分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。
根据分析:首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。
第二种,蒙骗法:
尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。
函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。
那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。
完整例子:
#include "stdio.h"
int add1(int a1,int b1);
int add2(int a2,int b2);
void main()
int numa1=1,numb1=2;
int numa2=2,numb2=3;
int (*op[2])(int a,int b);
op[0]=add1;
op[1]=add2;
printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));
int add1(int a1,int b1)
return a1+b1;
int add2(int a2,int b2)
return a2+b2;
再给出常用的C变量的定义方式:
a) 一个整型数(An integer)
b) 一个指向整型数的指针(A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)
d) 一个有10个整型数的数组(An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 参考技术A 错误信息是说你在ad0832.h和C:\Program
Files\HI-TECH
Software\PICC\PRO\9.60\include\pic168xa.h
中定义的RC1冲突了。
另外,#define
ad_clk
RC2;
#define
ad_do
RC3;
#define
ad_di
RC4;
这些
define语句后面不要加分号 参考技术B #include<stdio.h>
void
main()
const
double
p=3.1415926;
double
r,a,b;
printf("请输入半径:");
scanf("%lf",&r);
a=2*p*r;
b=p*r*r;
printf("周长:%.7lf\n",a);
printf("面积:%.7lf\n",b);
参考技术C 看看这个吧
#include<stdio.h>
#include<math.h>
int
IsPrimNumber(int
Num);
int
main()
int
Num,flage;
printf("输入要判断的数:");
scanf("%d",&Num);
flage
=
IsPrimNumber(Num);
if(flage
==
1)
printf("%d是素数\n",Num);
else
printf("%d不是素数\n",Num);
return
1;
//
判断一个正整数是否是素数
int
IsPrimNumber(int
Num)
int
i,k;
//
负数不能判断
if
(Num
<0)
printf("%d
can
not
be
dicedied
prime
number!\n",Num);
return
0;
//
素数
k
=
(int)sqrt(Num);///////k为Num的平方根
for
(i=2;i<=k;i++)
if
((Num
%
i)
==0)
return
0;
if
(i
>
k)
return
1;
else
return
0;
参考技术D #
include<stdio.h>
#include
<math.h>//1未包括
头文件
math.h
sqrt需要
int
main(void)
double
a,
b,
c;
double
detal,
x1,
x2;
char
ch;//2
未定义变量
ch
do
printf("a
=");//3打印a变量的值
没有意义
scanf("%lf",
&a);
printf("b
=");//3
scanf("%lf",
&b);
printf("c
=");//3
scanf("%lf",
&c);
detal
=
b*b-4*a*c;
if
(detal
>
0)
x1
=
(-b
-
sqrt(detal))/(2*a);
x2
=
(b
-
sqrt(detal))/(2*a);
printf("有两个解:
x1
=
%fl,x2
=
%fl\n",
x1,
x2);//缺少
换行符
,不
算错
else
if
(detal
==
0)
x1
=
x2
=
(-b)/(2*a);
printf("有一个解:x1
=
x2
=
%lf\n",
x1,
x2);//缺少换行符,不算错
else
printf("无解\n");
printf("你想继续么?Y/X");
scanf("
%c",
&ch);
while('y'
==
ch
||
'Y'
==
ch);
return
0;
C语言高手进(高分悬赏)
1.酒店客房信息管理系统:
是实现对客人信息如客人编号、
身份证号、姓名、性别、房间号、入住时间、入住天数、联系电话
等实现输入、查询、修改、输出、添加等功能的系统。功能总体结构如下:
2.功能
a.输入模块(creat函数):
b.修改模块(modify函数):
以编号或身份证号等中的一个查找单个客人的信息后进行修改
c.查找模块(search函数):
以编号或身份证号等中的一个查找单个客人的信息
d.输出模块(output函数):
显示所有客人的所有信息
e.显示模块(show函数):
该模块实现制作人员相关信息的显示。
f.追加模块(add函数):
该模块可以添加新的客人信息,并且不影响以前输入的信息。
g.退出运行界面(quit):
退出整个函数运行界面,回到原程序。
3.每次实现完一个功能后都可以自动返回功能选择页面
有类似的程序也行,谢谢了。偶舍得分!
在线等,急!!!!!!!!!!!!!!!!!!!!
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student
char num[10];
char name[20];
char id[19];
float total;
float yuwen;
float shuxue;
float yingyu;
float ziran;
float zhengzhi;
;
typedef struct node
struct student data;
struct node *next;
Node,*Link;
int shoudsave;
int find;
int count=0;
void menu()
printf("*******************************************************************************\n");
printf("\t1添加学生信息\t\t\t\t\t2查询学生信息\n");
printf("\t3修改学生信息\t\t\t\t\t4保存学生信息\n");
printf("\t0退出系统\n");
printf("*****************************************************************************\n");
void printstart()
printf("---------------------------------------------\n");
void Wrong()
printf("\n=====>提示:输入有错误!\n");
void Nofind()
printf("\n=====>提示:没有找到该学生!\n");
void printc()
printf("学号\t 姓名 id 总分 语文 数学 英语 自然 政治\n");
void printe(Node *p)
printf("%-12s%s\t%s\t%5.1f %5.1f %5.1f %5.1f %5.1f %5.1f \n",p->data.num,p->data.name,p->data.id,p->data.total,p->data.yuwen,p->data.shuxue,p->data.yingyu,p->data.ziran,p->data.zhengzhi);
Node* Locate(Link abc,float low,float high ,char findmess[],char nameornum[])
Node *r;
if(strcmp(nameornum,"total")==0)
r=abc->next;
while(r!=NULL)
if(r->data.total >= low&& r->data.total <= high)
printf("\t\t\t\t查找结果 %5.1f分~%5.1f分\n",low,high);
printstart();
printc();
printe(r);
printstart();
find = 1;
return Locate(r,low,high,"null","total");
r=r->next;
else if(strcmp(nameornum,"name")==0)
r=abc->next;
while(r!=NULL)
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
else if(strcmp(nameornum,"num")==0)
r=abc->next;
while(r!=NULL)
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
return 0;
void Add(Link abc)
Node *p,*r,*s;
char num[10];
r=abc->next;
s=abc->next;
while(1)
printf("输入学号(以'0'返回上一级菜单:)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
p=(Node *)malloc(sizeof(Node));
strcpy(p->data.num,num);
printf("请你输入姓名:");
scanf("%s",p->data.name);
getchar();
printf("请你输入id:");
scanf("%s",&p->data.id);
getchar();
printf("请你输入语文:");
scanf("%f",&p->data.yuwen);
printf("请你输入数学:");
scanf("%f",&p->data.shuxue);
printf("请你输入英语:");
scanf("%f",&p->data.yingyu);
printf("请你输入自然:");
scanf("%f",&p->data.ziran);
printf("请你输入政治:");
scanf("%f",&p->data.zhengzhi);
p->data.total = p->data.yuwen + p->data.shuxue + p->data.yingyu + p->data.ziran + p->data.zhengzhi;
printf("total:%5.1f\n", p->data.total);
if(count!=0)
if(p->data.total>abc->next->data.total)
p->next = abc->next;
abc->next = p;
else
for(;r->data.total<p->data.total;r = r->next);
if(r->data.total>p->data.total)
p->next = r->next;
r->next = p;
else
abc->next = p;
p->next = r;
else
r = p;
p->next = NULL;
abc->next=r;
count ++;
shoudsave=1;
void Qur(Link abc)
int sel;
char findmess[20];
float low,high;
Node *p;
if(!abc->next)
printf("\n======>1提示:没有资料可以查询!\n");
return;
printf("\n=====>1按成绩区间查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)
printf("请输入要分数区间(用空格隔开)至少要大于420:");
scanf("%f%f",&low,&high);
if(low<420)
low=420;
find = 0;
Locate(abc,low,high,"null","total");
if(!find)Nofind();
else if(sel==2)
printf("请输入要查找的姓名:");
scanf("%s",findmess);
p=Locate(abc,0,750,findmess,"name");
if(p)
printf("\t\t\t\t查找结果\n");
printstart();
printc();
printe(p);
printstart();
else
Nofind();
else
Wrong();
void Modify(Link abc)
Node *p;
char findmess[20];
if(!abc->next)
printf("\n=====>提示:没有资料可以修改!\n");
return;
printf("请你输入要修改的学生学号:");
scanf("%s",findmess);
p=Locate(abc,0,0,findmess,"num");
if(p)
printf("请你输入新学号(原来是%s):",p->data.num);
scanf("%s",p->data.num);
printf("请你输入新姓名(原来是%s):",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请你输入新id(原来是%S):",p->data.id);
scanf("%s",p->data.id);
getchar();
printf("\n=====>提示:资料修改成功!\n");
shoudsave=1;
else
Nofind();
void Disp(Link abc)
int count=0;
Node *p;
p=abc->next;
if(!p)
printf("\n=====>提示:没有资料可以显示!\n");
return;
printf("\t\t\t\t显示结果\n");
printstart();
printc();
printf("\n");
void Save(Link abc)
FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("c:\\student","wb");
if(fp==NULL)
printf("\n=====>提示:重新打开文件时发生错误!\n");
exit(1);
p=abc->next;
while(p)
if(fwrite(p,sizeof(Node),1,fp)==1)
p=p->next;
count++;
else
flag=0;
break;
if(flag)
printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count);
shoudsave=0;
fclose(fp);
void main()
Link abc;
FILE *fp;
int sel;
char ch;
char jian;
Node *p,*r;
printf("\t\t\t\t学生成绩管理系统\n\t\t\t\t\n");
abc=(Node*)malloc(sizeof(Node));
abc->next=NULL;
r=abc;
fp=fopen("C:\\student","rb");
if(fp==NULL)
printf("\n====>提示:文件不存在,是否创建?(Y/N)\n");
scanf("%c",&jian);
fp = fopen("c:\\student","w");
count = 0;
else
printf("\n====>提示:文件已经打开,正在导入记录......\n");
while(!feof(fp))
p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp))
p->next=NULL;
r->next=p;
r=p;
count++;
fclose(fp);
printf("\n====>提示:记录导入完毕,共导入%d条记录.\n",count);
while(1)
menu();
printf("请你选择操作:");
sel = getch();//("%d",&sel);
putch(sel);
putch('\n');
if(sel=='0')
if(shoudsave==1)
getchar();
printf("\n====>提示:资料已经改动,是否将改动保存到文件中(Y/N)?\n");
scanf("%c",&ch);
if(ch=='y')Save(abc);
printf("\n====>提示:你已经推出系统!\n");
break;
switch(sel)
case '1':Add(abc);break;
// case 2:Del(abc);break;
case '2':Qur(abc);break;
case '3':Modify(abc);break;
case '4':Save(abc);break;
default:Wrong();getchar();break;
参考技术A 200分可能有人帮你弄的
/*编制一个学生成绩管理系统,每个学生信息包括:学号、姓名、C语言、高数和英语成绩。具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的成绩;
(3)按学号或姓名查询成绩;
(4)添加成绩记录;
(5)修改指定姓名或学号的学生的成绩并可存盘;
(6)显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息。以C语言成绩为例*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 20
typedef struct
char name[10];
int num;
float c;
float math;
float english;
float aver;
stu;
//菜单
void menu() /*便于操作员使用*/
/*清屏*/
system("cls");
printf(" 学生平时成绩管理\n");
printf("=======================\n");
printf(" 1.成绩录入\n");
printf(" 2.计算\n");
printf(" 3.查询\n");
printf(" 4.修改\n");
printf(" 5.插入\n");
printf(" 6.显示\n");
printf(" 7.统计\n");
printf(" 8.删除\n");
printf(" 0.退出\n");
printf("=======================\n");
printf("请选择相应的功能:");
//成绩录入
void input()
FILE *fp;
stu xs; /*定义一个结构体变量来装从文件中读出来的数据*/
if((fp=fopen("student.dat","ab"))==NULL) printf("can't open file!\n");exit(0);
printf("\n录入格式: 姓名 学号 C语言 高数 英语 当输入姓名为ps结束录入\n");
while(1) /*中间加油break,可使循环中断*/
scanf("%s",xs.name);
if(strcmp(xs.name,"ps")==0) break;/*判断姓名是否为ps,用字符串判断*/
scanf("%d%f%f%f",&xs.num,&xs.c,&xs.math,&xs.english);
xs.aver=0;/*给平均分变量赋初值*/
fwrite(&xs,sizeof(stu),1,fp); //将成绩信息写入文件
fclose(fp);
//计算平均分
void sum()
int i=0,n;
stu xs[N];
FILE *fp;
if((fp=fopen("student.dat","rb+"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))/*文件读入内存,读取指针未到文件尾时返回值为0,读到尾时返回值为1,加!取反后,结束即为0*/
fread(&xs[i],sizeof(stu),1,fp);/*读入结构体变量*/
if(feof(fp)) break;/*上面while循环那个会多读一次因为读到尾时那个0还没返回,这里判断如果以读到文件尾,则直接停止,避免重复输入*/
xs[i].aver=(xs[i].c+xs[i].math+xs[i].english)/3;
i++;
n=i;/*把i的末尾值给n,用于下面循环写入*/
i=0;
fclose(fp);
if((fp=fopen("student.dat","wb"))==NULL) printf("can't open file!\n");exit(0);
while(i<n)
fwrite(&xs[i],sizeof(stu),1,fp);
i++;
fclose(fp);
void xingming()
FILE *fp;
stu xs;
char name[10];
printf("\n输入要查学生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*按姓名查询时判断输入的姓名是否存在,会循环从数据中找取*/
printf(" 学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
if(feof(fp)) printf("查找失败!!!"); /*学生不存在*/
fclose(fp);
void xuehao()
FILE *fp;
stu xs;
int num;
printf("\n输入要查学生的学号: ");scanf("%d",&num);
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs,sizeof(stu),1,fp);
if(xs.num==num)/*按学号查询时判断输入的学号是否存在,会循环从数据中找取*/
printf(" 学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
if(feof(fp)) printf("查找失败!!!");
fclose(fp);
//查询
void search()
char ch1;
system("cls");
printf("请输入按何种方式查询:\n");
printf("1-姓名,2-学号:");
ch1=getchar();/*用字符接收*/
switch(ch1)/*判断*/
case '1':xingming();break;
case '2':xuehao();break;
getch();/*让屏幕停留同时按任意键返回*/
//修改:输入学生的姓名,查找该学生,若找到则修改该生的成绩信息,并显示修改前后的结果;
void modi()
stu xs;
FILE *fp;
char name[10];
system("cls");
printf("\n输入要查学生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*判断输入要修改的姓名是否存在*/
printf(" 修改前学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
printf("\n请输入该生的C语言成绩:");scanf("%f",&xs.c);
printf("\n高数成绩:");scanf("%f",&xs.math);
printf("\n英语成绩:");scanf("%f",&xs.english);
xs.aver=(xs.c+xs.math+xs.english)/3;
break;
if(!feof(fp))
printf(" \n 修改后的学生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
fseek(fp,sizeof(stu),1);/*负号表示后退,1表示文件当前位置*/
fwrite(&xs,sizeof(stu),1,fp);/*再写入,同时把要修改的那个覆盖掉*/
else
printf("\n学生不存在,修改失败!!");
fclose(fp);
getch();
//插入:输入学生的平时的各项成绩,插入到指定位置;当指定的位置超出范围时,将其插入到全班的最后,并显示插入成功后的结果。
void insert()
int i=0,j,k,lenth;
FILE *fp;
stu s,xs[N];
system("cls");
printf("\n请输入插入的学生的姓名:");scanf("%s",&s.name);
printf("\n学生的学号:");scanf("%d",&s.num);
printf("\n学生的C成绩:");scanf("%f",&s.c);
printf("\n高数成绩:");scanf("%f",&s.math);
printf("\n英语成绩:");scanf("%f",&s.english);
s.aver=(s.c+s.math+s.english)/3;
printf("\n插入位置:");scanf("%d",&k);
// i=0;
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs[i],sizeof(stu),1,fp);/*把数据读入到结构体数组中*/
if(feof(fp)) break;
i++;
fclose(fp);
lenth=i;
if(k<lenth && k>=0)/*k的位置要位于数组范围之内*/
//插入
for(j=lenth-1;j>=k;j--)
xs[j+1]=xs[j];/*一开始j是最大的,往后移一个这样移动避免数据被覆盖*/
/*循环是只循环这一句的*/
xs[k]=s;/*将输入的学生信息加入这个k位置*/
lenth++;/*长度+1*/
//写回
if((fp=fopen("student.dat","wb"))==NULL) printf("不能建立文件!!\n");exit(0);
for(i=0;i<lenth;i++)
fwrite(&xs[i],sizeof(stu),1,fp);
else/*不再数组范围之内*/
if((fp=fopen("student.dat","ab"))==NULL) printf("不能建立文件!!\n");exit(0);
fwrite(&s,sizeof(stu),1,fp);
fclose(fp);
//显示
void print()
FILE *fp;
stu s;
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) printf("can't open file!\n");exit(0);
printf("\n%10s %s %6s %6s %6s %6s\n","姓名","学号","C语言","高数"," 英语","平均成绩");
while(!feof(fp))
fread(&s,sizeof(stu),1,fp);//从文件中读取成绩信息
if(feof(fp)) break;//判断是否文件尾
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",s.name,s.num,s.c,s.math,s.english,s.aver);
fclose(fp);
getch();
//统计
void tongji()
int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;
FILE *fp;
stu s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指针数组*/
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) printf("cant't open file!\n");exit(0);
while(!feof(fp))
fread(&s[i++],sizeof(stu),1,fp);/*读入数据*/
if(feof(fp)) break;
t=i;i=0;
for(u=0;u<t;u++)/*以下每个指针数组用于指向各分数段的学生信息*/
if(s[i].c<60) p1[j++]=&s[i++];continue;/*每个学生信息只能位于一个分数段*/
if(s[i].c>=60&&s[i].c<80) p2[k++]=&s[i++];continue;
if(s[i].c>=80&&s[i].c<90) p3[l++]=&s[i++];continue;
if(s[i].c>=90) p4[m++]=&s[i++];continue;
printf("不及格:姓名 学号 C语言\n");
for(n=0;n<j-1;n++)
printf("%10s %6d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c);
printf("60-79:姓名 学号 C语言\n");
for(p=0;p<k;p++)
printf("%10s %6d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c);
printf("80-89:姓名 学号 C语言\n");
for(q=0;q<l;q++)
printf("%10s %6d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c);
printf("90以上:姓名 学号 C语言\n");
for(r=0;r<m;r++)
printf("%10s %6d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c);
fclose(fp);
getch();
//删除:输入学生姓名,若该学生存在,则删除,并显示删除后余下的学生成绩信息
void dele()
stu xs[N];
FILE *fp;
char name[10];
int i=0,len,k=-1/*k<0是为后面if判断用的*/;
system("cls");
printf("\n输入要删除的学生姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) printf("can't open file!\n");exit(0);
while(!feof(fp))
fread(&xs[i],sizeof(stu),1,fp);
if(feof(fp)) break;
if(strcmp(xs[i].name,name)==0) k=i;
i++;
fclose(fp);
//以下是删除后重新写文件
len=i;/*结构体数组上限*/
if(k>=0)/*k>0说明找到删除学生位置*/
if((fp=fopen("student.dat","wb+"))==NULL) printf("can't open file!\n");exit(0);
for(i=0;i<len;i++)
if(i==k) continue;/*从这个位置开始写入*/
fwrite(&xs[i],sizeof(stu),1,fp);
fclose(fp);
else printf("删除失败!!!\n");getch(); /*失败后重新返回菜单*/
print();
//菜单选择
void main()
char ch;
while(1)
menu();// 显示菜单
ch=getch();//选择菜单
if(ch=='0') break;
switch(ch)//判断功能项
case '1':input();break;
case '2':sum();break;
case '3':search();break;
case '4':modi();break;
case '5':insert();break;
case '6':print( );break;
case '7':tongji();break;
case '8':dele();break;
printf("\n欢迎使用!!!\n");
//类似的吧
以上是关于C语言高手 进的主要内容,如果未能解决你的问题,请参考以下文章