C語言搭建項目-學生管理系統(非鏈表)

目錄

搭建offer.h文件

搭建offer.c中的main函數

密碼登入系統

搭建my_oferr.c中的接口函數?

使用幫助菜單接口函數

增加學生信息接口函數?

查詢學生信息接口函數

刪除學生信息接口函數?

保存學生信息接口?

打開文件fopen

關閉文件fclose

?判斷是否保存文件fwrite

退出執行文件exit

顯示學生信息接口函數

?修改學生信息接口函數

?學生排名信息接口函數

--------------------------------------

----------------?

每次歸程,都是為了更好出發;

每次停歇,都是為了積攢力量?。

最近大家C語言是不是都進入了實訓階段呢?

還在為寫不出代碼而苦惱嗎?

接下來我將帶領大家一起完成!

C語言的一個簡單項目-學生管理系統!

主要運用了數組和指針函數

關于鏈表的搭建后續會更新

題目:學生管理系統
學生數據由學號、姓名、性別、年齡、三門課(C語言、高數、大物)的成績構成

?實現功能包括:
(1)密碼登入
(2)使用提示
(3)信息錄入
(4)查詢信息
(5)刪除信息
(6)保存信息
(7)顯示信息

(8)修改信息

(9)成績排名

對于這種代碼量超百位數的,大家最好養成分模塊寫代碼的習慣:

我創建了一個.h文件和兩個.c 文件,.h一般放頭文件和結構體類型.c文件一個設置主函數main一個完善相應的函數接口。這樣分工明確,不會混亂,可以提高敲代碼的效率哦~

首先明白我們要實現的項目功能:密碼登入系統、使用幫助菜單、增加學生信息、查詢學生信息、刪除學生信息、保存當前信息、顯示當前信息、修改學生信息、學生成績排名


搭建offer.h文件

因為學生有以下幾個基本信息:姓名、年齡、學號、性別,依次由name、age、id和sex來表示,所以可以通過結構體實現,struct語句定義存儲不同類型的數據項,定義一個結構體數組Stu,用于存儲每個學生的信息

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void TiShi();      //提示功能
void StuXinXi();   //增加信息
void ChaZhao();    //查找信息
void ShanGai();    //刪改信息
void BaoCun();     //保存信息
void XianShi();    //顯示信息
void XiuGai();     //修改信息
void PaiMing();    //學生排名
#define N 20
#define Number sizeof(struct Student)//求結構體的大小    
//創建結構體包含學生信息
struct Student
{char Stuid[N];     //學號char Stuname[N];   //名字int Stuage;        //年齡char Stusex[N];    //性別double score[3];   //成績
}Stu[Number];
//枚舉體美化選項
enum menu2
{Quit = 0,Resume = 1
};
enum ChaZhao
{CaoZuo1 = 1,CaoZuo2 = 2,CaoZuo3 = 3
};

1.這里最好定義一個宏#define不然以后修改將會很麻煩

2.枚舉體美化選項在我之前的博客講過,提高代碼的可讀性

3.剩下的就是頭文件的引入和函數的聲明以及結構體的創建

搭建offer.c中的main函數

?要使用我們在offer.h中設置的頭文件要在offer.c中加上#include"offer.h"

#include"offer.h"

?整體的框架如下:

#include"offer.h"
int sum = 1;
int main()
{int i = 0;int input = 0, count = 0;char mima[20] = "123";//登入的密碼char shuru[20];system("color F4");printf("\t\t\t     **************************************\n");printf("\t\t\t     |       *歡迎使用學生管理系統*       |\n");printf("\t\t\t     |           *管理員: 小唐*           |\n");printf("\t\t\t      ------------------------------------\n");printf("請輸入管理員密碼:\n");while ((count = _getch()) != '\r')   {if (count == '\b'){i--;printf("\b \b");}else{shuru[i++] = count;printf("*");}}shuru[i++] = '\0';    //getch賦值的是單個字符,所以為了比較兩個字符串的大小要給shuru數組后面添加'\0'if (strcmp(mima, shuru) == 0){printf("\n密碼正確,您已進入系統!\n");}else{printf("\n密碼錯誤,請重新輸入!\n");return 0;}system("pause");system("cls");do{menu2();printf("請選擇繼續還是結束操作:\n");scanf("%d", &sum);switch (sum){case Quit:system("cls");//清除屏幕printf("您已退出學生管理系統!\n");break;case Resume:menu1();void(*p[9])() = { NULL,TiShi,StuXinXi,ChaZhao,ShanGai,BaoCun,XianShi,XiuGai,PaiMing };//指針數組函數printf("請輸入你要進行的操作\n");scanf("%d", &input);system("cls");(*p[input])();break;default:printf("輸入錯誤,重新輸入!\n");break;}} while (sum);return 0;
}

接下來我將帶領大家解讀以上代碼

密碼登入系統

在進入學生管理系統之前,我設置了一個小型的系統密碼登入界面來判斷是進入還是退出

	int count = 0;char mima[20] = "123";//登入的密碼char shuru[20];system("color F4");printf("\t\t\t     **************************************\n");printf("\t\t\t     |       *歡迎使用學生管理系統*       |\n");printf("\t\t\t     |           *管理員: 小唐*           |\n");printf("\t\t\t      ------------------------------------\n");printf("請輸入管理員密碼:\n");while ((count = _getch()) != '\r')   {if (count == '\b'){i--;printf("\b \b");}else{shuru[i++] = count;printf("*");}}shuru[i++] = '\0';    //getch賦值的是單個字符,所以為了比較兩個字符串的大小要給shuru數組后面添加'\0'if (strcmp(mima, shuru) == 0){printf("\n密碼正確,您已進入系統!\n");}else{printf("\n密碼錯誤,請重新輸入!\n");return 0;}

1.我們這里利用了while去進行getch輸入getch輸入單個字符是不會顯示信息的,但我們按下回車鍵輸入結束,循環停止

2.' \r '就是回車鍵的意思,而' \b '就是刪除鍵的意思

3.每循環一次就輸入一個字符count賦值給數組shuru,并打印" * "

4.getch賦值的是單個字符,所以為了比較兩個字符串的大小要給shuru數組后面添加' \0 '

5.strcmp是比較兩個字符串的大小,詳細可以看我之前的博客

以上就是我們密碼登入系統的全部內容

接下來我將講解接下來的代碼實現

?menu2()的作用就是選擇繼續操作還是退出系統

void menu2()
{system("color F4");printf("\t\t\t*********************\n");printf("\t\t\t*********************\n");printf("\t\t\t-------1.Resume------\n");printf("\t\t\t-------0.Quit--------\n");printf("\t\t\t*********************\n");
}

1.system("cls")-清屏函數,會將顯示過的內容清空,被#include<stdlib.h>包含

2.system("color F4");是改變背景顏色的函數,被#include<stdlib>包含

3.我們用枚舉類型美化選項Quit就是0,Resume就是1

4.我們采用了指針數組函數可以直接調用接口函數,因為沒有返回值函數類型就是void,這樣減少了重復代碼的編寫,如果大家不適應也可以用switch


搭建my_oferr.c中的接口函數?

首先定義我們my_oferr.c中的全局變量

#include"offer.h"
int m = 0;              //記錄錄入學生的人數

由于是顯示一個管理系統

所以我們設計一個主菜單

通過定義一個函數menu2()來實現這個功能:

void menu1()
{printf("\n");system("color F4");printf("\t\t\t*****************************************************\n");printf("\t\t\t*---------------------------------------------------*\n");printf("\t\t\t*                   學生管理系統                    *\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t********************系統功能菜單*********************\n");printf("\t\t\t----------------------     --------------------------\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    1、使用幫助菜單   *     2、增加學生信息      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    3、查詢學生信息   *     4、刪除學生信息      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    5、保存當前信息   *     6、顯示當前信息      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    7、修改學生信息   *     8、學生成績排名      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t----------------------     --------------------------\n");
}

這個大家可以自己隨喜好設置~?


?使用幫助菜單接口函數

void TiShi()
{printf("歡迎來到學生管理系統:\n");printf("在這個管理系統中,教師和學生都不需要去了解自己的信息,只需通過網絡就能實現自己的信息管理。\n");printf("教師可以輕松便捷地掌握學生相關情況、姓名、學號以及考試成績等基本信息。\n");printf("它還提供一個搜索功能和設置權限,可以將學生的信息進行搜索,\n也可根據關鍵字或其他方式對其進行定位,并且還能顯示出該人的相關基本資料。\n");printf("如果由技術上的缺陷還請聯系項目負責人:\n17817473648\n");system("pause");system("cls");
}

?system("pause")是暫停函數,按任意鍵重新啟動,被#include<stdlib.h>包含

本函數接口主要起到提示作用,小伙伴們可以自行添加自己的管理需求?


?增加學生信息接口函數?

void StuXinXi()
{int i = m,flag,n = 0;printf("請輸入你要添加的學生人數:\n");scanf("%d", &n);printf("--------------------------*學生信息錄入系統*--------------------------------\n");if (n > 0){do {flag = 1;while (flag){flag = 0;printf("請輸入第%d位學生的學號:\n", i + 1);scanf("%s", Stu[i].Stuid);for (int j = 0; j < i; j++){if (strcmp(Stu[i].Stuid, Stu[j].Stuid) == 0)//判斷是否重復{printf("該學生已經錄入,請重新選擇!\n");flag = 1;break;}}}printf("請輸入第%d學生的姓名:\n", i + 1);scanf("%s", Stu[i].Stuname);printf("請輸入第%d學生的年齡:\n", i + 1);scanf("%d", &Stu[i].Stuage);printf("請輸入第%d學生的性別:\n", i + 1);scanf("%s", &Stu[i].Stusex);printf("請輸入第%d學生的C語言成績:\n", i + 1);scanf("%lf", &Stu[i].score[0]);printf("請輸入第%d學生的高數成績:\n", i + 1);scanf("%lf", &Stu[i].score[1]);printf("請輸入第%d學生的大物成績:\n", i + 1);scanf("%lf", &Stu[i].score[2]);i++;} while (i < n + m);m += n;if (flag == 0){printf("添加完成!請進行下一步操作:\n");}system("pause");system("cls");}
}

1.flag用來判斷最后輸出的提示語句,提示錄入成功與否

2.然后就是whie循環給結構體成員賦初值

3.在將人數累加給全局變量m就好了


查詢學生信息接口函數

void ChaZhao()
{int flag, input;char Stu1[Number];printf("\t\t\t----------*學生信息查找系統*----------\n");printf("\t\t\t**************************************\n");printf("\t\t\t******1.請輸入你要查找的學生名字******\n");printf("\t\t\t******2.請輸入你要查找的學生學號******\n");printf("\t\t\t******------3.退出本次操作------******\n");printf("\t\t\t**************************************\n");while (1){flag = 0;printf("請輸入你要進行的查詢操作:\n");scanf("%d", &input);switch (input){case CaoZuo1:printf("請輸入你要查找的學生名字:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuname, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo2:printf("請輸入你要查找的學生學號:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo3:return;default:printf("輸入錯誤,重新選擇!\n");}if (flag == 0){printf("該學生沒有錄入系統,請重新查找!\n");}}system("pause");
}


刪除學生信息接口函數?

void ShanGai()
{int flag = 0;char arr[Number];  //定義一個數組printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}printf("請輸入你要刪除學生的學號:\n");scanf("%s", arr);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, arr) == 0) //查找對應的學號{flag = 1;for (int j = i; j < m - 1; j++) //m-1防止越界訪問{Stu[j] = Stu[j + 1];      //整個結構體后一個覆蓋前一個}}}if (flag == 0){printf("無法查找該學生信息!\n");}else{printf("刪除成功,請查詢系統!\n");m--;           //刪除成功總人數減一printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}

保存學生信息接口?

這里穿插一下文件的保存的函數內容:?

打開文件fopen

可以使用?fopen( )?函數來創建一個新的文件或者打開一個已有的文件,這個調用會初始化類型?FILE?的一個對象,類型?FILE?包含了所有用來控制流的必要的信息。下面是這個函數調用的原型:

FILE *fopen( const char *filename, const char *mode );

在這里,filename?是字符串,用來命名文件,訪問模式?mode?的值可以是下列值中的一個:

關閉文件fclose

為了關閉文件,請使用 fclose( ) 函數。函數的原型如下:

 int fclose( FILE *fp );

如果成功關閉文件,fclose( )?函數返回零,如果關閉文件時發生錯誤,函數返回?EOF。這個函數實際上,會清空緩沖區中的數據,關閉文件,并釋放用于該文件的所有內存。EOF 是一個定義在頭文件 #include<stdio.h>?中的常量。

?判斷是否保存文件fwrite

fwrite(file,string,length)
file必需。規定要寫入的打開文件。
string必需。規定要寫入打開文件的字符串。
length可選。規定要寫入的最大字節數。

fwrite() 函數將內容寫入一個打開的文件中。

函數會在到達指定長度或讀到文件末尾(EOF)時(以先到者為準),停止運行

如果函數成功執行,則返回寫入的字節數。如果失敗,則返回 FALSE

退出執行文件exit

void exit(int status)?

立即終止調用進程。任何屬于該進程的打開的文件描述符都會被關閉,該進程的子進程由進程 1 繼承,初始化,且會向父進程發送一個 SIGCHLD 信號。?

void BaoCun()
{FILE* fp;              //文件指針char filename[Number];printf("------------------------------\n");printf("---*請輸入你要保存的文件名*---\n");printf("------------------------------\n");scanf("%s", filename);if (fp = fopen("filename.txt", "a")== NULL)//fopen以.txt的形式打開文件函數{printf("打開文件失敗!\n");exit(0);}for (int i = 0; i < m; i++){if (fwrite(&Stu[i], sizeof(struct Student), 1, fp) != 1){printf("保存失敗!\n");}else{printf("保存成功!\n");    //返回字節數,則成功保存}}fclose(fp);   //關閉文件system("pause");
}

我們保存之后在這里查看保存過的文件:?

顯示學生信息接口函數

void XianShi()
{if (m == 0){printf("您好!現在還暫未錄入學生信息,請稍后重試");}else {printf("現在有%d名學生:\n", m);printf("-------------------------------------*成績顯示*----------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}

?

?修改學生信息接口函數

void XiuGai()
{int input = 0;int  flag;char id[Number], name[Number], sex[Number];int age;double score;printf("請輸入要修改的學生學號:\n");scanf("%s", &id);while (1){flag = 0;for (int i = 0; i < m; i++){if (strcmp(id, Stu[i].Stuid) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);printf("**************************************************\n");printf("----1.修改學生性別             2.修改學生姓名-----\n");printf("----3.修改學生年齡             4.修改C語言成績----\n");printf("----5.修改高數成績             6.修改大物成績-----\n");printf("********************7.退出本菜單******************\n");printf("請輸入你要修改的選項:\n");scanf("%d", &input);switch (input){case 1:printf("請輸入要修改的性別:\n");scanf("%s", sex);strcpy(Stu[i].Stusex, sex);break;case 2:printf("請輸入要修改的姓名:\n");scanf("%s",name);strcpy(Stu[i].Stuname, name);break;case 3:printf("請輸入要修改的年齡:\n");scanf("%d", &age);Stu[i].Stuage = age;break;case 4:printf("請輸入要修改的C語言成績:\n");scanf("%lf", &score);Stu[i].score[0] = score;break;case 5:printf("請輸入要修改的高數成績:\n");scanf("%lf", &score);Stu[i].score[1] = score;break;case 6:printf("請輸入要修改的大物成績:\n");scanf("%lf", &score);Stu[i].score[2] = score;break;case 7:return;default:printf("選擇錯誤,請重新選擇!\n");break;}}if (1 <= input && input <= 6){printf("恭喜你修改成功!\n");break;}if (flag == 0){printf("沒有找到該學生信息,請重新輸入學生學號:\n");gets(name);}}}system("pause");
}

char* strcpy(char * destination, const char * source );?

strcpy:拷貝函數,將括號右邊的值拷貝到左邊,詳細可看我之前的博客

?學生排名信息接口函數

int PaiXu(const void* e1, const void* e2)
{return  ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu1(const void* e1, const void* e2)
{return  ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu2(const void* e1, const void* e2)
{return  ((struct Student*)e2)->score[2] - ((struct Student*)e1)->score[2];
}
void PaiMing()
{int input = 0;while (1){printf("\t\t**************************************************\n");printf("\t\t---------------------***光榮榜***-----------------\n");printf("\t\t**************************************************\n");printf("\t\t********1.C語言-------------------2.高數**********\n");printf("\t\t********3.大物--------------------4.退出系統******\n");printf("\t\t**************************************************\n");printf("請輸入你要查詢的排名:\n");scanf("%d", &input);switch (input){case 1:printf("\t學號:\t\t名字:\tC語言成績:\n");int rs = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu);//排序for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 2:printf("\t學號:\t\t名字:\t高數成績:\n");int rs1 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs1, sizeof(Stu[0]), PaiXu1);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 3:printf("\t學號:\t\t名字:\t大物成績:\n");int rs2 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu2);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 4:return;default:printf("選擇錯誤,重新選擇!\n");break;}}
}

我們采用qsort排序法:

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

base首元素地址-數組名

num元素個數

size數據類型的大小

int (*compar)(const void*,const void*))比較大小的函數指針?

以下是整個代碼的實現:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 20      
#define Number sizeof(struct Student)
struct Student
{char Stuid[N];    char Stuname[N];  int Stuage;        char Stusex[N];       double score[3];  
}Stu[Number];
enum menu2
{Quit = 0,Resume = 1
};
enum ChaZhao
{CaoZuo1 = 1,CaoZuo2 = 2,CaoZuo3 = 3
};int m = 0;
void menu1()
{printf("\n");system("color F4");printf("\t\t\t*****************************************************\n");printf("\t\t\t*---------------------------------------------------*\n");printf("\t\t\t*                   學生管理系統                    *\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t********************系統功能菜單*********************\n");printf("\t\t\t----------------------     --------------------------\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    1、使用幫助菜單   *     2、增加學生信息      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    3、查詢學生信息   *     4、刪除學生信息      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    5、保存當前信息   *     6、顯示當前信息      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t**    7、修改學生信息   *     8、學生成績排名      **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t----------------------     --------------------------\n");
}
void menu2()
{system("color F4");printf("*********************\n");printf("*********************\n");printf("-------1.Resume------\n");printf("-------0.Quit--------\n");printf("*********************\n");
}
void TiShi()
{printf("歡迎來到學生管理系統:\n");printf("在這個管理系統中,教師和學生都不需要去了解自己的信息,只需通過網絡就能實現自己的信息管理。\n");printf("教師可以輕松便捷地掌握學生相關情況、姓名、學號以及考試成績等基本信息。\n");printf("它還提供一個搜索功能和設置權限,可以將學生的信息進行搜索,\n也可根據關鍵字或其他方式對其進行定位,并且還能顯示出該人的相關基本資料。\n");printf("如果由技術上的缺陷還請聯系項目負責人:\n唐工:2172227341@qq.com\n");system("pause");system("cls");
}
void StuXinXi()
{int i = m,flag,n = 0;printf("請輸入你要添加的學生人數:\n");scanf("%d", &n);printf("--------------------------*學生信息錄入系統*--------------------------------\n");if (n > 0){do {flag = 1;while (flag){flag = 0;printf("請輸入第%d位學生的學號:\n", i + 1);scanf("%s", Stu[i].Stuid);for (int j = 0; j < i; j++){if (strcmp(Stu[i].Stuid, Stu[j].Stuid) == 0){printf("該學生已經錄入,請重新選擇!\n");flag = 1;break;}}}printf("請輸入第%d學生的姓名:\n", i + 1);scanf("%s", Stu[i].Stuname);printf("請輸入第%d學生的年齡:\n", i + 1);scanf("%d", &Stu[i].Stuage);printf("請輸入第%d學生的性別:\n", i + 1);scanf("%s", &Stu[i].Stusex);printf("請輸入第%d學生的C語言成績:\n", i + 1);scanf("%lf", &Stu[i].score[0]);printf("請輸入第%d學生的高數成績:\n", i + 1);scanf("%lf", &Stu[i].score[1]);printf("請輸入第%d學生的大物成績:\n", i + 1);scanf("%lf", &Stu[i].score[2]);i++;} while (i < n + m);m += n;if (flag == 0){printf("添加完成!請進行下一步操作:\n");}system("pause");system("cls");}
}
void ChaZhao()
{int flag, input;char Stu1[Number];printf("\t\t\t----------*學生信息查找系統*----------\n");printf("\t\t\t**************************************\n");printf("\t\t\t******1.請輸入你要查找的學生名字******\n");printf("\t\t\t******2.請輸入你要查找的學生學號******\n");printf("\t\t\t******------3.退出本次操作------******\n");printf("\t\t\t**************************************\n");while (1){flag = 0;printf("請輸入你要進行的查詢操作:\n");scanf("%d", &input);switch (input){case CaoZuo1:printf("請輸入你要查找的學生名字:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuname, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo2:printf("請輸入你要查找的學生學號:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo3:return;default:printf("輸入錯誤,重新選擇!\n");}if (flag == 0){printf("該學生沒有錄入系統,請重新查找!\n");}}system("pause");}   
void ShanGai()
{int flag = 0;char arr[Number];printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}printf("請輸入你要刪除學生的學號:\n");scanf("%s", arr);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, arr) == 0) {flag = 1;for (int j = i; j < m - 1; j++) {Stu[j] = Stu[j + 1];      }}}if (flag == 0){printf("無法查找該學生信息!\n");}else{printf("刪除成功,請查詢系統!\n");m--;          printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}
void BaoCun()
{FILE* fp;              char filename[Number];printf("------------------------------\n");printf("---*請輸入你要保存的文件名*---\n");printf("------------------------------\n");scanf("%s", filename);if (fp = fopen("filename.txt", "a")== NULL){printf("打開文件失敗!\n");exit(0);}for (int i = 0; i < m; i++){if (fwrite(&Stu[i], sizeof(struct Student), 1, fp) != 1){printf("保存失敗!\n");}else{printf("保存成功!\n");}}fclose(fp);system("pause");
}
void XianShi()
{if (m == 0){printf("您好!現在還暫未錄入學生信息,請稍后重試");}else {printf("現在有%d名學生:\n", m);printf("-------------------------------------*成績顯示*----------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}
void XiuGai()
{int input = 0;int  flag;char id[Number], name[Number], sex[Number];int age;double score;printf("請輸入要修改的學生學號:\n");scanf("%s", &id);while (1){flag = 0;for (int i = 0; i < m; i++){if (strcmp(id, Stu[i].Stuid) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);printf("**************************************************\n");printf("----1.修改學生性別             2.修改學生姓名-----\n");printf("----3.修改學生年齡             4.修改C語言成績----\n");printf("----5.修改高數成績             6.修改大物成績-----\n");printf("********************7.退出本菜單******************\n");printf("請輸入你要修改的選項:\n");scanf("%d", &input);switch (input){case 1:printf("請輸入要修改的性別:\n");scanf("%s", sex);strcpy(Stu[i].Stusex, sex);break;case 2:printf("請輸入要修改的姓名:\n");scanf("%s",name);strcpy(Stu[i].Stuname, name);break;case 3:printf("請輸入要修改的年齡:\n");scanf("%d", &age);Stu[i].Stuage = age;break;case 4:printf("請輸入要修改的C語言成績:\n");scanf("%lf", &score);Stu[i].score[0] = score;break;case 5:printf("請輸入要修改的高數成績:\n");scanf("%lf", &score);Stu[i].score[1] = score;break;case 6:printf("請輸入要修改的大物成績:\n");scanf("%lf", &score);Stu[i].score[2] = score;break;case 7:return;default:printf("選擇錯誤,請重新選擇!\n");break;}}if (1 <= input && input <= 6){printf("恭喜你修改成功!\n");break;}if (flag == 0){printf("沒有找到該學生信息,請重新輸入學生學號:\n");gets(name);}}}system("pause");
}int PaiXu(const void* e1, const void* e2)
{return  ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu1(const void* e1, const void* e2)
{return  ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu2(const void* e1, const void* e2)
{return  ((struct Student*)e2)->score[2] - ((struct Student*)e1)->score[2];
}
void PaiMing()
{int input = 0;while (1){printf("\t\t**************************************************\n");printf("\t\t---------------------***光榮榜***-----------------\n");printf("\t\t**************************************************\n");printf("\t\t********1.C語言-------------------2.高數**********\n");printf("\t\t********3.大物--------------------4.退出系統******\n");printf("\t\t**************************************************\n");printf("請輸入你要查詢的排名:\n");scanf("%d", &input);switch (input){case 1:printf("\t學號:\t\t名字:\tC語言成績:\n");int rs = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu);//排序for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 2:printf("\t學號:\t\t名字:\t高數成績:\n");int rs1 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs1, sizeof(Stu[0]), PaiXu1);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 3:printf("\t學號:\t\t名字:\t大物成績:\n");int rs2 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu2);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 4:return;default:printf("選擇錯誤,重新選擇!\n");break;}}
}
#include"offer.h"
int sum = 1;
int main()
{int i = 0;int input = 0, count = 0;char mima[20] = "123";//登入的密碼char shuru[20];char mingzi[20];system("color F4");printf("\t\t\t     **************************************\n");printf("\t\t\t     |       *歡迎使用學生管理系統*       |\n");printf("\t\t\t     |           *管理員: 小唐*           |\n");printf("\t\t\t      ------------------------------------\n");printf("請輸入管理員密碼:\n");while ((count = _getch()) != '\r'){if (count == '\b'){i--;printf("\b \b");}else{shuru[i++] = count;printf("*");}}shuru[i++] = '\0';   if (strcmp(mima, shuru) == 0){printf("\n密碼正確,您已進入系統!\n");}else{printf("\n密碼錯誤,請重新輸入!\n");return 0;}system("pause");system("cls");do{menu2();printf("請選擇繼續還是結束操作:\n");scanf("%d", &sum);switch (sum){case Quit:system("cls");printf("您已退出學生管理系統!\n");break;case Resume:menu1();void(*p[9])() = { NULL,TiShi,StuXinXi,ChaZhao,ShanGai,BaoCun,XianShi,XiuGai,PaiMing };//指針數組函數printf("請輸入你要進行的操作\n");scanf("%d", &input);system("cls");(*p[input])();break;default:printf("輸入錯誤,重新輸入!\n");break;}} while (sum);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208132.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208132.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++:const類型數據的修改問題

在C語言中const類型的數據嚴格意義上可以修改&#xff1a; const int a1; int*b&a; *b2;不同于C語言&#xff0c;C中指針類型是要嚴格對應的&#xff0c;對const類型的數據必須使用const類型的指針進行接收&#xff0c;從而避免修改&#xff1b; 但問題是c中同樣支持指針的…

年度工作總結怎么寫?掌握這些年終總結萬能公式,讓你的報告出彩無比!

光陰似箭&#xff0c;日月如梭&#xff0c;時間總是不疾不徐地向前奔去&#xff0c;轉眼就來到了2023年的最后一個月&#xff0c;12月一到&#xff0c;上班族和打工人又要開始忙活工作總結的事情~ 工作總結&#xff0c;不僅是一年工作的回顧&#xff0c;更是未來規劃的起點。你…

Springboot中的RestTemplate

Springboot中的RestTemplate 在Spring Boot應用程序中&#xff0c;RestTemplate是一個用于進行HTTP請求的強大工具。通常用于與RESTful API進行交互、調用其他服務或執行HTTP請求。它提供了各種方法來發送HTTP請求&#xff08;如GET、POST、PUT、DELETE等&#xff09;&#xf…

cuda lib 線程安全的要義

1, 概述 cuda lib 線程安全的幾個多線程的情景&#xff1a; 單卡多線程&#xff1b; 多卡多線程-每卡單線程&#xff1b; 多卡多線程-每卡多線程&#xff1b; 需要考慮的問題&#xff1a; 每個 cublasHandle_t 只能有一個stream么&#xff1f; 每個cusolverHandle_t 只能有一…

python3.5安裝教程及環境配置,python3.7.2安裝與配置

大家好&#xff0c;小編來為大家解答以下問題&#xff0c;python3.5安裝教程及環境配置&#xff0c;python3.7.2安裝與配置&#xff0c;現在讓我們一起來看看吧&#xff01; python 從爬蟲開始&#xff08;一&#xff09; Python 簡介 首先簡介一下Python和爬蟲的關系與概念&am…

Android Studio的代碼筆記--IntentService學習

IntentService學習 IntentService常規用法清單注冊服務服務內容開啟服務 IntentService 一個 HandlerThread工作線程&#xff0c;通過Handler實現把消息加入消息隊列中等待執行&#xff0c;通過傳遞的intent在onHandleIntent中處理任務。&#xff08;多次調用會按順序執行事件…

Spring Cloud Alibaba實踐 --Sentinel

sentinel簡介 Sentinel的官方標題是&#xff1a;分布式系統的流量防衛兵。從名字上來看&#xff0c;很容易就能猜到它是用來作服務穩定性保障的。對于服務穩定性保障組件&#xff0c;如果熟悉Spring Cloud的用戶&#xff0c;第一反應應該就是Hystrix。但是比較可惜的是Netflix…

三防平板|手持終端PDA|8寸/10寸工業三防平板電腦主板方案定制

近年來&#xff0c;隨著科技的快速發展&#xff0c;三防平板成為了各行各業中不可或缺的工具。三防平板采用IP67級別的防護設計&#xff0c;通過了多項測試標準&#xff0c;如國標和美標&#xff0c;具備防水、防摔、防塵、防撞、防震、防跌落以及防鹽霧等多重防護功能。因此&a…

JavaScript 簡單理解原型和創建實例時 new 操作符的執行操作

function Person(){// 構造函數// 當函數創建&#xff0c;prototype 屬性指向一個原型對象時&#xff0c;在默認情況下&#xff0c;// 這個原型對象將會獲得一個 constructor 屬性&#xff0c;這個屬性是一個指針&#xff0c;指向 prototype 所在的函數對象。 } // 為原型對象添…

HarmonyOS應用開發工具DevEco Studio安裝與使用

語雀知識庫地址&#xff1a;語雀HarmonyOS知識庫 飛書知識庫地址&#xff1a;飛書HarmonyOS知識庫 知識庫內容逐步完善中… 工欲善其事必先利其器&#xff0c;要編寫HarmonyOS應用就需要用到官方提供的IDE工具來編寫相應的代碼。 在鴻蒙開發者官網&#xff0c;其提供了官方的開…

基于Java醫院掛號管理系統

基于Java醫院掛號管理系統 功能需求 1、患者信息管理&#xff1a;系統需要提供患者的基本信息錄入功能&#xff0c;包括姓名、性別、年齡、聯系方式等。此外&#xff0c;系統還應支持對患者信息進行修改、查詢和刪除的操作。 2、掛號管理&#xff1a;系統需要提供掛號功能&a…

高效的多維空間點索引算法——GeoHash

一、Geohash 算法簡介 GeoHash是空間索引的一種方式&#xff0c;其基本原理是將地球理解為一個二維平面&#xff0c;通過把二維的空間經緯度數據編碼為一個字符串&#xff0c;可以把平面遞歸分解成更小的子塊&#xff0c;每個子塊在一定經緯度范圍內擁有相同的編碼。以GeoHash方…

springboot 極簡案例

安裝idea File -> New Project 選擇依賴 創建controller文件 輸入controller類名 輸入代碼 運行項目 訪問 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…

數據庫對象介紹與實踐:視圖、函數、存儲過程、觸發器和物化視圖

文章目錄 一、視圖&#xff08;View&#xff09;1、概念2、基本操作1&#xff09;創建視圖2&#xff09;修改視圖3&#xff09;刪除視圖4&#xff09;使用視圖 3、使用場景4、實踐 二、函數&#xff08;Function&#xff09;1、概念2、基本操作1&#xff09;創建函數2&#xff…

粵能環保亮相迪拜COP28,智能技術鑄就運河城市可持續未來

在全球應對氣候變化的重要會議——迪拜COP28大會上&#xff0c;運河城市面臨的獨特環境挑戰引起了廣泛關注。隨著城市化進程的加快&#xff0c;運河城市在處理固體廢物、減少溫室氣體排放以及維持水資源安全方面面臨著嚴峻考驗。智能垃圾分類作為應對這些挑戰的有效途徑&#x…

一些系統日常運維命令和語句

一、前言 記錄一些日常系統運維的命令和語句 二、linux命令與語句 1、linux查看各目錄使用磁盤情況 du -h /home home為目錄 du -h /home 2.查看內存使用情況 free -h 3、查看進程和CPU使用情況 top top 三、數據庫語句 1、統計mysql數據庫表數量 SELECT COUNT(*) A…

被動副業機賺錢項目教程,Docker一鍵安裝教程

被動副業機賺錢項目教程&#xff0c;Docker一鍵安裝教程 Docker一鍵運行 軟件下載 視頻教程 /opt/wxedge_storage 路徑換成你設備里面的路徑即可&#xff0c;其余參數不用變&#xff0c; 鏡像名為onething1/wxedge 更多安裝說明&#xff0c;可參考官方文檔&#xff1a;容器魔…

【算法每日一練]-結構優化(保姆級教程 篇4 樹狀數組,線段樹,分塊模板篇)

目錄 分塊 分塊算法步驟&#xff1a; 樹狀數組 樹狀數組步驟&#xff1a; 線段樹點更新 點更新步驟&#xff1a; 線段樹區間更新 區間更新步驟&#xff1a; 不同于倍增和前綴和與差分序列。 前綴和處理不更新的區間和 差分處理離線的區間更新問題 倍增處理離線的區間…

C++的繼承語法

在面向對象編程中&#xff0c;繼承是一種強大的機制&#xff0c;允許一個類&#xff08;子類&#xff09;從另一個類&#xff08;父類&#xff09;繼承屬性和方法。C是一種支持面向對象編程的編程語言&#xff0c;通過其靈活而強大的繼承語法&#xff0c;開發者可以構建更加模塊…

維普論文查重率高【詳細說明】

大家好&#xff0c;今天來聊聊維普論文查重率高&#xff0c;希望能給大家提供一點參考。 以下是針對論文重復率高的情況&#xff0c;提供一些修改建議和技巧&#xff1a; 維普論文查重率高&#xff1a;原因分析與降重技巧 背景介紹 在學術領域&#xff0c;論文的重復率是衡量其…