较复杂的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

}

第一题void func(char *w,char x,int *n){int i, p=0</p><p _extended="true">w[*n]=x</p>备瞎大<p _extended="true">while (x>w[p]) p++</p><p _extended="神旁true">for (i=*ni>pi--) w[i]=w[i-1]</p><p _extended="true">w[p]=x</p><p _extended="true">++ *n</p><p _extended="true">仿竖}

呵呵,就完了,晚上就给你答案哈,你多等等~~~

恩,完工了,你看看吧:

/伍橘/注:本程序因涉及到引用即“&”,所以得保存为.cpp的后缀名再用c++编译器进行编译

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <conio.h>

#include <time.h>//用来得到当前时间

typedef struct student

{

char stuNumber[20]

char classNumber[20]

double score[10]

struct student *next

}stuNode,*stuList

void cre_node(stuList &L)//createNode,创建节点

{

int i

L=(stuList)malloc(sizeof(stuNode))

L->next=NULL

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

L->明碧score[i]=0

}

void add_node(stuList &L,char stuNumber[],char classNumber[],stuList &p)//增加节点

{

stuList q,prior

prior=L

p=L->next

while(p &&strcmp(classNumber,p->classNumber))

{

prior=p

p=p->next

}

while(p &&!strcmp(classNumber,p->classNumber))

{

prior=p

p=p->next

}

cre_node(q)

strcpy(q->stuNumber,stuNumber)

strcpy(q->classNumber,classNumber)

q->next=prior->next

prior->next=q

p=q

}

int check_list(stuList L,char stuNumber[])

{

stuList p=L->next

while(p &&strcmp(stuNumber,p->stuNumber))

p=p->next

if(p)

{

puts("学号不能重复,请重新输入:")

return 0

}

return 1

}

void cre_cla_info(stuList &L)//create class infomation

{

int i=0,j=0

char classNumber[20],stuNumber[20]

stuList p

puts("开始创建班级信息(输入0结束):")

while(1)

{

printf("\腔槐团n请输入第%d个班级班号:\n",i+1)

fflush(stdin)

gets(classNumber)

if( !strcmp(classNumber,"0"))

break

printf("开始创建%s班的学生信息(输入0结束):\n",classNumber)

j=0

while(1)

{

printf("请输入第%d个学生学号:\n",j+1)

fflush(stdin)

while(1)

{

gets(stuNumber)

if(check_list(L,stuNumber))

break

}

if( !strcmp(stuNumber,"0"))

break

add_node(L,stuNumber,classNumber,p)

j++

}

i++

}

p=L->next

system("cls")

puts("班级信息为:")

while(p)

{

strcpy(classNumber,p->classNumber)

printf("%s班:\n",classNumber)

while(p &&!strcmp(p->classNumber,classNumber))

{

puts(p->stuNumber)

p=p->next

}

}

puts("\n按任意一个键继续:")

getch()

}

int get_stu_info(stuList &L,char stuNumber[],stuList &p)//get student infomation

{

char ch,classNumber[20]

p=L->next

while(p &&strcmp(stuNumber,p->stuNumber))

p=p->next

if( !p)

{

puts("无该学生记录,你要增加该学生记录吗?(是则输入Y或y,不是输入则输入其他字符):")

scanf(" %c",&ch)

if(ch=='Y' || ch=='y')

{

puts("输入该学生所在班级班号:")

fflush(stdin)

gets(classNumber)

add_node(L,stuNumber,classNumber,p)

return 2

}

else

return 0

}

return 1

}

void print_cla_info(stuList &L,char classNumber[])

{

double average

int i=0,flag=0

char ch,stuNumber[20]

stuList p=L->next

while(p)

{

if( !strcmp(p->classNumber,classNumber))

{

flag=1

printf("学生%s作业完成情况为:\n",p->stuNumber)

average=0

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

{

average+=p->score[i]

printf("第%d次:\t%g\n",i+1,p->score[i])

}

average/=10

printf("\n该学生期末成绩为: %g\n\n",average)

}

p=p->next

}

if( !flag)

{

puts("无该班级信息,要创建一个吗?是输入Y或y,不是则输入其他字符:")

scanf(" %c",&ch)

if(ch=='Y' || ch=='y')

{

puts("输入该班学生学号,输入0结束:")

i=1

while(1)

{

printf("请输入第%d个学生学号:\n",i++)

while(1)

{

fflush(stdin)

gets(stuNumber)

if(check_list(L,stuNumber))

break

}

if( !strcmp(stuNumber,"0"))

break

add_node(L,stuNumber,classNumber,p)

}

}

}

puts("\n按任意一个键继续:")

getch()

}

void print(void)

{

puts("请选择一个 *** 作进行(输入一个数字):\n")

puts("(1)录入某位学生某次作业的分数:\n")

puts("(2)给定学号,显示某位学生的作业完成情况:\n")

puts("(3)给定某个班级的班号,显示该班学生所有学生的作业完成情况:\n")

puts("(4)给定某位学生的学号,修改该学生的作业完成情况:\n")

puts("(5)给定某位学生的学号,删除该学生的作业完成情况:\n")

puts("(6)提供一些统计各类信息的功能:\n")

puts("输入其他数字退出:\n")

}

void count(stuList L)

{

time_t cur_time//time_t在time.h头文件中被定义为long型

double average,m

int n,i,flag1,flag2,sum1,sum2

stuList p

char classNumber[20]

cur_time=time(NULL)//得到当前系统时间

FILE *fp

fp=fopen("d:\\统计.txt","a+")

fputs("\n\n&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n",fp)

fputs("时间格式:星期,月,日,小时:分:秒,年\n存档时间:",fp)

fputs(ctime(&cur_time),fp)

while(1)

{

system("cls")

puts("统计查询:")

puts("如若显示内容超过窗口所容,你可以到d:\\统计.txt文本中查看:\n")

puts("请选择一个 *** 作进行(输入一个数字):\n")

puts("(1)显示全部班级学生作业完成情况,并显示总人数:\n")

puts("(2)显示所有满足某次作业分数不大于m的学生,并显示学生人数(m值由你输入,且范围为0~100):\n")

puts("(3)显示所有满足某次作业分数不小于m的学生,并显示学生人数(m说明同上)::\n")

puts("(4)显示满足第i次作业分数不大于m的学生,并显示人数(i范围1~10,m范围0~100):\n")

puts("(5)显示满足第i次作业分数不小于m的学生,并显示人数(i范围1~10,m范围0~100):\n")

puts("输入其他数字返回:\n")

scanf("%d",&n)

if(n<1 || n>5)

break

p=L->next

if(n==1)

{

system("cls")

while(p)

{

sum1=0

strcpy(classNumber,p->classNumber)

printf("\n%s班所有学生作业完成情况为:\n",classNumber)

fprintf(fp,"\n%s班所有学生作业完成情况为:\n",classNumber)

while( p &&!strcmp(classNumber,p->classNumber))

{

average=0

printf("\n学生%s:\n",p->stuNumber)

fprintf(fp,"学生%s:\n",p->stuNumber)

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

{

average+=p->score[i]

printf("第%d次作业分数:\t%g\n",i+1,p->score[i])

fprintf(fp,"第%d次作业分数:\t%g\n",i+1,p->score[i])

}

average/=10

printf("该学生期末成绩为: %g\n",average)

fprintf(fp,"该学生期末成绩为: %g\n",average)

p=p->next

sum1++

}

printf("\n~%s班总人数为: %d~\n",classNumber,sum1)

fprintf(fp,"\n~%s班总人数为: %d~\n",classNumber,sum1)

puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

fputs("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",fp)

}

puts("\n按任意一个键继续:")

getch()

}

else if(n==2 || n==3)

{

system("cls")

puts("请输入m值(0~100):")

fputs("\n请输入m值(0~100):",fp)

while(1)

{

scanf("%lf",&m)

fprintf(fp,"%g\n",m)

if(m<0 || m>100)

{

puts("输入有误,请重新输入:")

fputs("输入有误,请重新输入:",fp)

continue

}

break

}

if(n==2)

{

printf("所有满足某次作业分数不大于%g的学生为:\n",m)

fprintf(fp,"所有满足某次作业分数不大于%g的学生为:\n",m)

}

else

{

printf("所有满足某次作业分数不小于%g的学生为:\n",m)

fprintf(fp,"所有满足某次作业分数不小于%g的学生为:\n",m)

}

sum2=0

while(p)

{

strcpy(classNumber,p->classNumber)

printf("\n%s班:\n",classNumber)

fprintf(fp,"\n%s班:\n",classNumber)

flag1=0

sum1=0

while( p &&!strcmp(classNumber,p->classNumber))

{

flag2=0

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

if(n==2 &&p->score[i] <= m)

{

flag1++

flag2++

if(flag2==1)

{

sum1++

printf("\n学生%s:\n",p->stuNumber)

fprintf(fp,"学生%s:\n",p->stuNumber)

}

printf("第%d次作业分数: %g\n",i+1,p->score[i])

fprintf(fp,"第%d次作业分数: %g\n",i+1,p->score[i])

}

else if(n==3 &&p->score[i] >= m)

{

flag1++

flag2++

if(flag2==1)

{

sum1++

printf("\n学生%s:\n",p->stuNumber)

fprintf(fp,"学生%s:\n",p->stuNumber)

}

printf("第%d次作业分数: %g\n",i+1,p->score[i])

fprintf(fp,"第%d次作业分数: %g\n",i+1,p->score[i])

}

p=p->next

}

if( !flag1)

{

printf("NULL:\n")

fprintf(fp,"%NULL:\n")

}

printf("\n%s班满足条件人数为:%d\n",classNumber,sum1)

fprintf(fp,"\n%s班满足条件人数为:%d\n",classNumber,sum1)

puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

fputs("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",fp)

sum2+=sum1

}

printf("\n一共满足条件人数为:%d\n",sum2)

fprintf(fp,"\n一共班满足条件人数为:%d\n",sum2)

puts("\n按任意一个键继续:")

getch()

}

else if(n==4 || n==5)

{

system("cls")

puts("输入i和m的值,用空格键分开(i:1~10,m:0~100):")

fputs("输入i和m的值,用空格键分开(i:1~10,m:0~100):",fp)

while(1)

{

scanf("%d%lf",&i,&m)

if(i<1 || i>10 || m<0 || m>100)

{

puts("输入错误,请重新输入:")

fputs("输入错误,请重新输入:",fp)

continue

}

break

}

if(n==4)

{

printf("所有满足第%d次作业分数不大于%g的学生为:\n",i,m)

fprintf(fp,"所有满足第%d次作业分数不大于%g的学生为:\n",i,m)

}

else

{

printf("所有满足第%d次作业分数不小于%g的学生为:\n",i,m)

fprintf(fp,"所有满足第%d次作业分数不小于%g的学生为:\n",i,m)

}

sum2=0

while(p)

{

strcpy(classNumber,p->classNumber)

printf("\n%s班:\n",classNumber)

fprintf(fp,"\n%s班:\n",classNumber)

flag1=0

sum1=0

while( p && !strcmp(classNumber,p->classNumber))

{

if(n==4 &&p->score[i-1] <= m)

{

flag1++

sum1++

printf("学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])

fprintf(fp,"学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])

}

else if(n==5 &&p->score[i-1] >= m)

{

flag1++

sum1++

printf("学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])

fprintf(fp,"学生%s,作业分数: %g\n",p->stuNumber,p->score[i-1])

}

p=p->next

}

if( !flag1)

{

printf("NULL:\n",classNumber)

fprintf(fp,"NULL:\n",classNumber)

}

printf("\n%s班满足条件人数为:%d\n",classNumber,sum1)

fprintf(fp,"\n%s班满足条件人数为:%d\n",classNumber,sum1)

puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

fputs("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",fp)

sum2+=sum1

}

printf("\n一共满足条件人数为:%d\n",sum2)

fprintf(fp,"\n一共班满足条件人数为:%d\n",sum2)

puts("\n按任意一个键继续:")

getch()

}

}

fclose(fp)

}

void destroy_list(stuList &L)

{

stuList p

while(p=L->next)

{

L->next=p->next

free(p)

}

free(L)

}

int main()

{

int m,n,i

double average

char stuNumber[20],classNumber[20]

stuList L,p

cre_node(L)

cre_cla_info(L)

while(1)

{

system("cls")

print()

scanf("%d",&n)

if(n<1 || n>6)

break

if(n==1)

{

system("cls")

puts("输入该学生学号:")

fflush(stdin)

gets(stuNumber)

if( !get_stu_info(L,stuNumber,p))

continue

printf("该学生%s所在班级为:%s\n",p->stuNumber,p->classNumber)

puts("只录入该学生某一次的作业请输入1,要一起录入该学生10次作业请输入其他数字:")

scanf("%d",&m)

if(m==1)

{

puts("录入该学生第几次的作业?")

while(1)

{

scanf("%d",&i)

if(i<1 || i>10)

{

puts("范围只能是1~10,请重新输入:")

continue

}

break

}

printf("该学生第%d次作业分数为:%g,你要修改为?:\t",i,p->score[i-1])

scanf("%lf",&p->score[i-1])

puts("本次 *** 作结果:")

printf("%s班%s学生第%d次作业分数为%g:\n",p->classNumber,p->stuNumber,i,p->score[i-1])

puts("\n按任意一个键继续:")

getch()

}

else

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

{

printf("第%d次作业分数: ",i+1)

scanf("%lf",&p->score[i])

}

}

else if(n==2)

{

system("cls")

puts("输入该学生学号:")

fflush(stdin)

gets(stuNumber)

i=get_stu_info(L,stuNumber,p)

if( !i)

continue

average=0

if(i==1)

{

printf("该学生所在班级班号为:%s,10次作业完成情况为:\n",p->classNumber)

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

{

average+=p->score[i]

printf("第%d次作业分数: %g\n",i+1,p->score[i])

}

average/=10

printf("\n该学生期末成绩为: %g\n\n",average)

}

puts("\n按任意一个键继续:")

getch()

}

else if(n==3)

{

system("cls")

puts("输入班级的班号:")

fflush(stdin)

gets(classNumber)

print_cla_info(L,classNumber)

}

else if(n==4)

{

system("cls")

puts("输入该学生学号:")

fflush(stdin)

gets(stuNumber)

if( !get_stu_info(L,stuNumber,p))

continue

printf("该学生所在班级班号为:%s,当前作业完成情况为:\n",p->classNumber)

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

printf("第%d次作业分数:\t%g\n",i+1,p->score[i])

while(1)

{

puts("要修改第几次作业?(输入数字1~10,输入其他数字结束):")

scanf("%d",&m)

if(m<1 || m>10)

break

printf("修改该学生分数%g为:\t",p->score[m-1])

scanf("%lf",&p->score[m-1])

}

}

else if(n==5)

{

system("cls")

puts("输入该学生学号:")

fflush(stdin)

gets(stuNumber)

if( !get_stu_info(L,stuNumber,p))

continue

printf("该学生所在班级班号为:%s,当前作业完成情况为:\n",p->classNumber)

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

printf("第%d次作业分数:\t%g\n",i+1,p->score[i])

while(1)

{

puts("要删除第几次作业?(输入数字1~10,输入其他数字结束):")

scanf("%d",&m)

if(m<1 || m>10)

break

p->score[m-1]=0

}

}

else

{

system("cls")

count(L)

}

}

destroy_list(L)

puts("谢谢使用!按任意键退出:")

getch()

return 0

}

哪里不懂可追问:


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存