C语言学习笔记

date: 2020-04-05 10:41:14

初识C语言

2020-04-05写下这篇博客文章,后续应该有其它补充修改。今年过年爆发新冠疫情,这个假期变得无比漫长,大一下半学期不得不在家上网课,通过线上学习C语言。除了课本上的知识,我还提前通过知乎了解,购买了比较有参考意义的书籍《C Primer Plus》,学好一门计算机语言,那么就从C开始吧

一、头文件

1. #include的用法

#include 叫做文件包含命令,用来引入对应的头文件(.h文件)。#include 也是C语言预处理命令的一种。

#include 的处理过程类似于复制粘贴,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件。

#include 的用法有两种,如下所示:

#include <std**.h>
#include "my**.h"

使用尖括号< >和双引号" "的区别在于头文件的搜索路径不同:

  • 使用尖括号< >,编译器会到系统路径下查找头文件;
  • 而使用双引号" ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。

也就是说,使用双引号比使用尖括号多了一个查找路径,查找的范围更大。

2. 关于 #include 用法的注意事项:

  • 头文件中不能连续定义
  • 区分< >" "便于一眼认出头文件在系统路径还是当前路径。
  • 一个 #include 命令只能包含一个头文件,多个头文件需要多个 #include 命令。
  • 同一个头文件可以被多次引入,多次引入的效果和一次引入的效果相同,因为头文件在代码层面有防止重复引入的机制。
  • 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。如,在头文a.h中包含头文件b.h,头文件b.h又包含头文件c.h
  • 在程序设计中,有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头都去重复书写, 从而节省时间,并减少出错。

3. 头文件名称及作用

二、赋值语句

1. 最常用的简写

  • a++ 即 a=a+1
  • a- - 即 a=a-1

2. 复合赋值运算符

①在赋值符 = 之前加上其他运算符(凡是二目运算符,都可以) ,可构成复合赋值符。如:

  • a+=b 即 a=a+b
  • x * =y+8 即 x=x * (y+8)
  • x%=3 即x=x%3

如果b是包含若干项的表达式,则相当于它有括号。 如:(以下三者等价)

  • x%=y+3
  • x%=(y+3)
  • x=x%(y+3)

等号左边的操作数必须是左值

3. 赋值过程中的类型转换

  • 浮点型数据(包括单、双精度)赋给整型变量时:先对浮点数取整,即舍弃小数部分,然后赋予整型变量。
  • 整型数据赋给单、双精度变量时:数值不变,但以浮点数形式存储到变量中。
  • 将一个double型数据赋给float变量时:先将双精度数转换为单精度,即只取6~7位有效数字,存储到float变量的4个字节中。且双精度数值的大小不能超出float型变量的数值范围。
  • 将一个float型数据赋值给double变量时:数值不变,在内存中以8个字节存储,有效位数扩展到15位。
  • char型数据赋给int型变量时:将字符的ASCLL代码赋给整型变量。
  • 将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时:只将其低字节原封不动地送到被赋值的变量,即发生“截断”

4. 数据类型

  • 数据转换时还会用到ASCII码表
  • 变量类型决定占字符的大小、变量名决定数据的地址(位置)
  • 一个&取地址,两个&&逻辑与
  • 浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,在计算机中用以近似表示任意某个实数,而定点数只能表示小数点固定的数值,具体用浮点数还是定点数去表示数,要看用户赋予这个数的意义是什么。

三、选择语句

  1. if else用法详解

  2. C语言switch语句用法详解

switch后一定是整型变量或整型表达式

四、循环语句

  1. while和do while循环

  2. for的用法详解

其它

VC++的工程文件说明:

  • .dsp:是VC++的项目文件,文本格式。
  • .dsw:是工作区文件,它可以指向一个或多个.dsp文件。
  • .clw:是 ClassWizard信息文件,实际上是INI文件的格式。
  • .opt:工程关于开发环境的参数文件,如工具条位置等信息。
  • .aps:(AppStudio File),资源辅助文件,二进制格式。
  • .rc:资源文件。
  • .plg:是编译信息文件,编译时的error和warning信息文件,在Tools->Options里面有个选项可以控制这个文件的生成。
  • .hpj:(Help Project)是生成帮助文件的工程,用microsfot Help Compiler可以处理。
  • .mdp:(Microsoft DevStudio Project)是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的DSP格式。
  • .bsc:是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,可以加快编译速度。
  • .map:是执行文件的映像信息纪录文件,除非对系统底层非常熟悉,这个文件一般用不着。
  • .pch:(Pre-Compiled File)是预编译文件,可以加快编译速度,但是文件非常大。
  • .pdb:(Program Database)记录了程序有关的一些数据和调试信息,在调试的时候可能有用。
  • .exp:只有在编译DLL的时候才会生成,记录了DLL文件中的一些信息,一般也没什么用。
  • .ncb:无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件,build后会自动生成。
  • .c:源代码文件,按C语言用法编译处理。
  • .cpp:源代码文件,按C++语法编译处理。

随机数(2020-04-19 22:58:19)

最近做的作业好多都是关于随机数的,应用的地方也比较多,所以有必要专门整理一下,内容如下:

1.控制随机数产生的范围

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
	srand((unsigned)time(NULL));//初始化种子为随机值
    int i;
	for(i = 0; i < 10; ++i)
    {
		printf("%d ",rand() % 3);//[0,2]	
	} 
	printf("\n");
	for(i = 0; i < 10; ++i)
    {
		printf("%d ",rand() % 6 + 3);//[3, 8]
	}
}

2.数组元素随机打乱

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM	50  //打乱几次
#define TOTAL 13  //数组元素个数
//此处为其他语句
	int n,i,j,t;
	srand((unsigned)time(NULL));//初始化种子为随机值
	for(n=0 ; n<NUM ; n++)
	{
		i = rand() % TOTAL ;//[0,TOTAL-1]
		j = rand() % TOTAL ;//[0,TOTAL-1]
		t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
//此处为其他语句

3.在一个数组中存放不同的随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int a[13]={0};
	int i,j;
	srand((unsigned)time(NULL));  //初始化种子为随机值
	for(i=0; i<13; i++)
	{
		a[i]=rand() % 13 + 1 ;	//产生1~13的随机数
		for(j=0; j<i; j++)	    //这个for循环用来判断是否与之前的随机数重复
		{
			if(a[i]==a[j])
			{
				i--;    //这一步点睛之笔
			}
		}
	}
    for(i=0; i<13; i++)
    {
        printf("%d ",a[i]);
    }
}

4.综合运用(对一维数组中元素随机赋值、排序并折半查找)

  1. 主函数部分
#include <stdio.h>
int compare(void);
int search(void);
int a[20];  //定义全局数组(只能定义一次,但可调用多次)
int main()
{
	compare();
	search();
}
  1. 随机赋值并排序函数部分
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
extern int a[20];  //申明a[](在其他函数中已被定义,直接调用)
int compare()
{
	int i,j,t,count;
	srand((unsigned)time(NULL));  //初始化种子为随机值
	for(i=0; i<20; i++)
	{
		a[i]=rand() ;	//产生任意随机数
		for(j=0; j<i; j++)
		{
			if(a[i]==a[j])	//判断是否与之前的随机数重复
			{
				i--;
			}
		}
	}
	printf("【这20个数分别为:】\n");
	for(i=0; i<20; i++)
	{
		printf("%d  ",a[i]);
		count++;
		if(count % 5 == 0)
		{
			printf("\n");
		}
	}
	for(i=0;i<19;i++)	//进行排序
	{
		for(j=i+1;j<20;j++)
		{
			if(a[i]>a[j])
			{
				t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
		}
	}
	printf("\n【这20个数排序后分别为:】\n");  //排序后的结果输出
	for(i=0; i<20; i++)
	{
		printf("%d  ",a[i]);
		count++;
		if(count % 5 == 0)
		{
			printf("\n");
		}
	}
}
  1. 折半查找函数部分
#include <stdio.h>
extern int a[20];
int find(int A[],int n,int key)
{
 	int low=0,high=n-1,mid;
 	if(A[low]==key)
	{
  		return low;
	}
	else if(A[high]==key)
  	{
		return high;
	} 	
	else
 	{
  		while(low<=high)
  		{
   			mid=(low+high)/2;
   			if(A[mid]==key)
			{
    			return mid;	//查找成功,返回mid 
			}
   			if(key>A[mid])
			{
    			low=mid+1;  //在后半序列中查找 
			}
   			else
			{
    			high=mid-1;	//在前半序列中查找 
			}
  		}
 	}
 	return -1;  //查找失败,返回-1 
}
int search()
{
 	int i,n,addr;
 	printf("\n【输入要查找元素:】");
 	scanf("%d",&n);		//输入待查找元素(变量n)
 	addr=find(a,20,n);  //折半查找返回该元素在数组中的下标
 	if(addr!=-1)		//查找成功
	{
  		printf("%d是数组中的第%d个元素\n",n,addr+1);
	}
	else				//查找失败
	{
  		printf("a数组中无%d\n",n);
	}
 	return 0;
}

发牌程序(2020-04-29 21:39:09)

摘要:产生随机数,使每一次发的13张牌结果不同

主函数部分

/***********************************************
ProjectName		:	数组发牌
CreateDate		:	20200429
Auther			:	Ma Hao
***********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int card(int a[],int num);  //乱序生成一个花色
int main(void)
{
	int a[13]={0};	
	int group;
	printf("【以下为本次打乱的扑克牌:】\n");
	srand((unsigned)time(NULL));  //初始化种子为随机值
	for(group=1; group<=4; group++)
	{
		card(a,group);
		printf("\n");
	}
}

发牌函数部分

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int card(int a[],int num)
{
	int i,j;
	for(i=0; i<13; i++)
	{
		a[i]=rand() % 13 + 1 ;	//产生1~13的随机数
		for(j=0; j<i; j++)	//这个for循环用来判断是否与之前的随机数重复
		{
			if(a[i]==a[j])
			{
				i--;
			}
		}
	}
	switch(num)  //开始循环输出
	{
		case 1:
		{
			for(i=0; i<=12; i++)
			{
				if(a[i]>=2 && a[i]<=10)
				{
					printf("黑桃%d ",a[i]);
				}
				if(a[i]==1)
				{
					printf("黑桃A ");
				}
				if(a[i]==11)
				{
					printf("黑桃J ");
				}
				if(a[i]==12)
				{
					printf("黑桃Q ");
				}
				if(a[i]==13)
				{
					printf("黑桃K ");
				}
			}
		}break;
		case 2:
		{
			for(i=0; i<=12; i++)
			{
				if(a[i]>=2 && a[i]<=10)
				{
					printf("红桃%d ",a[i]);
				}
				if(a[i]==1)
				{
					printf("红桃A ");
				}
				if(a[i]==11)
				{
					printf("红桃J ");
				}
				if(a[i]==12)
				{
					printf("红桃Q ");
				}
				if(a[i]==13)
				{
					printf("红桃K ");
				}
			}
		}break;
		case 3:
		{
			for(i=0; i<=12; i++)
			{
				if(a[i]>=2 && a[i]<=10)
				{
					printf("梅花%d ",a[i]);
				}
				if(a[i]==1)
				{
					printf("梅花A ");
				}
				if(a[i]==11)
				{
					printf("梅花J ");
				}
				if(a[i]==12)
				{
					printf("梅花Q ");
				}
				if(a[i]==13)
				{
					printf("梅花K ");
				}
			}
		}break;
		case 4:
		{
			for(i=0; i<=12; i++)
			{
				if(a[i]>=2 && a[i]<=10)
				{
					printf("方片%d ",a[i]);
				}
				if(a[i]==1)
				{
					printf("方片A ");
				}
				if(a[i]==11)
				{
					printf("方片J ");
				}
				if(a[i]==12)
				{
					printf("方片Q ");
				}
				if(a[i]==13)
				{
					printf("方片K ");
				}
			}
		}break;
	}
}

多功能菜单(2020-05-01 22:02:54)

摘要:对输入的20个数做处理

主函数部分

/***********************************************
ProjectName		:	菜单
Discribe		:	输入20个数,排序并输出,折半查找数组中的元素
CreateDate		:	20200501
Auther			:	Ma Hao
***********************************************/
#include <stdio.h>
void Sort(int a[]);
int Binarysearch(int a[],int Key);
int main(void)
{
	int a[20],i,FindKey,FindFlag;
	printf("【请输入20个数】\n");
	for(i=0;i<20;i++)
	{
		scanf("%d",&a[i]);
	}
	printf("【输入的20个数是:】\n");
	for(i=0;i<20;i++)
	{
		printf("%d ",a[i]);
	}
	Sort(a);	//进行排序
	printf("\n【请输入想要查找的数】\n");
	scanf("%d",&FindKey);
	FindFlag = Binarysearch(a,FindKey);
	if( FindFlag >= 0 )
	{
		printf("%d已经找到,是第%d个数\n",FindKey,FindFlag+1);
	}
	else
	{
		printf("%d不存在于数组中\n",FindKey);
	}
	return 0;
}

Sort函数

#define FLAG 0	//0从小到大排序,1从大到小排序
void Sort(int a[])
{
	int i,j,temp;
	for(i=0;i<19;i++)
	{
		for(j=i;j<20;j++)
		{
			if(FLAG==0)
			{
				if(a[i]>a[j])
				{
					temp = a[i];
					a[i] = a[j];
					a[j] = temp;
				}
			}
			else if(FLAG==1)
			{
				if(a[i]<a[j])
				{
					temp = a[i];
					a[i] = a[j];
					a[j] = temp;
				}
			}
		}
	}
	if(FLAG==0)
	{
		printf("\n【从小到大排序后20个数是:】\n");
		for(i=0;i<20;i++)
		{
			printf("%d ",a[i]);
		}
	}
	else if(FLAG==1)
	{
		printf("\n【从大到小排序后20个数是:】\n");
		for(i=0;i<20;i++)
		{
			printf("%d ",a[i]);
		}
	}
}

折半查找

int Binarysearch(int a[],int Key)
{
	int low,high,mid;
	low = 0;
	high = 19;//初始化low和high为数组的两端
	while(low<=high)
	{
		mid = (low + high)/2;//查找中心点
		if(a[mid]==Key)
		{
			return mid;//已找到,返回下标值
		}
		if(a[mid]<Key)//中点位置比key值小,以mid+1为新的下限值
		{
			low = mid + 1;
		}
		if(a[mid]>Key)//中点位置比key值大,以mid-1为新的上限值
		{
			high = mid - 1;
		}
	}
	return -1;//未找到,返回-1
}

const类型限定符(2020-05-23 13:15:26)

最近学习了const类型限定符,但是发现被const修饰的变量仍然可以被改变,自己的研究结果记录如下:

被const修饰的变量一定不能改变吗?

世上没有绝对的东西,事实证明被const修饰限定的变量仍可以改变其值。

但是此时直接对变量赋新值是不行的,编译器会报错,目前发现有两种办法进行赋值:

1. 运用指针(此时会有一个警告)

2. 运用scanf函数(此时运行正常)

总结:

这也许与scanf的读取机制有关,scanf是从缓冲区读取数值,而指针或者直接修改,是在程序运行中对const变量的修改,所以会被检测到然后警告或者报错。(目前是这样理解的,以后发现不对的话再来修改)

周易算卦(2020-06-09 10:05:37)

工程名Struct Yi用于练习单向链表的增删改查(新建、删除、修改、查找)

主函数

#include <stdio.h>
#include <stdlib.h>
struct Yi {
	int No;
	char Sign[4];
	char Name[8];
	char Yao[6][30];
	char Xiang[6][30];
	char Tuan[30];
	struct Yi *next;
};

struct Yi *AddNew(void);
void  SearchSignAll(struct Yi *HeadNode);
void  DeleteByNo(struct Yi *HeadNode);
void  Modify(struct Yi *HeadNode);

int main(void)
{
	struct Yi *Head_P=NULL,*Current_P=NULL,*temp_P=NULL;
	char Menu=0;
	do
	{
		system("cls");  //clean the screen
		printf("请选择菜单:\n\tA:输入新卦\n\tB:查询卦\n");
		printf("\tC:删除卦\n\tD:修改卦\n\tE:退出\n您的选择是:");
		scanf("%c",&Menu);
		fflush(stdin);  //清空输入缓冲区的换行符,避免多次显示菜单
		switch(Menu)
		{
			case 'A':
			{
				if(Head_P==NULL)  //头结点为空,还没有成功创建新卦
				{
					Head_P = AddNew();
				}
				else  //头结点不为空,已创建过新卦,则新建的链接在之前的后面
				{
					Current_P = Head_P;
					while(Current_P->next != NULL)  //寻找尾结点
					{
						Current_P = Current_P->next;  //Current_P指针往后移
					}
					Current_P->next = AddNew();  //将新增的卦连接在尾结点
				}
				break;
			}
			case 'B':
			{
				SearchSignAll(Head_P);
				break;
			}
			case 'C':
			{
				DeleteByNo(Head_P);
				break;
			}
			case 'D':
			{
				Modify(Head_P);
			}
			default:
			{
				break;
			}
		}
	}while(Menu != 'E');
	return 0;
}

新建

#include <stdio.h>
#include <stdlib.h>
struct Yi {
	int No;
	char Sign[4];
	char Name[8];
	char Yao[6][30];
	char Xiang[6][30];
	char Tuan[30];
	struct Yi *next;
};

struct Yi *AddNew(void)
{
	int i;
	struct Yi *NewNode=NULL;
	NewNode = (struct Yi *)malloc(sizeof(struct Yi));

	printf("输入新卦卦序:\t");
	scanf("%d",&NewNode->No);
	fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
	printf("输入新卦卦象:\t");
	gets(NewNode->Sign);
	fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
	printf("输入新卦卦名:\t");
	gets(NewNode->Name);
	fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取

	for(i=0;i<6;i++)
	{
		printf("\n请输入第%d爻爻辞:\t",i+1);
		gets(NewNode->Yao[i]);
		fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
	}
	for(i=0;i<6;i++)
	{
		printf("\n请输入第%d象象辞:\t",i+1);
		gets(NewNode->Xiang[i]);
		fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
	}
	printf("\n请输入新卦彖辞:\t");
	gets(NewNode->Tuan);
	fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取

	NewNode->next = NULL;
	return NewNode;
}

查找

#include <stdio.h>
#include <stdlib.h>
struct Yi {
	int No;
	char Sign[4];
	char Name[8];
	char Yao[6][30];
	char Xiang[6][30];
	char Tuan[30];
	struct Yi *next;
};

void SearchSignAll(struct Yi *HeadNode)
{
	int i;
	struct Yi *tempNode;
	tempNode = HeadNode;
	while(tempNode != NULL)
	{
		printf("\n##【第%d卦卦象】%s\n【卦名】%s【彖辞】%s",tempNode->No,tempNode->Sign,tempNode->Name,tempNode->Tuan);
		for(i=0;i<6;i++)
		{
			printf("\n【第%d爻爻辞】%s【象辞】%s",i+1,tempNode->Yao[i],tempNode->Xiang[i]);
		}
		tempNode = tempNode->next;
	}
	getchar();
}

修改

#include <stdio.h>
#include <stdlib.h>
struct Yi {
	int No;
	char Sign[4];
	char Name[8];
	char Yao[6][30];
	char Xiang[6][30];
	char Tuan[30];
	struct Yi *next;
};

void  Modify(struct Yi *HeadNode)
{
	int i;
	struct Yi *p=NULL;
	p=HeadNode;

    if(p==NULL)
    {
        printf("链表为空。\n");
        return;  //从函数中返回,不执行以下语句
    }

    printf("请输入要修改的卦序:");
    scanf("%d",&i);

    while(p->No != i)  //循环查找要修改的节点
    {
		p=p->next;
	}
	if(p->No == i)  //找到了一个节点的num和num相等
	{
		printf("输入修改后的第%d卦卦象:\t",p->No);
		gets(p->Sign);
		fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
		printf("输入修改后的第%d卦卦名:\t",p->No);
		gets(p->Name);
		fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取

		for(i=0;i<6;i++)
		{
			printf("\n请输入修改后的第%d爻爻辞:\t",i+1);
			gets(p->Yao[i]);
			fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
		}
		for(i=0;i<6;i++)
		{
			printf("\n请输入修改后的第%d象象辞:\t",i+1);
			gets(p->Xiang[i]);
			fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
		}
		printf("\n请输入修改后的第%d卦彖辞:\t",p->No);
		gets(p->Tuan);
		fflush(stdin);  //清空输入缓冲区,确保不影响后面的数据读取
	}
    else  //没有找到要修改的节点
    {
        printf("没有找到您要修改的节点\n");
    }
}

删除

#include <stdio.h>
#include <stdlib.h>
struct Yi {
	int No;
	char Sign[4];
	char Name[8];
	char Yao[6][30];
	char Xiang[6][30];
	char Tuan[30];
	struct Yi *next;
};

void  DeleteByNo(struct Yi *HeadNode)
{
    struct Yi *pb=NULL,*pa=NULL;  //p_before和p_after
    int i=0;
	pa=HeadNode;

    if(pa==NULL)
    {
        printf("链表为空。\n");
        return;  //从函数中返回,不执行以下语句
    }

    printf("请输入要删除的卦序:");
    scanf("%d",&i);

    while(pa->No != i && pa->next!=NULL)  //循环查找要删除的节点
    {
		pb=pa;
		pa=pa->next;
	}
	if(pa->No == i)  //找到了一个节点的num和num相等
	{
		if(pa == HeadNode)  //找到的节点是头节点
		{
			HeadNode = HeadNode->next;
		}
		else  //找到的节点是普通节点
		{
			pb->next = pa->next;
		}
		free(pa);
	}
    else  //没有找到要删除的节点
    {
        printf("没有找到您要删除的节点\n");
    }
}

其中每个函数重复定义的部分可放在一个头文件中


定义一个自己的头文件

1.在vc中创建头文件

2.头文件中的代码如下

#ifndef INFO_H
#define INFO_H
//-----------------------------
#include <stdio.h>
#include <stdlib.h>
struct Yi {
	int No;
	char Sign[4];
	char Name[8];
	char Yao[6][30];
	char Xiang[6][30];
	char Tuan[30];
	struct Yi *next;
};
//-----------------------------
#endif

课程设计(2020-07-13 16:53:55)

摘要:对一个有N个学生的班级,通过该系统实现对该班级学生的基本信息进行录入、显示、修改、删除、保存等操作的管理。

班级档案管理系统

/***********************************************
ProjectName		:	班级档案管理系统 
CreateDate		:	20200630 
Auther			:	Ma Hao 
***********************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 60  //学生总人数 
#define CHECK 123  //修改信息密码(数字密码) 
#define PRINT "  %d %9s%16s%16s%16s%16s\n", i+1 ,b[i].num,b[i].name,b[i].sex,b[i].age,b[i].add
int n=0,i=0;  //n是已存入学生人数,i用来操作数组元素 

int choose;  //用来读取用户选择 
void Menu();  //菜单
void Entering();  //录入 
void Show();  //显示 
void Find();  //查询 
void Expurgate();  //删除 
void Save();  //保存 
void Modify();  //修改 
void Quit();  //退出 

typedef struct stu {   
	char num[N];
    char name[N];
	char sex[N];
    char age[N];
    char add[N];
}stu;  //定义结构体类型stu  
stu b[N];  //定义存放学生信息的结构体数组  

/*主函数*/  
void main()   
{
	void Welcome();
    Welcome();
}

void Menu() 
{
	printf("\a\t\t\t      欢迎进入兰州交通大学学生信息管理系统\n");
	printf("          ****************************菜单****************************          \n");
	printf("\t\t*[1]学生基本信息录入\n");
	printf("\t\t*[2]学生基本信息显示\n");
	printf("\t\t*[3]学生基本信息查询\n");
	printf("\t\t*[4]学生基本信息删除\n");
	printf("\t\t*[5]学生基本信息保存\n");
	printf("\t\t*[6]学生基本信息修改\n");
	printf("\t\t*[7]退出系统\n");
	printf("\n          ************************************************************            \n\n\n");
	printf("\a\n\n\n\n\t请输入您的选项:【】\b\b");
	scanf("%d",&choose);
	if (choose<1||choose>8)
	{
		printf("\a\t\t输入错误,请按回车重新输入!");
		getchar();
		getchar();
		system("cls");
		Menu();
	}
	switch(choose)
	{  
		case 1: Entering();break;
		case 2: Show();break;
		case 3: Find();break;
		case 4: Expurgate();break;
		case 5: Save();break;
		case 6: Modify();break;
		case 7: Quit();break;
	}
}

void Entering()
{
	char panduan[5];
	system("cls");
	printf("\t\t\t\t学生基本信息录入界面\n\n\n");
	printf("\n\n********************************************************************************\n");
	do
	{ 
		printf("\t请输入第%d名学生的信息\n",n+1);
		printf("\t请输入学号:");
	    scanf("%s",&b[i].num);
	    printf("\t请输入姓名:");
	    scanf("%s",&b[i].name);
		printf("\t请输入性别:");
	    scanf("%s",&b[i].sex);
	    printf("\t请输入年龄:");
	    scanf("%s",&b[i].age);
	    printf("\t请输入备注:");
	    scanf("%s",&b[i].add);
		i++;  //移动到结构数组的下一个元素 
		n++;  //学生人数加一 
	    printf("********************************************************************************");
	    printf("\a\t是否继续输入?是请按y,否请按n。【】\b\b");
		scanf("%s",panduan);
		printf("********************************************************************************");
		printf("\n\n\n");
	}while(!strcmp(panduan,"y"));     //当输入不是y的时候跳出循环
	printf("\t输入结束!\n\n\n\n\n");
	getchar();
	getchar();
	system("cls");
	Menu();
}

void Show()
{
	int m=0;
    system("cls");  //清屏 
    printf("\t\t\t\t学生基本信息显示");
    printf("\n\n********************************************************************************");
    printf("\n\t学号\t\t姓名\t\t性别\t\t年龄\t\t备注\n");
	for(i=0;i<n;i++)
	{
		printf(PRINT); 
		printf("\n");
		if(i>1&&((i+1)%10==0))  //一页显示十个  
		{
			printf("***********************************(第%d页)**************************************\n",(i+1)/10); 
			system("pause");  //dos命令,暂停程序的执行 
			system("cls");  //清屏之后再接着输出下面十个学生信息  
		} 
	}
    printf("***********************************(第%d页)**************************************\n",i/10+1);
	printf("\t\t注意:返回主菜单请按回车");
	getchar();
	getchar();
	system("cls");
	Menu();
}

void Find()
{
	int c;  //choice 
    void find1();
    void find2();
    void find3();
    void find4();
	system("cls");
	printf("\t        学生基本信息查询\n");
	printf("\n\n********************************************************************************\n");
	printf("\t    【1】按照学号进行查询\n");
	printf("\t    【2】按照年龄进行查询\n");
	printf("\t    【3】按照性别进行查询\n");
	printf("\t    【4】按照姓名进行查询\n");
	printf("\t    【5】返回主菜单\n");
	printf("\n\n\n\n\t\t请输入你的选项:【】\b\b");
	scanf("%d",&c);
	if (c<1||c>5)
	{
		printf("\t\t输入错误,请按回车重新输入!");
		getchar();
		getchar();
		system("cls");
	    Find();
	}
	system("cls");
	switch(c)
	{
		case 1: find1();break;
	    case 2: find2();break;
		case 3: find3();break;
		case 4: find4();break;
	    case 5:  Menu();break;
	}
}

void find1()
{
	char a[20];
	int c;  //choice
	int m=0;  //用来判断是否找到学生信息  
	printf("\n\t\t\t\t按照学号查询界面\n");
	printf("\n\n********************************************************************************\n");
    printf("\t请输入学号:");
    scanf("%s",&a);
    printf("********************************************************************************\n");
    printf("\n\t学号\t\t姓名\t\t性别\t\t年龄\t\t备注\n");
    for(i=0;i<n;i++)
    { 
    	if(strcmp(a,b[i].num)==0)
    	{ 
    		printf(PRINT);
    		m=1;  //若找到则让m=1  
    	} 
    } 
	if(m==0)
	{
		printf("\n\t未找到该学生信息!");
	} 
    printf("\n\n\t是否继续查询?是(请输入1),否(请输入2):");
    scanf("%d",&c);
    switch(c)
	{
		case 1: Find();break;
	 	case 2: system("cls");Menu();break;
	}
}

void find2()
{
	char a[20];
    int c;  //choice 
    int m=0;  //用来判断是否找到学生信息
    printf("\t\t\t\t按照年龄查询界面\n");
    printf("\n\n********************************************************************************\n");
    printf("\t请输入年龄:");
	scanf("%s",&a);
	printf("********************************************************************************\n");
	printf("\n\t学号\t\t姓名\t\t性别\t\t年龄\t\t备注\n");
    for(i=0;i<=n;i++)
    { 
    	if(strcmp(a,b[i].age)==0)
    	{ 
    		printf(PRINT);
    		m=1;  //若找到则让m=1 
    	} 
    } 
    if(m==0)
	{
		printf("\n\t未找到该学生信息!");
	} 
    printf("\n\n\t是否继续查询?是(请输入1),否(请输入2):");
    scanf("%d",&c);
    switch (c)
	{
		case 1: Find();break;
	    case 2: system("cls");Menu();break;
	}
}

void find3()
{
	char a[20];
	int c;  //choice 
	int m=0;  //用来判断是否找到学生信息
	printf("\n\t\t\t\t按照性别查询界面\n");
	printf("\n\n********************************************************************************\n");
    printf("\t请输入性别:");
    scanf("%s",&a);
    printf("********************************************************************************\n");
    printf("\n\t学号\t\t姓名\t\t性别\t\t年龄\t\t备注\n");
    for(i=0;i<n;i++)
    { 
    	if(strcmp(a,b[i].sex)==0)
    	{ 
    		printf(PRINT);
    		m=1;  //若找到则让m=1 
    	}  
    } 
    if(m==0)
	{
		printf("\n\t未找到该学生信息!");
	}
    printf("\n\n\t是否继续查询?是(请输入1),否(请输入2):");
    scanf("%d",&c);
    switch(c)
	{
		case 1: Find();break;
	    case 2:	system("cls");Menu();break;
	}
}

void find4()
{
	char a[20];
	int c;  //choice 
	int m=0;  //用来判断是否找到学生信息
	printf("\n\t\t\t\t按照姓名查询界面\n");
	printf("\n\n********************************************************************************\n");
    printf("\t请输入姓名:");
    scanf("%s",&a);
    printf("********************************************************************************\n");
    printf("\n\t学号\t\t姓名\t\t性别\t\t年龄\t\t备注\n");
    for(i=0;i<n;i++)
    { 
    	if(strcmp(a,b[i].name)==0)
    	{ 
    		printf(PRINT);
    		m=1;  //若找到则让m=1 
    	} 
    } 
    if(m==0)
	{
		printf("\n\t未找到该学生信息!");
	}
    printf("\n\n\t\t是否继续查询?是(请输入1),否(请输入2):");
    scanf("%d",&c);
    switch(c)
	{
		case 1: Find();break;
	    case 2:	system("cls");Menu();break;
	}
}

void Expurgate()
{   
	int j=0,m,c;
	char s[20];
	system("cls");
	printf("\t\t\t\t学生基本信息删除界面\n\n\n");
    printf("\n\n********************************************************************************\n");
    printf("\t\t请输入需要删除的姓名:");
    scanf("%s",&s);
	while(strcmp(b[j].name,s)!=0&&j<n)  //查找输入的名字所处位置  
	{ 
		j++; 
	} 
	if(j==n)  //(n+1)是已经存入的学生人数 
	{
		printf("\t学生基本信息中没有此人!\n"); 
		printf("\n\n\t\t是否继续删除?是(请输入1),否(请输入2):");
        scanf("%d",&c);
        switch(c)
		{
		    case 1: Expurgate();break;
	        case 2: system("cls");Menu();break; 
		} 
	}
	for(m=j;m<n-1;m++)
	{ 
		//把后面的信息copy给前面
		strcpy(b[m].num,b[m+1].num); 
		strcpy(b[m].name,b[m+1].name); 
		strcpy(b[m].add,b[m+1].add);
		strcpy(b[m].sex,b[m+1].sex); 
		strcpy(b[m].age,b[m+1].age); 
	} 
	i--;  //结构数组指向前一个元素 
	n--;  //已存入的学生人数相应减一 
	printf("\t\t已经成功删除!\n");
	printf("\n\n\t\t是否继续删除?是(请输入1),否(请输入2):");
    scanf("%d",&c);
    switch(c)
	{
		case 1: Expurgate();break;
    	case 2: system("cls");Menu();break; 
	} 
}

void Quit()
{
	system("cls");
	printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t谢谢使用,再见!\n\n\n\n\n\n\n\t\t\t\t\t\t");
	printf("\t请按回车键结束!\n\n\n\n\n\n\n");
}
 
void Save()           
{ 
	i=0; 
	FILE *fp;  //定义一个指向文件的指针变量fp 
	fp=fopen("Person.txt","w+");  //将fopen函数的返回值赋给指针变量fp   
	printf("\t保存到文件\n");                          
	if((fp=fopen("Person.txt","w")) == NULL)  //文件名字为"Person.txt" ,使用只写方式打开 
	{ 
		printf("\t无法打开文件\n"); 
		system("pause");  //暂停程序运行,等待用户信号 
		Menu();  //返回主菜单 
	} 
	//fprintf是向文件输出,将输入的内容输出到硬盘的文件中或是相当于文件的设备上 
	fprintf(fp,"*********************************学生基本信息***********************************\n");
	fprintf(fp,"\n\t学号\t姓名\t性别\t年龄\t备注\n");
	fprintf(fp,"--------------------------------------------------------------------------------\n");
	while(i<n)  //向文件输出已存入学生信息  
	{ 
		fprintf(fp,PRINT);  //将学生信息按指定格式输出到fp所指向的文件中  
		i++; 
	}
	fprintf(fp,"--------------------------------------------------------------------------------\n");
	fprintf(fp,"*************************************共有%d条记录*******************************\n",n); 
	fclose(fp);  //关闭文件,防止再被误用  
	printf("\t\t保存成功!\n"); 
    getchar();
	getchar();
	system("cls");
	Menu();
} 

void Modify()
{   
	int Check();
    char s[20];  
	int i=0; 
    system("cls");
    if(Check()==1)  //当密码输入正确  
    {
	    system("cls");
		printf("\t\t\t\t学生基本信息修改界面\n\n\n");
	    printf("\n\n********************************************************************************\n");
		printf("\t请输入想修改的学生基本信息的名字:\n"); 
		printf("********************************************************************************\n");
		scanf("%s",s); 
		while(strcmp(b[i].name,s)!=0&&i<n)
		{
			i++;
		}
		if(i==n) 
		{ 
			printf("\t学生基本信息没有此人!\n"); 
			getchar();
		    getchar();
		    system("cls"); 
		}  
		else
		{
			printf("\t请输入修改后姓名:");
		    scanf("%s",&b[i].name);
			printf("\t请输入修改后学号:");
		    scanf("%s",&b[i].num);
			printf("\t请输入修改后性别:");
		    scanf("%s",&b[i].sex);
		    printf("\t请输入修改后年龄:");
		    scanf("%s",&b[i].age);
		    printf("\t请输入修改后备注:");
		    scanf("%s",&b[i].add);
			printf("\t修改成功!");
			getchar();
			getchar();
			system("cls");
		}
	}
	Menu();
}

int Check()  //验证“修改界面”密码(数字密码) 
{
	int s,i=0;  //s存储输入的密码,i记录输入次数 
	printf("\n\n\t \t \t (学生基本信息修改系统)\n");
    printf("\n\n********************************************************************************\n");
	do
	{
		printf("\t\t\n请输入密码:"); 
	    scanf("%d",&s);
		i=i+1; 
		if(i>=3)break;  //输入错误三次,结束循环  
	}while(s!=CHECK);
	if(i>=3)
	{
		printf("\t\t----密码错误,退回菜单界面!----\n\a\n\n");
		getchar();  //不会一闪而过,按任意键退出。
		getchar();
		system("cls");
		Menu();
	}
	else
	{
		return 1;
	}
}

void Welcome()  //验证“登陆界面”密码(字符密码) 
{
	char s[10],t[10];  //s存储输入的密码  
	int i=0;  //i记录输入次数 
	strcpy(t,"abc123");  /***************密码在此修改****************/ 
	printf("******************************管理员入口*****************************");
	do
	{
		printf("\t\t\n请输入密码进入系统(六位数字): "); 
		fflush(stdin);  //清除缓冲区中的内容  
	    scanf("%s",s);
		i=i+1; 
		if(i>=3)break;  //输入错误三次,结束循环  
	}while(strcmp(t,s)!=0);
	if(i>=3)
	{
		printf("\n密码输入错误三次,退出程序\n");
	}
	else
	{
		system("cls");
		Menu();
	}
}

成绩管理系统

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h> 
void homepage();   //主页面函数     
void input();          //输入函数 
void display();       //输出函数 
void countMenuDisplay(); 
void duqu();
void save();
void modify();           //修改函数 
void count();            //信息统计函数          
void countmenu();    //统计显示菜单     
void sort();  //排序 
int counts=10;    //全局变量,用来记录输入了几个学生的信息 
float avg[4];     //记录每一门学科的平均成绩 
int sort_type,count_type;     //记录要选择的排序类型和查询类型 
struct stud
{
        char num[10];
        char name[10];
        float cla[4];
}student[10];
int main()
{ 
    system("color 02f");
	homepage();
}
void homepage()
{
	
	int k;
	printf("\t                                                  \n");         
	printf("\t**************************************************\n");               //输出此界面 
	printf("\t*                *               *               *\n");
	printf("\t*  1、信息录入   *  2、信息显示  *  3、信息保存  *\n");
	printf("\t*                *               *               *\n");
	printf("\t**************************************************\n");
	printf("\t*                *               *               *\n");
	printf("\t*  4、信息排序   *  5、信息修改  *  6、信息查询  *\n");
	printf("\t*                *               *               *\n");
	printf("\t**************************************************\n");
	printf("\t*                                                *\n");
	printf("\t*        7、退出程序     8、读入数据             *\n");
	printf("\t*                                                *\n");
	printf("\t**************************************************\n");
	printf("\t请输入(1-7)选择需要的功能:");                                   //提示输入 
	scanf("%d",&k);       
	system("cls");//清空当前页面 
	switch(k)//选择需要的功能 
	{
		case 1:input();break;
		case 2:display();break;
		case 3:save();break;
		case 4:countMenuDisplay();break;
		case 5: modify();break;
		case 6:countmenu();break;
		case 7:printf("欢迎再次使用!!!\n");break;
		case 8:duqu();break;
	}
}
void input()
{
	void homepage();
	int i,j;
	float sum;
	int  b; 
	for(i=0;i<10;i++)
	{
		printf("请输入学号:\n");
		scanf("%s",student[i].num);
		printf("请输入姓名:\n");
		scanf("%s",student[i].name);
		printf("请输入数学成绩:\n");
		scanf("%f",&student[i].cla[0]);
		printf("请输入语文成绩:\n");
		scanf("%f",&student[i].cla[1]);
		printf("请输入英语成绩:\n");
		scanf("%f",&student[i].cla[2]);
		printf("请输入政治成绩:\n");
		scanf("%f",&student[i].cla[3]);
		printf("是否继续输入信息?1、是,2、否:");//询问是否继续输入学生信息 
		scanf("%d",&b);
		//counts=counts+1;//记录输入了几个学生的信息 
		system("cls");//清空当前页面 
		if(b==2)//满足条件,跳出循环 
		break;
	}
	for(i=0;i<4;i++)//计算各门科目的平均值 
	{ 
        sum=0;	
	    for(j=0;j<counts;j++)
	    {
		    sum=sum+student[j].cla[i];
		
	    }
	    avg[i]=sum/counts;
	} 
	homepage();//返回主界面 
	
 } 
 void display()         //显示全部成绩
{
	int i,j;
	printf("学号\t姓名\t 数学\t 语文\t 英语\t 政治\n");
	for(i=0;i<10;i++)
	{
		printf("%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",student[i].num,student[i].name,student[i].cla[0],student[i].cla[1],student[i].cla[2],student[i].cla[3]);
	} 
	homepage();
 } 
 void countMenuDisplay()
{
	printf("\t                                  \n");                
	printf("\t**********************************\n");
	printf("\t*                *               *\n");
	printf("\t*  1、数学排序   *  2、语文排序  *\n");
	printf("\t*                *               *\n");
	printf("\t**********************************\n");
	printf("\t*                *               *\n");
	printf("\t*  3、英语排序   *  4、政治排序  *\n");
	printf("\t*                *               *\n");
	printf("\t**********************************\n");
	printf("\t*                                *\n");
	printf("\t*         5、退出此页面          *\n");
	printf("\t*                                *\n");
	printf("\t**********************************\n");
	printf("\t请输入(1-5)选择需要的功能:");
	scanf("%d",&sort_type);//输入要选择的功能 
	sort();
}
 void sort()
{
    int i,j;
	float b;
     struct student2
     {
     	char num[10];
     	char name[15];
     	float cla[4];
	 }student2[10];
	 for(i=0;i<10;i++)
	 for(j=0;j<4;j++)
	 {
	 	student2[i].cla[j]=student[i].cla[j];
	 }
	//scanf("%d",&k);
	switch(sort_type)
	{ 
	case 1:
	{
		for(i=0;i<10-1;i++)
		for(j=0;j<10-i-1;j++)
		{
			if(student2[j].cla[0]>student2[j+1].cla[0])
			{
				b=student2[j].cla[0];
				student2[j].cla[0]=student2[j+1].cla[0];
				student2[j+1].cla[0]=b;
				
			}
		}
		system("cls");
		printf("按数学成绩排序为:\n");
		for(i=0;i<counts;i++)
		printf("%f\t",student2[i].cla[0]);
		countMenuDisplay();
		break;
	} 
	case 2:
	{
		for(i=0;i<10-1;i++)//对语文成绩进行冒泡排序 
		for(j=0;j<counts-i-1;j++)
		{
			if(student2[j].cla[1]>student2[j+1].cla[1])
			{
				b=student2[j].cla[1];
				student2[j].cla[1]=student2[j+1].cla[1];
				student2[j+1].cla[1]=b;
				
			}
		}
		system("cls"); 
		printf("按语文成绩排序为:\n");
		for(i=0;i<counts;i++)
		printf("%f\t",student2[i].cla[1]);
		countMenuDisplay();
		break;
	}
	case 3:
	{
		for(i=0;i<counts-1;i++)//对英语成绩进行冒泡排序 
		for(j=0;j<counts-i-1;j++)
		{
			if(student2[j].cla[2]>student2[j+1].cla[2])
			{
				b=student2[j].cla[2];
				student2[j].cla[2]=student2[j+1].cla[2];
				student2[j+1].cla[2]=b;
				
			}
		}
		system("cls");
		printf("按英语成绩排序为:\n");
		for(i=0;i<counts;i++)
		printf("%f\t",student2[i].cla[2]);
		countMenuDisplay();
		break;
	}
	case 4:
	{
		for(i=0;i<counts-1;i++)//对政治成绩进行冒泡排序 
		for(j=0;j<counts-i-1;j++)
		{
			if(student2[j].cla[3]>student2[j+1].cla[3])
			{
				b=student2[j].cla[3];
				student2[j].cla[3]=student2[j+1].cla[3];
				student2[j+1].cla[3]=b;
				
			}
		}
		system("cls");
		printf("按政治成绩排序为:\n");
		for(i=0;i<counts;i++)
		printf("%f\t",student2[i].cla[3]);
		countMenuDisplay();
		break;
	}
	case 5:system("cls");homepage();break;
	 
    } 
 } 
 void modify()
{
	int s,i=0,a=123456,b;
	do
	{
		printf("请输入管理员密码:\n"); 
	    scanf("%d",&s);
		i=i+1; 
		if(i>=3)break;
	}while(s!=a);
	if(i>=3)
	{
		printf("密码输入错误三次,返回上一层\n");
		homepage();
	}
	do
	{
		printf("要修改第几个学生的信息?(1-%d)",counts);
		scanf("%d",&i);
		printf("请输入学号:\n");
		scanf("%s",student[i-1].num);
		printf("请输入姓名:\n");
		scanf("%s",student[i-1].name);
		printf("请输入数学成绩:\n");
		scanf("%f",&student[i-1].cla[0]);
		printf("请输入语文成绩:\n");
		scanf("%f",&student[i-1].cla[1]);
		printf("请输入英语成绩:\n");
		scanf("%f",&student[i-1].cla[2]);
		printf("请输入政治成绩:\n");
		scanf("%f",&student[i-1].cla[3]);
		printf("是否继续修改信息?1、是,2、否:");
		scanf("%d",&b);
	}while(b==1);
	homepage();

}
void countmenu()
{
	printf("\n"); 
	printf("\t***************************************\n");
	printf("\t* 1、每门课程成绩最高的学生的基本信息 *\n");
	printf("\t***************************************\n");
	printf("\t* 2、每门课程的平均成绩               *\n");
	printf("\t***************************************\n");
	printf("\t* 3、超过某门课程平均成绩的学生人数   *\n");
	printf("\t***************************************\n");
	printf("\t* 4、退出                             *\n");
	printf("\t***************************************\n"); 
	printf("\t请输入(1-4)选择需要的功能:");
	//scanf("%d",&count_type);
	count();
 } 
 void count()
{
	scanf("%d",&count_type);
	switch(count_type)
	{ 
	case 1:
	{
		int i,j,k;
		float max;
		system("cls"); 
		for(j=0;j<4;j++)
		{
			max=student[0].cla[0];
			for(i=0;i<counts;i++)
			{
				if(student[i].cla[j]>max) 
				{
					max=student[i].cla[j];
					k=i;
				}
				
			}
			switch(j)
			{
			case 0:printf("数学成绩最高的学生信息为:\n姓名:%s  学号:%s  数学:%5.2f  语文:%5.2f  英语:%5.2f  政治:%5.2f\n",student[k].name,student[k].num,student[k].cla[0],student[k].cla[1],student[k].cla[2],student[k].cla[3]);break; 
			case 1:printf("语文成绩最高的学生信息为:\n姓名:%s  学号:%s  数学:%5.2f  语文:%5.2f  英语:%5.2f  政治:%5.2f\n",student[k].name,student[k].num,student[k].cla[0],student[k].cla[1],student[k].cla[2],student[k].cla[3]);break;
			case 2:printf("英语成绩最高的学生信息为:\n姓名:%s  学号:%s  数学:%5.2f  语文:%5.2f  英语:%5.2f  政治:%5.2f\n",student[k].name,student[k].num,student[k].cla[0],student[k].cla[1],student[k].cla[2],student[k].cla[3]);break;
			case 3:printf("政治成绩最高的学生信息为:\n姓名:%s  学号:%s  数学:%5.2f  语文:%5.2f  英语:%5.2f  政治:%5.2f\n",student[k].name,student[k].num,student[k].cla[0],student[k].cla[1],student[k].cla[2],student[k].cla[3]);break;
			}
		}
		countmenu();
		break;
	}
	case 2:
	{
		int i;
		system("cls"); 
		printf("每门课程的平均成绩\n");
		printf("数学\t    语文\t    英语\t    政治\n   ");
		for(i=0;i<4;i++)
		{
			printf("%f\t",avg[i]);
		}
		countmenu();
		break;
	} 
	case 3:
	{
		int i,k,j;
		system("cls");
		printf("超过某门课程平均成绩的学生人数\n");
		printf("数学\t语文\t英语\t政治\n   ");
		for(i=0;i<4;i++)
		{
			k=0; 
			for(j=0;j<counts;j++)
			{
				if(student[j].cla[i]>avg[i])
				k=k+1;
			}
			printf("%d\t",k);
		}
		countmenu();
		break;
	}
	case 4:system("cls");homepage();break;
    } 
 } 
 void save()
{
    FILE *fp;
    int i;
    //char adr[20] = "Grade.txt";
    if((fp=fopen("grade.dat","wb")) == NULL)
    {
        printf("\n保存失败!");
        return ;
    }
    
        for(i=0;i<counts;i++)
        {
            
            //fprintf(fp,"学号:%s   姓名:%s\n数学:%f     语文:%f     英语:%f   政治:%f\n",student[i].num,student[i].name,student[i].cla[0],student[i].cla[1],student[i].cla[2],student[i].cla[3]);
            if(fwrite(&student[i],sizeof(struct stud),1,fp)!=1)
             
            printf("file write error\n");
        }
    fclose(fp);
    printf("学生信息已保存!\n");
    homepage();
} 
void duqu()
{
	FILE *fp;
	int i;
	if((fp=fopen("grade.dat","rb")) == NULL)
	{
		printf("读取失败!\n");
			exit (0);

	}

	for(i=0;i<10;i++)
	{
		fread(&student[i],sizeof(struct stud),1,fp);
		printf("学号:%s   姓名:%s\n数学:%f     语文:%f     英语:%f   政治:%f\n",student[i].num,student[i].name,student[i].cla[0],student[i].cla[1],student[i].cla[2],student[i].cla[3]);
	}
	fclose(fp);
	printf("读取成功\n");
	homepage();
}



参考资料:

posted @ 2022-02-01 13:32  Ma-Hao  阅读(75)  评论(0)    收藏  举报