1. 程式人生 > >c語言運用----學生成績管理系統

c語言運用----學生成績管理系統

學生成績管理系統

這個學生管理系統是我學習c語言兩個禮拜後與隊友一同寫的第一個專案,一個相對比較完整的專案,雖然有很多的不足,有很多的bug,但是相對的功能實現基本可以完成實現。

基本設計:

上面我只列舉了超級管理員的操作流程,還有管理員,老師,學生的資訊系統流程由於功能很多,沒有一一列在上面。
此專案用C語言編寫,運用結構體,函式,標頭檔案將各個功能來連線起來,使用檔案來將資訊儲存起來,然後再各自的函式裡分別寫各自的功能,完成佈置功能的實現,並能夠儲存管理員,老師,學生的資訊。

基本知識點:

在此我也稍微列舉一下我所學到的覺得重要的知識點,僅對於我一個小白來說。

  1. 標頭檔案衛士:功能是防止標頭檔案被重複匯入,從面增加檔案的大小,浪費編譯時間。在此專案中,因為需要用到很多的函式,於是我們在標頭檔案中加入了很多函式宣告,這樣的話我們可以在.c檔案中標註#include" "來使用將函式連線起來。
    ifndef FILENAME_H
    #define FILENAME_H
    #endif//FILENAME_H
  2. system(“clear”):清屏
  3. gets和puts:gets可以接受空格而scanf不行,puts和gets的優點在於編譯後代碼少, 相對佔用記憶體也小, 從而提高了速度,。
  4. strcpy和strcmp:都是在string.h標頭檔案中的函式,與字串相關,前者是複製,後者是拷貝。
  5. typedef struct 結構名{ }結構名;
  6. 檔案的開啟:
    FILE *fopen(const char *path, const char *mode);
    功能:開啟或建立一個檔案
    path:檔案的路徑
    mode:開啟檔案的方式
    “w” 以只寫方式開啟檔案,檔案存在則清空,不存在則建立。
    “w+” 在w的基礎上新增讀的許可權。
    “r” 以只讀方式開啟檔案,檔案存在則開啟,檔案不存在則返回空。
    “r+” 在r的基礎上新增寫的許可權。
    “a” 以只寫方式開啟檔案,檔案存在開啟檔案,新寫入的資料在檔案的末尾,不存在則建立。
    “a+” 在a的基礎上新增讀的許可權。
  7. 檔案位置指標:
    int fseek(FILE *stream, long offset, int whence);

    功能:調整檔案的位置指標
    offset:偏移值,要與whence配合使用。
  8. 檔案本檔案的讀寫:
    int fprintf(FILE *stream, const char *format,…);
    功能:向檔案中以字元形式寫入資料,把資料按照點位符的格式轉換成字串,寫入到檔案中。
    int fscanf(FILE *stream, const char *format, …);
    功能:從檔案中以字元形式讀取資料,從檔案中讀取字串,再按照點位符的格式轉換化資料。
  9. 二進位制檔案的讀寫:
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    功能:從stream檔案中讀取size個位元組,讀取nmemb次,儲存在ptr中。
    返回值:成功讀取到的次數。
    size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE stream);
  10. 隱藏密碼。
//作者:watchman_Xu
//時間:2018.12

#include<stdio.h>
#include<string.h>
#include "struct.h"
#include"tool.h"
#include"supermanager.h"
//增加管理員
void add_manager(void)
{
	system("clear");
	if(ma_count!=0)
	{
	ma[ma_count].ma_num=ma[ma_count-1].ma_num+1;
	}
	strcpy(ma[ma_count].password,"000000");
	puts("請輸入姓名");
	gets(ma[ma_count].name);
	puts("新增管理員資訊成功");
	ma_count++;
	anykey_continue();
}	
//刪除管理員
void del_manager(void)
{	
	char str[20]={};
	system("clear");
	printf("請輸入要刪除的管理員的姓名\n");
	gets(str);
	for(int j=0;j<ma_count;j++)
	{
		if(strcmp(ma[j].name,str)==0 && ma[j].index!=1)
		{
			ma[j].index=1;
			printf("已刪除此人\n");
			anykey_continue();
			return;
		}
	}
	printf("沒有此人\n");
	anykey_continue();
}	 
//重置管理員密碼
void reset_manager(void)
{
	system("clear");
	printf("請輸入你要重置的管理員的姓名:\n");
	char str[20]={};
	gets(str);
	for(int i=0;i<ma_count;i++)
	{
		if(strcmp(ma[i].name,str)==0 && ma[i].index!=1)
		{
			strcpy(ma[i].password,"123456");
			puts("重置成功");
			anykey_continue();
			return ;
		}
		
	}
	anykey_continue();
} 
//解鎖管理員賬號
void unlock_manager(void )
{
	system("clear");
	printf("請輸入你要解鎖的管理員的名字:\n");
	char str[20]={};
	gets(str);
	for(int i=0;i<ma_count;i++)
	{
		if(strcmp(ma[i].name,str)==0 && ma[i].index!=1)
		{
			ma[i].lock=0;
			puts("解鎖成功");
			anykey_continue();
			return ;
		}
		
	}
	anykey_continue();

不足之處和收穫:

不足的地方有很多,比如超級管理員如果忘記密碼之後的功能改如何實現,剛開始寫的時候非常的簡單,寫的也很快,最開始的版本我還使用了goto,因為我考慮到如果需要刪除的人數不只有一個,所以我使用if然後進行判斷是否要繼續,在通過goto回到原來的函式遍歷中,後來在隊友的幫助提醒下看到其實可以這樣寫,程式碼簡單而且效率高,對於小白的我來說,簡簡單單的一段程式碼對於我來說最後完成還需要很多的修改,特別是忘記;{}等等問題的存在,所以小組分工完成我覺得是我們在未來接觸社會前的練習,我們可以去讀懂別人的程式碼並汲取他人的長處,他人在寫其他程式碼的優點,也鍛鍊了我們的團隊配合問題,對於我來說,可能在專案中做出的貢獻會是最少的,但是我的收穫一定是最大的,因為我需要去學習的地方很多,漸漸的從小白開始啟航。
這是我寫超級管理員的一段程式碼,我覺得c語言,c++,嵌入式一步一步的深入,對我來說任重而道遠,前路漫漫,革命尚未成功,同志仍須努力。hahahahhah。。。。。。。。