軟件開發(fā)流程圖示例關(guān)于班級管理(班級管理系統(tǒng)用例圖)
今天給各位分享軟件開發(fā)流程圖示例關(guān)于班級管理的知識,其中也會對班級管理系統(tǒng)用例圖進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧!
本文目錄一覽:
軟件開發(fā)流程
一個軟件從開始到最后一共需要以下幾個流程:
1、計劃
2、分析
3、設(shè)計
4、編碼
5、測試
6、維護(hù)
1、計劃
對所要解決的問題進(jìn)行總體定義,包括了解用戶的要求及現(xiàn)實環(huán)境,從技術(shù)、經(jīng)濟(jì)和社會因素等3個方面研究并論證本軟件項目的可行性,編寫可行性研究報告,探討解決問題的方案,并對可供使用的資源(如計算機(jī)硬件、系統(tǒng)軟件、人力等)成本,可取得的效益和開發(fā)進(jìn)度作出估計,制訂完成開發(fā)任務(wù)的實施計劃。
2、分析
軟件需求分析就是對開發(fā)什么樣的軟件的一個系統(tǒng)的分析與設(shè)想。它是一個對用戶的需求進(jìn)行去粗取精、去偽存真、正確理解,然后把它用軟件工程開發(fā)語言(形式功能規(guī)約,即需求規(guī)格說明書)表達(dá)出來的過程。本階段的基本任務(wù)是和用戶一起確定要解決的問題,建立軟件的邏輯模型,編寫需求規(guī)格說明書文檔并最終得到用戶的認(rèn)可。需求分析的主要方法有結(jié)構(gòu)化分析方法、數(shù)據(jù)流程圖和數(shù)據(jù)字典等方法。本階段的工作是根據(jù)需求說明書的要求,設(shè)計建立相應(yīng)的軟件系統(tǒng)的體系結(jié)構(gòu),并將整個系統(tǒng)分解成若干個子系統(tǒng)或模塊,定義子系統(tǒng)或模塊間的接口關(guān)系,對各子系統(tǒng)進(jìn)行具體設(shè)計定義,編寫軟件概要設(shè)計和詳細(xì)設(shè)計說明書,數(shù)據(jù)庫或數(shù)據(jù)結(jié)構(gòu)設(shè)計說明書,組裝測試計劃。在任何軟件或系統(tǒng)開發(fā)的初始階段必須先完全掌握用戶需求,以期能將緊隨的系統(tǒng)開發(fā)過程中哪些功能應(yīng)該落實、采取何種規(guī)格以及設(shè)定哪些限制優(yōu)先加以定位。系統(tǒng)工程師最終將據(jù)此完成設(shè)計方案,在此基礎(chǔ)上對隨后的程序開發(fā)、系統(tǒng)功能和性能的描述及限制作出定義。
3、設(shè)計
軟件設(shè)計可以分為概要設(shè)計和詳細(xì)設(shè)計兩個階段。實際上軟件設(shè)計的主要任務(wù)就是將軟件分解成模塊是指能實現(xiàn)某個功能的數(shù)據(jù)和程序說明、可執(zhí)行程序的程序單元??梢允且粋€函數(shù)、過程、子程序、一段帶有程序說明的獨立的程序和數(shù)據(jù),也可以是可組合、可分解和可更換的功能單元。模塊,然后進(jìn)行模塊設(shè)計。概要設(shè)計就是結(jié)構(gòu)設(shè)計,其主要目標(biāo)就是給出軟件的模塊結(jié)構(gòu),用軟件結(jié)構(gòu)圖表示。詳細(xì)設(shè)計的首要任務(wù)就是設(shè)計模塊的程序流程、算法和數(shù)據(jù)結(jié)構(gòu),次要任務(wù)就是設(shè)計數(shù)據(jù)庫,常用方法還是結(jié)構(gòu)化程序設(shè)計方法。
4、編碼
軟件編碼是指把軟件設(shè)計轉(zhuǎn)換成計算機(jī)可以接受的程序,即寫成以某一程序設(shè)計語言表示的“源程序清單”。充分了解軟件開發(fā)語言、工具的特性和編程風(fēng)格,有助于開發(fā)工具的選擇以及保證軟件產(chǎn)品的開發(fā)質(zhì)量。
當(dāng)前軟件開發(fā)中除在專用場合,已經(jīng)很少使用二十世紀(jì)80年代的高級語言了,取而代之的是面向?qū)ο蟮拈_發(fā)語言。而且面向?qū)ο蟮拈_發(fā)語言和開發(fā)環(huán)境大都合為一體,大大提高了開發(fā)的速度。
5、測試
軟件測試的目的是以較小的代價發(fā)現(xiàn)盡可能多的錯誤。要實現(xiàn)這個目標(biāo)的關(guān)鍵在于設(shè)計一套出色的測試用例(測試數(shù)據(jù)與功能和預(yù)期的輸出結(jié)果組成了測試用例)。如何才能設(shè)計出一套出色的測試用例,關(guān)鍵在于理解測試方法。不同的測試方法有不同的測試用例設(shè)計方法。兩種常用的測試方法是白盒法測試對象是源程序,依據(jù)的是程序內(nèi)部的的邏輯結(jié)構(gòu)來發(fā)現(xiàn)軟件的編程錯誤、結(jié)構(gòu)錯誤和數(shù)據(jù)錯誤。結(jié)構(gòu)錯誤包括邏輯、數(shù)據(jù)流、初始化等錯誤。用例設(shè)計的關(guān)鍵是以較少的用例覆蓋盡可能多的內(nèi)部程序邏輯結(jié)果。白盒法和黑盒法依據(jù)的是軟件的功能或軟件行為描述,發(fā)現(xiàn)軟件的接口、功能和結(jié)構(gòu)錯誤。其中接口錯誤包括內(nèi)部/外部接口、資源管理、集成化以及系統(tǒng)錯誤。黑盒法用例設(shè)計的關(guān)鍵同樣也是以較少的用例覆蓋模塊輸出和輸入接口。
6、維護(hù)
維護(hù)是指在已完成對軟件的研制(分析、設(shè)計、編碼和測試)工作并交付使用以后,對軟件產(chǎn)品所進(jìn)行的一些軟件工程的活動。即根據(jù)軟件運行的情況,對軟件進(jìn)行適當(dāng)修改,以適應(yīng)新的要求,以及糾正運行中發(fā)現(xiàn)的錯誤。編寫軟件問題報告、軟件修改報告。
一個中等規(guī)模的軟件,如果研制階段需要一年至二年的時間,在它投入使用以后,其運行或工作時間可能持續(xù)五年至十年。那么它的維護(hù)階段也是運行的這五年至十年期間。在這段時間,人們幾乎需要著手解決研制階段所遇到的各種問題,同時還要解決某些維護(hù)工作本身特有的問題。做好軟件維護(hù)工作,不僅能排除障礙,使軟件能正常工作,而且還可以使它擴(kuò)展功能,提高性能,為用戶帶來明顯的經(jīng)濟(jì)效益。然而遺憾的是,對軟件維護(hù)工作的重視往往遠(yuǎn)不如對軟件研制工作的重視。而事實上,和軟件研制工作相比,軟件維護(hù)的工作量和成本都要大得多。
在實際開發(fā)過程中,軟件開發(fā)并不是從第一步進(jìn)行到最后一步,而是在任何階段,在進(jìn)入下一階段前一般都有一步或幾步的回溯。在測試過程中的問題可能要求修改設(shè)計,用戶可能會提出一些需要來修改需求說明書等。
C語言程序設(shè)計 班級學(xué)生成績管理系統(tǒng)
設(shè)計課題一:班級成績管理系統(tǒng)
一、 問題描述:
對一個有N個學(xué)生的班級,每個學(xué)生有M門課程。該系統(tǒng)實現(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)功能項:
a、 成績錄入
b、 成績顯示
c、 成績保存
d、 成績排序
e、 成績修改(要求先輸入密碼)
f、 成績統(tǒng)計
(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é)可以在實現(xiàn)上述基本功能后,完善系統(tǒng)的其它功能。
問題補(bǔ)充:
今天誰能給我答案?。。。。。。。〖奔保。。。。。?!
提問者: 342123465 - 一級
最佳答案
C語言課程設(shè)計報告—班級成績管理系統(tǒng)
需要分析:
學(xué)生成績管理系統(tǒng)有13種功能。把這13個功能做成13個子函數(shù)。在主函當(dāng)數(shù)中設(shè)計一個菜單對這13個子數(shù)進(jìn)行管理。來實現(xiàn)對整個系統(tǒng)的操作。
根據(jù)課題的要求。每一個學(xué)生的包括姓名(char)、學(xué)號(char)、M門課程的成績(float).再加上系統(tǒng)功能上的要求每一學(xué)生的信息還要總分和名次等。所以自然的想到要用結(jié)構(gòu)體來定義每一個學(xué)生的信息結(jié)構(gòu)。然后用鏈表把它們組成一個有序的整體。用對鏈表的操作來實現(xiàn)對所有學(xué)生信息的統(tǒng)一管理(成績顯示、成績排序、成績修改等)。最后為了以后按照處理后的順序保存到文件中。
. 各函數(shù)的功能:
概要設(shè)計:
程序的模塊組成:
主 函 數(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)
計算總分和均分函數(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)計函數(shù):
l 顯示每門課程成績最高的學(xué)生的基本信息。
l 顯示每門課程的平均成績。
l 顯示超過某門課程平均成績的學(xué)生人數(shù)。
課題的功能模塊的劃分:
開始
菜單界面
功能選擇
初始化函數(shù)
輸入學(xué)生信息
刪除學(xué)生信息
顯示學(xué)生信息
查找學(xué)生信息
按成績排序
保存到文件
從文件讀數(shù)據(jù)
插入學(xué)生成績
分類合計
退出系統(tǒng)
結(jié)束
詳細(xì)設(shè)計: 整個系統(tǒng)除了主函數(shù)外,另外還有14個函數(shù),實現(xiàn)八大功能:輸入功能、顯示功能、查找功能、排序功能、插入功能、保存功能、讀取功能。各個函數(shù)的詳細(xì)設(shè)計說明分別如下:
主函數(shù) main()
利用無限次循環(huán)for(;;)和swithch()實現(xiàn)各函數(shù)的調(diào)用,系統(tǒng)根據(jù)輸入的數(shù)字選項來調(diào)用相應(yīng)的函數(shù)。
菜單選擇函數(shù) int menu_select()
這是一個無參函數(shù),主要實現(xiàn)“功能選擇”的界面,在這個界面里有顯示系統(tǒng)的九大功能,根據(jù)每個功能前面的序號進(jìn)行選擇。等執(zhí)行完每一個函數(shù)功能后,返回菜單。
代碼設(shè)計: 初始化函數(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é)點的指針指向第一個結(jié)點,將p結(jié)點(即第一個結(jié)點)的數(shù)據(jù)輸出。然后再將p結(jié)點的指針指向p指針的的指針(即下一結(jié)點),將p結(jié)點(即第一結(jié)點)的數(shù)據(jù)輸出。重復(fù)執(zhí)行此步聚直到p指針指向NULL為止。
N-S流程圖如下:
p=head,使指向第一個結(jié)點
輸出p所指向的結(jié)點
p指向一下個結(jié)點
當(dāng)p指的不是表尾
程序調(diào)試:
由于本課題中的許多知識點都沒有學(xué)過都要靠自己到課外的資料中去查找。在用的時候難免出現(xiàn)這樣那樣的錯誤。如開始設(shè)計出來的菜單不是預(yù)想的那樣,而是總個窗中出現(xiàn)混亂。解決的這個問題的辦法是調(diào)整。最后還是老師幫我?guī)臀覀冋业搅藛栴}的所在——for 循環(huán)的次超過了鏈表中結(jié)點的數(shù)量。再就是自定義函數(shù)時由于課本的概念不清楚,多寫了空格鍵,以至函數(shù)調(diào)用不出來。又如:在設(shè)計修改學(xué)生信息時的密密碼時。當(dāng)用戶發(fā)現(xiàn)輸入密碼錯誤按了退格鍵后,因為“*”并沒有消去。導(dǎo)致用戶再次按退格鍵,又出現(xiàn)前面的情況。最終導(dǎo)致輸入密碼錯誤。所以用了兩次退格鍵:
在對鏈表操作時,要特別鏈表指針的移動(p=p-next)和鏈表尾的判斷 (p= =NULL)。沒有指針的移動,就很容易出現(xiàn)死循環(huán)。而在運行過程中不能控制。所以你就會認(rèn)為是死機(jī)。如果沒有鏈表尾的判斷。就會在運行過程出現(xiàn)想不到的錯誤。如:在顯示鏈表信息時,后面就會出現(xiàn)亂碼。
一個系統(tǒng)的菜單和提示信息非常重要。如果沒有這些用戶根本不知道怎么用你設(shè)計的這個系統(tǒng)。在設(shè)計的調(diào)試過程中也無法順利的完成調(diào)試工作。有了一個清晰簡單的菜單和一些提示信息這后,調(diào)試過程完成的非常順利。
予我耐心解答的老師和同學(xué),是他們?yōu)槲倚〕绦虻某晒ζ鸬搅岁P(guān)鍵性的作用,那么多個日夜,如此多的困難,同學(xué)們勤懇塌實,從開始到結(jié)束,沒有顯出一點倦意,始終熱情高漲,我感謝這種氛圍,感謝學(xué)校提供的良好條件。
回顧起此次課程設(shè)計,至今我仍感慨頗多,的確,從拿到題目到完成整個編程,從理論到實踐,在整整半個學(xué)期的日子里,可以學(xué)到很多很多的東西,同時不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,比如說結(jié)構(gòu)體……通過這次課程設(shè)計之后,一定把以前所學(xué)過的知識重新溫故。
本次課程設(shè)計結(jié)束了,對于我的影響很大。我通過這次實踐學(xué)到了許多知識。學(xué)到了設(shè)計一個簡單的系統(tǒng)。要注意哪些方面。也使我知道自己哪些方面做得還不夠。
但我出總結(jié)出了一點點的經(jīng)驗如下:
1、要對系統(tǒng)的功能和要求做出詳細(xì)的分析,并合理分解任務(wù)。
2、把分解出來的子任務(wù),做給一個相對獨立的模塊。
3、在設(shè)計一個模塊之前,要簡單構(gòu)想一下總界面的顯視情況。
4、針對構(gòu)想出來的界面進(jìn)行程序的編寫。
最后,感謝老師您對我的指導(dǎo)和從百忙中抽空看我的設(shè)計,謝謝!
附件:
源程序:
#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); /*計算總分和均分*/
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; /*計算總分和均分*/
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", /*計算所有學(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è)計*/
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); /*輸入選擇項*/
c=atoi(s); /*將輸入的字符串轉(zhuǎn)化為整形數(shù)*/
}while(c0||c14); /*選擇項不在0~14之間重輸*/
return c; /*返回選擇項,主程序根據(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é)號并校驗*/
if(info-no[0]=='@') { clrscr();break; } /*如果學(xué)號首字符為@則結(jié)束輸入,清屏后返回*/
inputs("enter name:",info-name,15); /*輸入姓名,并進(jìn)行校驗*/
printf("please input %d score \n",N); /*提示開始輸入成績*/
s=0; /*計算每個學(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é)點做為新輸入結(jié)點的后繼結(jié)點*/
h=info; /*新輸入結(jié)點為新的頭結(jié)點*/
clrscr();
}
return(h); /*返回頭指針*/
}
/*輸入字符串,并進(jì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)行長度校驗,超過count值重輸入*/
}while(strlen(p)count);
strcpy(s,p); /*將輸入的字符串拷貝到字符串s中*/
}
/*輸出鏈表中結(jié)點信息*/
void print(STUDENT *h)
{
int i=0; /* 統(tǒng)計記錄條數(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é)點,就輸出記錄*/
{
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é)點指針,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é)點*/
{ 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é)點的指針,作為下一結(jié)點的前驅(qū)*/
p=p-next; /*指針后移,新讀入數(shù)據(jù)鏈到當(dāng)前表尾*/
}
q-next=NULL; /*最后一個結(jié)點的后繼指針為空*/
fclose(fp); /*關(guān)閉文件*/
printf("---You have success read data from file!!!---\n");
getch(); /*按任意鍵返回主菜單*/
clrscr();
return h; /*返回頭指針*/
}
/*成績統(tǒng)計*/
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)計記錄條數(shù)*/
p=p-next; /*指針后移*/
h; /*返回頭指針
}
關(guān)于班級管理的流程圖
(1)任命班長
(2)授予班長挑選副班長以及其他班委員的權(quán)力,
(3)授予班委任命、管理小組長的權(quán)力
(4)授予小組長管理組員的權(quán)力
結(jié)束!
C語言程序設(shè)計:班級電話本管理程序
/* 電話簿程序 */
/******頭文件(.h)***********/
#include "stdio.h" /*I/O函數(shù)*/
#include "stdlib.h" /*標(biāo)準(zhǔn)庫函數(shù)*/
#include "string.h"/*字符串函數(shù)*/
#include "ctype.h" /*字符操作函數(shù)*/
#define M 50 /*定義常數(shù)表示記錄數(shù)*/
struct unit/*定義數(shù)據(jù)結(jié)構(gòu)*/
{
char name[20]; /*姓名*/
char units[30]; /*單位*/
char tele[10]; /*電話*/
};
typedef struct unit ADDRESS;
/******以下是函數(shù)原型*******/
int enter(ADDRESS t[]); /*輸入記錄*/
void list(ADDRESS t[],int n); /*顯示記錄*/
void search(ADDRESS t[],int n); /*按姓名查找顯示記錄*/
int delete(ADDRESS t[],int n); /*刪除記錄*/
int add(ADDRESS t[],int n); /*插入記錄*/
void save(ADDRESS t[],int n); /*記錄保存為文件*/
int load(ADDRESS t[]); /*從文件中讀記錄*/
void display(ADDRESS t[]); /*按序號查找顯示記錄*/
void sort(ADDRESS t[],int n); /*按姓名排序*/
void qseek(ADDRESS t[],int n); /*快速查找記錄*/
void copy(); /*文件復(fù)制*/
void print(ADDRESS temp); /*顯示單條記錄*/
int find(ADDRESS t[],int n,char *s) ; /*查找函數(shù)*/
int menu_select(); /*主菜單函數(shù)*/
/******主函數(shù)開始*******/
main()
{
int i;
ADDRESS adr[M]; /*定義結(jié)構(gòu)體數(shù)組*/
int length; /*保存記錄長度*/
clrscr(); /*清屏*/
for(;;)/*無限循環(huán)*/
{
switch(menu_select()) /*調(diào)用主菜單函數(shù),返回值整數(shù)作開關(guān)語句的條件*/
{
case 0:length=enter(adr);break;/*輸入記錄*/
case 1:list(adr,length);break; /*顯示全部記錄*/
case 2:search(adr,length);break; /*查找記錄*/
case 3:length=delete(adr,length);break; /*刪除記錄*/
case 4:length=add(adr,length); break; /*插入記錄*/
case 5:save(adr,length);break; /*保存文件*/
case 6:length=load(adr); break; /*讀文件*/
case 7:display(adr);break; /*按序號顯示記錄*/
case 8:sort(adr,length);break; /*按姓名排序*/
case 9:qseek(adr,length);break; /*快速查找記錄*/
case 10:copy();break; /*復(fù)制文件*/
case 11:exit(0); /*如返回值為11則程序結(jié)束*/
}
}
}
/*菜單函數(shù),函數(shù)返回值為整數(shù),代表所選的菜單項*/
menu_select()
{
char s[80];
int c;
gotoxy(1,25);/*將光標(biāo)定為在第25行,第1列*/
printf("press any key enter menu......\n");/*提示壓任意鍵繼續(xù)*/
getch(); /*讀入任意字符*/
clrscr(); /*清屏*/
gotoxy(1,1);
printf("********************MENU*********************\n\n");
printf(" 0. Enter record\n");
printf(" 1. List the file\n");
printf(" 2. Search record on name\n");
printf(" 3. Delete a record\n");
printf(" 4. add record \n");
printf(" 5. Save the file\n");
printf(" 6. Load the file\n");
printf(" 7. display record on order\n");
printf(" 8. sort to make new file\n");
printf(" 9. Quick seek record\n");
printf(" 10. copy the file to new file\n");
printf(" 11. Quit\n");
printf("***********************************************\n");
do{
printf("\n Enter you choice(0~11):"); /*提示輸入選項*/
scanf("%s",s); /*輸入選擇項*/
c=atoi(s); /*將輸入的字符串轉(zhuǎn)化為整型數(shù)*/
}while(c0||c11); /*選擇項不在0~11之間重輸*/
return c; /*返回選擇項,主程序根據(jù)該數(shù)調(diào)用相應(yīng)的函數(shù)*/
}
/***輸入記錄,形參為結(jié)構(gòu)體數(shù)組,函數(shù)值返回類型為整型表示記錄長度*/
int enter(ADDRESS t[])
{
int i,n;
char *s;
clrscr(); /*清屏*/
printf("\nplease input num \n"); /*提示信息*/
scanf("%d",n); /*輸入記錄數(shù)*/
printf("please input record \n"); /*提示輸入記錄*/
printf("name unit telephone\n");
printf("------------------------------------------------\n");
for(i=0;in;i++)
{
scanf("%s%s%s",t[i].name,t[i].units,t[i].tele); /*輸入記錄*/
printf("----------------------------------------------\n");
}
return n; /*返回記錄條數(shù)*/
}
/*顯示記錄,參數(shù)為記錄數(shù)組和記錄條數(shù)*/
void list(ADDRESS t[],int n)
{
int i;
clrscr();
printf("\n\n*******************ADDRESS******************\n");
printf("name unit telephone\n");
printf("------------------------------------------------\n");
for(i=0;in;i++)
printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);
if((i+1)%10==0) /*判斷輸出是否達(dá)到10條記錄*/
{
printf("Press any key continue...\n"); /*提示信息*/
getch(); /*壓任意鍵繼續(xù)*/
}
printf("************************end*******************\n");
}
/*查找記錄*/
void search(ADDRESS t[],int n)
{
char s[20]; /*保存待查找姓名字符串*/
int i; /*保存查找到結(jié)點的序號*/
clrscr(); /*清屏*/
printf("please search name\n");
scanf("%s",s); /*輸入待查找姓名*/
i=find(t,n,s); /*調(diào)用find函數(shù),得到一個整數(shù)*/
if(in-1) /*如果整數(shù)i值大于n-1,說明沒找到*/
printf("not found\n");
else
print(t[i]); /*找到,調(diào)用顯示函數(shù)顯示記錄*/
}
/*顯示指定的一條記錄*/
void print(ADDRESS temp)
{
clrscr();
printf("\n\n********************************************\n");
printf("name unit telephone\n");
printf("------------------------------------------------\n");
printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);
printf("**********************end***********************\n");
}
/*查找函數(shù),參數(shù)為記錄數(shù)組和記錄條數(shù)以及姓名s */
int find(ADDRESS t[],int n,char *s)
{
int i;
for(i=0;in;i++)/*從第一條記錄開始,直到最后一條*/
{
if(strcmp(s,t[i].name)==0) /*記錄中的姓名和待比較的姓名是否相等*/
return i; /*相等,則返回該記錄的下標(biāo)號,程序提前結(jié)結(jié)束*/
}
return i; /*返回i值*/
}
/*刪除函數(shù),參數(shù)為記錄數(shù)組和記錄條數(shù)*/
int delete(ADDRESS t[],int n)
{
char s[20]; /*要刪除記錄的姓名*/
int ch=0;
int i,j;
printf("please deleted name\n"); /*提示信息*/
scanf("%s",s);/*輸入姓名*/
i=find(t,n,s); /*調(diào)用find函數(shù)*/
if(in-1) /*如果in-1超過了數(shù)組的長度*/
printf("no found not deleted\n"); /*顯示沒找到要刪除的記錄*/
else
{
print(t[i]); /*調(diào)用輸出函數(shù)顯示該條記錄信息*/
printf("Are you sure delete it(1/0)\n"); /*確認(rèn)是否要刪除*/
scanf("%d",ch); /*輸入一個整數(shù)0或1*/
if(ch==1) /*如果確認(rèn)刪除整數(shù)為1*/
{
for(j=i+1;jn;j++) /*刪除該記錄,實際后續(xù)記錄前移*/
{
strcpy(t[j-1].name,t[j].name); /*將后一條記錄的姓名拷貝到前一條*/
strcpy(t[j-1].units,t[j].units); /*將后一條記錄的單位拷貝到前一條*/
strcpy(t[j-1].tele,t[j].tele); /*將后一條記錄的電話拷貝到前一條*/
}
n--; /*記錄數(shù)減1*/
}
}
return n; /*返回記錄數(shù)*/
}
/*插入記錄函數(shù),參數(shù)為結(jié)構(gòu)體數(shù)組和記錄數(shù)*/
int add(ADDRESS t[],int n)/*插入函數(shù),參數(shù)為結(jié)構(gòu)體數(shù)組和記錄數(shù)*/
{
ADDRESS temp; /*新插入記錄信息*/
int i,j;
char s[20]; /*確定插入在哪個記錄之前*/
printf("please input record\n");
printf("************************************************\n");
printf("name unit telephone\n");
printf("--------------------------------------------------\n");
scanf("%s%s%s",temp.name,temp.units,temp.tele); /*輸入插入信息*/
printf("------------------------------------------------\n");
printf("please input locate name \n");
scanf("%s",s); /*輸入插入位置的姓名*/
i=find(t,n,s); /*調(diào)用find,確定插入位置*/
for(j=n-1;j=i;j--) /*從最后一個結(jié)點開始向后移動一條*/
{
strcpy(t[j+1].name,t[j].name); /*當(dāng)前記錄的姓名拷貝到后一條*/
strcpy(t[j+1].units,t[j].units); /*當(dāng)前記錄的單位拷貝到后一條*/
strcpy(t[j+1].tele,t[j].tele); /*當(dāng)前記錄的電話拷貝到后一條*/
}
strcpy(t[i].name,temp.name); /*將新插入記錄的姓名拷貝到第i個位置*/
strcpy(t[i].units,temp.units); /*將新插入記錄的單位拷貝到第i個位置*/
strcpy(t[i].tele,temp.tele); /*將新插入記錄的電話拷貝到第i個位置*/
n++; /*記錄數(shù)加1*/
return n; /*返回記錄數(shù)*/
}
/*保存函數(shù),參數(shù)為結(jié)構(gòu)體數(shù)組和記錄數(shù)*/
void save(ADDRESS t[],int n)
{
int i;
FILE *fp; /*指向文件的指針*/
if((fp=fopen("record.txt","wb"))==NULL) /*打開文件,并判斷打開是否正常*/
{
printf("can not open file\n");/*沒打開*/
exit(1); /*退出*/
}
printf("\nSaving file\n"); /*輸出提示信息*/
fprintf(fp,"%d",n); /*將記錄數(shù)寫入文件*/
fprintf(fp,"\r\n"); /*將換行符號寫入文件*/
for(i=0;in;i++)
{
fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);/*格式寫入記錄*/
fprintf(fp,"\r\n"); /*將換行符號寫入文件*/
}
fclose(fp);/*關(guān)閉文件*/
printf("****save success***\n"); /*顯示保存成功*/
}
/*讀入函數(shù),參數(shù)為結(jié)構(gòu)體數(shù)組*/
int load(ADDRESS t[])
{
int i,n;
FILE *fp; /*指向文件的指針*/
if((fp=fopen("record.txt","rb"))==NULL)/*打開文件*/
{
printf("can not open file\n"); /*不能打開*/
exit(1); /*退出*/
}
fscanf(fp,"%d",n); /*讀入記錄數(shù)*/
for(i=0;in;i++)
fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele); /*按格式讀入記錄*/
fclose(fp); /*關(guān)閉文件*/
printf("You have success read data from file!!!\n"); /*顯示保存成功*/
return n; /*返回記錄數(shù)*/
}
/*按序號顯示記錄函數(shù)*/
void display(ADDRESS t[])
{
int id,n;
FILE *fp; /*指向文件的指針*/
if((fp=fopen("record.txt","rb"))==NULL) /*打開文件*/
{
printf("can not open file\n"); /*不能打開文件*/
exit(1); /*退出*/
}
printf("Enter order number...\n"); /*顯示信息*/
scanf("%d",id); /*輸入序號*/
fscanf(fp,"%d",n); /*從文件讀入記錄數(shù)*/
if(id=0idn) /*判斷序號是否在記錄范圍內(nèi)*/
{
fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移動文件指針到該記錄位置*/
print(t[id]); /*調(diào)用輸出函數(shù)顯示該記錄*/
printf("\r\n");
}
else
printf("no %d number record!!!\n ",id); /*如果序號不合理顯示信息*/
fclose(fp); /*關(guān)閉文件*/
}
/*排序函數(shù),參數(shù)為結(jié)構(gòu)體數(shù)組和記錄數(shù)*/
void sort(ADDRESS t[],int n)
{
int i,j,flag;
ADDRESS temp; /*臨時變量做交換數(shù)據(jù)用*/
for(i=0;in;i++)
{
flag=0; /*設(shè)標(biāo)志判斷是否發(fā)生過交換*/
for(j=0;jn-1;j++)
if((strcmp(t[j].name,t[j+1].name))0) /*比較大小*/
{
flag=1;
strcpy(temp.name,t[j].name); /*交換記錄*/
strcpy(temp.units,t[j].units);
strcpy(temp.tele,t[j].tele);
strcpy(t[j].name,t[j+1].name);
strcpy(t[j].units,t[j+1].units);
strcpy(t[j].tele,t[j+1].tele);
strcpy(t[j+1].name,temp.name);
strcpy(t[j+1].units,temp.units);
strcpy(t[j+1].tele,temp.tele);
}
if(flag==0)break; /*如果標(biāo)志為0,說明沒有發(fā)生過交換循環(huán)結(jié)束*/
}
printf("sort sucess!!!\n"); /*顯示排序成功*/
}
/*快速查找,參數(shù)為結(jié)構(gòu)體數(shù)組和記錄數(shù)*/
void qseek(ADDRESS t[],int n)
{
char s[20];
int l,r,m;
printf("\nPlease sort before qseek!\n"); /*提示確認(rèn)在查找之前,記錄是否已排序*/
printf("please enter name for qseek\n"); /*提示輸入*/
scanf("%s",s); /*輸入待查找的姓名*/
l=0;r=n-1; /*設(shè)置左邊界與右邊界的初值*/
while(l=r) /*當(dāng)左邊界=右邊界時*/
{
m=(l+r)/2; /*計算中間位置*/
if(strcmp(t[m].name,s)==0) /*與中間結(jié)點姓名字段做比較判是否相等*/
{
print(t[m]); /*如果相等,則調(diào)用print函數(shù)顯示記錄信息*/
return ; /*返回*/
}
if(strcmp(t[m].name,s)0) /*如果中間結(jié)點小*/
l=m+1; /*修改左邊界*/
else
r=m-1; /*否則,中間結(jié)點大,修改右邊界*/
}
if(lr) /*如果左邊界大于右邊界時*/
printf("not found\n"); /*顯示沒找到*/
}
/*復(fù)制文件*/
void copy()
{
char outfile[20]; /*目標(biāo)文件名*/
int i,n;
ADDRESS temp[M]; /*定義臨時變量*/
FILE *sfp,*tfp; /*定義指向文件的指針*/
clrscr();/*清屏*/
if((sfp=fopen("record.txt","rb"))==NULL) /*打開記錄文件*/
{
printf("can not open file\n"); /*顯示不能打開文件信息*/
exit(1); /*退出*/
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示信息*/
scanf("%s",outfile); /*輸入目標(biāo)文件名*/
if((tfp=fopen(outfile,"wb"))==NULL) /*打開目標(biāo)文件*/
{
printf("can not open file\n"); /*顯示不能打開文件信息*/
exit(1); /*退出*/
}
fscanf(sfp,"%d",n); /*讀出文件記錄數(shù)*/
fprintf(tfp,"%d",n);/*寫入目標(biāo)文件數(shù)*/
fprintf(tfp,"\r\n"); /*寫入換行符*/
for(i=0;in;i++)
{
fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].units,
temp[i].tele); /*讀入記錄*/
fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,
temp[i].units,temp[i].tele); /*寫入記錄*/
fprintf(tfp,"\r\n"); /*寫入換行符*/
}
fclose(sfp); /*關(guān)閉源文件*/
fclose(tfp); /*關(guān)閉目標(biāo)文件*/
printf("you have success copy file!!!\n"); /*顯示復(fù)制成功*/
}
關(guān)于軟件開發(fā)流程圖示例關(guān)于班級管理和班級管理系統(tǒng)用例圖的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。