設(shè)計(jì)課題一:班級成績管理系統(tǒng)
成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供滁州網(wǎng)站建設(shè)、滁州做網(wǎng)站、滁州網(wǎng)站設(shè)計(jì)、滁州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、滁州企業(yè)網(wǎng)站模板建站服務(wù),十多年滁州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
一、 問題描述:
對一個有N個學(xué)生的班級,每個學(xué)生有M門課程。該系統(tǒng)實(shí)現(xiàn)對班級成績的錄入、顯示、修改、排序、保存等操作的管理。
二、功能要求:
1、本系統(tǒng)采用一個結(jié)構(gòu)體數(shù)組,每個數(shù)據(jù)的結(jié)構(gòu)應(yīng)當(dāng)包括:學(xué)號、姓名、M門課程名稱。
2、本系統(tǒng)顯示這樣的菜單:
請選擇系統(tǒng)功能項(xiàng):
a、 成績錄入
b、 成績顯示
c、 成績保存
d、 成績排序
e、 成績修改(要求先輸入密碼)
f、 成績統(tǒng)計(jì)
(1) 顯示每門課程成績最高的學(xué)生的基本信息
(2) 顯示每門課程的平均成績
(3) 顯示超過某門課程平均成績的學(xué)生人數(shù)
g、 退出系統(tǒng)
3、執(zhí)行一個具體的功能之后,程序?qū)⒅匦嘛@示菜單。
4、將學(xué)生成績保存到文件中。
三、算法提示:
1、數(shù)據(jù)結(jié)構(gòu):結(jié)構(gòu)體類型數(shù)組。
2、數(shù)據(jù)庫結(jié)構(gòu):下表構(gòu)成該系統(tǒng)的基本數(shù)據(jù)庫。
姓名 學(xué)號 課程名稱1 課程名稱2 ●●●●●●
char Char float float
四、測試數(shù)據(jù):
學(xué)生人數(shù)N=10
課程門數(shù)M=4
課程名:數(shù)學(xué)、語文、英語、政治
五、其它
對該系統(tǒng)有興趣的同學(xué)可以在實(shí)現(xiàn)上述基本功能后,完善系統(tǒng)的其它功能。
問題補(bǔ)充:
今天誰能給我答案啊?。。。。。?!急急!?。。。。?!
提問者: 342123465 - 一級
最佳答案
C語言課程設(shè)計(jì)報(bào)告—班級成績管理系統(tǒng)
需要分析:
學(xué)生成績管理系統(tǒng)有13種功能。把這13個功能做成13個子函數(shù)。在主函當(dāng)數(shù)中設(shè)計(jì)一個菜單對這13個子數(shù)進(jìn)行管理。來實(shí)現(xiàn)對整個系統(tǒng)的操作。
根據(jù)課題的要求。每一個學(xué)生的包括姓名(char)、學(xué)號(char)、M門課程的成績(float).再加上系統(tǒng)功能上的要求每一學(xué)生的信息還要總分和名次等。所以自然的想到要用結(jié)構(gòu)體來定義每一個學(xué)生的信息結(jié)構(gòu)。然后用鏈表把它們組成一個有序的整體。用對鏈表的操作來實(shí)現(xiàn)對所有學(xué)生信息的統(tǒng)一管理(成績顯示、成績排序、成績修改等)。最后為了以后按照處理后的順序保存到文件中。
. 各函數(shù)的功能:
概要設(shè)計(jì):
程序的模塊組成:
主 函 數(shù): int main()
新建函數(shù):STUDENT *init()
輸入函數(shù) :STUDENT *create()
顯示函數(shù): void print(STUDENT *head)
刪除函數(shù): STUDENT *delete(STUDENT *head)
按名字尋找函數(shù): void lookup(STUDENT *head)
保存函數(shù): void save(STUDENT *head)
按總分排序函數(shù): STUDENT *sort(STUDENT *head)
計(jì)算總分和均分函數(shù): void computer(STUDENT *h)
修改函數(shù): STUDENT *Modify(STUDENT *head,STUDENT *new)
按學(xué)號排序函數(shù): STUDENT *index(STUDENT *h)
菜單函數(shù):int menu_select()
各個函數(shù)的主要功能:
輸入函數(shù): 隨時輸入數(shù)據(jù)。
菜單函數(shù):顯示系統(tǒng)主菜單。
顯示函數(shù): 顯示所有學(xué)生的信息。
尋找函數(shù): 方便學(xué)生查找自己的成績。
刪除函數(shù): 刪除某學(xué)生的信息。
排序函數(shù): 按總成績排序。
按學(xué)號排序函數(shù): 按學(xué)號排序。
插入函數(shù): 可以插入新的信息。
保存函數(shù): 保存好學(xué)生成績,以免丟失。
統(tǒng)計(jì)函數(shù):
l 顯示每門課程成績最高的學(xué)生的基本信息。
l 顯示每門課程的平均成績。
l 顯示超過某門課程平均成績的學(xué)生人數(shù)。
課題的功能模塊的劃分:
開始
菜單界面
功能選擇
初始化函數(shù)
輸入學(xué)生信息
刪除學(xué)生信息
顯示學(xué)生信息
查找學(xué)生信息
按成績排序
保存到文件
從文件讀數(shù)據(jù)
插入學(xué)生成績
分類合計(jì)
退出系統(tǒng)
結(jié)束
詳細(xì)設(shè)計(jì): 整個系統(tǒng)除了主函數(shù)外,另外還有14個函數(shù),實(shí)現(xiàn)八大功能:輸入功能、顯示功能、查找功能、排序功能、插入功能、保存功能、讀取功能。各個函數(shù)的詳細(xì)設(shè)計(jì)說明分別如下:
主函數(shù) main()
利用無限次循環(huán)for(;;)和swithch()實(shí)現(xiàn)各函數(shù)的調(diào)用,系統(tǒng)根據(jù)輸入的數(shù)字選項(xiàng)來調(diào)用相應(yīng)的函數(shù)。
菜單選擇函數(shù) int menu_select()
這是一個無參函數(shù),主要實(shí)現(xiàn)“功能選擇”的界面,在這個界面里有顯示系統(tǒng)的九大功能,根據(jù)每個功能前面的序號進(jìn)行選擇。等執(zhí)行完每一個函數(shù)功能后,返回菜單。
代碼設(shè)計(jì): 初始化函數(shù) STUDENT *init()
這是一個無參函數(shù),里面只有兩個語句,它的作用是使鏈表初始化,使head的值為NULL和一個清屏語句。比如:沒有這個函數(shù)的話,在你沒有輸入任何數(shù)據(jù)的情況下,去執(zhí)行顯示功能的時候會顯示一些亂碼!
輸入記錄函數(shù) STUDENT *create() 這是一個無參函數(shù),用來執(zhí)行學(xué)生成績記錄的輸入,當(dāng)學(xué)生為@時停止輸入,函數(shù)結(jié)束后,帶回一個鏈表頭的指針指向一下個學(xué)生的信息插在表頭。
N-S流程圖如下:
head=NULL無條件循環(huán)
指針p指向新開辟的單元
指針p是否為空
是 否
輸入學(xué)號p-num
輸出 p-num是否為@
內(nèi)存 是 否
溢出 輸入姓名p-name
停止 for(i=0;i3;i++)
輸入 輸入成績
返回 p-sum=s;
菜單 p-average=(float)s/3;
顯示記錄函數(shù) void print(STUDENT *head)
這是一個不返回值的有參函數(shù),形參為“鏈表頭的指針”,負(fù)責(zé)對全部學(xué)生成績記錄的輸出,不足之處就是不能對學(xué)生成績進(jìn)行分頁顯示。
算法:先將p結(jié)點(diǎn)的指針指向第一個結(jié)點(diǎn),將p結(jié)點(diǎn)(即第一個結(jié)點(diǎn))的數(shù)據(jù)輸出。然后再將p結(jié)點(diǎn)的指針指向p指針的的指針(即下一結(jié)點(diǎn)),將p結(jié)點(diǎn)(即第一結(jié)點(diǎn))的數(shù)據(jù)輸出。重復(fù)執(zhí)行此步聚直到p指針指向NULL為止。
N-S流程圖如下:
p=head,使指向第一個結(jié)點(diǎn)
輸出p所指向的結(jié)點(diǎn)
p指向一下個結(jié)點(diǎn)
當(dāng)p指的不是表尾
程序調(diào)試:
由于本課題中的許多知識點(diǎn)都沒有學(xué)過都要靠自己到課外的資料中去查找。在用的時候難免出現(xiàn)這樣那樣的錯誤。如開始設(shè)計(jì)出來的菜單不是預(yù)想的那樣,而是總個窗中出現(xiàn)混亂。解決的這個問題的辦法是調(diào)整。最后還是老師幫我?guī)臀覀冋业搅藛栴}的所在——for 循環(huán)的次超過了鏈表中結(jié)點(diǎn)的數(shù)量。再就是自定義函數(shù)時由于課本的概念不清楚,多寫了空格鍵,以至函數(shù)調(diào)用不出來。又如:在設(shè)計(jì)修改學(xué)生信息時的密密碼時。當(dāng)用戶發(fā)現(xiàn)輸入密碼錯誤按了退格鍵后,因?yàn)椤?”并沒有消去。導(dǎo)致用戶再次按退格鍵,又出現(xiàn)前面的情況。最終導(dǎo)致輸入密碼錯誤。所以用了兩次退格鍵:
在對鏈表操作時,要特別鏈表指針的移動(p=p-next)和鏈表尾的判斷 (p= =NULL)。沒有指針的移動,就很容易出現(xiàn)死循環(huán)。而在運(yùn)行過程中不能控制。所以你就會認(rèn)為是死機(jī)。如果沒有鏈表尾的判斷。就會在運(yùn)行過程出現(xiàn)想不到的錯誤。如:在顯示鏈表信息時,后面就會出現(xiàn)亂碼。
一個系統(tǒng)的菜單和提示信息非常重要。如果沒有這些用戶根本不知道怎么用你設(shè)計(jì)的這個系統(tǒng)。在設(shè)計(jì)的調(diào)試過程中也無法順利的完成調(diào)試工作。有了一個清晰簡單的菜單和一些提示信息這后,調(diào)試過程完成的非常順利。
予我耐心解答的老師和同學(xué),是他們?yōu)槲倚〕绦虻某晒ζ鸬搅岁P(guān)鍵性的作用,那么多個日夜,如此多的困難,同學(xué)們勤懇塌實(shí),從開始到結(jié)束,沒有顯出一點(diǎn)倦意,始終熱情高漲,我感謝這種氛圍,感謝學(xué)校提供的良好條件。
回顧起此次課程設(shè)計(jì),至今我仍感慨頗多,的確,從拿到題目到完成整個編程,從理論到實(shí)踐,在整整半個學(xué)期的日子里,可以學(xué)到很多很多的東西,同時不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實(shí)際動手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,比如說結(jié)構(gòu)體……通過這次課程設(shè)計(jì)之后,一定把以前所學(xué)過的知識重新溫故。
本次課程設(shè)計(jì)結(jié)束了,對于我的影響很大。我通過這次實(shí)踐學(xué)到了許多知識。學(xué)到了設(shè)計(jì)一個簡單的系統(tǒng)。要注意哪些方面。也使我知道自己哪些方面做得還不夠。
但我出總結(jié)出了一點(diǎn)點(diǎn)的經(jīng)驗(yàn)如下:
1、要對系統(tǒng)的功能和要求做出詳細(xì)的分析,并合理分解任務(wù)。
2、把分解出來的子任務(wù),做給一個相對獨(dú)立的模塊。
3、在設(shè)計(jì)一個模塊之前,要簡單構(gòu)想一下總界面的顯視情況。
4、針對構(gòu)想出來的界面進(jìn)行程序的編寫。
最后,感謝老師您對我的指導(dǎo)和從百忙中抽空看我的設(shè)計(jì),謝謝!
附件:
源程序:
#include "stdio.h" /*I/O函數(shù)*/
#include "stdlib.h" /*其它說明*/
#include "string.h" /*字符串函數(shù)*/
#include "conio.h" /*屏幕操作函數(shù)*/
#include "mem.h" /*內(nèi)存操作函數(shù)*/
#include "ctype.h" /*字符操作函數(shù)*/
#include "alloc.h" /*動態(tài)地址分配函數(shù)*/
#include "dos.h"
#define N 4 /*定義常數(shù)*/
typedef struct z1 /*定義數(shù)據(jù)結(jié)構(gòu)*/
{
char no[12];
char name[20];
int score[N];
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
/*以下是函數(shù)原型*/
STUDENT *init(); /*初始化函數(shù)*/
STUDENT *create(); /*創(chuàng)建鏈表*/
STUDENT *delete(STUDENT *h); /*刪除記錄*/
void print(STUDENT *h); /* 顯示所有記錄*/
void lookup(STUDENT *h); /*查找*/
void save(STUDENT *h); /*保存*/
STUDENT *load(); /*讀入記錄*/
void computer(STUDENT *h); /*計(jì)算總分和均分*/
STUDENT *Modify(STUDENT *h); /*修改記錄*/
void append(); /*追加記錄*/
STUDENT *sort(STUDENT *h); /*按總分排序*/
STUDENT *index(STUDENT *h); /*按學(xué)號排序*/
int menu_select(); /*菜單函數(shù)*/
/******主函數(shù)開始*******/
main()
{
int i;
STUDENT *head; /*鏈表定義頭指針*/
printf("\n\n\n\n\n\n\n\n\n");
printf(" * * ******* * ***** ***** * * ******* \n");
printf(" * * * * * * * ** * * * \n");
printf(" * * * * ******* * * * * * *** * ******* \n" );
printf(" * * * * * * * * * * * * * \n");
printf(" * * ******* ******* ***** * *** * * * ******* \n");
printf("\n");
printf("\n");
printf("\n");
sleep(2);
head=init(); /*初始化鏈表*/
clrscr(); /*清屏*/
for(;;) /*無限循環(huán)*/
{
switch(menu_select()) /*調(diào)用主菜單函數(shù),返回值整數(shù)作開關(guān)語句的條件*/
{ /*值不同,執(zhí)行的函數(shù)不同,break 不能省略*/
case 0:head=init();break; /*執(zhí)行初始化*/
case 1:head=create();break; /*創(chuàng)建鏈表*/
case 2:print(head);break; /*顯示全部記錄*/
case 3:head=delete(head);break; /*刪除記錄*/
case 4:lookup(head);break; /*按名字查找記錄*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*讀文件*/
case 7:computer(head);break; /*計(jì)算總分和均分*/
case 8:head=Modify(head); break; /*修改記錄,一般會插在表尾*/
case 9:head=sort(head);break; /*按部分排序*/
case 10:append();break; /*追加記錄*/
case 11:head=index(head);break; /*按學(xué)號排序*/
case 12: exit(0); /*如菜單返回值為12程序結(jié)束*/
}
}
}
/*菜單函數(shù),返回值為整數(shù)*/
menu_select()
{
char *menu[]={"***************MENU***************", /*定義菜單字符串?dāng)?shù)組*/
" 00. init list", /*初始化*/
" 01. Enter list", /*輸入記錄*/
" 02. print list ", /*顯示單鏈表中所有記錄*/
" 03. Delete a record from list", /*從表中刪除記錄*/
" 04. Search record on name", /*按照姓名查找記錄*/
" 05. Save the file", /*將單鏈表中記錄保存到文件中*/
" 06. Load the file", /*從文件中讀入記錄*/
" 07. compute the score", /*計(jì)算所有學(xué)生的總分和均分*/
" 08. Modify an information ", /*修改某學(xué)號的信息*/
" 09. sort to make new file", /*排序*/
" 10. append record to file", /*追加記錄到文件中*/
" 11. index on nomber", /*按學(xué)號排序*/
" 12. Quit"}; /*退出*/
char s[3]; /*以字符形式保存選擇號*/
int c,i; /*定義整形變量*/
gotoxy(1,1); /*移動光標(biāo)*/
textcolor(YELLOW); /*設(shè)置文本顯示顏色為黃色*/
textbackground(BLUE); /*設(shè)置背景顏色為藍(lán)色*/
gotoxy(10,2); /*移動光標(biāo)*/
putch(0xc9); /*輸出左上角邊框┏*/
for(i=1;i44;i++)
putch(0xcd); /*輸出上邊框水平線*/
putch(0xbb); /*輸出右上角邊框 ┓*/
for(i=3;i20;i++)
{
gotoxy(10,i);putch(0xba); /*輸出左垂直線*/
gotoxy(54,i);putch(0xba); /*輸出右垂直線*/
}
gotoxy(10,20);putch(0xc8); /*輸出左上角邊框┗*/
for(i=1;i44;i++)
putch(0xcd); /*輸出下邊框水平線*/
putch(0xbc); /*輸出右下角邊框┛*/
window(11,3,53,19); /* 制作顯示菜單的窗口,大小根據(jù)菜單條數(shù)設(shè)計(jì)*/
clrscr(); /*清屏*/
for(i=0;i16;i++) /*輸出主菜單數(shù)組*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK); /*設(shè)置背景顏色為黑色*/
window(1,1,80,25); /*恢復(fù)原窗口大小*/
gotoxy(10,21); /*移動光標(biāo)*/
do{printf("\n make by wenwei");
printf("\n Enter you choice(0~13):"); /*在菜單窗口外顯示提示信息*/
scanf("%s",s); /*輸入選擇項(xiàng)*/
c=atoi(s); /*將輸入的字符串轉(zhuǎn)化為整形數(shù)*/
}while(c0||c14); /*選擇項(xiàng)不在0~14之間重輸*/
return c; /*返回選擇項(xiàng),主程序根據(jù)該數(shù)調(diào)用相應(yīng)的函數(shù)*/
}
STUDENT *init()
{ clrscr();
return NULL;
}
/*創(chuàng)建鏈表*/
STUDENT *create()
{
int i; int s;
STUDENT *h=NULL,*info; /* STUDENT指向結(jié)構(gòu)體的指針*/
clrscr();
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/
if(!info) /*如果指針info為空*/
{
printf("\nout of memory"); /*輸出內(nèi)存溢出*/
return NULL; /*返回空指針*/
}
inputs("enter no:",info-no,11); /*輸入學(xué)號并校驗(yàn)*/
if(info-no[0]=='@') { clrscr();break; } /*如果學(xué)號首字符為@則結(jié)束輸入,清屏后返回*/
inputs("enter name:",info-name,15); /*輸入姓名,并進(jìn)行校驗(yàn)*/
printf("please input %d score \n",N); /*提示開始輸入成績*/
s=0; /*計(jì)算每個學(xué)生的總分,初值為0*/
for(i=0;iN;i++) /*N門課程循環(huán)N次*/
{
do{
printf("score%d:",i+1); /*提示輸入第幾門課程*/
scanf("%d",info-score[i]); /*輸入成績*/
if(info-score[i]100||info-score[i]0) /*確保成績在0~100之間*/
printf("bad data,repeat input\n"); /*出錯提示信息*/
}while(info-score[i]100||info-score[i]0);
s=s+info-score[i]; /*累加各門課程成績*/
}
info-sum=s; /*將總分保存*/
info-average=(float)s/N; /*求出平均值*/
info-order=0; /*未排序前此值為0*/
info-next=h; /*將頭結(jié)點(diǎn)做為新輸入結(jié)點(diǎn)的后繼結(jié)點(diǎn)*/
h=info; /*新輸入結(jié)點(diǎn)為新的頭結(jié)點(diǎn)*/
clrscr();
}
return(h); /*返回頭指針*/
}
/*輸入字符串,并進(jìn)行長度驗(yàn)證*/
inputs(char *prompt, char *s, int count)
{
char p[255];
do{
printf(prompt); /*顯示提示信息*/
scanf("%s",p); /*輸入字符串*/
if(strlen(p)count)printf("\n too long! \n"); /*進(jìn)行長度校驗(yàn),超過count值重輸入*/
}while(strlen(p)count);
strcpy(s,p); /*將輸入的字符串拷貝到字符串s中*/
}
/*輸出鏈表中結(jié)點(diǎn)信息*/
void print(STUDENT *h)
{
int i=0; /* 統(tǒng)計(jì)記錄條數(shù)*/
STUDENT *p; /*移動指針*/
clrscr(); /*清屏*/
p=h; /*初值為頭指針*/
printf("\n\n\n*********************************STUDENT************************************\n");
printf("|rec|nO | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");
printf("|---|----------|---------------|----|----|----|----|--------|--------|-----|\n");
while(p!=NULL) /*只要p不是尾結(jié)點(diǎn),就輸出記錄*/
{
i++;
printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6.2f | %3d |\n", i, p-no,p-name,p-score[0],p-score[1],p-score[2],p-score[3],p-sum,p-average,p-order);
p=p-next;
}
printf("***********************************end**************************************\n");
getch(); /*輸入任一鍵返回主菜單*/
clrscr(); /*清屏*/
}
/*刪除記錄*/
STUDENT *delete(STUDENT *h)
{
STUDENT *p,*q; /*p為查找到要刪除的結(jié)點(diǎn)指針,q為其前驅(qū)指針*/
char s[12]; /*存放學(xué)號*/
char *pass="wenwei28";
char a[20],b=NULL;
int i=0;
clrscr();
printf("Input your password:");
while((i20)(b!='\r'))
{ b=getch(); /*無回顯輸入*/
if(b==8)
{ if(i0)
{a[--i]=NULL;
putchar(8); /*退格鍵*/
putchar(' '); /*以空格代替*/
putchar(8);
}
else putchar(7); /*沒有任何字符的退格,響鈴警告*/
}
else if(b!='\r')
{ a[i++]=b; /*只要不是退格和回車就接受*/
putchar('*');
}
else
{a[i]=NULL; break; /*密碼輸入完了,記得加個NULL到后面*/
}
}
if(strcmp(a,pass)!=0)
{clrscr();
printf("Password is mistake Tow seconds to return!");
sleep(2);clrscr();return h;
}
else {printf("Password is OK! Welcome to come!"); sleep(3);
}
clrscr(); /*清屏*/
printf("please deleted no\n"); /*顯示提示信息*/
scanf("%s",s); /*輸入要刪除記錄的學(xué)號*/
q=p=h; /*給q和p賦初值頭指針*/
while(strcmp(p-no,s)p!=NULL) /*當(dāng)記錄的學(xué)號不是要找的,或指針不為空時*/
{
q=p; /*將p指針值賦給q作為p的前驅(qū)指針*/
p=p-next; /*將p指針指向下一條記錄*/
}
if(p==NULL) /*如果p為空,說明鏈表中沒有該結(jié)點(diǎn)*/
{ printf("\nlist no %s student\n",s);sleep(2);clrscr();return h;}
else /*p不為空,顯示找到的記錄信息*/
{
printf("*********************************have found********************************\n");
printf("|no | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");
printf("|------------|---------------|----|----|----|----|--------|--------|-----|\n");
printf("|%-12s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6-5.2f | %3d |\n", p-no,
p-name,p-score[0],p-score[1],p-score[ q=p; /*保存當(dāng)前結(jié)點(diǎn)的指針,作為下一結(jié)點(diǎn)的前驅(qū)*/
p=p-next; /*指針后移,新讀入數(shù)據(jù)鏈到當(dāng)前表尾*/
}
q-next=NULL; /*最后一個結(jié)點(diǎn)的后繼指針為空*/
fclose(fp); /*關(guān)閉文件*/
printf("---You have success read data from file!!!---\n");
getch(); /*按任意鍵返回主菜單*/
clrscr();
return h; /*返回頭指針*/
}
/*成績統(tǒng)計(jì)*/
void computer(STUDENT *h)
{
STUDENT *p,*t,*q; /*定義移動指針*/
float saverage[N]={0}; /*均分初值為0*/
int i;
clrscr();
for (i=0;iN;i++)
{ int n=0,j=0; /*保存記錄條數(shù)初值為0*/
long s=0; /*總分初值為0*/
p=h; /*從頭指針開始*/
while(p!=NULL) /*當(dāng)p不為空時處理*/
{
s+=p-score[i]; /*累加總分*/
j++; /*統(tǒng)計(jì)記錄條數(shù)*/
p=p-next; /*指針后移*/
h; /*返回頭指針
}
#includestdio.h
#includestdlib.h
#includestring.h
struct stud_node{
char adree[50];
char birthday[20];
int yuwen,shuxue,yingyu,wuli;
char name[20];
char xingbie[10],minzu[10],guoji[10],xueli[8];
int telephone[13],schooltelephone[13],hometelephone[13];
struct stud_node * next;
};
struct stud_node * xinjian();/*新建*/
struct stud_node * charu(struct stud_node *head);/*插入*/
struct stud_node * bianji(struct stud_node *head);/*編輯*/
void chaxun(struct stud_node *head);/*查詢*/
struct stud_node * shanchu(struct stud_node *head);/*刪除*/
void dayin(struct stud_node *head);/*打印*/
struct stud_node * zairu();/*載入*/
char * int_char(int num);
int main(void)
{
printf("\n歡迎使用學(xué)生信息管理系統(tǒng)\n \n");
printf("如果已經(jīng)保存過學(xué)生信息,請使用載入功能將信息輸入到程序\n");
int choice;
char yes_no[2];
struct stud_node *head=NULL;
do{
printf("1:新建,2:插入,3:編輯,4:查詢,5:刪除,6:打印,7:載入,0:退出 \n");
printf("請輸入您的選擇:");
scanf("%d",choice);
switch(choice){
case 1:
printf("\n新建將刪除以前的信息\n");
printf("\n確認(rèn)繼續(xù)嗎?(y/n)");
scanf("%s",yes_no);
if(strcmp(yes_no,"n")==0){
printf("\n您取消了新建\n\n");
break;
}
else
head=xinjian();
break;
case 2:
head=charu(head);
break;
case 3:
head=bianji(head);
break;
case 4:
chaxun(head);
break;
case 5:
head=shanchu(head);
break;
case 6:
dayin(head);
break;
case 7:
head=zairu();
break;
case 0:
break;
default:
printf("請輸入正確的選擇\n\n");
break;
}
}while(choice!=0);
return 0;
}
struct stud_node * xinjian()
{
printf("輸入名字時輸入“0”退出新建\n");
struct stud_node *head,*p,*tail,pt;
FILE *fnum,*fstud;
int i,num=0;
char num_[15];
head=tail=NULL;
int size=sizeof(struct stud_node);
do{
p=(struct stud_node *)malloc(size);
printf("請輸入名字:");
scanf("%s",pt.name);
if((i=strcmp(pt.name,"0"))==0)
break;
printf("請輸入人信息(性別、民族、國籍、學(xué)歷):");
scanf("%s%s%s%s",pt.xingbie,pt.minzu,pt.guoji,pt.xueli);
printf("請輸入個人地址、出生日期:");
scanf("%s%s",pt.adree,pt.birthday);
printf("請輸入學(xué)科成績(語文、數(shù)學(xué)、英語、物理):");
scanf("%d%d%d%d",pt.yuwen,pt.shuxue,pt.yingyu,pt.wuli);
printf("請輸入聯(lián)系方式(手機(jī)、家庭電話、學(xué)校電話):");
scanf("%s%s%s",pt.telephone,pt.hometelephone,pt.schooltelephone);
num++;
if((fnum=fopen("num_.txt","w+"))==NULL){
printf("文件打開失敗\n");
exit(0);
}
fprintf(fnum,"%d",num);
fclose(fnum);
fnum=fopen("num_.txt","r");
fscanf(fnum,"%s",num_);
fclose(fnum);
strcat(num_,".txt");
if((fstud=fopen(num_,"w"))==NULL){
printf("文件打開失敗\n");
exit(0);
}
fprintf(fstud,"%s ",pt.name);
fprintf(fstud,"%s %s %s %s ",pt.xingbie,pt.minzu,pt.guoji,pt.xueli);
fprintf(fstud,"%s %s ",pt.adree,pt.birthday);
fprintf(fstud,"%d %d %d %d ",pt.yuwen,pt.shuxue,pt.yingyu,pt.wuli);
fprintf(fstud,"%s %s %s",pt.telephone,pt.schooltelephone,pt.hometelephone);
fclose(fstud);
(*p)=pt;
p-next=NULL;
if(head==NULL)
head=p;
else
tail-next=p;
tail=p;
}while(i!=0);
FILE *fp;
if((fp=fopen("num.txt","w"))==NULL){
printf("文件打開失敗\n");
exit(0);
}
fprintf(fp,"%d",num);
if(fclose(fp)){
printf("文件打開失敗\n");
exit(0);
}
return head;
}
struct stud_node *bianji(struct stud_node *head)
{
struct stud_node *ptr;
char name[20];
printf("請輸入要更改的學(xué)生姓名:");
scanf("%s",name);
for(ptr=head;strcmp(name,ptr-name);ptr=ptr-next)
;
printf("該學(xué)生的信息是:\n");
printf("姓名:%s\n",ptr-name);
printf("人信息(性別、民族、國籍、學(xué)歷):%s %s %s %s\n",ptr-xingbie,ptr-minzu,ptr-guoji,ptr-xueli);
printf("個人地址、出生日期:%s %s\n",ptr-adree,ptr-birthday);
printf("學(xué)科成績(語文:%d,數(shù)學(xué):%d,英語:%d,物理:%d)\n",ptr-yuwen,ptr-shuxue,ptr-yingyu,ptr-wuli);
printf("聯(lián)系方式(手機(jī):%s,家庭電話:%s,學(xué)校電話:%s)\n",ptr-telephone,ptr-hometelephone,ptr-schooltelephone);
printf("\n\n");
printf("請重新輸入學(xué)生信息!\n");
printf("請輸入姓名:");
scanf("%s",ptr-name);
printf("請輸入人信息(性別、民族、國籍、學(xué)歷):");
scanf("%s%s%s%s",ptr-xingbie,ptr-minzu,ptr-guoji,ptr-xueli);
printf("請輸入個人地址、出生日期:");
scanf("%s%s",ptr-adree,ptr-birthday);
printf("請輸入學(xué)科成績(語文、數(shù)學(xué)、英語、物理):");
scanf("%d%d%d%d",ptr-yuwen,ptr-shuxue,ptr-yingyu,ptr-wuli);
printf("請輸入聯(lián)系方式(手機(jī)、家庭電話、學(xué)校電話):");
scanf("%s%s%s",ptr-telephone,ptr-hometelephone,ptr-schooltelephone);
int i;
char cnum[10],name1[20];
FILE *fp,*fstud;
for(i=1;strcmp(name1,name);i++){
strcpy(cnum,int_char(i));
strcat(cnum,".txt");
fp=fopen(cnum,"r");
fscanf(fp,"%s ",name1);
}
fstud=fopen(cnum,"w");
fprintf(fstud,"%s ",ptr-name);
fprintf(fstud,"%s %s %s %s ",ptr-xingbie,ptr-minzu,ptr-guoji,ptr-xueli);
fprintf(fstud,"%s %s ",ptr-adree,ptr-birthday);
fprintf(fstud,"%d %d %d %d ",ptr-yuwen,ptr-shuxue,ptr-yingyu,ptr-wuli);
fprintf(fstud,"%s %s %s",ptr-telephone,ptr-schooltelephone,ptr-hometelephone);
fclose(fstud);
printf("\n修改成功\n\n");
return head;
}
void chaxun(struct stud_node *head)
{
struct stud_node *ptr;
char name[20];
if(head==NULL){
printf("\n暫無學(xué)生信息\n");
return;
}
printf("請輸入要查詢的學(xué)生的姓名:");
scanf("%s",name);
for(ptr=head;ptr;ptr=ptr-next)
if(strcmp(ptr-name,name)==0)
break;
if(ptr==NULL){
printf("\n不存在該學(xué)生的信息\n");
return;
}
else{
printf("該學(xué)生的信息是:\n");
printf("姓名:%s\n",ptr-name);
printf("人信息(性別、民族、國籍、學(xué)歷):%s %s %s %s\n",ptr-xingbie,ptr-minzu,ptr-guoji,ptr-xueli);
printf("個人地址、出生日期:%s %s\n",ptr-adree,ptr-birthday);
printf("學(xué)科成績(語文:%d,數(shù)學(xué):%d,英語:%d,物理:%d)\n",ptr-yuwen,ptr-shuxue,ptr-yingyu,ptr-wuli);
printf("聯(lián)系方式(手機(jī):%s,家庭電話:%s,學(xué)校電話:%s)\n",ptr-telephone,ptr-hometelephone,ptr-schooltelephone);
printf("\n");
return;
}
}
struct stud_node *shanchu(struct stud_node *head)
{
struct stud_node *ptr,*p,*pt;
char name[20],yes_no[2];
printf("請輸入要刪除的學(xué)生的姓名:");
scanf("%s",name);
printf("確認(rèn)刪除嗎?(y/n)");
scanf("%s",yes_no);
if(strcmp(yes_no,"n")==0){
printf("\n您取消了刪除\n\n");
return head;
}
p=head;
for(ptr=head;ptr;ptr=ptr-next)
if(strcmp(ptr-name,name)==0)
break;
if(ptr==NULL){
printf("\n沒有記錄該學(xué)生的信息\n");
return head;
}
pt=ptr-next;
if(ptr==head){
if(head-next==NULL)
head=NULL;
else{
ptr=head;
head=head-next;
free(ptr);
}
}
else{
for(ptr=head-next;strcmp(ptr-name,name);ptr=ptr-next,p=p-next)
;
if(ptr-next==NULL){
ptr=NULL;
}
else{
p-next=ptr-next;
ptr=NULL;
}
}
FILE *fnum,*fstud;
char fname[20],cnum[10];
int num,i;
fnum=fopen("num.txt","r+");
fscanf(fnum,"%d",num);
for(i=1;i=num;i++){
strcpy(cnum,int_char(i));
strcat(cnum,".txt");
fstud=fopen(cnum,"r");
fscanf(fstud,"%s ",fname);
fclose(fstud);
if(strcmp(fname,name)==0)
break;
}
if(i!=num){
for(;inum;i++){
strcpy(cnum,int_char(i));
strcat(cnum,".txt");
fstud=fopen(cnum,"w");
fprintf(fstud,"%s ",pt-name);
fprintf(fstud,"%s %s %s %s ",pt-xingbie,pt-minzu,pt-guoji,pt-xueli);
fprintf(fstud,"%s %s ",pt-adree,pt-birthday);
fprintf(fstud,"%d %d %d %d ",pt-yuwen,pt-shuxue,pt-yingyu,pt-wuli);
fprintf(fstud,"%s %s %s",pt-telephone,pt-schooltelephone,pt-hometelephone);
fclose(fstud);
}
}
num--;
rewind(fnum);
fprintf(fnum,"%d",num);
fclose(fnum);
printf("\n刪除成功\n\n");
return head;
}
void dayin(struct stud_node *head)
{
struct stud_node *ptr;
if(head==NULL){
printf("\n暫沒輸入學(xué)生信息,請輸入\n\n");
return;
}
for(ptr=head;ptr;ptr=ptr-next){
printf("姓名:%s\n",ptr-name);
printf("人信息(性別、民族、國籍、學(xué)歷):%s %s %s %s\n",ptr-xingbie,ptr-minzu,ptr-guoji,ptr-xueli);
printf("個人地址、出生日期:%s %s\n",ptr-adree,ptr-birthday);
printf("學(xué)科成績(語文:%d,數(shù)學(xué):%d,英語:%d,物理:%d)\n",ptr-yuwen,ptr-shuxue,ptr-yingyu,ptr-wuli);
printf("聯(lián)系方式(手機(jī):%s,家庭電話:%s,學(xué)校電話:%s)\n",ptr-telephone,ptr-hometelephone,ptr-schooltelephone);
printf("\n\n");
}
return;
}
struct stud_node * charu(struct stud_node *head)
{
struct stud_node *ptr,*p;
int size,num;
char cnum[10];
size=sizeof(struct stud_node);
p=(struct stud_node *)malloc(size);
printf("請輸入姓名:");
scanf("%s",p-name);
printf("請輸入人信息(性別、民族、國籍、學(xué)歷):");
scanf("%s%s%s%s",p-xingbie,p-minzu,p-guoji,p-xueli);
printf("請輸入個人地址、出生日期:");
scanf("%s%s",p-adree,p-birthday);
printf("請輸入學(xué)科成績(語文、數(shù)學(xué)、英語、物理):");
scanf("%d%d%d%d",p-yuwen,p-shuxue,p-yingyu,p-wuli);
printf("請輸入聯(lián)系方式(手機(jī)、家庭電話、學(xué)校電話):");
scanf("%s%s%s",p-telephone,p-hometelephone,p-schooltelephone);
FILE *fnum,*fstud;
fnum=fopen("num.txt","r");
fscanf(fnum,"%d",num);
num++;
strcpy(cnum,int_char(num));
fclose(fnum);
fnum=fopen("num.txt","w");
fprintf(fnum,"%d",num);
fclose(fnum);
strcat(cnum,".txt");
fstud=fopen(cnum,"w");
fprintf(fstud,"%s ",p-name);
fprintf(fstud,"%s %s %s %s ",p-xingbie,p-minzu,p-guoji,p-xueli);
fprintf(fstud,"%s %s ",p-adree,p-birthday);
fprintf(fstud,"%d %d %d %d ",p-yuwen,p-shuxue,p-yingyu,p-wuli);
fprintf(fstud,"%s %s %s",p-telephone,p-schooltelephone,p-hometelephone);
fclose(fstud);
if(head==NULL){
head=p;
head-next=NULL;
}
else{
for(ptr=head;ptr-next!=NULL;ptr=ptr-next)
;
ptr-next=p;
p-next=NULL;
}
printf("\n插入成功\n\n");
return head;
}
struct stud_node * zairu()
{
struct stud_node *head,*p,*tail;
int num,i,size;
char cnum[10];
head=tail=NULL;
size=sizeof(struct stud_node);
FILE *fnum,*fp;
if((fnum=fopen("num.txt","r"))==NULL){
printf("num文件打開失敗\n");
exit(0);
}
fscanf(fnum,"%d",num);
fclose(fnum);
for(i=1;i=num;i++){
p=(struct stud_node *)malloc(size);
strcpy(cnum,int_char(i));
strcat(cnum,".txt");
fp=fopen(cnum,"r");
fscanf(fp,"%s ",p-name);
fscanf(fp,"%s %s %s %s ",p-xingbie,p-minzu,p-guoji,p-xueli);
fscanf(fp,"%s %s ",p-adree,p-birthday);
fscanf(fp,"%d %d %d %d ",p-yuwen,p-shuxue,p-yingyu,p-wuli);
fscanf(fp,"%s %s %s",p-telephone,p-schooltelephone,p-hometelephone);
fclose(fp);
p-next=NULL;
if(head==NULL)
head=p;
else
tail-next=p;
tail=p;
}
printf("\n載入成功\n\n");
return head;
}
char * int_char(int num){ /*將數(shù)字轉(zhuǎn)化成字符串*/
char cnum[10];
FILE *fp;
fp=fopen("int_char_num.txt","w");
fprintf(fp,"%d",num);
fclose(fp);
fp=fopen("int_char_num.txt","r");
fscanf(fp,"%s",cnum);
fclose(fp);
return cnum;
}
和你要的不太一樣,僅作參考之用,你可以自己在基礎(chǔ)上進(jìn)行修改,思想都差不多,在vc6.0編譯的。
下附改程序的題目:
設(shè)計(jì)內(nèi)容:設(shè)計(jì)一個學(xué)生信息管理系統(tǒng),能夠?qū)W(xué)生的信息進(jìn)行管理, 編寫一個學(xué)生管理系統(tǒng),每個學(xué)生應(yīng)該包含如下信息:地址、出生日期、學(xué)科成績(語文,英語,數(shù)學(xué),物理)、個人信息(姓名,性別,民族,國籍,學(xué)歷)、聯(lián)系方式(手機(jī),家庭電話,學(xué)校電話)。
任務(wù)和要求
實(shí)現(xiàn)任意添加學(xué)生信息
實(shí)現(xiàn)刪除學(xué)生信息
實(shí)現(xiàn)編輯學(xué)生信息
實(shí)現(xiàn)查詢、保存和打印學(xué)生信息
//****************************************************************************
//**** 說明:密碼所在的文件位于c盤,文件名為1.txt。
//**** 學(xué)生基本信息最好保存在C盤,文件名為student.txt。
//****************************************************************************
#include stdio.h
#include stdlib.h
#include string.h
#include conio.h
#define N 3
struct student
{
char name[10];
char no[10];
char sex;
int age;
char bnote[100];
};
void print(bool menu)//打印基本信息
{
if (!menu)
{
printf("學(xué)生基本信息錄入 ,press 1\n");
}
else
{
printf("學(xué)生基本信息顯示 ,press 2\n");
printf("學(xué)生基本信息保存 ,press 3\n");
printf("學(xué)生基本信息刪除 ,press 4\n");
printf("學(xué)生基本信息修改 ,press 5\n");
printf("學(xué)生基本信息查詢 ,press 6\n");
}
printf("退出學(xué)生信息系統(tǒng) ,press 7\n");
}
bool Check(char pas[6])//密碼驗(yàn)證
{
FILE *fp;
char ch;
char a[7]={" "};
int i = 0;
if ((fp=fopen("c:\\1.txt","r"))==NULL)
{
printf("打開文件失敗!\n");
exit(0);
}
ch=fgetc(fp);
while (ch!=EOFi6)
{
a[i] = ch;
ch=fgetc(fp);
i++;
}
a[6] = '\0';
if (!strcmp(pas,a))
{
return true;
}
else
{
printf("密碼錯誤\n");
return false;
}
fclose(fp);
}
void GetInfo(struct student *arr,int n)//學(xué)生基本信息錄入
{
for (int i = 0;in;i++)
{
printf("輸入學(xué)生的基本信息:name no sex age bnote\n");
scanf("%s %s %c %d %s",arr[i].name,arr[i].no,arr[i].sex,arr[i].age,arr[i].bnote);
}
}
void Display(struct student* arr,int n)//學(xué)生基本信息顯示
{
printf("學(xué)生信息: Name NO Sex age Note\n");
for (int i = 0;in;i++)
{
printf("%15s%15s%15c%15d%15s\n",arr[i].name,arr[i].no,arr[i].sex,arr[i].age,arr[i].bnote);
}
}
void Save(struct student* arr,int n)//學(xué)生基本信息保存,保存在c:\\student.txt
{
FILE * fp;
fp= fopen("c:\\student.txt","w+");
if (fp == NULL)
{
printf("文件不存在!\n");
exit(0);
}
fwrite(arr,sizeof(struct student)*n,n,fp);
fclose(fp);
}
void Modfiy(struct student* arr,int n)//學(xué)生基本信息修改
{
char number[10];
bool flag=false;
char pass[6];
printf("請輸入密碼:\n");
scanf("%s",pass);
if (Check(pass))
{
printf("修改學(xué)生信息:\n");
printf("請輸入學(xué)號:\n");
scanf("%s",number);
for (int i =0;in;i++)
{
if (!strcmp(number,arr[i].no))
{
printf("infor: name no sex age note\n");
printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].no,
arr[i].sex,arr[i].age,arr[i].bnote);
printf("please input information:\n");
scanf("%s%s%c%d%s",arr[i].name,arr[i].no,arr[i].sex,arr[i].age,arr[i].bnote);
Save(arr,n);
flag = true;
}
}
if (flag == false)
{
printf("該學(xué)生不存在!:\n");
}
}
}
void Delete(struct student* arr,int n)//學(xué)生基本信息刪除
{
char number[10];
bool flag=false;
printf("Delete information:\n");
printf("please input the no:\n");
scanf("%s",number);
for (int i =0;in;i++)
{
if (!strcmp(number,arr[i].no))
{
strcpy(arr[i].name," ");
strcpy(arr[i].no," ");
strcpy(arr[i].bnote," ");
arr[i].sex = ' ';
arr[i].age = 0;
Save(arr,n);
flag = true;
}
}
if (flag == true)
{
printf("該學(xué)生不存在!:\n");
}
}
void Search(struct student* arr,int n)//學(xué)生基本信息查詢
{
int temp,i;
bool flag=false;
printf("---------------通過學(xué)號查詢,press 1-------------\n");
printf("---------------通過姓名查詢,press 2-----------\n");
printf("---------------通過性別查詢,press 3------------\n");
printf("---------------通過年齡查詢,press 4------------\n");
printf("---------------退出,press 5 ------------\n");
scanf("%d",temp);
switch (temp)
{
case 1://按照學(xué)號查詢
{
char num[10];
printf("請輸入學(xué)號:\n");
scanf("%s",num);
for ( i =0;in;i++)
{
if (!strcmp(num,arr[i].no))
{
printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].no,
arr[i].sex,arr[i].age,arr[i].bnote);
flag = true;
}
}
if (!flag)
{
printf("該學(xué)生不存在.\n");
}
}
break;
case 2://按照名字查詢
{
char num[10];
printf("please input name:\n");
scanf("%s",num);
for ( i =0;in;i++)
{
if (!strcmp(num,arr[i].name))
{
printf("%12s%12s%12c%12d%12s",arr[i].name,arr[i].no,
arr[i].sex,arr[i].age,arr[i].bnote);
flag = true;
}
}
if (!flag)
{
printf("該學(xué)生不存在.\n");
}
}
break;
case 3://按照性別查詢
{
char ch;
printf("請輸入性別:\n");
//scanf("%c",ch);
ch = getch();
for ( i =0;in;i++)
{
if (ch == arr[i].sex)
{
printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].no,
arr[i].sex,arr[i].age,arr[i].bnote);
flag = true;
}
}
if (!flag)
{
printf("t該學(xué)生不存在.\n");
}
}
break;
case 4://按照年齡查詢
{
char num_age;
printf("請輸入年齡:\n");
scanf("%d",num_age);
for ( i =0;in;i++)
{
if (num_age == arr[i].age)
{
printf("%12s%12s%12c%12d%12s\n",arr[i].name,arr[i].no,
arr[i].sex,arr[i].age,arr[i].bnote);
flag = true;
}
}
if (!flag)
{
printf("該學(xué)生不存在.\n");
}
}
break;
default:
break;
}
}
void main()
{
struct student arr[N];
char ps[6];
bool flag =false;
printf("請輸入密碼:\n");
scanf("%s",ps);
flag = Check(ps);
if (flag)
{
int select;
print(false);
scanf("%d",select);
while (0select select 7 )
{
switch (select)
{
case 1:
GetInfo(arr,N);
print(true);
break;
case 2:
Display(arr,N);
print(true);
break;
case 3:
Save(arr,N);
print(true);
break;
case 4:
Delete(arr,N);
print(true);
break;
case 5:
Modfiy(arr,N);
print(true);
break;
case 6:
Search(arr,N);
print(true);
break;
default:
break;
}
printf("請選擇:\n");
scanf("%d",select);
}
}
}
切換到新語言始終是一大步,尤其是當(dāng)您的團(tuán)隊(duì)成員只有一個時有該語言的先前經(jīng)驗(yàn)?,F(xiàn)在,Stream 的主要編程語言從 Python 切換到了 Go。這篇文章將解釋stream決定放棄 Python 并轉(zhuǎn)向 Go 的一些原因。
Go 非???。性能類似于 Java 或 C++。對于用例,Go 通常比 Python 快 40 倍。
對于許多應(yīng)用程序來說,編程語言只是應(yīng)用程序和數(shù)據(jù)庫之間的粘合劑。語言本身的性能通常并不重要。然而,Stream 是一個API 提供商,為 700 家公司和超過 5 億最終用戶提供提要和聊天平臺。多年來,我們一直在優(yōu)化 Cassandra、PostgreSQL、Redis 等,但最終,您會達(dá)到所使用語言的極限。Python 是一門很棒的語言,但對于序列化/反序列化、排名和聚合等用例,它的性能相當(dāng)緩慢。我們經(jīng)常遇到性能問題,Cassandra 需要 1 毫秒來檢索數(shù)據(jù),而 Python 會花費(fèi)接下來的 10 毫秒將其轉(zhuǎn)換為對象。
看看我如何開始 Go 教程中的一小段 Go 代碼。(這是一個很棒的教程,也是學(xué)習(xí) Go 的一個很好的起點(diǎn)。)
如果您是 Go 新手,那么在閱讀那個小代碼片段時不會有太多讓您感到驚訝的事情。它展示了多個賦值、數(shù)據(jù)結(jié)構(gòu)、指針、格式和一個內(nèi)置的 HTTP 庫。當(dāng)我第一次開始編程時,我一直喜歡使用 Python 更高級的功能。Python 允許您在編寫代碼時獲得相當(dāng)?shù)膭?chuàng)意。例如,您可以:
這些功能玩起來很有趣,但是,正如大多數(shù)程序員會同意的那樣,在閱讀別人的作品時,它們通常會使代碼更難理解。Go 迫使你堅(jiān)持基礎(chǔ)。這使得閱讀任何人的代碼并立即了解發(fā)生了什么變得非常容易。 注意:當(dāng)然,它實(shí)際上有多“容易”取決于您的用例。如果你想創(chuàng)建一個基本的 CRUD API,我仍然推薦 Django + DRF或 Rails。
作為一門語言,Go 試圖讓事情變得簡單。它沒有引入許多新概念。重點(diǎn)是創(chuàng)建一種非??焖偾乙子谑褂玫暮唵握Z言。它唯一具有創(chuàng)新性的領(lǐng)域是 goroutine 和通道。(100% 正確CSP的概念始于 1977 年,所以這項(xiàng)創(chuàng)新更多是對舊思想的一種新方法。)Goroutines 是 Go 的輕量級線程方法,通道是 goroutines 之間通信的首選方式。Goroutines 的創(chuàng)建非常便宜,并且只需要幾 KB 的額外內(nèi)存。因?yàn)?Goroutine 非常輕量,所以有可能同時運(yùn)行數(shù)百甚至數(shù)千個。您可以使用通道在 goroutine 之間進(jìn)行通信。Go 運(yùn)行時處理所有復(fù)雜性。goroutines 和基于通道的并發(fā)方法使得使用所有可用的 CPU 內(nèi)核和處理并發(fā) IO 變得非常容易——所有這些都不會使開發(fā)復(fù)雜化。與 Python/Java 相比,在 goroutine 上運(yùn)行函數(shù)需要最少的樣板代碼。您只需在函數(shù)調(diào)用前加上關(guān)鍵字“go”:
Go 的并發(fā)方法很容易使用。與 Node 相比,這是一種有趣的方法,開發(fā)人員必須密切關(guān)注異步代碼的處理方式。Go 中并發(fā)的另一個重要方面是競爭檢測器。這樣可以很容易地確定異步代碼中是否存在任何競爭條件。
我們目前用 Go 編寫的最大的微服務(wù)編譯需要 4 秒。與以編譯速度慢而聞名的 Java 和 C++ 等語言相比,Go 的快速編譯時間是一項(xiàng)重大的生產(chǎn)力勝利。我喜歡在程序編譯的時候摸魚,但在我還記得代碼應(yīng)該做什么的同時完成事情會更好。
首先,讓我們從顯而易見的開始:與 C++ 和 Java 等舊語言相比,Go 開發(fā)人員的數(shù)量并不多。根據(jù)StackOverflow的數(shù)據(jù), 38% 的開發(fā)人員知道 Java, 19.3% 的人知道 C++,只有 4.6% 的人知道 Go。GitHub 數(shù)據(jù)顯示了類似的趨勢:Go 比 Erlang、Scala 和 Elixir 等語言使用更廣泛,但不如 Java 和 C++ 流行。幸運(yùn)的是,Go 是一種非常簡單易學(xué)的語言。它提供了您需要的基本功能,僅此而已。它引入的新概念是“延遲”聲明和內(nèi)置的并發(fā)管理與“goroutines”和通道。(對于純粹主義者來說:Go 并不是第一種實(shí)現(xiàn)這些概念的語言,只是第一種使它們流行起來的語言。)任何加入團(tuán)隊(duì)的 Python、Elixir、C++、Scala 或 Java 開發(fā)人員都可以在一個月內(nèi)在 Go 上發(fā)揮作用,因?yàn)樗暮唵涡?。與許多其他語言相比,我們發(fā)現(xiàn)組建 Go 開發(fā)人員團(tuán)隊(duì)更容易。如果您在博爾德和阿姆斯特丹等競爭激烈的生態(tài)系統(tǒng)中招聘人員,這是一項(xiàng)重要的優(yōu)勢。
對于我們這樣規(guī)模的團(tuán)隊(duì)(約 20 人)來說,生態(tài)系統(tǒng)很重要。如果您必須重新發(fā)明每一個小功能,您根本無法為您的客戶創(chuàng)造價值。Go 對我們使用的工具有很好的支持。實(shí)體庫已經(jīng)可用于 Redis、RabbitMQ、PostgreSQL、模板解析、任務(wù)調(diào)度、表達(dá)式解析和 RocksDB。與 Rust 或 Elixir 等其他較新的語言相比,Go 的生態(tài)系統(tǒng)是一個重大勝利。它當(dāng)然不如 Java、Python 或 Node 之類的語言好,但它很可靠,而且對于許多基本需求,你會發(fā)現(xiàn)已經(jīng)有高質(zhì)量的包可用。
Gofmt 是一個很棒的命令行實(shí)用程序,內(nèi)置在 Go 編譯器中,用于格式化代碼。就功能而言,它與 Python 的 autopep8 非常相似。我們大多數(shù)人并不真正喜歡爭論制表符與空格。格式的一致性很重要,但實(shí)際的格式標(biāo)準(zhǔn)并不那么重要。Gofmt 通過使用一種正式的方式來格式化您的代碼來避免所有這些討論。
Go 對協(xié)議緩沖區(qū)和 gRPC 具有一流的支持。這兩個工具非常適合構(gòu)建需要通過 RPC 通信的微服務(wù)。您只需要編寫一個清單,在其中定義可以進(jìn)行的 RPC 調(diào)用以及它們采用的參數(shù)。然后從這個清單中自動生成服務(wù)器和客戶端代碼。生成的代碼既快速又具有非常小的網(wǎng)絡(luò)占用空間并且易于使用。從同一個清單中,您甚至可以為許多不同的語言生成客戶端代碼,例如 C++、Java、Python 和 Ruby。因此,內(nèi)部流量不再有模棱兩可的 REST 端點(diǎn),您每次都必須編寫幾乎相同的客戶端和服務(wù)器代碼。.
Go 沒有像 Rails 用于 Ruby、Django 用于 Python 或 Laravel 用于 PHP 那樣的單一主導(dǎo)框架。這是 Go 社區(qū)內(nèi)激烈爭論的話題,因?yàn)樵S多人主張你不應(yīng)該一開始就使用框架。我完全同意這對于某些用例是正確的。但是,如果有人想構(gòu)建一個簡單的 CRUD API,他們將更容易使用 Django/DJRF、Rails Laravel 或Phoenix。對于 Stream 的用例,我們更喜歡不使用框架。然而,對于許多希望提供簡單 CRUD API 的新項(xiàng)目來說,缺乏主導(dǎo)框架將是一個嚴(yán)重的劣勢。
Go 通過簡單地從函數(shù)返回錯誤并期望調(diào)用代碼來處理錯誤(或?qū)⑵浞祷氐秸{(diào)用堆棧)來處理錯誤。雖然這種方法有效,但很容易失去問題的范圍,以確保您可以向用戶提供有意義的錯誤。錯誤包通過允許您向錯誤添加上下文和堆棧跟蹤來解決此問題。另一個問題是很容易忘記處理錯誤。像 errcheck 和 megacheck 這樣的靜態(tài)分析工具可以方便地避免犯這些錯誤。雖然這些變通辦法效果很好,但感覺不太對勁。您希望該語言支持正確的錯誤處理。
Go 的包管理絕不是完美的。默認(rèn)情況下,它無法指定特定版本的依賴項(xiàng),也無法創(chuàng)建可重現(xiàn)的構(gòu)建。Python、Node 和 Ruby 都有更好的包管理系統(tǒng)。但是,使用正確的工具,Go 的包管理工作得很好。您可以使用Dep來管理您的依賴項(xiàng),以允許指定和固定版本。除此之外,我們還貢獻(xiàn)了一個名為的開源工具VirtualGo,它可以更輕松地處理用 Go 編寫的多個項(xiàng)目。
我們進(jìn)行的一個有趣的實(shí)驗(yàn)是在 Python 中使用我們的排名提要功能并在 Go 中重寫它??纯催@個排名方法的例子:
Python 和 Go 代碼都需要執(zhí)行以下操作來支持這種排名方法:
開發(fā) Python 版本的排名代碼大約花了 3 天時間。這包括編寫代碼、單元測試和文檔。接下來,我們花了大約 2 周的時間優(yōu)化代碼。其中一項(xiàng)優(yōu)化是將分?jǐn)?shù)表達(dá)式 (simple_gauss(time)*popularity) 轉(zhuǎn)換為抽象語法樹. 我們還實(shí)現(xiàn)了緩存邏輯,可以在未來的特定時間預(yù)先計(jì)算分?jǐn)?shù)。相比之下,開發(fā)此代碼的 Go 版本大約需要 4 天時間。性能不需要任何進(jìn)一步的優(yōu)化。因此,雖然 Python 的最初開發(fā)速度更快,但基于 Go 的版本最終需要我們團(tuán)隊(duì)的工作量大大減少。另外一個好處是,Go 代碼的執(zhí)行速度比我們高度優(yōu)化的 Python 代碼快大約 40 倍?,F(xiàn)在,這只是我們通過切換到 Go 體驗(yàn)到的性能提升的一個示例。
與 Python 相比,我們系統(tǒng)的其他一些組件在 Go 中構(gòu)建所需的時間要多得多。作為一個總體趨勢,我們看到 開發(fā) Go 代碼需要更多的努力。但是,我們花更少的時間 優(yōu)化 代碼以提高性能。
我們評估的另一種語言是Elixir.。Elixir 建立在 Erlang 虛擬機(jī)之上。這是一種迷人的語言,我們之所以考慮它,是因?yàn)槲覀兊囊幻麍F(tuán)隊(duì)成員在 Erlang 方面擁有豐富的經(jīng)驗(yàn)。對于我們的用例,我們注意到 Go 的原始性能要好得多。Go 和 Elixir 都可以很好地服務(wù)數(shù)千個并發(fā)請求。但是,如果您查看單個請求的性能,Go 對于我們的用例來說要快得多。我們選擇 Go 而不是 Elixir 的另一個原因是生態(tài)系統(tǒng)。對于我們需要的組件,Go 有更成熟的庫,而在許多情況下,Elixir 庫還沒有準(zhǔn)備好用于生產(chǎn)環(huán)境。培訓(xùn)/尋找開發(fā)人員使用 Elixir 也更加困難。這些原因使天平向 Go 傾斜。Elixir 的 Phoenix 框架看起來很棒,絕對值得一看。
Go 是一種非常高性能的語言,對并發(fā)有很好的支持。它幾乎與 C++ 和 Java 等語言一樣快。雖然與 Python 或 Ruby 相比,使用 Go 構(gòu)建東西確實(shí)需要更多時間,但您將節(jié)省大量用于優(yōu)化代碼的時間。我們在Stream有一個小型開發(fā)團(tuán)隊(duì),為超過 5 億最終用戶提供動力和聊天。Go 結(jié)合了 強(qiáng)大的生態(tài)系統(tǒng) 、新開發(fā)人員的 輕松入門、快速的性能 、對并發(fā)的 可靠支持和高效的編程環(huán)境 ,使其成為一個不錯的選擇。Stream 仍然在我們的儀表板、站點(diǎn)和機(jī)器學(xué)習(xí)中利用 Python 來提供個性化的訂閱源. 我們不會很快與 Python 說再見,但今后所有性能密集型代碼都將使用 Go 編寫。我們新的聊天 API也完全用 Go 編寫。
培訓(xùn)班管理系統(tǒng)在學(xué)校管理中具有豐富的培訓(xùn)經(jīng)驗(yàn)。該系統(tǒng)的發(fā)展是根據(jù)班級管理課程管理班級的規(guī)模管理模式進(jìn)行管理,實(shí)現(xiàn)全面精細(xì)化的管理模式。主要用于班級信息管理,根據(jù)市場需求設(shè)置班級開發(fā)課程,開設(shè)不同班級;學(xué)生選擇班級管理學(xué)生選擇班級管理是班級晉升、班級關(guān)閉等功能模塊的所有學(xué)生。
1.智能排課不重疊
課程的安排與教室和教師的安排都是需要考慮到位的,如果有一個細(xì)節(jié)上的重疊都會造成排課不成功的問題。為了能夠確保排課更加輕松。系統(tǒng)可以實(shí)現(xiàn)智能排課,需要調(diào)課的教師也可以根據(jù)顯示是否有空余的時間或者是教室來選擇調(diào)課的時間。
2.調(diào)課一鍵通知更方便
針對課程的安排以及調(diào)課信息的調(diào)整等,如果僅僅是依靠社交軟件來進(jìn)行通知,很可能有時候家長比較忙忽略了信息,所以沒有收到課程調(diào)整的通知。系統(tǒng)有一鍵通知功能,可以將所有的調(diào)課信息及時推送給家長,提醒家長能夠在第一時間了解相關(guān)的課程調(diào)換與安排。
4.考勤自動扣課時
培訓(xùn)班學(xué)生按排課課程刷卡考勤上課,系統(tǒng)自動扣除課時,并可查詢時間段內(nèi)課時消耗情況;按扣除課時,系統(tǒng)自動計(jì)算老師課時費(fèi),根據(jù)需求靈活計(jì)算。
校盈易培訓(xùn)班管理系統(tǒng)是個很好的選擇。特別是在工作效率的提升中,面對傳統(tǒng)手工作業(yè)無法滿足的前提下,用培訓(xùn)班管理系統(tǒng)進(jìn)行管理之后,摒棄了傳統(tǒng)的手工作業(yè),不管是班課管理、招生管理、員工管理、教師的工作情況管理上的工作效率都提高了,具有減輕培訓(xùn)機(jī)構(gòu)的工作量的作用。
馬上注冊免費(fèi)體驗(yàn):校盈易培訓(xùn)班管理系統(tǒng)
VC6.0編譯通過,利用結(jié)構(gòu)體,結(jié)構(gòu)體指針,單鏈表,文件操作,命令窗口下簡單菜單設(shè)計(jì),可從文件讀入數(shù)據(jù),自動保存數(shù)據(jù),有錯誤自動判斷修復(fù),能添加,刪除,查詢,顯示,排序記錄,通過本人2小時升級修改,已經(jīng)適合多數(shù)初學(xué)者期末C語言作業(yè)設(shè)計(jì)要求!如果要增加科目,只要修改源代碼中的Class_N的值就可以了,科目的名稱在程序第一次運(yùn)行時輸入,會自動保存到student.ini文件,程序運(yùn)行時自動生成的student.ini文件為系統(tǒng)信息文件(二進(jìn)制文件),student.db為數(shù)據(jù)存儲文件(二進(jìn)制文件),Student.txt為操作記錄文件(文本文件),可以修改Student.txt的打開方式,那樣就能保存以前的操作記錄了。自己稍微修改書下就可以了!可以到百度網(wǎng)盤下載: