真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言班級管理系統(tǒng) go語言學(xué)生成績管理系統(tǒng)

C語言程序設(shè)計(jì) 班級學(xué)生成績管理系統(tǒng)

設(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; /*返回頭指針

}

急需一班級學(xué)生成績管理系統(tǒng) 我們現(xiàn)在學(xué)的是C語言 不是C++

#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語言課程設(shè)計(jì)--班級檔案管理系統(tǒng)

//****************************************************************************

//**** 說明:密碼所在的文件位于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);

}

}

}

GO語言商業(yè)案例(十八):stream

切換到新語言始終是一大步,尤其是當(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)有些什么功能?

培訓(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)

求編程 班級成績管理系統(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)盤下載:


當(dāng)前標(biāo)題:go語言班級管理系統(tǒng) go語言學(xué)生成績管理系統(tǒng)
本文地址:http://weahome.cn/article/dococds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部