c語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)詳解
該學(xué)生管理系統(tǒng)的實(shí)現(xiàn)是通過(guò)分文件的方式來(lái)寫的,infor.h
文件為頭文件,源文件infor.c實(shí)現(xiàn)源文件test.c中封裝函數(shù),建議
讀者在做較大的系統(tǒng)是分文件來(lái)實(shí)現(xiàn),可以提高代碼的運(yùn)行效率。
(該學(xué)生管理系統(tǒng)由b站鵬哥c語(yǔ)言通訊錄視頻改進(jìn)而來(lái))
infor.h
//頭文件 實(shí)現(xiàn)引用函數(shù)頭文件,定義常量,以及源文件中封裝函數(shù)的聲明
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <windows.h>
#define MAX_NAME 20 //都用define定義 為了后期的可改性
#define MAX_SEX 10
#define MAX_TELE 15
#define MAX_ADDR 30
#define begin 3 //初始開辟動(dòng)態(tài)內(nèi)存容量
#define add 2 //每次容滿后增容數(shù)量
//#define MAX 1000
typedef struct Student //定義學(xué)生信息結(jié)構(gòu)體變量
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}Student;
//typedef struct student //結(jié)構(gòu)體套結(jié)構(gòu)體
//{
// Student data[MAX]; //存放添加進(jìn)來(lái)的個(gè)人信息
// int sz; //記錄當(dāng)前系統(tǒng)中有效信息個(gè)數(shù)
//}student;
typedef struct student //結(jié)構(gòu)體嵌套結(jié)構(gòu)體
{
Student*data; //指向動(dòng)態(tài)申請(qǐng)空間,用來(lái)存放個(gè)人信息
int sz; //記錄當(dāng)前系統(tǒng)中有效信息個(gè)數(shù)
int capacity; //記錄當(dāng)前通訊錄最大容量
}student;
void Initstudent(student*pc);//初始化結(jié)構(gòu)體
void ADDstudent(student* pc);//增加學(xué)生信息
void PRINTstudent(student* pc);//瀏覽學(xué)生信息
void SEARCHstudent(student* pc);//查找學(xué)生信息
void MODIFYstudent(student* pc);//修改學(xué)生信息
void DELETEstudent(student* pc);//刪除學(xué)生信息
void DESETORYstudent(student* pc);//銷毀學(xué)生信息
test.c
//主文件的測(cè)試 該文件為實(shí)現(xiàn)學(xué)生管理系統(tǒng)的核心
#define _CRT_SECURE_NO_WARNINGS 1
#include"infor.h" //注意分文件寫時(shí) 源文件中都需要引用頭文件
void menu()
{
system("color fc");
printf("\n");
printf("\n");
printf("\n");
printf(" ***********鄭州輕工業(yè)大學(xué)學(xué)生信息管理系統(tǒng)************\n");
printf(" *-------0.退出 1.增加學(xué)生信息-------*\n");
printf(" *-------2.瀏覽學(xué)生信息 3.查找學(xué)生信息-------*\n");
printf(" *-------4.修改學(xué)生信息 5.刪除學(xué)生信息-------*\n");
printf(" *****************************************************\n");
printf("\n");
printf("\n");
printf("\n");
}
enum option
{ //通過(guò)枚舉常量,使得主函數(shù)中的switch語(yǔ)句更明了的實(shí)現(xiàn)不同的功能
EXIT,
ADD,
PRINT,
SEARCH,
MODIFY,
Delete
};
int main()
{
int input = 0;
student stu;
Initstudent(&stu); //結(jié)構(gòu)體數(shù)組的初始化
do
{
menu();
printf("請(qǐng)選擇:>\n");
scanf("%d", &input);
switch(input) //封裝多個(gè)函數(shù)實(shí)現(xiàn)多個(gè)功能
{ //函數(shù)的聲明位于頭文件中,實(shí)現(xiàn)在infor.c中實(shí)現(xiàn)
case EXIT:
DESETORYstudent(&stu);
printf("退出系統(tǒng)\n");
break;
case ADD:
ADDstudent(&stu);
break;
case PRINT:
PRINTstudent(&stu);
break;
case SEARCH:
SEARCHstudent(&stu);
break;
case MODIFY:
MODIFYstudent(&stu);
break;
case Delete:
DELETEstudent(&stu);
break;
default:
printf("選擇錯(cuò)誤,重新選擇\n");
break;
}
} while (input);
return 0;
}
infor.c
//該文件為test.c中封裝函數(shù)的實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS 1
#include"infor.h"
//靜態(tài)
//void Initstudent(student* pc)
//{
// pc->sz = 0;
// memset(pc->data, 0, sizeof(pc->data));//memset()內(nèi)存設(shè)置 使整個(gè)結(jié)構(gòu)體數(shù)組初始化
//}
//動(dòng)態(tài)
void Initstudent(student* pc)
{
//指針data維護(hù)開辟的動(dòng)態(tài)內(nèi)存空間 calloc初始化開辟空間
pc->data = (Student*)calloc(begin,sizeof(Student));
pc->sz = 0; //sz為有效信息個(gè)數(shù)
pc->capacity = begin; //定義目前容量為初始容量
}
void ADDstudent(student* pc)
{
if (pc->sz == pc->capacity) //容量滿了完成增容
{
Student* ptr = (Student*)realloc(pc->data, (pc->capacity + add)*sizeof(Student));
if (ptr != NULL)
{
pc->data = ptr;
pc->capacity += add;
printf("~~~增容成功~~~\n");
}
else
{
perror("ADDstudent");//失敗報(bào)錯(cuò)
printf("增加聯(lián)系人失敗\n");
return;
}
}
//增加一個(gè)人的信息
printf("請(qǐng)輸入姓名:\n");
scanf("%s", pc->data[pc->sz].name);
printf("請(qǐng)輸入性別:\n");
scanf("%s", pc->data[pc->sz].sex);
printf("請(qǐng)輸入年齡:\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("請(qǐng)輸入電話:\n");
scanf("%s", pc->data[pc->sz].tele);
printf("請(qǐng)輸入地址:\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("增加成功\n");
}
void DESETORYstudent(student* pc) //銷毀個(gè)人信息
{
free(pc->data); //釋放內(nèi)存
pc->data = NULL; //回歸為0
pc->capacity = 0;
pc->sz = 0;
}
//void ADDstudent(student* pc)
//{
// if (pc->sz == MAX)
// {
// printf("通訊錄已滿,無(wú)法添加\n");
// return;
// }
// //增加一個(gè)人的信息
// printf("請(qǐng)輸入姓名:\n");
// scanf("%s", pc->data[pc->sz].name);
// printf("請(qǐng)輸入性別:\n");
// scanf("%s", pc->data[pc->sz].sex);
// printf("請(qǐng)輸入年齡:\n");
// scanf("%d", &(pc->data[pc->sz].age));
// printf("請(qǐng)輸入電話:\n");
// scanf("%s", pc->data[pc->sz].tele);
// printf("請(qǐng)輸入地址:\n");
// scanf("%s", pc->data[pc->sz].addr);
// pc->sz++;
// printf("增加成功\n");
//}
void PRINTstudent(student* pc)
{
int i = 0;
printf("%-10s%-10s%-10s%-15s%-30s\n", "姓名", "性別", "年齡", "電話", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s%-10s%-10d%-15s%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr
);
}
}
static int Findbyname(student* pc, char name[]) //通過(guò)名字來(lái)查找學(xué)生 stadic靜態(tài)局部變量 該函數(shù)只在本文件中應(yīng)用 保護(hù)該函數(shù)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0) //利用strcmp函數(shù)的返回值判斷是否找到了該人
{
return i; //找到了就返回學(xué)生信息的角標(biāo)
}
}
return -1; //沒(méi)找到
}
void SEARCHstudent(student* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入要查找學(xué)生姓名:\n");
scanf("%s", name);
int end = Findbyname(pc, name);
if (end == -1)
{
printf("你所要查找的人不存在");
}
else
{
printf("%-10s%-10s%-10s%-15s%-30s\n", "姓名", "性別", "年齡", "電話", "地址");
printf("%-10s%-10s%-10d%-15s%-30s\n", //Findbuname函數(shù)如果找到對(duì)應(yīng)學(xué)生,返回對(duì)應(yīng)下標(biāo),輸出對(duì)應(yīng)下標(biāo)學(xué)生信息
pc->data[end].name,
pc->data[end].sex,
pc->data[end].age,
pc->data[end].tele,
pc->data[end].addr
);
}
}
void MODIFYstudent(student* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入要修改學(xué)生信息的學(xué)生姓名:\n");
scanf("%s", name);
int end = Findbyname(pc, name);
if (end == -1)
{
printf("你所要修改學(xué)生信息的人不存在");
}
else
{
printf("請(qǐng)輸入性別:\n");
scanf("%s", pc->data[end].sex);
printf("請(qǐng)輸入年齡:\n");
scanf("%d", &(pc->data[end].age));
printf("請(qǐng)輸入電話:\n");
scanf("%s", pc->data[end].tele);
printf("請(qǐng)輸入地址:\n");
scanf("%s", pc->data[end].addr);
printf("修改成功\n");
}
}
void DELETEstudent(student* pc)
{
char name[MAX_NAME] = { 0 };
printf("請(qǐng)輸入要?jiǎng)h除學(xué)生信息的學(xué)生姓名:\n");
scanf("%s", name);
int end = Findbyname(pc, name);
if (end == -1)
{
printf("你所要?jiǎng)h除學(xué)生信息的人不存在");
}
int i = 0;
for (i = end; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功");
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- C語(yǔ)言結(jié)構(gòu)體鏈表和指針實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- 基于C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)班級(jí)學(xué)生管理系統(tǒng)
- C語(yǔ)言不用鏈表完成學(xué)生管理系統(tǒng)(完整代碼)
- C語(yǔ)言單鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- C語(yǔ)言鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生管理系統(tǒng)
- C語(yǔ)言學(xué)生管理系統(tǒng)源碼分享
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(768.可排序的最大塊數(shù)之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(768.可排序的最大塊數(shù)之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
深入C++四種強(qiáng)制類型轉(zhuǎn)換的總結(jié)
本篇文章是對(duì)C++中四種強(qiáng)制類型轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C/C++實(shí)現(xiàn)的MD5哈希校驗(yàn)的示例代碼
MD5算法是一種廣泛使用的 Hash 算法,常用于確保信息傳輸?shù)耐暾耘c一致性,本文主要介紹了C/C++實(shí)現(xiàn)的MD5哈希校驗(yàn)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
C語(yǔ)言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)
楊輝三角是中國(guó)古代數(shù)學(xué)的杰出研究成果之一,它把二項(xiàng)式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來(lái),是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實(shí)現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試2022-01-01

