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;
}
//要自己手动建立一个文件夹
//登录账号功能