導航:首頁 > 源碼編譯 > C演算法課程

C演算法課程

發布時間:2023-05-12 00:52:34

『壹』 大學c語言課程設計,急求急求啊,這2天就要,求大神幫忙!!!!!!!

C++行賀旦不?這是我們的一個禪沖擾小項目,你拿去稍微修改判漏下:http://yunpan.cn/QevHf26VQMZqH

『貳』 數據結構課程設計(C版語言)二叉排序樹演算法

下面的程序包含了樹二叉樹的所有操作
在二叉樹的應用中有二叉排序樹。
都是C語言,只不過用了C++的cin(輸入)和cout(輸出),因為這兩個不需要格式控制符。
//建一個工程:包含頭文件:bittree.h Cpp文件:bittree.cpp main函數:main.cpp
編譯運行就可以了。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//頭文件 bittree.h
#ifndef _DEF
#define _DEF
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define TURE 1
#define OK 1
#define FALSE 0
#define ERROR 0
#define INFEASIBLE -1//不可實行的
#define OVERFLOW -2
typedef int stas;
typedef char Telemtype;
//typedef int Telemtype2;//為了二叉排序樹的創建
typedef char ElemType;
#define STACK_SIZE 100;
#define STACKINCREMENT 10;

//二叉樹
typedef struct bitnode{
Telemtype data;
struct bitnode *lchild,*rchild;
}BitNode,*BitTree;
extern stas CreateBitTree(BitTree &T);
extern stas PreOrderTraverse(BitTree T);
extern stas InOrderTraverse(BitTree T);
extern stas PostOrderTraverse(BitTree T);

typedef BitNode selemtypechar;
typedef BitTree selemtypechar2;

// 棧
typedef struct SqStack{
selemtypechar2 *base;
selemtypechar2 *top;
int stacksize;
}sqstack;
extern stas initstackC(sqstack &S);
extern stas gettopC(sqstack S,selemtypechar2 &e);
extern stas pushC(sqstack &S,selemtypechar2 e);
extern stas popC(sqstack &S,selemtypechar2 &e);
extern stas destroyC(sqstack &S);//銷毀
extern stas clearC(sqstack &S);//置空
extern stas stackempty(sqstack S);

//棧實現二叉樹的輸出
extern stas PreOrderTraverse2(BitTree T);
extern stas InOrderTraverse2(BitTree T);
extern stas PostOrderTraverse2(BitTree T);
//二叉樹的應用
extern stas Depth(BitTree T);
extern stas Single(BitTree T);
extern stas Double(BitTree T);
extern stas CountLeaf(BitTree T);
extern void Change_Left_Right(BitTree T);
//二叉層次遍歷用到隊列
typedef BitTree Qelemtype;
typedef struct QNode{
Qelemtype data;
struct QNode *next;
}qnode,*QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
extern stas InitQueue(LinkQueue &Q);
extern stas DestroyQueue(LinkQueue &Q);
extern stas EnterQueue(LinkQueue &Q,Qelemtype e);
extern stas DeQueue(LinkQueue &Q,Qelemtype &e);
//二叉層次遍歷
extern stas LevelOrder(BitTree T);
//二叉排序樹
extern void insert(BitTree &T,ElemType x);
extern void CreateBiTree2(BitTree &root);

#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//cpp文件 bittree.cpp
#include "bittree.h"
#include <stdlib.h>

stas initstackC (sqstack &s)
{
s.base=(selemtypechar2 *)malloc(100*sizeof(selemtypechar));//用STACKINCREMENT會報錯???
if (!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=100;
return OK;
}
stas gettopC(sqstack s,selemtypechar2 &e)
{
if(s.base==s.top) return ERROR;
e=*(s.top-1);
return OK;
}
stas pushC(sqstack &s,selemtypechar2 e)
{
if ((s.top-s.base)>=s.stacksize)
{
s.base=(selemtypechar2 *)realloc(s.base,((s.stacksize+10)*(sizeof(selemtypechar))));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=10;
}
*(s.top++)=e;
//s.top++;
return OK;
}
stas popC(sqstack &s,selemtypechar2 &e)
{
if(s.top==s.base) return ERROR;
--s.top;
e=*(s.top);
return OK;
}
stas destroyC(sqstack &s)
{
free(s.base); s.base=NULL;s.top=NULL;
return OK;
}
stas clearC(sqstack &s)
{
s.top=s.base;
return OK;
}
stas stackempty(sqstack s)
{
if(s.top!=s.base) return ERROR;
else
return OK;
}

//二叉樹
stas CreateBitTree(BitTree &T)//創建
{
Telemtype ch;
cin>>ch;
if(ch=='#') T=NULL;
else{
T=(BitTree)malloc(sizeof(BitNode));
if (!T) exit (OVERFLOW);
T->data=ch;
CreateBitTree(T->lchild);
CreateBitTree(T->rchild);
}
return OK;
}
stas PreOrderTraverse(BitTree T)//先序訪問
{
if(!T) return ERROR;
else if (T)
{
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
stas InOrderTraverse(BitTree T)//中序
{
if(!T) return ERROR;
else if (T)
{
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
return OK;
}
stas PostOrderTraverse(BitTree T)//後序
{
if(!T) return ERROR;
else if (T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data<<" ";
}
return OK;
}

//棧實現二叉樹的訪問
stas PreOrderTraverse2(BitTree T)//先序
{
sqstack s;
BitTree p;
initstackC(s);
p=T;
//pushC(s,p);
while (p||!stackempty(s))
{
//popC(s,p);
if (p)
{
pushC(s,p);
if(!p->data)return ERROR;
cout<<p->data<<" ";
//p1=p;
p=p->lchild;
if (p==NULL)
{
popC(s,p);
p=p->rchild;
}
else
pushC(s,p);

}
else {
popC(s,p);
popC(s,p);
p=p->rchild;
if (p==NULL)
{
popC(s,p);
if (p==NULL)
{
return OK;
}
else
{
p=p->rchild;
}
}
else{
pushC(s,p);
if(!p->data)return ERROR;
cout<<p->data<<" ";
p=p->lchild;//左空不壓棧
if (p==NULL)
{
popC(s,p);
p=p->rchild;
}
else
pushC(s,p);
}
}
}
destroyC(s);
return OK;
}
stas InOrderTraverse2(BitTree T)//中序
{
sqstack s;
BitTree p;
initstackC(s);
p=T;
while (p||!stackempty(s))
{
if (p)
{
pushC(s,p);
p=p->lchild;
}
else {
popC(s,p);
if(!p->data)return ERROR;
cout<<p->data<<" ";
p=p->rchild;
}
}
destroyC(s);
return OK;
}

stas PostOrderTraverse2(BitTree T)//後序
{
sqstack s;
BitTree p;
initstackC(s);
p=T;
while (p||!stackempty(s))
{
if (p)
{
pushC(s,p);
p=p->lchild;
if (p==NULL)
{
popC(s,p);
//p=p->rchild;
if (p->rchild==NULL)
{
if(!p->data)return ERROR;
cout<<p->data<<" ";
//p=p->rchild;
popC(s,p);
if (p==NULL)
{
return OK;
}
else
{
//pushC(s,p);//???右結點重復壓棧???
//p1=p;
p=p->rchild;
//p->rchild=NULL;
}
}
else
{
p=p->rchild;
}
}
else
continue ;
}
else
{
//popC(s,p);
if(!p->data)return ERROR;
cout<<p->data<<" ";
popC(s,p);
if (p==NULL)
{
return OK;
}
else
{
//pushC(s,p);
//p1=p;
p=p->rchild;
//p->rchild=NULL;
}
}
}
destroyC(s);
return OK;
}
//二叉樹的應用

//二叉樹的深度
stas Depth(BitTree T)
{
int depthval,depthLeft,depthRight;
if (!T) depthval=0;
else{
depthLeft=Depth(T->lchild);
depthRight=Depth(T->rchild);
depthval=1+(depthLeft>depthRight?depthLeft:depthRight);
}
return depthval;
}
//二叉樹的單分支結點數
stas Single(BitTree T)
{
if (T==NULL) return 0; //空樹
else if (T->lchild==NULL && T->rchild==NULL) return 0; //葉子結點
else{
if (!T->lchild && T->rchild) return Single(T->rchild)+1;//只有左單分支
if (T->lchild && !T->rchild) return Single(T->lchild)+1;//只有右單分支
if(T->lchild && T->rchild) return Single(T->lchild)+Single(T->rchild);//雙分支結點
}
}
//二叉樹的多分支結點數
stas Double(BitTree T)
{

if (T==NULL) return 0; //空樹
else if (T->lchild==NULL && T->rchild==NULL) return 0; //葉子結點
else{
if (!T->lchild && T->rchild) return Double(T->rchild);//只有左單分支
if (T->lchild && !T->rchild) return Double(T->lchild);//只有右單分支
if(T->lchild && T->rchild) return Double(T->lchild)+Double(T->rchild)+1;//雙分支結點
}
}
//葉子結點
stas CountLeaf(BitTree T)
{
int num,num1,num2;
if(T==NULL) num=0;
else if(T->lchild==NULL&&T->rchild==NULL)
num=1;
else
{
num1=CountLeaf(T->lchild);
num2=CountLeaf(T->rchild);
num=num1+num2;
}
return num;
}
//交換左右子樹
void Change_Left_Right(BitTree T)
{
BitTree Temp;
if (T)
{
Change_Left_Right(T->lchild);
Change_Left_Right(T->rchild);
Temp=T->lchild;
T->lchild=T->rchild;
T->rchild=Temp;
}
}
//二叉層次遍歷用到隊列
stas InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(100*sizeof(qnode));
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
stas DestroyQueue(LinkQueue &Q)
{
while (Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return OK;
}

stas EnterQueue(LinkQueue &Q,Qelemtype e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(qnode));
if(!p) return ERROR;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
stas DeQueue(LinkQueue &Q,Qelemtype &e)
{ QueuePtr p;
if(Q.front==Q.rear) return ERROR;
p=Q.front->next;e=p->data;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
free(p);
return OK;
}
//二叉層次遍歷
stas LevelOrder(BitTree T)
{
LinkQueue Q;
BitTree B;
InitQueue(Q);
if (T!=NULL)
{
EnterQueue(Q,T);
while (!(Q.front==Q.rear))
{
DeQueue(Q,B);
cout<<B->data<<" ";
if(B->lchild!=NULL) EnterQueue(Q,B->lchild);
if(B->rchild!=NULL) EnterQueue(Q,B->rchild);
}
}
return OK;
}
//二叉排序樹
void insert(BitTree &T,ElemType x)
{
if (T==NULL)
{
T=(BitTree)malloc(sizeof(BitNode));
T->data=x;
T->lchild=T->rchild=NULL;
}
else
{
if(x<T->data)insert(T->lchild,x);
if(x>=T->data)insert(T->rchild,x);
}
}
void CreateBiTree2(BitTree &root)
{
ElemType x;
root=NULL;
cout<<"二叉排序樹的創建<以'#'結束!!!>"<<endl;
cout<<"<請輸入字母,沒寫整型!!!>"<<endl;
cin>>x;
while (x!='#')
{
insert(root,x);
cin>>x;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//主函數 main.cpp
#include "bittree.h"
void main()
{
system("cls");
system("color f0");
BitTree T;
Create:
cout<<'\t'<<'\t'<<"先序創建二叉樹<以'#'表示左右孩子為空!!!>:"<<endl;
CreateBitTree(T);
BitTree T1(T);
select:
cout<<'\t'<<'\t'<<"----------------MAIN-MENU----------------"<<endl;
cout<<'\t'<<'\t'<<"&1、先序輸出 2、中序輸出 3、後序輸出 &"<<endl;
cout<<'\t'<<'\t'<<"&4、棧實現輸出 5、重新創建二叉樹 0、退出&"<<endl;
cout<<'\t'<<'\t'<<"------------6、二叉樹的應用-------------"<<endl;
char sel;
getchar();
cin>>sel;
switch (sel)//總
{
case '0':
break;
case '1':cout<<endl<<"---------------------------------"<<endl;
PreOrderTraverse(T);
cout<<endl<<"---------------------------------"<<endl;
goto select;
case '2':cout<<endl<<"---------------------------------"<<endl;
InOrderTraverse(T);
cout<<endl<<"---------------------------------"<<endl;
goto select;
case '3':cout<<endl<<"---------------------------------"<<endl;
PostOrderTraverse(T);
cout<<endl<<"---------------------------------"<<endl;
goto select;
case '4':
stackcout:
cout<<endl<<'\t'<<" -------------------SUB-MENU1---------------------"<<endl;
cout<<'\t'<<" &1、先序輸出 2、中序輸出 3、後序輸出 4、返回 &"<<endl;
cout<<'\t'<<" ------------------------------------------------"<<endl;
cin>>sel;
switch (sel)//棧關於樹的輸出
{
case '1':cout<<endl<<"---------------------------------"<<endl;
PreOrderTraverse2(T1);//p->lchild==null,時 T 的值被修改!!!!!!!!
cout<<endl<<"---------------------------------"<<endl;
goto stackcout;
case '2':cout<<endl<<"---------------------------------"<<endl;
InOrderTraverse2(T);
cout<<endl<<"---------------------------------"<<endl;
goto stackcout;
case '3':cout<<endl<<"---------------------------------"<<endl;
PostOrderTraverse(T1);//棧實現未寫完
cout<<endl<<"---------------------------------"<<endl;
goto stackcout;
case '4':goto select;
default:cout<<"選擇錯誤!!!"<<endl;
goto stackcout;
}
case '5':
goto Create;
case '6':
{
SUB_MENU2:
cout<<'\t'<<'\t'<<"-------------------------SUB-MENU2---------------------"<<endl;
cout<<'\t'<<'\t'<<"&1、二叉樹的深度 2、二叉樹的單分支結點數 &"<<endl;
cout<<'\t'<<'\t'<<"&3、二叉樹的多分支結點數 4、二叉樹的葉子結點數 &"<<endl;
cout<<'\t'<<'\t'<<"&5、二叉層次遍歷 6、二叉排序樹 7、交換左右子樹 &"<<endl;
cout<<'\t'<<'\t'<<"&------------------8、輸出 0、返回--------------------&"<<endl;
cin>>sel;
switch (sel)//二叉樹的應用
{
case '0':
goto select;
case '1':
{
int deepth=0;
deepth=Depth(T);
cout<<endl<<"---------------------------------"<<endl;
cout<<"樹的深度為:"<<deepth<<endl;
cout<<endl<<"---------------------------------"<<endl;
}
goto SUB_MENU2;
case '2':
{
int cou_sig;
cou_sig=Single(T);
cout<<endl<<"---------------------------------"<<endl;
cout<<"此樹的單分支結點為數:"<<cou_sig<<endl;
cout<<endl<<"---------------------------------"<<endl;
}
goto SUB_MENU2;
case '3':
{
int cou_dou;
cou_dou=Double(T);
cout<<endl<<"---------------------------------"<<endl;
cout<<"此樹的雙分支結點數為:"<<cou_dou<<endl;
cout<<endl<<"---------------------------------"<<endl;
}
goto SUB_MENU2;
case '4':
{
int cou_leaf;
cou_leaf=CountLeaf(T);
cout<<endl<<"---------------------------------"<<endl;
cout<<"此樹的葉子結點數為:"<<cou_leaf<<endl;
cout<<endl<<"---------------------------------"<<endl;
}
goto SUB_MENU2;
case '5':
{
cout<<"二叉層次遍歷的結果為:"<<endl;
cout<<endl<<"---------------------------------"<<endl;
LevelOrder(T);
cout<<endl<<"---------------------------------"<<endl;
}
goto SUB_MENU2;
case '6':
{
BitTree T3;
CreateBiTree2(T3);
SUB3:
cout<<'\t'<<"-------------------------SUB-MENU2-------------------"<<endl;
cout<<'\t'<<" &1、先序輸出 2、中序輸出 3、後序輸出 0、返回 &"<<endl;
cout<<'\t'<<"-----------------------------------------------------"<<endl;
cin>>sel;
switch (sel)//二叉樹的層次遍歷
{
case '0':
break;
case '1':cout<<endl<<"---------------------------------"<<endl;
PreOrderTraverse(T3);
cout<<endl<<"---------------------------------"<<endl;
goto SUB3;
case '2':cout<<endl<<"---------------------------------"<<endl;
InOrderTraverse(T3);
cout<<endl<<"---------------------------------"<<endl;
goto SUB3;
case '3':cout<<endl<<"---------------------------------"<<endl;
PostOrderTraverse(T3);
cout<<endl<<"---------------------------------"<<endl;
goto SUB3;
default:
cout<<"選擇錯誤!!!"<<endl;
goto SUB3;
}
}
goto SUB_MENU2;
case '7':
{
Change_Left_Right(T);
cout<<endl<<"---------------------------------"<<endl;
cout<<"交換完成,請選擇8輸出查看!!!"<<endl;
cout<<endl<<"---------------------------------"<<endl;
}
goto SUB_MENU2;
case '8':
goto select;
default:
cout<<"選擇錯誤!!!"<<endl;
goto SUB_MENU2;
}
}
break;
default :
cout<<endl<<"選擇錯誤!!!"<<endl;
goto select;
}
}

『叄』 C語言教程的內容是

C語言學習從入門到精通的一套經典視頻教程,本課程通過高清晰的視頻、概念詳解、實例精講、習題測試讓你很快的掌握C語言的相關知識,並領略運用到實例中去。在針對一些用戶認為C語言比較難學的情況下,本課程從初中級用戶的角度出發,進行合理的內容安排,突出學、練、用、鞏固相結合的特點,以通俗易懂的語言,豐富多彩的實例,詳細介紹了使用C語言進行程序開發應該掌握的各方面知識。本課程主要給大家講解了C語言概述,演算法,數據類型,運算符與表達式,常用的數據輸入、輸出函數,選擇結構程序設計,循環控制,數組,函數,指針,結構體和共用體,位運算,預處理,模塊化編程,編程規范,C語言常見問題及分析,習題測試等內容。所有知識都結合具體實例進行介紹,涉及的程序代碼給出了詳細的講解,可以使讀者輕松領會C語言程序開發的精髓,快速提高開發技能。

課程內容詳盡,實例豐富,非常適合作為單片機及編程初學者的學習課程,也可作為大中院校相關專業在校學生及畢業生的教學輔導課程、短期C語言培訓課程,是C語言編程愛好者從入門到深入的經典課程。
課程共分為15講,每節課的內容大綱如下:

第1課 C語言概述
1、幾種常見的程序設計語言
2、C語言出現的歷史背景
3、C語言的特點
4、簡單的C程序介紹
5、C程序的上機步驟
6、習題測試
第2課 程序的靈魂-演算法
1、程序設計過程
2、演算法的基本概念
3、演算法的特徵
4、演算法的表示方法(流程圖)
5、結構化程序設計方法
6、習題測試
第3課 C語言的數據類型
1、預備知識
2、C語言的數據類型
3、常量與變數
4、不同數據類型之間的轉換
5、運算符號和表達
6、習題測試
第4課 C語言順序程序設計
1、C語句概述
2、賦值語句
3、數據的輸入輸出
4、字元數據輸入輸出
5、格式輸入輸出
6、順序程序舉例
7、習題測試
第5課 C語言選擇程序設計
1、關系運算符和關系表達式
2、邏輯運算符和邏輯表達式
3、if 語句---條件判斷
4、條件運算符
5、switch 語句
6、選擇程序舉例
7、習題測試
第6課 C語言的循環控制
1、概述
2、goto語句及與if語句構成循環
3、while語句
4、do …while語句
5、for語句
6、循環的嵌套
7、幾種循環的比較
8、break語句和contiune語句
9、程序舉例
10、習題測試
第7課 C語言數組
1、一維數組
2、二維數組及多維數組
3、字元數組和字元串
4、程序舉例
5、習題測試
第8課 函數
1、概述
2、函數定義的一般格式
3、函數的返回值
4、函數的調用
5、函數參數及其傳遞方式
6、函數的嵌套與遞歸調用
7、數組作為函數參數
8、變數的存儲屬性
9、內部函數和外部函數
10、習題測試
第9課 C語言預處理命令
1、編譯預處理
2、宏定義
3、文件包含
4、條件編譯
5、習題測試
第10課 指針
1、指針的概念
2、指針變數
3、指針與數組
4、指針與字元串
5、指針與函數
6、返回指針值的函數
7、指針數組和多級指針
8、習題測試
第11課 結構體與共用體
1、結構類型與結構變數的定義
2、結構變數的引用與初始化
5、結構數組
6、指向結構類型數據的指針
7、用指針處理鏈表
8、共用體
9、枚舉類型
10、用typedef定義別名
11、程序舉例
12、習題測試
第12課 位運算
1、位運算概述
2、位運算符的使用方法
3、習題測試
第13課 單片機C語言的模塊化編程
1、模塊化編程的優點
2、C語言源文件(*.c)文件和頭文件(*.h)的的作用
3、模塊化編程設計步驟
4、程序實例
5、模塊化程序的移植
6、習題測試
第14課 C語言編程規范
1、編碼規范概述
2、編程排版規范
3、編程注釋規范
4、命名規則
5、可讀性規范
6、變數與結構規范
7、函數與過程規范
8、編程效率規范
9、質量保證規范
10、宏規范
11、代碼編輯
12、編譯
13、審查
14、代碼測試
15、維護
16、習題測試
第15課 C語言編程常見出錯問題及分析
1、C語言的一些基本概念
2、位(bit)和位元組(byte)
3、變數和數據存儲
4、數據文件
5、字元串操作
6、數組
7、指針和內存分配
8、函數
9、編譯預處理
10、標准庫函數
11、系統調用
12、可移植性
13、編程風格和標准
14、程序的編寫和編譯
15、調試

『肆』 C語言課程設計,貪吃蛇應該怎麼做

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坐標。

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

對應數據與數據類型:這些描述是為了與程序的按鍵的輸入部分與判斷游戲結束部分相聯系而設的。方向只有四個方向:上下左右。可以設置與之對應的四個整型數: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();

}

『伍』 學習C語言需要掌握哪些基本知識

1.入門程序

#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}

2.數據類型

數據類型:

1.基本數據類型:

1.1. 整型:int 4個位元組

1.2. 字元型:char 1個位元組

1.3. 實型(浮點型)

『陸』 C語言課程設計:shell排序、堆排序、快速排序、歸並(遞歸和非遞歸)排序5種演算法效率分析!求能運行的源碼

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
void shellSort(int *a,int len)
{
int step;
int i,j;
int temp;
for(step=len/2; step>0;step/=2)
{
for(i=step;i<len;i++)
{
temp = a[i];
for(j=i-step;(j>=0 && temp < a[j]);j-=step)
{
a[j+step] = a[j];
}
a[j+step] = temp;
}
}
}

void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

void heapify(int *a,int n,int k)
{
int l,r,lg = -1;

l = 2*k;
r = l+1;

if (l <= n && a[l-1] > a[k-1])
{
lg = l;
}
else
{
lg = k;
}

if (r <= n && a[r-1] > a[lg-1])
{
lg = r;
}

if (lg != k)
{
swap(&a[lg-1],&a[k-1]);
heapify(a,n,lg);
}
}

void build_heap(int a[],int n)
{
for (int i=n/2+1; i>0; i--)
{
heapify(a,n,i);
}
}

void heap_sort(int a[],int n)
{
build_heap(a,n);

for (int i=n; i>0; i--)
{
swap(&a[0],&a[i-1]);
heapify(a,i-1,1);
}
}

int partitions(int a[],long p,long q)
{
long i,j=p-1;

for (i=p; i<q; i++)
{
if (a[i-1] <= a[q-1])
{
j++;
swap(&a[i-1],&a[j-1]);
}
}

j++;
swap(&a[j-1],&a[q-1]);

return j;
}

void quicksort(int a[],long p,long q)
{
long i;

if (p<q)
{
i = partitions(a,p,q);
quicksort(a,p,i-1);
quicksort(a,i+1,q);
}
}

void merge(int *a,int start, int mid, int end)
{
int n1 = mid - start + 1;
int n2 = end - mid;
int *left = (int *)malloc(sizeof(int)*n1), *right=(int *)malloc(sizeof(int)*n2);
int i, j, k;

for (i = 0; i <棚孝 n1; i++) /* left holds a[start..mid] */
left[i] = a[start+i];
for (j = 0; j < n2; j++) /* right holds a[mid+1..end] */鏈攔稿
right[j] = a[mid+1+j];

i = j = 0;
k = start;
while (i < n1 && j < n2)
if (left[i] < right[j])
a[k++] = left[i++];
else
a[k++] = right[j++];

while (i < n1) /* left[] is not exhausted */
a[k++] = left[i++];
while (j <衡友 n2) /* right[] is not exhausted */
a[k++] = right[j++];
free(left);
free(right);
}

void MergeSort(int *a,int start, int end)
{
int mid;
if (start < end)
{
mid = (start + end) / 2;

MergeSort(a,start, mid);
MergeSort(a,mid+1, end);
merge(a,start, mid, end);
}
}
double gettime(LARGE_INTEGER t,LARGE_INTEGER t1,LARGE_INTEGER t2)
{
double time;
if (t.LowPart==0 && t.HighPart==0)
time = -1;
else
{
time = (float)(t2.LowPart - t1.LowPart);
if (time < 0) time += 2^32;
time /= (t.LowPart+t.HighPart * 2^32);
}
return time;
}
int main()
{
const int NUM = 1000;
srand(time(NULL));
int data[NUM];
int i;
for (i=0; i<NUM; ++i)
{
data[i] = rand()/(RAND_MAX/20000+1);
}

LARGE_INTEGER t,t1,t2;
QueryPerformanceFrequency(&t);

QueryPerformanceFrequency(&t1);
shellSort(data,NUM);
QueryPerformanceFrequency(&t2);
printf("shell time:%0.4f\n",gettime(t,t1,t2));

QueryPerformanceFrequency(&t1);
heap_sort(data,NUM);
QueryPerformanceFrequency(&t2);
printf("shell time:%0.4f\n",gettime(t,t1,t2));

QueryPerformanceFrequency(&t1);
quicksort(data,1,NUM);
QueryPerformanceFrequency(&t2);
printf("shell time:%0.4f\n",gettime(t,t1,t2));

QueryPerformanceFrequency(&t1);
MergeSort(data,0,NUM);
QueryPerformanceFrequency(&t2);
printf("shell time:%0.4f\n",gettime(t,t1,t2));

return 0;
}

『柒』 數據結構與演算法分析 課程設計 c/c++語言

頭大啦!

『捌』 C語言課程設計:查找演算法設計

折半查找
#include <stdio.h>
#define N 51
void main(void)
{
int a[N];
int i,n,num;
int top,bottom,mid;
int flag=1; //如果在表列中找到數字,則值為1,否則為0
int loc=-1;//要查找的數在表列中的位置,如果loca=-1表棗碰示表列中沒有這個數;如果有這個數,則它的值為所在的位置

printf("你想在多少個數中進行折半查找,請輸入(1--50):");
scanf("%d",&n);

while(n<1 || n>50)
{
printf("你輸入的數不正確,請重新輸入。\n");
printf("你想在多少個數中進行折半查找,請輸入(1--50):");
scanf("%d",&n);
}

printf("請你輸入一個整數 a[1](需保證遞增有序):");
scanf("%d",&a[1]);

i=2;
while(i<=n) //輸入從小到大的表列
{
printf("請你輸入一個整數 a[%d](需保證遞增有序):",i);
scanf("%d",&a[i]);
if(a[i] > a[i-1])
i++;
else
printf("你輸入的數不滿足要求,請重新輸入。\n");
}

//輸出表列
printf("\n輸出表列\n");
for(i=1; i<=n; i++)
{
printf("%6d",a[i]);
}
printf("\n");

printf("請你輸入要查找的數:");
scanf("%d",&num);

flag=1; //假設輸入的數在表列中

top=n;
bottom=1;
mid=(top+bottom)/2;

while(flag)
{

//printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid]);

if( (num>a[top]) || (num<a[bottom]) ) //輸野伍入的數 num>a[top] 或者 num<a[bottom],肯定num不在這個表列中
{
loc=-1;
flag=0;
}
else if(a[mid]==num) //如果num 等於找到的數
{
loc=mid;
printf("找到數頌岩或 %6d 的位置%2d\n",num,loc);
break;
}
else if(a[mid]>num) //若 a[mid]>num,則num 一定在 a[bottom]和a[mid-1]范圍之內
{
top=mid-1;
mid=(top+bottom)/2;
}
else if(a[mid]<num) //若 a[mid]<num,則num 一定在 a[mid+1]和a[top]范圍之內
{
bottom=mid+1;
mid=(top+bottom)/2;
}
}

if(loc==-1)
{
printf("%d 這個數在表列中沒有找到。\n",num);
}
printf("折半查找結束,按任意鍵退出:\n");

}

閱讀全文

與C演算法課程相關的資料

熱點內容
自動解壓失敗叫我聯系客服 瀏覽:482
易語言新手源碼 瀏覽:456
oa伺服器必須有固定ip地址 瀏覽:42
傳奇源碼分析是什麼 瀏覽:267
解放壓縮機支架 瀏覽:255
程序員禿頂搞笑相遇 瀏覽:6
IBM手機app商店叫什麼名字 瀏覽:834
jpeg壓縮質量 瀏覽:774
雲伺服器評測對比 瀏覽:145
java日期轉string 瀏覽:221
openfire源碼編譯 瀏覽:897
在線小工具箱引流網站源碼 瀏覽:337
非科班程序員自學 瀏覽:800
壓縮泡沫鞋底底材 瀏覽:219
程序員職場第一課2正確的溝通 瀏覽:679
遇到不合法app應該怎麼辦 瀏覽:90
匯編程序編譯後的文件 瀏覽:79
大智慧均線源碼 瀏覽:373
單片機排阻的作用 瀏覽:216
滴滴金融app被下架如何還款 瀏覽:212