c語言課程設計總結

c語言課程設計總結

平臺用戶的互動中精選與c語言課程設計總結相關的:1、c語言 課程設計 3、要C語言程序設計試驗報告的小結,誰有? 4、學生成績記錄薄 c語言 課程設計報告 5、感覺C語言課程設計好難有沒有 9、C語言課程設計 10、C語言課程設計 貪吃蛇
c語言課程設計總結
平臺用戶 2018-06-06 17:02:05

下面是精選平臺用戶互動時的最佳討論

184***@qq.com
184***@qq.com


184***@qq.com:c語言 課程設計

設計一個課程管理系統。系統具有查詢,輸入,保存,排序等功能。系統有一個菜單界面,可供功能選擇。定義課程結構體類型,用數組保存課程信息,用指針方式進行訪問。定義多個功能函數,分別提供查詢,輸入,保存,排序等功能。查詢功能比如可分別按課程編號、... 設計一個課程管理系統。系統具有查詢,輸入,保存,排序等功能。系統有一個菜單界面,可供功能選擇。定義課程結構體類型,用數組保存課程信息,用指針方式進行訪問。定義多個功能函數,分別提供查詢,輸入,保存,排序等功能。查詢功能比如可分別按課程編號、課程名稱等參數進行查詢;需采用文件方式保存信息;排序功能比如可按學時排序,允許升序或降序排序求各位大神解救。麻煩發我郵箱[email protected]
下面的解答已被6706人點贊

你好!
  有個基本程序,可以滿足你的要求,你看看吧,可以根據需要修改程序

最后一次編輯時間 2015-06-30
純真孩子丶丵
純真孩子丶丵


純真孩子丶丵:要C語言程序設計試驗報告的小結,誰有?

下面的解答已被2577人點贊
通過對這一課題的設計和實現,我對Micosoft Visual C++環境進行了深一步的了解,并逐漸開始熟練Micosoft Visual C++環境的工作界面,以及對每一個快捷鍵的熟悉。并認識到,熟悉這些快捷鍵,極為便捷編寫程序,但是還要更加熟悉。 編程時要養成良好的風格,注意相同內容的縮進和對齊。這樣做,可以使程序代碼出錯的情況下,可以快速并且便捷的查找到錯誤的行,利于很好的修改。 通過這次編程我們深深的感受到對代碼的變量命名,代碼內注釋格式,甚至嵌套中行縮進的長度和函數間的空行數字都有明確規定,良好的編寫習慣,不但有助于代碼的移植和糾錯,也有助于不同人員之間的協作。 這個程序設計主要涉及到了C語言中的結構體、指針及文件操作等內容,只有充分掌握了C語言中的結構體、指針及文件操作等內容,才有可能組織好這些代碼,使之符合運算邏輯,得到理想的結果。 善于總結,也是學習能力的一種體現,每次完成一個編程任務,完成一段代碼,都應當有目的的跟蹤該程序的應用狀況,隨時總結,找到自己的不足,這樣所編寫的程序才能逐步提高,生活就是這樣,汗水預示著結果也見證著收獲。勞動是人類生存生活永恒不變的話題。通過實際動手做,我們才真正領略到“艱苦奮斗”這一詞的真正含義,我們想說,編程確實有些辛苦,但苦中也有樂,在這個團隊的任務中,一起的工作可以讓我們有說有笑,相互幫助,配合默契。對我們而言,知識上的收獲重要,精神上的豐收是可喜的。挫折是一份財富,經歷是一份擁有。這次實際操作必將成為我們人生旅途上一個非常美好的回憶! 回顧起此次課程設計,至今仍感慨頗多,的確,自從拿到題目到完成整個編程,從理論到實踐,在整整半個月的日子里,可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發現了自己的不足之處,對一些前面學過的知識理解得不夠深刻,掌握得不夠牢固,比如說結構體,指針……通過這次課程設計之后,我把前面所學過的知識又重新溫故了一遍。 同時,在*老師的身上我學得到很多實用的知識,在此表示感謝!同時,對給過我幫助的所有同學和指導老師再次表示忠心的感謝!
最后一次編輯時間 推薦于2017-09-20 10:16:58
冰封輪回
冰封輪回


冰封輪回:學生成績記錄薄 c語言 課程設計報告

這是題目: 學生成績記錄簿(限最多2人完成) 編制一個C語言成績記錄簿,每個學生信息包括:學號、姓名、C語言成績。具體功能: (1)創建信息鏈表并以磁盤文件保存; (2)讀取磁盤文件并顯示輸出所有學生的成績; (3)按學號或姓名查詢成績; (... 這是題目:
學生成績記錄簿(限最多2人完成)
編制一個C語言成績記錄簿,每個學生信息包括:學號、姓名、C語言成績。具體功能:
(1)創建信息鏈表并以磁盤文件保存;
(2)讀取磁盤文件并顯示輸出所有學生的成績;
(3)按學號或姓名查詢成績;
(4)添加成績記錄;
(5)修改指定姓名或學號的學生的成績并可存盤;
(6)顯示輸出60分以下、60~79、80~89、90分以上各分數段的學生信息。
求這個問題的配套課程設計報告,
下面的解答已被9885人點贊
C語言程序設計報告

課題名稱:學生成績管理

1 系統概述:

本程序為一個學生成績管理系統,對學生的成績進行管理,學生的信息包括學號,姓名,學期,三門課程的成績,輸入這些信息,本程序可以自動計算總成績,可以按高分到低分進行排名,并對輸入信息的人數進行匯總.

2 數據結構設計:

(1)結構體;

(2)數組的設計:運用指針代替數組,使用指針來建立線性表,使程序更加簡潔,可讀性更強.

3 各函數的設計:

函數原型:void InitList(SqLinkList &L);

功能: 創建一個空的線性鏈表;

入口參數:L為要創建的線性鏈表;

出口參數:創建鏈表的L.head為空,L.length為0;

返回值: 無;

函數原型:void EmptyLinkList(SqLinkList &L);

功能: 清空整個線性鏈表;

入口參數:L為要清空的鏈表名稱;

出口參數:若清空成功則鏈表長度L.length為0;

返回值: 無;

函數原型:int ScanE(ElemType &e);

功能: 輸入學生信息;

入口參數:e為要輸入信息的學生名稱;

出口參數:e.num保存學號,e.name保存姓名,e.team保存所在學期,e.s1,e.s2,e.s3分別保存三門課程的成績;

返回值: 輸入合法返回1,否則返回0;

錯誤處理:若學號、姓名等輸入不合法會有提示及重輸;

函數原型:Status SqLinkListAppend(SqLinkList &L,ElemType e);

功能: 追加一個結點到線性鏈表中;

入口參數:e為所追加的結點名稱,L為e所追加到的線性鏈表的名稱;

出口參數:若追加成功,則e為頭結點,鏈表長度L.length增1;

返回值: 若追加成功返回1;

函數原型:Link SearchNode(SqLinkList L,int NUM);

功能: 查找學號為NUM的學生;

入口參數:查找的鏈表名稱L,學號NUM;

出口參數:若找到結點指針p指向該結點,否則指向空結點;

返回值: 結點指針p;

函數原型:void SearchTeam(SqLinkList L,int team);

功能: 查找學期為team的所有記錄并輸出其信息;

入口參數:查找的鏈表名稱L,要查找的學期team;

出口參數:無;

返回值: 無;

函數原型:void SearchUnpass(SqLinkList L,float s1,float s2,float s3);

功能: 查找所有有掛科記錄的學生并輸出其信息;

入口參數:查找的鏈表名稱L,要查找的各門學科成績s1,s2,s3;

出口參數:無;

返回值: 無;

函數原型:void SqLinkListSearch(SqLinkList L);

功能: 對鏈表進行分類查找;

入口參數:要查找的鏈表名稱L;

出口參數:無;

返回值: 無;

函數原型: void inputData(SqLinkList &L);

功能: 輸入數據,并追加一個結點;

入口參數: L為要追加結點的鏈表名稱;

出口參數: 無;

返回值: 無;

函數原型:void SqLinkListTraverse(SqLinkList L);

功能: 輸出鏈表中所有學生成績列表;

入口參數:L為要輸出信息的鏈表名稱;

出口參數:無;

返回值: 無;

函數原型:void PrintE(ElemType e);

功能: 輸出一個結點的所有信息;

入口參數:要輸出的結點名稱e;

出口參數:無;

返回值: 無;

4 使用程序的說明:

本程序為一個學生成績管理系統。對學生的成績信息進行管理,學生的信息包括學號、姓名、學期、三門課程的成績、平均成績、名次。本管理系統實現學生的學號、姓名、學期、每門課程的成績的錄入,并自動按平均分排名,使用時按屏幕上的提示,輸入使用代碼.如下圖所示:

例如:輸入代碼數字”1”,程序執行”輸入學生成績或已存在的學生成績進行修改”這條小程序.輸入學生個人信息后,如下圖所示:

如此分別輸入相應的程序代碼,就執行相應的程序段.

如下的程序是按學號進行成績排名:

當輸入”6”時,執行相應的程序,即匯總一共輸入學生的人數:

5 總結和體會:

通過對C語言學習,尤其是這學期本班開展C語言雙語教學,體會到學習難的同時,也真正了解到C語言作為一門高級的計算機語言的強大功能,特別是在當今實際生活,生產,辦公,信息管理等方面的強大作用. 這次合作我們遇到了許多的困難。時間的緊迫,知識的不足,給我很大的壓力。最終我還是還是完成了任務。團結就是力量是我這次最真切的感受。

6 程序代碼:

void InitList(SqLinkList &L) {

// 構造一個空的線性表L;

L.head = 0; //頭指針為空;

L.length = 0; //長度初始為0;

}

void EmptyLinkList(SqLinkList &L){

//入口參數為整個線性表的數據,功能為清空線性表;

Node *p;

if(!L.head)printf("系統中不存在記錄。\n");

//頭指針為空時沒有學生錄入;

else {

while (L.head){

//每個循環將下一結點賦值給頭指針,并釋放本結點空間,直至線性表清空;

p=L.head;

L.head=p->next;

free(p);

} //end while;

L.length=0; //長度為0;

printf("該管理系統學生信息已清空。\n");

}//end else;

}

int ScanE(ElemType &e){

//輸入一個學生的成績數據結點。返回0為無效結點數據,1為有效結點數據;

printf("\n學號:");

scanf("%d",&e.num);

if(e.num==0){

//學號為0輸入不合法,重新輸入;

printf("學號輸入不合法.\n");

return 0;

}

printf("\n姓名:");

scanf("%s",&e.name);

printf("\n學期:");

scanf("%d",&e.team);

while(e.team>12){

//系統只記錄小于12的學期數;

printf("輸入的學期不能大于12,請重新輸入:");

scanf("%d",&e.team);

}

printf("\n成績A:");

scanf("%f",&e.s1);

printf("\n成績B:");

scanf("%f",&e.s2);

printf("\n成績C:");

scanf("%f",&e.s3);

return OK;

}

Status SqLinkListAppend(SqLinkList &L,ElemType e){

//追加一個結點到線性表中;

Node *p;

p=SearchNode(L,e.num);

//查找學號為e.num的記錄并將其地址賦給指針p;

if (p==0){

//若不存在添加學號相同的結點,追加一個結點;

p=(Node *)malloc(sizeof(Node));

if (!p) return ERROR;

memcpy(&(p->data),&e,sizeof(ElemType));

p->next=L.head ;

L.head=p;

//追加的一個結點為首結點;

L.length++; //表長度加1;

}

else { //如果該學號記錄已存在,則進行修改操作;

memcpy(&(p->data),&e,sizeof(ElemType));

printf("該學生記錄已經存在,已完成修改操作。\n");

}

return OK;

}

Link SearchNode(SqLinkList L,int NUM){

//查找學生記錄,該學生的學號為NUM;

Node *p;

p=L.head; //p先指在頭結點;

while (p&& p->data.num !=NUM ) p=p->next;

//如果該學生的學號不為NUM則查找下一個結點;

return p;

}

void SearchTeam(SqLinkList L,int team){

//按學期查找并輸出所有該學期存在的記錄;

Node *p;

p=L.head;

int n,sum=0;

//sum記錄該學期的學生總人數;

printf("請輸入您要查詢的學生的學期:");

scanf("%d",&n);

printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");

while(p&&p->next){

//如果p結點和它的下一結點不為空,且該結點的學期等于要查找學期,則格式輸出所有該學期學生信息;

if(p->data.team==n){

PrintE(p->data);

sum++;

//查找到一個該學期的學生記錄計數加1;

}

p=p->next;

//轉向下一結點;

} //end while;

if(p->data.team==n){

//如果p的下一結點為空,且本結點學期為n,則格式輸出該結點信息;

sum++;

PrintE(p->data);

}

if(sum==0)printf("沒有這學期的記錄。\n");

if(sum)printf("該學期共有%d人的記錄.\n",sum);

}

void SearchUnpass(SqLinkList L,float s1,float s2,float s3){

//查找并輸出有掛科的學生信息;

Node *p;

p=L.head;

int sum=0;

//sum計數掛科總人數,初始為0;

printf("以下是有一門以上不及格科目的學生的成績:\n");

printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");

while(p&&p->next){

//如果p及其下一結點為真,且該結點有一門以上科目分數低于60則輸出該結點成績并使sum計數加1;

if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60))

{

PrintE(p->data);

sum++;

} //end if;

p=p->next;

//轉到下一結點;

} //end while;

if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60)){

//查看最后一個結點,若有掛科,sum加1并格式輸出結點信息;

sum++;

PrintE(p->data);

}

if(sum==0)printf("沒有不及格的記錄。\n");

if(sum)printf("共有%d人的掛科記錄.\n",sum);

}

void SqLinkListSearch(SqLinkList L){

//分類查找學生記錄;

Node *p;

p=L.head;

int n,reg; //reg為查詢方式的指令;

printf("1--按學號查詢\n2--按學期查詢\n3--掛科學生信息列表\n");

printf("請您輸入查詢方式:");

scanf("%d",®);

if(L.length){

if(reg>3)printf("對不起沒有您要求的選項。\n");

//若reg>3則輸入不合法;

else if(reg==1){

//reg==1按學號查詢;

printf("請輸入您要查詢的學生的學號:");

scanf("%d",&n);

while(p&&p->next&& p->data.num !=n) p=p->next;

//當p和他下一結點為真時且結點數據不為要查找數據時轉向下一結點;

if(p->data.num==n){

//找到所要查詢結點,格式輸出;

printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");

PrintE(p->data);

}

else printf("沒有您要查找的學號。\n");

} //end reg==1 if ;

else if(reg==2)SearchTeam(L,p->data.team);

//reg==2,調用SearchTeam函數按學期查詢并輸出;

else if(reg==3)SearchUnpass(L,p->data.s1,p->data.s2,p->data.s3);

//reg==3,調用SearchUnpass函數,輸出全部有掛科記錄的學生信息;

}//end if;

else printf("系統中無記錄.\n");

}

void inputData(SqLinkList &L){

//請求輸入學生成績,則追加一個結點并輸入;

ElemType e;

if (ScanE(e)) SqLinkListAppend(L,e); //輸入數據,追加一個結點;

}

void SqLinkListTraverse(SqLinkList L){

//所有學生信息列表輸出;

Node *p;

char c;

p=L.head;

if(p) //非空表;

{

printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");

for (p=L.head ;p;p=p->next )PrintE(p->data);

//從第一個結點開始輸出所有信息直到結點為空;

}

else printf("系統中無記錄。\n");

//空表;

c=getchar();

}

void PrintE(ElemType e){

//輸出各科成績和平均成績;

printf("%d\t%s\t%d\t%f\t%f\t%f\t%f\n",e.num,e.name,e.team,e.s1,e.s2,e.s3,(e.s1+e.s2+e.s3)/3);

//格式輸出學生的學號、姓名、學期、A、B、C三門成績以及平均成績;

}
最后一次編輯時間 推薦于2016-08-10 03:58:16
孫叔2084
孫叔2084


孫叔2084:感覺C語言課程設計好難有沒有

下面的解答已被203人點贊
如果你讀過高中,考上了大學,c語言根本不算什么。慢慢來,需要時間和心血的
最后一次編輯時間 2017-12-30
牙上有韭菜
牙上有韭菜


牙上有韭菜:C語言課程設計

題目: 飛機訂票設計。 功能: 本飛機共有80個座位,分為20排,每排4個位子。編號為A,B,C,D。如10D表示10排D座。A和D靠窗,19到20排為吸煙區。本系統可以讓乘客自己選座號和區域,直到乘客滿意為止,無法滿足的話,只能改乘另一個航班。訂上票的乘客需要... 題目: 飛機訂票設計。

功能: 本飛機共有80個座位,分為20排,每排4個位子。編號為A,B,C,D。如10D表示10排D座。A和D靠窗,19到20排為吸煙區。本系統可以讓乘客自己選座號和區域,直到乘客滿意為止,無法滿足的話,只能改乘另一個航班。訂上票的乘客需要給出姓名和身份證號,最后要打印出乘客清單。

分布實施:

1、初步完成總體設計,搭好框架,確定人機對話的界面,確定兩個函數;
2、完成最低要求:建立一個小系統,包括5排座位,兩個區域,能供乘客選擇;
3、進一步要求:完成全部功能的系統。

要求: 1、用C語言實現程序設計;
2、利用結構體數組實現信息的數據結構設計;
3、系統的各個功能模塊要求用函數的形式實現;
4、界面友好(良好的人機交互),程序加必要的注釋。

課程設計試驗報告要求:

1、預習報告:題目、課程設計任務、數據結構、程序的總體設計(算法)、模塊劃分。
2、實驗總結報告:流程圖、主要源程序代碼(需打。、測試情況及調試中問題與解決方案、小結等。
下面的解答已被3307人點贊
我做好發給你了,注意接收] 
--------------------------------------------------------
//#include <stdafx.h>
#include < conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -2
#define PR printf
typedef int status;
typedef struct airline
{
char line_num[8];//航班號
char plane_num[8];//飛機號
char end_place[20];//目的的
int total;//座位總數
int left;//剩余座位
struct airline *next;//下一個結點
}airline;
typedef struct customer
{
char name[9];//顧客名
char line_num[8];//航班號
int seat_num;//座位號
struct customer *next;//下一個結點
}customer;
airline *init_airline()
{ //初始化鏈表
airline *l;
l=(airline*)malloc(sizeof(airline));
if(l==NULL)
{ exit(0);
}
l->next=NULL;
return l;
}
customer * init_customer(){//初始化鏈表
customer *l;
l=(customer*)malloc(sizeof(customer));
if(l==NULL){
exit(0);
}
l->next=NULL;
return l;
}
status insert_airline(airline **p,char *line_num,char *plane_num,char *end_place,int total,int left){//airline鏈表插入操作
airline *q;
q=(airline*)malloc(sizeof(airline));
strcpy(q->line_num , line_num);
strcpy(q->plane_num , plane_num);
strcpy(q->end_place , end_place);
q->total =total;
q->left =left;
q->next=NULL;
(*p)->next=q;
(*p)=(*p)->next;
// PR("insert %d ,%dis succssed!\n",e,bl);
return OK;
}
status insert_customer(customer **p,char *name,char *line_num,int seat){//customer鏈表插入操作
customer *q;
q=(customer*)malloc(sizeof(customer));
/* { PR("內存分配失敗\n");
return OVERFLOW; }*/
strcpy(q->name , name);
strcpy(q->line_num , line_num);
q->seat_num =seat;
q->next=NULL;
(*p)->next=q;
(*p)=(*p)->next;
// PR("insert %d ,%dis succssed!\n",e,bl);
return OK;
}
airline *modefy_airline(airline *l,char *line_num)//修改airline鏈表中的數據
{ airline *p;
p=l->next ;
for(;p!=NULL;p=p->next )
{ if(strcmp(line_num,p->line_num )==0)
{ p->left ++;
// PR("modefy %s\n",p->line_num );
return l;
}
}
PR("沒有這個航班,無法完成修改任務!\n");
return 0;
}
status delete_airline(airline *h,char *line_num)//刪除航班
{ airline *p,*pr;
pr=h;
p=pr->next ;
while(p!=NULL)
{ if(strcmp(line_num,p->line_num )==0)
{ pr->next =p->next ;
PR("刪除 %s 航班\n",p->line_num );
return OK;
}
pr=pr->next ;
p=pr->next ;
}
PR("無此航班,無法刪除!\n");
return ERROR;
}
status delete_customer(customer *h,char *line_num)//刪除顧客
{ customer *p,*pr;
pr=h;
p=pr->next ;
while(p!=NULL)
{ if(strcmp(line_num,p->line_num )==0)
{ pr->next =p->next ;
}
pr=pr->next ;
p=pr->next ;
}
// PR("無此航班,無法刪除!\n");
return OK;
}
status delete_cus(customer *h,airline *l,char *name)//顧客退票
{ customer *p,*pr;
char line_num[8];
// qr=h;
pr=h;
p=pr->next ;
// PR("開始刪除\n");
while(p!=NULL)
{ if(strcmp(name,p->name )==0)
{ strcpy(line_num,p->line_num );
l=modefy_airline(l,line_num);
pr->next =p->next ;
PR("顧客 %s 退票成功!\n",p->name );
return OK;
}
pr=pr->next ;
p=pr->next ;
}
PR("無此顧客,無法退票!\n");
return ERROR;
}
status save_airline(airline *l)//保存airline.dat
{ FILE *fp_airline;
char ch='#';
airline *p=l->next ;
char filename[]="c:\\airline.dat";
if((fp_airline=fopen(filename,"wb"))==NULL)
{ printf("can not open file to write:%s\n",filename);
return ERROR;
}
for(;p!=NULL;p=p->next )
{ // printf("%s,%s,%s,%d,%d\n",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
fprintf(fp_airline,"%s,%s,%s,%d,%d%c\n",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left ,ch);
}
fclose(fp_airline);
return OK;
}
status save_customer(customer *l)//保存顧客信息 customer.dat
{ FILE *fp_customer;
char ch='#';
customer *p=l->next ;
char filename[]="c:\\customer.dat";
if((fp_customer=fopen(filename,"wb"))==NULL)
{ printf("can not open file to write:%s\n",filename);
return ERROR;
}
for(;p!=NULL;p=p->next )
{ // PR("%s,%s,%d\n",p->name ,p->line_num ,p->seat_num );
fprintf(fp_customer,"%s,%s,%d%c",p->name ,p->line_num ,p->seat_num ,ch);
}
fclose(fp_customer);
return OK;
}
int changStrInt(char *ch)//把字符串轉化為整型
{ int a=1,b=0,c=0,i;
for (i=strlen(ch)-1;i>=0;i--)
{ if (ch[i]<58&&ch[i]>47)
{ b=a*(ch[i]-48);
a=a*10;
c=c+b;

}
else
{ PR("%c 不合法,無法將此字符串轉化為整形!\n",ch[i]);
return 0;
}
// printf("the c is %d\n",c);
}
return c;
}
status insert_air(airline *l,char *line_num,char *plane_num,char *end_place,int total,int left){//airline鏈表插入操作
airline *q;
q=(airline*)malloc(sizeof(airline));
strcpy(q->line_num , line_num);
strcpy(q->plane_num , plane_num);
strcpy(q->end_place , end_place);
q->total =total;
q->left =left;
q->next=l->next ;
l->next=q;
// PR("insert %d ,%dis succssed!\n",e,bl);
return OK;
}
status insert_cus(customer *l,char *name,char *line_num,int seat){//customer鏈表插入操作
customer *q;
q=(customer*)malloc(sizeof(customer));
strcpy(q->name , name);
strcpy(q->line_num , line_num);
q->seat_num =seat;
q->next=l->next ;
l->next=q;
return OK;
}
status load_airline(airline *l)
{ FILE *fp_airline;
int flag=0,i=0;
char ch;
char line_num[8];//航班號
char plane_num[8];//飛機號
char end_place[20];//目的的
char total_str[5];
char left_str[5];
int total;//座位總數
int left;//剩余座位
// airline *p=l;
char filename[]="c:\\airline.dat";
if((fp_airline=fopen(filename,"rb"))==NULL)
{ printf("can not open file to load:%s\n",filename);
return ERROR;
}
while(!feof(fp_airline))
{ ch=fgetc(fp_airline);
if(ch!='#')
{ if(flag==0&&ch!=',')
{ line_num[i]=ch;
i++;
}
else if(flag==1&&ch!=',')
{ plane_num[i]=ch;
i++;
}
else if(flag==2&&ch!=',')
{ end_place[i]=ch;
i++;
}
else if(flag==3&&ch!=',')
{ total_str[i]=ch;
i++;
}
else if(flag==4&&ch!=',')
{ left_str[i]=ch;
i++;
}
else if (ch==',')
{ flag++;
i=0;
}
/* else
{ PR("錯誤\n");
return ERROR;
}*/
}
else
{ flag=0;
i=0;
total=changStrInt(total_str);
left=changStrInt(left_str);
PR("%8s%8s%8s%9d%9d\n",line_num ,plane_num ,end_place ,total ,left );
insert_air(l,line_num,plane_num,end_place,total,left);
}
}
fclose(fp_airline);
return OK;
}
status load_customer(customer *l)
{ FILE *fp_customer;
int flag=0,i=0;
char ch;
char name[9];
char line_num[8];//航班號
char seat_num_str[5];
int seat_num;//座位
// customer *p=*l;
char filename[50]="c:\\customer.dat";
if((fp_customer=fopen(filename,"rb"))==NULL)
{ printf("can not open file to load:%s\n",filename);
return ERROR;
}
while(!feof(fp_customer))
{ ch=fgetc(fp_customer);
printf("%c\n",ch);
if(ch!='#')
{ if(flag==0&&ch!=',')
{ name[i]=ch;
i++;
}
else if(flag==1&&ch!=',')
{ line_num[i]=ch;
i++;
}
else if(flag==2&&ch!=',')
{ seat_num_str[i]=ch;
i++;
}
else if (ch==',')
{ flag++;
i=0;
}
else
{ PR("錯誤\n");
return ERROR;
}
}
else
{ flag=0;
seat_num=changStrInt(seat_num_str);
PR("%10s %10s %d\n",name ,line_num ,seat_num );
insert_cus(l,name,line_num,seat_num);
// p=p->next ;
}
}
fclose(fp_customer);
return OK;
}
status creat_airline(airline **l)//創建airline單鏈表
{ airline *p=*l;
int i=0;
char *line_num[3]={"bjnc01","bjsh02","shgz03"};
char *plane_num[3]={"plane1","plane2","plane3"};
char *end_place[3]={"nc","sh","gz"};
int total[3]={100,100,100};
int left[3]={51,50,78};
for (i=0;i<3;i++){
insert_airline(&p,line_num[i],plane_num[i],end_place[i],total[i],left[i]);
}
return OK;
}
status creat_customer(customer **l)////創建customer單鏈表
{ customer *p=*l;
int i=0;
char *name[3]={"ouyangj0","yhl","fs"};
char *line_num[3]={"bjnc01","bjsh02","shgz03"};
int seat_num[3]={1,5,10};
for (i=0;i<3;i++){
insert_customer(&p,name[i],line_num[i],seat_num[i]);
}
return OK;
}
status increase_air(airline *l,char *line_num,char *plane_num,char *end_place,int total)//增加航線
{ airline *p=l->next ;
for(;p->next !=NULL;p=p->next){}
insert_airline(&p,line_num,plane_num,end_place,total,total);
PR("增加航班 %s 成功!\n",line_num);
return OK;
}
status book(airline *l,char *line_num,customer *c,char *name)//訂票函數
{ airline *p=l;
customer *q=c->next ;
p=l->next ;
for(;q->next !=NULL;q=q->next){}
// PR("%s\n",q->name );
for(;p!=NULL;p=p->next )
{ if(strcmp(line_num,p->line_num )==0)
{ if(p->left >0)
{ PR("恭喜您!訂票成功!\n");
PR("你的座位號是: %d\n",(p->total -p->left +1));
insert_customer(&q,name,line_num,p->total -p->left +1);
p->left --;
return OK;
}
else PR("對不起,座位已滿!\n");
return 0;
}
}
PR("對不起,沒有這個航班號!\n");
return ERROR;
}
status print_airline(airline *l)//打印航線信息
{ airline *p=l->next ;
for(;p!=NULL;p=p->next )
{ PR("%8s%8s%8s%9d%9d\n",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
}
return OK;
}
status print_customer(customer *l)//打印顧客信息
{
customer *p=l->next ;
for(;p!=NULL;p=p->next )
{ PR("%10s %10s %d\n",p->name ,p->line_num ,p->seat_num );
}
return OK;
}
status inputpassword(char cc[9])//隱藏密碼為*號的函數 -------------------樓主,注意這里!
{
char c;
int i;
for(i=0;c=getch();i++)
{
if(c==13) break; /*13是回車的ascii碼,用'\n'不行,不知怎么回事*/
else
{
cc[i]=c;
printf("*");
}
}
cc[i]='\0';
//printf("\n");
//printf("%s",cc);
//getchar();
return strlen(cc);
}
void main()
{ char choice,choice2,name[9],line_num[8],password[9],plane_num[8],end_place[9];
char pass[9]="19851102",re_pass_1[9],re_pass_2[9];
int t=1,tt=1,total;
airline *air=init_airline();
customer *cus=init_customer();
PR(" 計算機0541課程設計 (一)\n");
PR(" 航空訂票系統\n");
PR(" 成員:晏凱\n");
creat_airline(&air);
creat_customer(&cus);
// save_airline(air);
// save_customer(cus);
while(t==1)
{ PR("*----------------------------*\n");
PR("*--航空訂票系統選擇菜單------*\n");
PR("* 訂票-------0 *\n");
PR("* 退票-------1 *\n");
PR("* 查詢-------2 *\n");
PR("* 修改航線---3 *\n");
PR("* 讀入文件---4 *\n");
PR("* 退出-------5 *\n");
PR("*----------------------------*\n");
PR("請選擇: ");
choice = getch();
PR("%c\n",choice);
if(choice=='0')
{ PR("請輸入你要訂的航班號: ");
scanf( "%s",line_num);
PR("請輸入你的姓名: ");
scanf( "%s",name);
book(air,line_num,cus,name);
save_airline(air);
save_customer(cus);
}
else if(choice=='1')
{ PR("\n請輸入你的姓名: ");
scanf( "%s",name);
delete_cus(cus,air,name);
save_airline(air);
save_customer(cus);
}
else if(choice=='2')
{ PR("\n 航班號 飛機號 目的地 總票數 余票數\n");
print_airline(air);
PR(" 姓名 航班號 座位號\n");
print_customer(cus);
}
else if(choice=='3')
{ tt=1;
PR("請輸入密碼: ");
//scanf("%s",password);
inputpassword(password);-----------------樓主,注意這里!我改了!

if(strcmp(password,pass)==0)
{ while (tt==1){
PR("\n*------------------------------*\n");
PR("*-------航線信息修改:----------*\n");
PR("* 增加航班號-----'0' *\n");
PR("* 刪除航班號-----'1' *\n");
PR("* 修改密碼-------'2' *\n");
PR("* 查詢航線信息---'3' *\n");
PR("* 退出航線修改---'4' *\n");
PR("*------------------------------*\n");
PR("請選擇: ");

choice2=getch();
PR("%c\n",choice2);
if(choice2=='0')
{ PR("請輸入你要增加的航班號: ");
scanf("%s",line_num);
PR("請輸入飛機號: ");
scanf("%s",plane_num);
PR("請輸入目的地: ");
scanf("%s",end_place);
PR("請輸入座位總數: ");
scanf("%d",&total);
increase_air(air,line_num,plane_num,end_place,total);
save_airline(air);
save_customer(cus);
}
else if (choice2=='1')
{ PR("請輸入你要刪除的航班號: ");
scanf("%s",line_num);
delete_airline(air,line_num);
delete_customer(cus,line_num);
save_airline(air);
save_customer(cus);
}
else if(choice2=='2')
{ PR("注意:密碼不能超過8位!\n");
PR("請輸入新密碼:");
scanf("%s",re_pass_1);
PR("請再輸入一次: ");
scanf("%s",re_pass_2);
if(strcmp(re_pass_1,re_pass_2)==0)
{ strcpy(pass,re_pass_1);
PR("密碼修改成功!請記住.\n");
}
else { PR("你兩次輸入的密碼不一致!\n");
}
}
else if(choice2=='3')
{ PR("\n 航班號 飛機號 目的地 總票數 余票數\n");
print_airline(air);
}
else if(choice2=='4')
{ tt=0;
}
else {
PR("你的輸入有誤\n");
tt=0;
}
}//end while
}//end if
else {
PR("對不起!你輸入的密碼不正確!\n");
}
}//end else if 修改
else if(choice=='4')
{ load_airline(air);
load_customer(cus);
}
else if(choice=='5')
{ PR("再見!");
t=0;
}
else
{ PR("你的輸入有誤\n");
}
}
getch();
}
最后一次編輯時間 推薦于2016-09-08 11:55:42
清風清木
清風清木


清風清木:C語言課程設計 貪吃蛇

要求:一、 題目意義和設計思想
二、采用的主要技術、遇到的難點和解決方法
三、實現的主要功能和系統結構
四、心得體會
五、算法描述和相關技術說明
我們學校要我們編一個關于貪吃蛇的游戲,還要寫出心得體會,如果能全部幫我完成的話,我可以提高懸賞金額,謝謝啦
下面的解答已被8314人點贊

2.1程序功能介紹

貪吃蛇游戲是一個經典小游戲,一條蛇在封閉圍墻里,圍墻里隨機出現一個食物,通過按鍵盤四個光標鍵控制蛇向上下左右四個方向移動,蛇頭撞倒食物,則食物被吃掉,蛇身體長一節,同時記10分,接著又出現食物,等待蛇來吃,如果蛇在移動中撞到墻或身體交叉蛇頭撞倒自己身體游戲結束。

2.2程序整體設計說明

一個游戲要有開始部分,運行部分,結束部分(實際上開始部分與運行部分是一體的)。

2.2.1設計思路

這個程序的關鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示。移動時必須從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當前方向上前移,當游戲者按了有效的方向鍵后,蛇頭朝著指定的方向移動,一步移動一節身體,所以當按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動,圖形的實現是從蛇頭的新位置開始畫出蛇,這時由于沒有慶平的原因,原來蛇的位置和新蛇的位置差一個單位,所以看起來社會多一節身體,所以將蛇的最后一節用背景色覆蓋。食物的出現和消失也是畫矩形塊和覆蓋矩形塊

2.2.2數據結構設計及用法說明 

開始部分:

游戲是運行在圖形模式下的,所以第一步一定是初始化圖形模式,接著要有開始的界面,就像書有封面一樣,我設置了一個游戲的標題畫面,除了游戲標題畫面我還設置了一個歡迎畫面。標題畫面以后,還要為游戲的運行部分作初始化,包括繪制游戲運行時的背景,對游戲某些重 要變量的初始化。

運行部分:

作為游戲的核心部分,這里包括的函數比較多,也就是模塊比較多,首先讓我模擬一下貪吃蛇的游戲模式:某個世界上突然出現一條蛇,它很短,它的運動神經異常,它沒法停止自己的多動癥在它的世界里就只有食物,它很餓,也很貪吃;同樣在不明原因的情況下,食物從天而降,可惜的是沒有落到嘴邊;饑餓的主人公,不管它有沒有毒,也不問食物的來歷,徑直向食物爬去;它吃到食物啦,它超出想象的同化能力讓食物很快的成為自己身體的一部分,它的身子變長啦。當它吃到第一顆食物時,上帝有給它第二顆,于是它吃了第二顆,于是又變長了,于是又有第三顆……它的身子是一直的加長,它不管自己過長身體的麻煩——轉身不便,繼續吃下去,現在它是直接把巴張大,好讓食物有個綠色通道。但是在某天的下午,它咬到了自己,它才想起自己是一條毒蛇,于是暈死過去(不是毒死);又或者它往食物沖鋒的時候,它失去控制,撞到了墻上。

第一輪循環:第一步,出現食物;第二步,蛇不停運動;第三步,檢查蛇是撞到自己或墻壁;由第四步起游戲有兩條支線(A、B):

A :第四步,蛇沒有碰到自己或墻壁,蛇繼續前進,繪制蛇的動作;第五步,判斷蛇是否吃到食物,如果蛇吃到食物,身子變長,原來的食物消失;第六步,讓玩家輸入控制指令,讓蛇在下一輪循環的第二步改變運動方向;第七步,第二輪循環的第一步,重復第一輪的步驟;

B:第四步,蛇碰到自己或墻壁,終止游戲。

結束部分:

游戲結束時,顯示“GAME OVER”,已經是約定俗成的規律了,我的游戲也不例外。除了游戲結束畫面外,我還設置了一個游戲退出畫面,“善始善終”嘛。

有了上述的大致劃分,我把整個程序劃分成(13+2)個模塊(其實就是函數)

2.2.3程序結構(流程圖)

圖2.1流程圖

依據所需要處理的任務要求,規劃輸入數據和輸出結果,決定存放數據的數據結構。

C語言中數據結構集中體現在數據類型上,因此在進行C語言程序設計時,應統籌規劃程序中所使用的變量,數組,指針等,以及它們的類型等。這點是很重要的,如果在此期間選擇不合適的變量或者數組,將來修改就十分困難。

現在分析一下貪吃蛇游戲中的元素,繼而得出與它們對應的在程序中的描述:

蛇:

基本描述:長度,顏色,位置。

對應數據與數據類型:長度—雖然可以用坐標表示,但是這樣的話,運算量將很大,所以換算成較大的單位—節數,以固定長度的每節描述;坐標--整型;顏色--整型; 位置--X,Y坐標。

增加的描述:蛇運動的方向,蛇的生命。

對應數據與數據類型:這些描述是為了與程序的按鍵的輸入部分與判斷游戲結束部分相聯系而設的。方向只有四個方向:上下左右?梢栽O置與之對應的四個整型數:3、4、2、1。生命就只有兩種情況:死或生,對應0或1。

食物:   

基本描述:顏色,位置。

對應數據與數據類型:由于顏色設成固定的,所以不再討論。位置—X、Y坐標。

增加的描述:食物的存在。

對應數據與數據類型:這是為了避免重復出現食物而設置的,與繪制食物的函數有聯系。只有兩個值:0或1(沒有食物或有食物)

其他的元素:墻,由于它在顯示上是作為背景而存在的,所以并沒有什么說明實際的墻壁就是四條直線組成的邊框,由坐標描述。

還需要的變量:鍵盤鍵入的鍵值(作為全局變量,整型);經常要使用的循環變量;自定義的填充圖案;說明文字的字符數組;游戲的記分;游戲的速度(蛇的速度)。

圖2.2蛇的不停運動的關鍵算法的流程圖

2.2.4各模塊的功能及程序說明

主要模塊的實現思路和算法的流程圖說明:

關鍵所在——蛇不停移動的Snakemove():

蛇的不停移動,就是蛇的下一節取代前一節的位置,在計算機中就是蛇下一節的位置坐標變成前一節的位置坐標。在上文中,已定義蛇的位置坐標為數組類型,一組坐標對應一節的位置,假設有i+1節,由0到i節,第i節的坐標取第i-1節的坐標,第i-1節的坐標取第i-2節的坐標……直到第1節取第0節的坐標。而第0節的坐標,即蛇頭的坐標要往某個方向變化,變化量為蛇每節的長度。蛇的這種坐標輪換需要循環語句使其繼續下去。  

2.2.5程序結果

運行程序得到如下初始界面圖:

圖2.3程序結果圖

用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示:

圖2.4程序結果圖

蛇沒有碰到自己或墻壁,蛇繼續前進:

圖2.5程序結果圖

游戲結束時,顯示“GAME OVER”

圖2.6程序結果圖

2.3程序源代碼及注釋

#define N 200

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

int gamespeed=50000;/*游戲速度自己調整*/

struct Food{

int x;/*食物的橫坐標*/

int y;/*食物的縱坐標*/

int yes;/*判斷是否要出現食物的變量*/

}food;/*食物的結構體*/

struct Snake{

int x[N];

int y[N];

int node;/*蛇的節數*/

int direction;/*蛇移動方向*/

int life;/* 蛇的生命,0活著,1死亡*/

}snake;

void Init(void);/*圖形驅動*/

void Close(void);/*圖形結束*/

void DrawK(void);/*開始畫面*/

void GameOver(void);/*結束游戲*/

void GamePlay(void);/*玩游戲具體過程*/

void PrScore(void);/*輸出成績*/

/*主函數*/

void main(void){

Init();/*圖形驅動*/

DrawK();/*開始畫面*/

GamePlay();/*玩游戲具體過程*/

Close();/*圖形結束*/}

/*圖形驅動*/

void Init(void){

int gd=DETECT,gm;

registerbgidriver(EGAVGA_driver);

initgraph(&gd,&gm,"c:\\program files\\winyes\\tc20h\\bgi");

cleardevice();}

/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻*/

void DrawK(void){

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/

for(i=50;i<=600;i+=10)/*畫圍墻*/   {

rectangle(i,40,i+10,49); /*上邊*/

rectangle(i,451,i+10,460);/*下邊*/   }

for(i=40;i<=450;i+=10)  {

rectangle(50,i,59,i+10); /*左邊*/

rectangle(601,i,610,i+10);/*右邊*/ }}

/*玩游戲具體過程*/

void GamePlay(void){

randomize();/*隨機數發生器*/

food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/

snake.life=0;/*活著*/

snake.direction=1;/*方向往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇頭*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*節數*/

PrScore();/*輸出得分*/

while(1)/*可以重復玩游戲,壓ESC鍵結束*/   {

while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/      {

if(food.yes==1)/*需要出現新食物*/     {

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物隨機出現后必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*畫面上有食物了*/     }

if(food.yes==0)/*畫面上有食物了就要顯示*/     {

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);     }

for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵算法*/         {

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];     }

/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/

switch(snake.direction)     {

case 1:snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break;     }

for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/     {

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])        {

GameOver();/*顯示失敗*/

snake.life=1;

break;        }        }

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到墻壁*/    {

GameOver();/*本次游戲結束*/

snake.life=1; /*蛇死*/    }

if(snake.life==1)/*以上兩種判斷以后,如果蛇死就跳出內循環,重新開始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/    {

setcolor(0);/*把畫面上的食物東西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/

snake.node++;/*蛇的身體長一節*/

food.yes=1;/*畫面上需要出現新的食物*/

score+=10;

PrScore();/*輸出新得分*/    }

setcolor(4);/*畫出蛇*/

for(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最后一節*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);     }  /*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循環*/

break;

key=bioskey(0);/*接收按鍵*/

if(key==ESC)/*按ESC鍵退出*/

break;

else

if(key==UP&&snake.direction!=4)

/*判斷是否往相反的方向移動*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}/*endwhile(1)*/}

/*游戲結束*/

void GameOver(void){

cleardevice(); 

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();}

/*輸出成績*/

void PrScore(void){   

char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);}

/*圖形結束*/

void Close(void){   

getch();

closegraph();

}

最后一次編輯時間 2018-03-30
金蟾捕鱼单机下载