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码表
- 变量类型决定占字符的大小、变量名决定数据的地址(位置)
- 一个
&取地址,两个&&逻辑与- 浮点数并不一定等于小数,定点数也并不一定就是整数。所谓浮点数就是小数点在逻辑上是不固定的,在计算机中用以近似表示任意某个实数,而定点数只能表示小数点固定的数值,具体用浮点数还是定点数去表示数,要看用户赋予这个数的意义是什么。
三、选择语句
switch后一定是整型变量或整型表达式
四、循环语句
其它
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.综合运用(对一维数组中元素随机赋值、排序并折半查找)
- 主函数部分
#include <stdio.h>
int compare(void);
int search(void);
int a[20]; //定义全局数组(只能定义一次,但可调用多次)
int main()
{
compare();
search();
}
- 随机赋值并排序函数部分
#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");
}
}
}
- 折半查找函数部分
#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();
}
参考资料:

浙公网安备 33010602011771号