学生管理系统知识总结(附源码)

1.strcmp函数

函数声明

int strcmp(const char *str1, const char *str2)

(const char*为常量指针:说明该指针指向一个常量,指针指向的内容不可改变。增强了代码的可靠性

该函数返回值如下:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

可以用大于小于进行类比

2.strcpy函数

函数声明

char *strcpy(char *存储复制内容的目标数组, const char *要复制的字符串)
//例如:
strcpy(src, "subscribe to jiaran");

该函数返回一个指向最终的目标字符串的指针。

3.[Error] request for member 'data' in 'p', which is of pointer type 'LinkList* {aka LNode*}' (maybe you meant to use '->' ?)

例如:typedef struct Node{
int data;
struct Node *next;
}LinkList;

LinkList * p = (*LinkList)mlloc(sizeof(LinkList));//此时p是linklist*类型的指针变量,它是一个结点的地址(它的值指向一个结点)

*p是结点变量

结论:*p用.  (结点变量用这个)     p用->(指针变量用这个)

4.

结论

LinkList *L和 LinkList *&L

引用L是为了改变L的值,而L指向的是链表的头结点的地址,即要改变头结点的地址,但是一般改链都是对头结点之后的结点进行操作,所以头结点的地址一直没变,故去掉&后函数依旧可以正常执行。之所以会加&,是以防链表没有头结点的那种情况,因为可能会对第一个结点操作,那L的地址就会改变。

inkList &*L

发现LinkList &*L会报错,LinkList &*L3分开来看,LinkList &(*L3),那么就会发现,定义了一个LinkList& 型的类型,他的地址为(*L),这有问题

转载https://www.cnblogs.com/witharush/p/9784449.html

结论:函数形参里面都写成(*&L)

5.

while(!feof(FP))的含义:fe是文件夹,of是的,()里面是文件夹的名字。如果不是末尾就返回0末尾的话返回非0
但读到文件末尾时,文件指针并没有超出文件,所以会多读一次。为了防止这种问题出现,特意先扫一遍得到一个i值,让i-1并
赋值给b,这样就避免了这个问题

6.C语言中const修饰的常变量可以修改吗

#include <stdio.h>
int main()
{
   const int a=10; //若const a=10,编译器也会默认为a是int类型的
   int *P=(int*)&a; //注意需要强制&a前需要加int*类型强制类型转换
   *P=12;
   printf("a=%d\n",a);
   return 0;
}
const关键字是C语言中很重要的一个关键字,被它”修饰“的变量我们称为常变量

引用是某块内存的别名。(C语言没有引用)

7.条件编译

作用:让原程序中满足要求的部分进行编译,不满足的就不参加编译

#ifdef 标识符
        程序段1
#else
        程序段2
#endif

如果标识符已经被#define命令定义过,则对程序1进行编译,否则2。如果2为空,#else可以不要。

#ifndef 标识符
        程序段1
#else  
        程序段2
#endif

如果标识符未被#define命令定义过,则对程序1进行编译,否则2。如果2为空,#else可以不要

#if 常量表达式
            程序段1;
#else 
            程序段2;
#endif

如果常量表达式为真就执行1,不然2

8.

 9.system( “pause “);来暂停黑窗口 在编写的c++程序中,如果是窗口,有时会一闪就消失了,如果不想让其消失,在程序中添加: system(“pause”); 

10.

调用函数时不用加返回值类型,函数声明时全加上,例如void delay(unsigned int z);

11.

    system("cls");清屏

system("pause");按任意键继续

12.

getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 函数原型:int getch(void) 返回值:读取的字符

#include <stdio.h>   
#include <malloc.h> 
#include <string.h> 
#include <stdlib.h> 
#include <conio.h>
struct Score
{		
	int score_math;		
	int score_english; 
};
struct users
{
	char ac[30];
	char pw[30];
};
struct users use[50];//结构体 
typedef struct Student  
{  
   char name[100]; 		
   char num[100];  		
   char sex;			
   int age;				
   Score score;			
}stu; 
typedef struct LNode  
{  
    Student data;  
    struct LNode *next;  //
}LinkList;
//在外面把这些量都定义了一遍,方便赋值
char nam[100];//名字  
char nu[100];//学号  
char s;//性别  
int ag;//年龄  
Score sc;//成绩  
void menu();
void help();
void InitLinkList(LinkList *&L);
void readstu(LinkList *&L);
void sort(LinkList *&L);
void choose();

void menu()/* 菜单界面*/
{
	 printf("\t\t\t  ******************************************************\n\n");
	 printf("\t\t\t  *                学生信息管理系统                   * \n\n");
	 printf("\t\t\t  ******************************************************\n\n"); 
	 printf("\t\t\t*********************系统功能菜单*************************\n");
	 printf("\t\t\t     ----------------------   ----------------------  \n");
	 printf("\t\t\t     *********************************************  \n");
	 printf("\t\t\t     * 0.系统帮助及说明  * *  1.刷新学生信息   *   \n");
	 printf("\t\t\t     *********************************************  \n"); 
	 printf("\t\t\t     * 2.查询学生信息    * *  3.修改学生信息   *   \n");
	 printf("\t\t\t     *********************************************  \n");
	 printf("\t\t\t     * 4.增加学生信息    * *  5.按学号删除信息 *   \n");
	 printf("\t\t\t     *********************************************  \n");
	 printf("\t\t\t     * 6.显示当前信息    * *  7.保存当前学生信息*   \n");
	 printf("\t\t\t     ********************** **********************  \n");
	 printf("\t\t\t     * 8.退出系统        * *  9.清屏*     \n");
	 printf("\t\t\t     **********************   **********************     \n");
	 printf("\t\t\t     ----------------------   ----------------------  \n");
}

void help()/*帮助界面*/
{ 
	 printf("\n\t\t\t0.欢迎使用系统帮助!\n");
	 printf("\n\t\t\t1.初次进入系统后,请先选择增加学生信息;\n");
	 printf("\n\t\t\t2.按照菜单提示键入数字代号;\n");
	 printf("\n\t\t\t3.增加学生信息后,切记保存;\n");
	 printf("\n\t\t\t4.谢谢您的使用!\n");
}

void registeruser()//注册账号 
{
	char ac[30];
	char pw[6],pd[6];
	int	i, a = 0;

		printf("\t\t【注册帐号】\n");
	FILE *fp = fopen("账号信息档案.txt", "ab");
	printf("请输入用户账号和密码(账号、密码可以为数字,中文字母,英文字母,符号,密码必须6位)\n\n\n");
	printf("\t请你输入账号:");
	scanf("%s", &ac);
	strcpy(use[a].ac, ac);
	printf("\n\t请你输入密码:");
	for (i = 0; i<6; i++)
	{
		pw[i] = _getch();
		printf("*");
		use[a].pw[i] = pw[i];
		if (pw[i] == '\r')
		{
			printf("注册失败,请重新注册账号\n");
			return;
		}
	}
	printf("\n\n\t再次确认密码:");
	for (i = 0; i<6; i++)
	{
		pd[i] = _getch();
		printf("*");
		if (use[a].pw[i] != pd[i])
		{
			printf("\n密码不对,请重新注册账号\n");
			return;
		}
	}
	fprintf(fp, "账号\t密码\n");
	fprintf(fp, "%s\t%s\n", use[a].ac, use[a].pw);
	printf("\n注册成功!!!\n");
	fclose(fp);
	system("pause");
	system("cls");
}





void InitLinkList(LinkList *&L)//初始化链表 
{
	L = (LinkList *)malloc(sizeof(LinkList));//加了个空格 
	L->next = NULL;
	
}

void LinkListInesrt(LinkList *&L,LinkList *p)//头插法插入节点   空格 
{
	LinkList *q = NULL;
	q = L;
	p->next = q->next;
	q->next = p;
}

void addinfo(LinkList *&L) // 
{
	LinkList *q =L->next; // 
	
	printf("请输入您要添加学生的学号:");
	scanf("%s",nu);//给整个数组赋值不用加取地址符 
	while(q!=NULL)
	{
		if(0 == strcmp(nu,q->data.num))
		{
			printf("该学生的信息已经存在了"); 
			break; 
		}
		q=q->next;
	}
	if(q==NULL)
	{
		LinkList *p;//重新定义一个结点来接收数据,Q已经为NULL了 
		InitLinkList(p);  
		//
		strcpy(p->data.num,nu);  
		printf("请输入该生的高数成绩\n");
		scanf("%d",&sc.score_math);
		while(sc.score_math<0||sc.score_math>100)//用while而不用if保证了数据一定是对的 
		{
			printf("输入有误,请重新输入");
			 	scanf("%d",&sc.score_math);
		}
		p->data.score.score_math =  sc.score_math;
				printf("请输入该生的英语成绩\n");
		scanf("%d",&sc.score_english);
		while(sc.score_english<0||sc.score_english>100)//用while而不用if保证了数据一定是对的 
		{
			printf("输入有误,请重新输入");
			 	scanf("%d",&sc.score_english);
		}
		p->data.score.score_english = sc.score_english;
		printf("请输入该生的名字\n");
		scanf("%s",nam);//
		strcpy(p->data.name,nam);
		printf("请输入该生的性别,m男f女\n");
		scanf(" %c",&s);//前面必须有空格,不然会跳过性别输入,程序会把上一个回车当成字符给存起来 
		p->data.sex=s;
		printf("请输入该生的年龄\n");
		scanf("%d",&ag);
		p->data.age = ag;
		LinkListInesrt(L,p);
	}
}

void deletestu(LinkList*&L)
{
	printf("请输入要删除学生的学号");
	char num[100];
	scanf("%s",&num);
	LinkList *p,*pre;
	if(L->next = NULL) 
		{
			printf("未发现任何学生的信息!\n");
		}
	int judge = 0;
	p = L->next;
	pre = L;
	while(p)
	{
		if(0 == strcmp(num,p->data.num))
		{
			char g[100];
			pre->next = p->next;
			strcpy(g,p->data.num);
			printf("您成功删除了%s学生的信息!\n",g);
			free(p);
			judge++;
			return;
		}
		pre = p;//pre要时刻在p前面一个位置,以防p是要被删除的结点。 
		p = p->next;
	}
	if(judge == 0)
	{
		printf("未查询到该生信息!\n");
	}
}

void changestu(LinkList *&L)//修改学生信息 
{
	int judge = 0;
	int a;
	LinkList *p = L->next;	
	printf("请输入您要更改的学生学号\n");
	char num[100];
	scanf("%s",&num);
	while(p!=NULL)
	{
		if(0 == strcmp(num,p->data.num))
		{
			printf("请输入您要改变的:1.成绩2.性别。3.年龄\n"); 
			scanf("%d",&a);
			switch(a)
			{
				case(1):
					printf("请输入更改后的高数成绩\n");
					scanf("%d",sc.score_math);
					p->data.score.score_math = sc.score_math;
					printf("更改成功了!\n");
					break;
				case(2):
					printf("请输入更改后的性别\n");
					scanf("%d",&s);
					p->data.sex = s;
					printf("更改成功了!\n");
					break;
				case(3):
					printf("请输入更改后的年龄\n");
					scanf("%d",&ag);
					p->data.age = ag;
					printf("更改成功了!\n");
					break;
				default:printf("请输入有效序号!\n"); 
			}
			judge++;
		}else
		{
			p = p->next;
		}	
	}
	if(p == NULL)
	{
		printf("您还未输入任何学生信息!\n");
	}
	if(judge == 0)
	{
	printf("查无此人\n");
	}
}
void findstu(LinkList *&L)
{
	int flag;
	printf("请输入您查询的方式:\n按学号查询请输入1\n按姓名查询请输入2\n");
	scanf("%d",&flag);
	LinkList *p = L->next;//写成这个样:LinkList * p./->不出来 
	if(flag == 1)
	{
		printf("请输入您想查询的学号");
		scanf("%s",nu);//删除了函数里面定义的变量 
	//	LinkList *p = L->next;
		while(p!=NULL)
		{
			if(0 == strcmp(nu,p->data.num))
			{
			
				printf("姓名是");
				printf("%s\n",p->data.name); 
				printf("性别是\n"); 
				printf("%c",p->data.sex); 
				printf("\n高数成绩和英语成绩分别是"); 
				printf("%d和%d\n",p->data.score.score_math,p->data.score.score_english);
				printf("年龄是"); 
				printf("%d",p->data.age);
				break;//少加了break导致无限循环 
			}else
			{
				p = p->next;
			}
		}
		        	if(p==NULL)  
            	printf("该生不存在\n");  
	}else if(flag == 2)
	{
		printf("请输入您想查询的学生姓名");
		scanf("%s",nam);
	//		LinkList *p = L->next;
		while(p!=NULL)
		{
			if(0 == strcmp(nam,p->data.name))
			{
				printf("学号是\n");
				printf("%s",p->data.num); 
				printf("性别是\n"); 
				printf("%c",p->data.sex); 
				printf("高数成绩和英语成绩分别是\n"); 
				printf("%d和%d",p->data.score.score_math,p->data.score.score_english);
				printf("年龄是\n"); 
				printf("%d",p->data.age);
				break; 
			}else
			{
				p = p->next;
			}
		}
		if(p==NULL)  
            	printf("该生不存在\n");  
	 } 
}

void display(LinkList *&L)//浏览全部学生信息  
{  
    LinkList *q=L->next;  
    if(q==NULL)  
    {  
        printf("还没有学生信息,请增加学生信息\n");  
        return;  
    }  
    while(q)  
    {   
  		printf("姓名:%s\t",q->data.name);  
        printf("学号:%s\t",q->data.num);  
        printf("性别:%c\t",q->data.sex);  
        printf("年龄:%d\t",q->data.age);  
  		printf("高等数学成绩:%d\t",q->data.score.score_math); 
  		printf("大学英语成绩:%d\n",q->data.score.score_english);
  		q=q->next;  
    }  
} 

void sort(LinkList *&L)//按学号排序排序 并输出排序后的结果  
{
	LinkList *p,*q, *r = L->next;
	if(r = NULL)
	{
		printf("未查到任何学生信息!\n");
	}
	while(r)
	{
		
		p = r;
		q = r->next;
		LinkList *temp;
		InitLinkList(temp);
		while(q)
		{
			if(q->data.num<p->data.num)//应该是由大到小了, 位置不变数值变 
			{
				strcpy(temp->data.name,q->data.name);
				strcpy(temp->data.num,q->data.num);
				temp->data.sex = q->data.sex;//单个字符不用函数
				temp->data.score.score_english = q->data.score.score_english ;
				temp->data.score.score_math = q->data.score.score_english;
				temp->data.age = q->data.age;
					strcpy(q->data.name,p->data.name);
				strcpy(q->data.num,p->data.num);
				q->data.sex = p->data.sex;
				q->data.score.score_english = p->data.score.score_english ;
				q->data.score.score_math = p->data.score.score_english;
				q->data.age = p->data.age;
					strcpy(p->data.name,temp->data.name);
				strcpy(p->data.num,temp->data.num);
				p->data.sex = temp->data.sex;//单个字符不用函数
				p->data.score.score_english = temp->data.score.score_english ;
				p->data.score.score_math = temp->data.score.score_english;
				p->data.age = temp->data.age;
			}
			q = q->next;
		 }
		r = r->next;
	}
	printf("排过序之后的学生信息是\n");
	display(L);
}
void savestudata(LinkList * &L)
{
	FILE *fp;
	LinkList *p = L->next;
	fp=fopen("student1.txt","w");//分清w和wt的区别 
	if((fp=fopen("student1.txt","w"))==NULL)
        {
		printf("提示:文件未能成功打开\n");
        exit(1);//异常退出 
    	}
	while(p)
	{
		fprintf(fp,"%d  %s  %s  %d  %d  %c  \n",p->data.age,p->data.name,p->data.num,p->data.score.score_english,p->data.score.score_math,p->data.sex);
		p = p->next;
	}
	printf("保存成功\n"); 
	 fclose(fp);  	
}

void readstu(LinkList *&L)
{
	FILE *fp;
	fp = fopen("student1.txt","r");
	if(fp == NULL)
	{
		printf("文件不存在\n");
		exit(0);//终止程序 	
	}
	int i = 0;
	while(!feof(fp))
	{
		char nu[100];
		char nam[100];
		char s;
		int ag;
		Score sc;
		fscanf(fp,"%d  %s  %s  %d  %d  %c  \n",&ag,nam,nu,&sc.score_english,&sc.score_math,&s);//& 
		i++;
	}
	fclose(fp);
	FILE *FP;
	FP = fopen("student1.txt","r");
	if(FP == NULL)
	{
		printf("文件不存在\n");
		exit(0); 
	}
	int b = i-1;
	int j=1;
	while(!feof(FP))
	{
		fscanf(FP,"%d  %s  %s  %d  %d  %c  \n",&ag,nam,nu,&sc.score_english,&sc.score_math,&s);// name nu不用加& 
		LinkList *n = (LinkList *)malloc(sizeof(LinkList));
		strcpy(n->data.name,nam);
		strcpy(n->data.num,nu);
		n->data.age = ag;
		n->data.score.score_english = sc.score_english;
		n->data.score.score_math = sc.score_math;
		LinkListInesrt(L,n);
		n = n->next;//
		if(j==b)
		{
			break;
		}
		j++;
	}
	fclose(FP);
}
/*	while(!feof(FP))的含义:fe是文件夹,of是的,()里面是文件夹的名字。如果不是末尾就返回0末尾的话返回非0
但读到文件末尾时,文件指针并没有超出文件,所以会多读一次。为了防止这种问题出现,特意先扫一遍得到一个i值,让i-1并
赋值给b,这样就避免了这个问题*/ 






void login(LinkList*&L)
{
	char ac[30];
	char ad[20], pw;
	int	i, j, a = 0;
	int	flag = 0;

		printf("--------【登录账号】--------\n");
	for (i = 0; i<3; i++)
	{
		printf("请输入帐号:");
		scanf("%s", &ac);
		printf("请输入密码:");
		for (j = 0; j<6; j++)
		{
			pw = _getch();
			printf("*");
			ad[j] = pw;
		}
		FILE *fp;
		fp = fopen("账号信息档案.txt", "r");//读取文件操作
		while (!feof(fp))
		{
			fscanf(fp, "%s %sn", &use[a].ac, &use[a].pw);
			if ((strcmp(ac, use[a].ac) == 0) && (strcmp(ad, use[a].pw) == 0))
			{
				flag = 1;
				fclose(fp);
				break;
			}
			a++;
		}

		if (flag == 1)
		{
			printf("\n登录成功!");
			printf("按任意键进入学生信息管理系统!\n");
			system("pause");
			system("cls");
		while (1)
			{
				menu();
				printf("请输入您的选择:\n"); 
		int choose;
        scanf("%d",&choose);  
        switch(choose)  
        {  
        case 0://系统帮助及说明
   			help();
   			break; 
        case 1://刷新信息(按学号排序)
   			sort(L);
   			break;
  		case 2: //查询学生信息
            findstu(L);  
            break;  
        case 3://修改学生信息  
   			changestu(L); 
            break; 
  		case 4://增加学生信息  
            addinfo(L); 
            break; 
 		case 5://删除学生信息  
            deletestu(L);  
            break;  
        case 6://输出所有学生的信息  
            display(L);  
            break; 
        case 7://保存学生信息到文件   
            savestudata(L);  
            break;
  		case 8://退出  
            printf("谢谢使用!");  
            exit(0);  
		case 9: 
			system("cls");//清屏  
			break;
        default:  
            printf("请输入正确的选择\n");  
            break;  
        }  
	
			}
		}
		else {
			printf("\n账号或者密码输入错误,你还有%d次机会,请重新输入:\n", 2 - i);
		}
	}
	if (i == 3)
	{
		printf("登录失败\n");
		return;
	}

}

int main()  
{       
	LinkList *L;  
	InitLinkList(L);  
	readstu (L); 
  //运行前把文件内容读取到电脑   
	int se;
	printf("********************************************\n");
	printf("**********学生信息管理系统登录界面**********\n");
	printf("********************************************\n\n");
	printf("\t\t1.-登录账号-\n");
	printf("\t\t2.-注册账号-\n");
	printf("\t\t3.-退出界面-\n\n");
	printf("******************欢迎使用******************\n");
	printf("请选择:");
	scanf("%d", &se);
	switch (se)
	{
	case 1:
		login(L);
		break;
	case 2:
		registeruser();
		break;
	case 3:
		printf("\n\t\t【成功退出】\n");
		exit(0);
		system("pause");
		break;
	default:
		printf("\n没有这个选项,请重新选择!\n");
		break;
	}
		system("pause");
		system("cls");
 	return 0;
}  

//要自己手动建立一个文件夹 
//登录账号功能 





Guess you like

Origin blog.csdn.net/qq_61551764/article/details/121404989