较复杂的c语言程序设计源代码

较复杂的c语言程序设计源代码,第1张

一个“歼灭敌机”的小游戏,DEVc++通过编译:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <windows.h>

#include <time.h>

#define zlx 10  //增量坐标(x)让游戏框不靠边

#define zly 3   //增量坐标(y)让游戏框不靠边

#define W 26  //游戏框的宽度

#define H 24  //游戏框的高度

int jiem[22][22]={0}, wj=10  //界面数组, 我机位置(初值为10)

int speed=4,density=30, score=0,death=0//敌机速度, 敌机密度, 玩家成绩,死亡次数

int m=0,n=0 // m,n是控制敌机的变量

void gtxy (int x, int y)  //控制光标位置的函数

{ COORD pos

pos.X = x  pos.Y = y

SetConsoleCursorPosition ( GetStdHandle (STD_OUTPUT_HANDLE), pos )

}

void Color(int a)  //设定颜色的函数(a应为1-15)

{ SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), a )}

void yinc(int x=1,int y=0)   //隐藏光标的函数

{ CONSOLE_CURSOR_INFO  gb={x,y}   //y设为0即隐藏

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &gb)

}

void csh( )  //初始化函数

{ int i

Color(7)

gtxy(zlx,zly)printf("╔")  gtxy(zlx+W-2,zly)printf("╗")  //左上角和右上角的框角

gtxy(zlx,zly+H-1)printf("╚")gtxy(zlx+W-2,zly+H-1)printf("╝")//下边两框角

for(i=2i<W-2i+=2) {gtxy(zlx+i,zly)  printf("═")}      //打印上横框

for(i=2i<W-2i+=2) {gtxy(zlx+i,zly+H-1)printf("═")}  //打印下横框

for(i=1i<H-1i++) { gtxy(zlx,zly+i) printf("║")}       //打印左竖框

for(i=1i<H-1i++) {gtxy(zlx+W-2,zly+i)printf("║")}  //打印右竖框

Color(14)gtxy(19,2)printf("歼灭敌机")Color(10)

gtxy(37,5)printf("设置:Esc ")

gtxy(37,7)printf("发射:↑ ")

gtxy(37,9)printf("控制:← → ")

gtxy(37,11)printf("得分:%d",score)

gtxy(37,13)printf("死亡:%d",death)

yinc(1,0)

}

void qcjm( )  //清除界面函数

{int i,j

for(i=0i<H-2i++)

for(j=0j<W-4j++){gtxy(zlx+2+j,zly+1+i)printf(" ")}

}

void feiji( )  //飞机移动函数

{int i,j

for(i=21i>=0i--)  //从底行往上是为了避免敌机直接冲出数组

  for(j=0j<22j++)

     {if(i==21&&jiem[i][j]==3) jiem[i][j]=0  //底行赋值0 以免越界

       if(jiem[i][j]==3) jiem[i][j]=0, jiem[i+1][j]=3

     }

if(jiem[20][wj]==3&&jiem[21][wj]==1) death++

}

void zidan( )  //子d移动函数

{ int i,j

for(i=0i<22i++)

  for(j=0j<22j++)

     {if(i==0&&jiem[i][j]==2) jiem[i][j]=0

     if(jiem[i][j]==2) { if(jiem[i-1][j]==3) score+=100,printf("\7")

                                  jiem[i][j]=0,jiem[i-1][j]=2}

     }

}

void print(  )  //输出界面函数

{int i,j

qcjm( )

for(i=0i<22i++)

for(j=0j<22j++)

{ gtxy(12+j,4+i)

if(jiem[i][j]==3) {Color(13)printf("□")}

if(jiem[i][j]==2) {Color(10)printf(".")}

if(jiem[i][j]==1) {Color(10)printf("■")}

}

gtxy(37,11)Color(10)printf("得分:%d",score)

gtxy(37,13)printf("死亡:%d",death)

}

void setting( )  //游戏设置函数

{ qcjm( )

gtxy(12,4)printf("选择敌机速度:")

gtxy(12,5)printf("  1.快 2.中 3.慢>>")

switch(getche( ))

    {case '1': speed=2break

     case '2': speed=4break

     case '3': speed=5break

     default: gtxy(12,6)printf("  错误!默认值")

   }

gtxy(12,7)printf("选择敌机密度:")

gtxy(12,8)printf("  1.大 2.中 3.小>>")

switch(getche( ))

     {case '1': density=20break

      case '2': density=30 break

      case '3': density=40break

       default: gtxy(12,9)printf("  错误!默认值")

     }

for(int i=0i<22i++)

 for(int j=0j<22j++) jiem[i][j]=0

jiem[21][wj=10]=1jiem[0][5]=3

gtxy(12,10)printf("  按任意键保存...")

getch( )

qcjm( )

}

void run( )  //游戏运行函数

{ jiem[21][wj]=1  //值为1代表我机(2则为子d)

jiem[0][5]=3   //值为3代表敌机

SetConsoleTitle("歼灭敌机") //设置窗口标题

while(1)

  { if (kbhit( ))  //如有键按下,控制我机左右移动、发射或进行设定

       {int key

        if((key=getch( ))==224) key=getch( )

        switch(key)

           {case 75: if(wj>0) jiem[21][wj]=0,jiem[21][--wj]=1break

            case 77: if(wj<20) jiem[21][wj]=0,jiem[21][++wj]=1 break

            case 72: jiem[20][wj]=2break

           case 27: setting( )

         }

      }

   if(++n%density==0)  //控制产生敌机的速度

      { n=0srand((unsigned)time(NULL))

        jiem[0][rand( )%20+1]=3

      }

   if(++m%speed==0) { feiji( )m=0}  //控制敌机移动速度(相对子d而言)

   zidan( )  //子d移动

   print( )  //输出界面

Sleep(120)  //延时120毫秒

  }

}

int main( )

{csh( )

 run( )

 return 0

}

好,给你一个有趣的程序,下面程序的作用是,输入一个4位数,之后将这个数分解成4个数字,并将这4个数字组合成一个最大数和一个最小数,并将两者相减,结果作为新的4位数,重复前面的步骤,最后的结果是什么?自己测试一下。

#include <stdio.h>

void mysort(int *a, int size)

{

int i, j, k, t

for (i = 0i <size - 1++i)

{

k = i

for (j = ij <size++j)

{

if (a[k] >a[j])

k = j

}

if (k != i)

{

t = a[i]

a[i] = a[k]

a[k] = t

}

}

}

void main()

{

int num, a[4], max, min

do

{

scanf("%d", &num)/* 输入最初的4位数 */

} while (num <1000 || num >9999)

while (num)

{

/* 将4位数分解成4个独立的数字,并保存在a数组中 */

a[0] = num % 10

num /= 10

a[1] = num % 10

num /= 10

a[2] = num % 10

num /= 10

a[3] = num

/* 排序数组元素 */

mysort(a, 4)

/* 从数组的4个元素中产生最大数字和最小数字 */

max = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0]

min = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]

/* 产生新的4位数 */

num = max - min

printf("%d\n", num)

if (num == 6174)

break

}

printf("The magic number is: %d\n", num)

}

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

/**快速排序版本1*/

int PARTITION(int A[],int p,int r)///p,r是数组下标

{

int x=A[r]

int i=p-1

int j

int tmp

for(j=pj<rj++)

{

if(A[j]<x)

{

i++

tmp=A[i]

A[i]=A[j]

A[j]=tmp

}

}

i++

tmp=A[i]

A[i]=A[r]

A[r]=tmp

return i

}

void QUICKSORT(int A[],int p,int r)

{

int q

if(p<r)

{

q=PARTITION(A,p,r)

QUICKSORT(A,p,q-1)

QUICKSORT(A,q+1,r)

}

}

/**快速排序版本2*/

int findpivot( int i, int j ,int A[])

{

int firstkey

int k

firstkey = A[i]

for ( k=i+1k<=jk++ )

{

if ( A[k] >firstkey )

{

return k

}

else if ( A[k] <firstkey )

{

return i

}

}

return -1 //注意这个函数什么时候返回-1

}

int partion ( int i, int j, int pivot ,int A[]) //以中点pivot 为界交换

{

int L, R

L = i

R = j //两个移动游标

int temp

do

{

temp = A[L]

A[L] = A[R]

A[R] = temp

while ( A[L] <pivot )

L = L +1

while ( A[R] >= pivot )

R = R -1

}

while ( L <= R )

return L

}

void quicksort( int i, int j ,int A[])

{

int pivot

int pivotindex , k

pivotindex = findpivot( i, j ,A) //pivotindex可以就选第一个,可这是怎么判断结束呢,根据快排的段长

if (pivotindex!=-1)

{

pivot = A[pivotindex]

k = partion ( i, j, pivot ,A)

quicksort( i, k-1, A)

quicksort( k, j , A)

}

}

/**归并排序*/

void merge ( int l , int m, int n, int A[], int B[] )

{

int i, j, k, t

i = l //i是前段下标计数器

k = l

j = m+1 //后段开始下标 j是后段下标计数器

while (( i <= m ) &&( j <= n )) //应该将两段归并到一段(l 至 n),这个循环只是找到了“一段”的较小的一半

{

if ( A[i] <= A[j] )

B[k++] = A [i++]

else

B[k++] = A[j++]

}

if ( i >m ) //这是处理对称两段 这时k已经等于后段的起始地址了

for ( t = j t <= n t++ )

B[k+t-j] = A[t]

else //处理非对称两段 这时i已经等于后段的起始地址了

for ( t = i t <= m t++ )

B[k+t-i] = A[t]

}

void mpass ( int n,int l,int A[],int B[])

{

int i, t

i = 0

while ( i <= (n-2*l+1) )//不足两段时终止

{

merge( i,i+l-1,i+2*l-1,A,B)//参数:起始下标 前段终止下标 后段终止下标 (两个段长都是 l )

i = i + 2*l //计算出下一个起始下标

}

if ((i+l-1)<n )//余下的一段有余 既是不对称两段,但还能合并

merge ( i, i+l-1, n, A, B)

else //余下的不足一段 已不能合并

for ( t = it <= nt++)

B[t] = A[t]

}

void mergesort( int n,int A[])

{

int l

int *B = (int *)malloc(n*sizeof(int))

l =1

while ( l <n )

{

mpass( n, l, A, B)

l = 2*l

mpass( n, l, B, A)

l = 2*l

}

}

/**希尔排序*/

void Shellsort ( int n,int A[] )

{

int i,j,k,x

for ( k = n/2 k >= 1k /= 2 )

{

for ( i=k+1i<=ni++ )

{

x = A[i]

j = i-k

while ( (j>=0) &&(x<A[j]) )

{

A[j+k] = A[j]

j -= k

}

A[j+k] = x

}

}

}

/**插入排序*/

void insertsort ( int n, int A[] )

{

int i, j

int temp

//A[0]= -1

for (i=1i<=ni++)

{

j=i

while (A[j]<A[j-1])

{

temp = A[j]

A[j] = A[j-1]

A[j-1] = temp

j=j-1

if (j==0)

break

}

}

}

/**选择排序*/

void selectsort ( int n, int A[])

{

int i, j,lowindex

int temp

for (i=0i<ni++)

{

lowindex = i

for ( j = i+1j<=nj++)

if ( A[j] <A[lowindex] )

lowindex = j

temp = A[i]

A[i] = A[lowindex]

A[lowindex] = temp

}

}

/**冒泡排序*/

void bubblesort(int n,int A[]) //n为元素个数

{

int i,j

int temp

for (i=0i<ni++)

for (j=n-1j>=i+1j--)

if (A[j]<A[j-1])

{

temp = A[j]

A[j] = A[j-1]

A[j-1] = temp

}

}

/**读文件*/

void ReadFile(int a[])

{

FILE *fin

int j

if ((fin=fopen("data.txt","r"))==NULL)

{

printf("打开文件失败\n")

exit (2)

}

j=0

while (fscanf(fin,"%d",&a[j])!=EOF)

j++

fclose(fin)

}

/**写文件*/

void WriteFile(char *filename,int a[])

{

FILE *fout

int j

if ((fout=fopen(filename,"w"))==NULL)

{

printf("打开文件失败\n")

exit (2)

}

for (j=0j<100000j++)

{

fprintf(fout,"%d\n",a[j])

}

fclose(fout)

}

int main()

{

clock_t s,f

double dura

FILE *fout

int a[100000]

int j

/*生成随机数写入文件*/

if ((fout=fopen("data.txt","w"))==NULL)

{

printf("打开文件失败\n")

exit (2)

}

for (j=0j<100000j++)

{

fprintf(fout,"%d\n",rand())

}

fclose(fout)

/*快速排序版本1*/

ReadFile(a)

s=clock()

QUICKSORT(a,0,99999)

f=clock()

dura=(double)(f-s)/CLOCKS_PER_SEC

/*结果写入文件*/

WriteFile("QUICKSORT1.txt",a)

printf("快速排序1: %lf\n",dura)

/*快速排序版本2*/

ReadFile(a)

s=clock()

quicksort(0,99999,a)

f=clock()

dura=(double)(f-s)/CLOCKS_PER_SEC

/*结果写入文件*/

WriteFile("quicksort2.txt",a)

printf("快速排序2: %lf\n",dura)

/*

* 归并排序

*从文件读出

*/

ReadFile(a)

s=clock()

mergesort(100000,a)

f=clock()

dura=(double)(f-s)/CLOCKS_PER_SEC

/*结果写入文件*/

WriteFile("mergesort.txt",a)

printf("归并排序 : %lf\n",dura)

/*

* 希尔排序

*/

ReadFile(a)

s=clock()

Shellsort(100000,a)

f=clock()

dura=(double)(f-s)/CLOCKS_PER_SEC

/*结果写入文件*/

WriteFile("shellsort.txt",a)

printf("希尔排序 : %lf\n",dura)

/*

* 选择排序*/

ReadFile(a)

s=clock()

selectsort(100000,a)

f=clock()

dura=(double)(f-s)/CLOCKS_PER_SEC

/*结果写入文件*/

WriteFile("selectsort.txt",a)

printf("选择排序: %lf\n",dura)

/*

* 插入排序*/

ReadFile(a)

s=clock()

insertsort(100000,a)

f=clock()

dura=(double)(f-s)/CLOCKS_PER_SEC

/*结果写入文件*/

WriteFile("insertsort.txt",a)

printf("插入排序: %lf\n",dura)

/*

* 气泡排序

*从文件读出*/

ReadFile(a)

s=clock()

bubblesort(100000,a)

f=clock()

dura=(double)(f-s)/CLOCKS_PER_SEC

/*结果写入文件*/

WriteFile("bubblesort.txt",a)

printf("气泡排序: %lf\n",dura)

return 0

}

排序算法时间效率的比较

归并排序,希尔排序,快速排序,选择排序,冒泡排序的时间效率的比较

上面说的全用了,而且算法包括各种排序算法


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7736850.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存