C言語のカリキュラムのデザインテンプレート

まず、自作の設計フレームワークを見てみましょう。
ここに画像を挿入説明

私は個人的に設計、C言語情報管理システムは、基本的なフレームワークが上回っていると感じ
例:
1、学生情報管理システム
2、ホテル管理システム
3、電車発券管理システム
4、スタッフの情報管理システム
5、図書館情報管理システム
全体を見てはるかに容易になるように、そのようなシステムでは、ディスクからデータを思い付くこと以外の何物でも、データを操作した後、再びそれについて示しておらず、ディスクに書き込まれ、
上記のシステムと同様に、次のテンプレート自体を適用することができます使用を変更

前記メイン問題:
1、構造体の配列、鎖構造
2、標準的なファイルI / O操作
3、当プログラミング

コードに次へ:

//编译环境:Dev c++编译器 (不同的编译器可能有细微的差别,可自行改动调试) 
//编译语言:C
//数据结构:结构体、单链表
//可以套用大多数的信息管理系统

//框架与设计介绍:

//1、登录模块
//2、功能子模块
//3、主菜单调用 

//其中可扩展部分在框内自行添加,无需改动的会标注 

#include<stdio.h>
struct Information
{
	char name[20];	//姓名
	char number[20];//编号
	int age;		//年龄
	//**自行添加**
	struct Information *next;//连接下一个节点
};
const unsigned char allchar[63] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生字符串使用 
char Str[10];//随机产生字符串使用 


/////////////////////////////////////////  1、登陆模块  ////////////////////////////////////////// 
void Verification()		//随机产生字符串
{
	int i=6;
	srand((unsigned int)time(NULL));
	while(i--)
	{
		Str[5-i]=allchar[rand()%62];
	}
	Str[5]='\0';
}
  

void Validation(char account[],char password[])	//函数用于验证账号密码的正确性
{
	char s_account[20],s_password[20],s_verification[10];
	while(1){	
	printf("请输入账户:");
	scanf("%s",&s_account);
	printf("请输入密码:"); 
	scanf("%s",&s_password);
	Verification();							//调用函数产生验证码 
	printf("请输入验证码(%s):",Str);
	scanf("%s",&s_verification);
	if((strcmp(s_account,account)==NULL)&&(strcmp(s_password,password)==NULL))	//如果账户和密码正确
	{
		if((strcmp(Str,s_verification)==NULL))
		{
			printf("登陆成功!\n");
			break;
		}
		printf("验证码错误!\n");
		Sleep(2000);
		system("cls"); 
		continue; 
	}
	printf("账户或密码验证失败!\n");
	Sleep(2000);
	system("cls"); 
	}
}
void Landing()		//函数用于从磁盘中读取账户和密码数据,并且传递给 Validation函数进行验证 
{
	//打开Landing.txt文件,读取账户和密码信息
	char account[20];	//账号
	char password[20];	//密码
	char Verification[10];	//验证码
	 
	FILE *fp;
	if((fp=fopen("Landing.txt","r"))==NULL)
	{
		printf("Landing.txt文件打开失败!\n");
		exit(0);
	}
	fscanf(fp,"账号: %s 密码: %s\n",&account,&password);
	fclose(fp);
	Validation(account,password);	//把磁盘中的账户和密码传入验证函数
}


////////////////////////////////////  2、功能子模块   //////////////////////////////////////// 

//**自行添加别的函数模块**

struct Information * Initialize(struct Information *head)	//调用函数进行初始化(从磁盘文件中读取信息)
{
	FILE *fp;
	struct Information *p,*q;		//head指向链表头,q和q来进行尾插法 
	p=q=NULL;
	if((fp=fopen("data.txt","r"))==NULL)//判断文件是否正确打开 
	{
		printf("file open fail !\n");
		exit(0);
	}
	if(fgetc(fp)==EOF)		//判断文件是否为空 
	{
		printf("磁盘文件为空!\n");
		return(head);
	}
	rewind(fp);			//由于上面fgetc使文件位置指针移动,让其还原 
	head=q=p=(struct Information *)malloc(sizeof(struct Information));	//分配空间 
	
	//**fscanf按照结构体自行修改,不懂格式看链接:https://blog.csdn.net/qq_42856154/article/details/93225821 掌握文件I/O操作**
	fscanf(fp,"姓名:%s 编号:%s 年龄:%d\n",p->name,p->number,&p->age);		//已经判断文件有数据,读取第一个数据,作为头节点 
	
	while(!feof(fp))	//feof(fp):当返回值为1时,文件到达尾部当返回值为0时,文件未到达尾部  
	{
		p=(struct Information *)malloc(sizeof(struct Information));
		
		//**fscanf按照结构体自行修改
		fscanf(fp,"姓名: %s 编号:%s 年龄: %d\n",p->name,p->number,&p->age);	//格式读取信息,一次一行 
		q->next=p;
		q=p;
	}
	p->next=NULL;		//尾节点next域赋值为NULL 
	p=q=NULL;			//指针指向为NULL 
	fclose(fp);			
	return(head);		//返回链表的头指针 
}




struct Information * Increase(struct Information *head)		//增加节点(在链表尾增加) 
{
	struct Information *p,*q;
	q=head;
	
	p=(struct Information *)malloc(sizeof(struct Information));
	
	//**按照自己定义的结构体自行修改 
	printf("请输入姓名:");
	scanf("%s",p->name);
	printf("请输入编号:");
	scanf("%s",p->number);
	printf("请输入年龄:");
	scanf("%d",&p->age);
	
	p->next=NULL;
	if(head==NULL)		//当头节点不存在时,把创建的节点直接当作头节点 
	{
		head=p;
	}
	else
	{
		while(q->next!=NULL)
			q=q->next;
		q->next=p;
	}
	q=p=NULL;
	printf("增加成功!\n");
	return head;
}

struct Information * Delete(struct Information *head)		//删除节点 (按编号删除)
{
	int i=0;
	char num[20];
	struct Information *p,*q;
	p=q=head;
	printf("请输入要删除的编号:");
	scanf("%s",num);
	while(q!=NULL)
	{
		if(i>1)p=p->next;
		i++;
		if((strcmp(num,q->number)==NULL))
		{
			printf("已经找到是第 %d 个节点\n",i);
			goto delete;
		}
		q=q->next;
	}
	printf("该编号信息不存在!\n");
	return head;
	
delete:
	if(i==1)			//删除头节点 
	{
		head=q->next;
		printf("头节点删除成功!\n");
		return head;
	}
	if(q->next==NULL)	//删除尾节点 
	{
		p->next=NULL;
		p=q=NULL;
		return head;
	}
	p->next=q->next;	//删除中间节点  
	free(q);
	q=NULL;
	printf("删除成功!\n"); 
	return head;
}

int Find(struct Information *head)		//查找节点信息 (按编号查找)
{
	int i=0;
	char num[20];
	printf("请输入要查找的编号:");
	scanf("%s",num);
	while(head!=NULL)
	{
		i++;
		if((strcmp(num,head->number)==NULL))
		{
			printf("已经找到在: %d 个节点\n",i);
			
			//**printf按照结构体自行修改
			printf("姓名: %s 编号:%s 年龄: %d\n",head->name,head->number,head->age);
			return 0;
		}
		head=head->next;
	}
	printf("该编号信息不存在!\n");
	return 0;
}

int Change(struct Information *head)		//修改节点信息 (按编号修改)
{
	//该函数可以做成(按照名称、学好、编号查找,本例为编号查找),可以自行修改 
	char num[20];
	printf("请输入要修改的编号:");
	scanf("%s",num);
	while(head!=NULL)
	{
		if((strcmp(num,head->number)==NULL))
		{
			printf("姓名: %s 编号:%s 年龄: %d\n",head->name,head->number,head->age);
			printf("请输入除编号外的其它信息\n\n");
			printf("请输入姓名:");
			scanf("%s",head->name);
			printf("请输入年龄:");
			scanf("%d",&head->age);
			printf("姓名: %s 编号:%s 年龄: %d\n",head->name,head->number,head->age);
			printf("\n修改成功!\n");
			return 0;
		}
		head=head->next;
	}
	printf("该编号信息不存在!\n");
	return 0;
}

int Print_list(struct Information *head)	//打印链表数据 
{
	if(head==NULL)
	{
		printf("链表为空!\n");
		return 0;
	}
	while(head!=NULL)		//当头指针不为NULL,表示头节点有数据 
	{
		
		//**printf按照结构体自行修改
		printf("姓名: %s 编号:%s 年龄: %d\n",head->name,head->number,head->age);
		head=head->next;
	}
	return 0;
}


void Save(struct Information *head)
{
	FILE *fp;
	if((fp=fopen("data.txt","w"))==NULL)//判断文件是否正确打开 
	{
		printf("file open fail !\n");
		exit(0);
	}
	while(head!=NULL)
	{
		
		//**fprintf按照结构体自行修改
		fprintf(fp,"姓名: %s 编号:%s 年龄: %d\n",head->name,head->number,head->age);
		head=head->next;
	}
	printf("保存磁盘成功!\n");
	fclose(fp);
}


///////////////////////////////////     3、主菜单调用     ///////////////////////////////////////////
void Menu()
{
	Sleep(2000);
	system("cls");
	
	//**按照函数功能自行修改菜单目录
	 
	printf("\t\t\t*****功能主菜单*****\n\n\n");
	printf("\t\t*** 增加节点 ***\t\t--1\n");
	printf("\t\t*** 删除节点 ***\t\t--2\n");
	printf("\t\t*** 修改节点 ***\t\t--3\n");
	printf("\t\t*** 查询节点 ***\t\t--4\n");
	printf("\t\t*** 打印链表 ***\t\t--5\n");
	printf("\t\t*** 保存磁盘 ***\t\t--6\n");
	printf("\t\t*** 退出系统 ***\t\t--7\n");
} 


int main()
{
	//main函数内可能变化较大,所以根据自己的喜好进行排布代码 
	
	int flag = 1;
	int n;
	struct Information *Head = NULL;	//头指针(头指针为空,只是用来指向头节点)
	Landing();			//1、登陆模块调用,使用默认的账户和密码进行验证(**登陆**) 
	Head = Initialize(Head);	//2、调用函数进行初始化(**从磁盘文件中读取信息恢复链表**)
	
	while(flag)
	{
		Menu();
		printf("请选择:");
		scanf("%d",&n);
		switch(n)
		{
			case 1:Head = Increase(Head);break;
			case 2:Head = Delete(Head);break;
			case 3:Change(Head);break;
			case 4:Find(Head);break;
			case 5:Print_list(Head);break;
			case 6:Save(Head);break;
			case 7:flag = 0;break;
			default:printf("输入错误!\n");	
		}
	} 
	return 0;
}

全体のコードは長くはありませんが、基本的な機能は完璧ですが、厳格なテストデータBUGがあるでしょうが、学習が可能であるとして、

行われ、これらの手順のいくつかは、最大の感覚は)、:(最初の植樹で枝をトリミングし、造園の葉を行きます

OK
:コードは、一般的に導入される
1、言語:C言語
2、データ構造:構造リスト全体のコードのコアとして
動作フォーマットされたテキストファイルの書き込みと読み取り:3、ファイル操作を
パスワード認証ランダム+:モジュール着陸、4符号
5は、機能サブモジュール:

  • ノードを追加します。
  • ノードを削除します。
  • ノードを変更します。
  • クエリノード
  • 初期データは、ディスクの初期化リストから読み込まれます
  • ディスクにリスト全体を保存します(追加ではない、直接ファイルを上書き)
  • リスト全体を印刷

(2つのTXT形式は、プロジェクトディレクトリのファイル、data.txtをとLanding.txtの下にあります)
data.txtを:リンクリストデータ保存
Landing.txt:ログインIDとパスワードのデータを保存し
、プロジェクトディレクトリに2つのtxtファイルを確立することをデータ.txtのデータが存在しないかもしれませんが、存在し、それはこの形式でなければなりません、画像の内容を保存してくださいLanding.txt

ここに画像を挿入説明

推奨事項:
1、モジュール、サブユーザーアカウントと管理者アカウントを着陸、パーミッションは操作機能の機能は、全体のプロセス強化することができたときにセット
2を、サブモジュールは、いくつかの統計クラスモジュールを追加することができます
3、デザインの主な機能を、それがあるべきコードはコンパクト明瞭に見えるので、この1を制御呼び出すコールのための継続的な改善は、最終的な業績と経験を決定します

彼は、自分の変更を追加し、あなたが利用したい場合は、(コメント)と結合された特定のレースを、実行することをお勧めします、と言った
チキンスープを添付して、最後に:この練習は不可欠の意志であることを知っている必要があります

どのようなご質問、コメント欄にメッセージを残してください

おすすめ

転載: blog.csdn.net/qq_42856154/article/details/93376716