日期格式化c语言怎么写中的时间改成平方代码是什么?

今天给各位分享c语言程序设计程序题的知识,其中也会对c语言程序设计教程考试题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:
1、C语言程序设计2015A卷-
2、c语言程序设计题目
3、c语言编程100题,有没有大神帮帮忙
4、C语言程序设计编程题:
5、C语言程序设计作业题-
6、c语言程序设计题
C语言程序设计2015A卷-
一、判断题(每小题1分,共15分)
1.标准C中,只有数值型数据才能进行4则混合运算。
2.标准C中,_a是合法的自定义标识符。
3.有定义:float f;表达式f+=(int)3.6%2”不符合C语言语法。
4.标准C中,逻辑运算的结果只有是1表示满足条件,而结果是0表示不满足条件。
6.以下运算符排列顺序满足按照优先级从高到低的排列:‘’、‘!’、‘==’、‘-’。
7.语句for(;;);是非法的。
8.在C语言程序中可以由多个源文件构成,每个源文件都可以有自己的main()函数。
9.while和do-while的主要区别是后者至少无条件执行一次。
10.数组名代表数组的首地址是常量,所以将实参数组名表示地址传给形参数组名是错误的。
11.当函数没有返回值类型时,表示函数类型为void。
12.C语言中,指针变量作函数参数时,它们不是采取单向值传递的方式。
13.一个函数中只允许有一条return语句。
14.在C语言中,如果没有说明变量的存储类型是auto类型的。
15.由于指针中所存放的地址都是整数,所以整型指针和浮点型指针可以相互赋值。
二、填空题(每空1分,共15分)
1. 若a=4;b=5,c=6;则表达式c==(b=-a); 中c的值是 (1) 。
2. 计算表达式的值:
4&&-4的值: (2) ;
设int a=3,b=4,c=5,则表达式a
b+cb==c的值: (3) ;
设x=2.5, a=7, y=4.7,则表达式x+a%3*(int)(x+y)%2/4的值: (4) ;
设a=12,则表达式a*=a/5的值: (5) ;
3. 若int x = 4,y = 6,z = 0;有循环while(x = y) {z ++;y--;}
则循环语句执行完后,z值为 (6) 。
4. 变量的指针就是指该变量的 (7) 。
5. 若有定义int (*p)[4],则标识符p是 (8) ;若有定义int *p[4],则标识符p是 (9) ;
6. 已有定义:char *p[ ]={“France”,“Chinese”,“Russia”,“America”};则语句printf(“%s”,p[2]);printf(“%c”,*(p[1]+2));printf(“%c”,*(*(p+1)+1));
的输出结果分别为: (10) 、 (11) 、 (12) 。
7. 已有定义: int x=65; 若格式化输出结果为“A, 65”,则对应的格式化输出语句为printf(“ (13) , (14) ”, x, x)。
8. 已定义:int a[][2]={1, 2, 3, 4, 2, 6, 7, 2};则a[3][0]= (15) 。
三、简答题(每题4分,共12分)
1、简述选择语句if和else语句对与switch语句的区别。
2、简述在循环语句中,break和continue的区别。
3、若int a[5],*p=a;简述*p++和(*p)++的区别。
四、下列各程序中每个程序各有2个错误,指出错误语句,写出对应正确语句(每小题4分,共16分)
五、程序填空题:下列程序中缺少若干条语句,在对应的下划线上填上合适的语句,每一个下划线只填一条语句(每小题6分,共24分)
六、阅读下列程序,写出运行结果(第一小题4分,第二小题6分,共10分)
七、编程题(8分)
编译程序,其功能是比较字符串的大小(
不允许
用系统提供的字符串比较函数strcmp)。要求是:
(1) 通过主函数调用一个函数strcompare来实现。
(2) 要求函数strcompare实现两个字符的比较:如第一个字符小于第二个字符则返回一个负值;如两个字符相等则返回0值;如第一个字符大于第二个字符则返回一个正值。
(3) 并输出两个字符串中相同部分的子串。
《C语言程序设计基础》试卷参考答案
一、判断题(每小题1分,共15分)
1~5
; 6~10
; 11~15
二、填空题(每空1分,共15分)
(1) 6 (2) 1 (3) 1 (4) 2.5 (5) 24 (6) 6
(7)地址 (8) 行指针,指向有四个元素的一维数组
(9)指针数组名,该数组有四个元素,每个元素都是指针
(10)Russia (11)i (12)h (13) %c (14) %d (15)7
三、简答题(每题4分,共12分)
1、if总是判断其后面的表达式的值是否为非零值,如是非零值则执行其后面的语句或由{}括起来的复合语句,否则执行else后面的语句。而switch语句则根据其后面表达式的可数值来判断,执行switch语句体内与其中的一个case:常量值相等语句后面的语句。执行break语句后,跳出switch语句体。
2、break是终止整个循环过程;continue是终止本次循环。
3、*p++首先取a[0]的值,然后p指向a[1];(*p)++使得a[0]的值自增1,但p保持不变。
四、下列各程序中每个程序各有2个错误,指出错误语句,写出对应正确语句(每小题4 分,共16分)
1、 (1)缺#include ; (2)scanf(“%f”,a); 改为 scanf(“%f”,a);
2、 (1)缺sum=0; (2)for(i=1; i=3; i++) 改为for(i=0;i3;i++)
3、 (1)p1=p2 改为 *p1=*p2 (2)swap(a, *p) 改为swap(a, p)
4、 (1)在if(m0)语句后添加else if(m==0) a=1; (2) 添加 return(a);
五、程序填空题:下列程序中缺少若干条语句,在对应的下划线上填上合适的语句,每一个下划线只填一条语句(每小题6分,共24分)
1、 (1)x=0; (2)if(n==x) (3)s++;或s=s+1;
2、 (4)num[i] (5)max num[i]? (6)num[i]!=0
3、 (7)n-i-1 (8)a[j]a[j+1] (9)a[j+1]=temp
4、 (10)count=0; (11)n%10 (12)n0或n!=0或n
六、阅读下列程序,写出运行结果(第一小题4分,第二小题6分,共10分)
1、 #*#*#*
2、 main i=1 j=2 k=2
sub i=1 j=2 k=1 x=2
sub i=1 j=2 k=1 x=3
七、编程题(8分)
#include
main()
{
int i,j, flag=0;
char str1[90],str2[90];
gets(str1);
gets(str2);
i=0;
do{
flag=strcompare(str1[i],str2[i]);
i++;
}while(str1[i]!=’’
str2[i]!=’’ flag=0);
if(flag0)printf(“%s小于%s ”,str1,str2);
else if(flag==0) printf(“%s 等于%s ”,str1,str2);
else printf(“%s大于%s ”,str1,str2);
printf(“两个字符串中相同的字串为:”);
j=0;
i--; 后3句可用str1[i]=’’; printf(“%s”,str1);代替//用str2也可以。
while(ji){printf(“%c”,str1[i]);j++;} span="" /i){printf(“%c”,str1[i]);j++;}
}
int strcompare(char c1,char c2)
{
int v;
v=c1-c2;
return v;
} c语言程序设计题目分类:
电脑/网络
程序设计
其他编程语言
问题描述:
1、写运行结果: (1)
main()
{ int m,s;m=1;s=3;
do { s+=m++;
if (s%7==0) continue;
else ++m;
}while (s15);
printf(“%d”,m);
} (2)
main()
{ int a,b;
for(a=1,b=1; a=100; a++)
{ if (b=20) break;
if (b%3==1) { b+=3;continue;}
b=b-5;
}
printf(“a=%d\n”, a);
}
(3)
#include stdio.h
main()
{ int j, k;
for( k=0; k4; k++)
{ for( j=4; jk; j--)
putchar(‘A’+k);
putchar(‘\n’);
}
}
(4)
main()
{ int k, n=0;
for( k=2; k5; k++)
{ do { if (k%3) continue;
n++;}
while( !k );
n++;
}
printf(“n=%d\n”, n);
}
2、若用0~9之间不同的三个数构成一个三位数,下面程序将统计出共有多少种方法,请填空。
main()
{ int i, j, k, count=0;
for( i=1; i=9; i++)
for( j=____ ; j=9; j++)
if ( _________ )
continue;
else
for( k=0; k=9; k++)
if ( ____________ ) count++;
printf(“%d\n”,count);
}
解析:
1 (1). 8 (2). a=8 (3). AAAA BBB CC D (4). n=4 2. void main() {
int i, j, k, count=0;
for( i=1; i=9; i++)
for( j=0 ; j=9; j++)
if ( i==j )
continue;
else
for( k=0; k=9; k++)
if ( j!=k
i!=k )
{
count++;
printf("%d\n",count);
} } 648c语言编程100题,有没有大神帮帮忙您好,c语言经典100题:【程序1】题目:有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数都是多少1.程序分析:可填在百位,十位,个位的数字都是1,2,3,4.组成所有的排列后再去掉不满足条件的排列.2.程序源代码:main(){inti,j,k;printf("\n");for(i1;i5;i++)/*以下为三重循环*/for(j1;j5;j++)for(k1;k5;k++){if(i!ki!jj!k)/*确保i,j,k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}【程序2】题目:企业发放的奖金根据利润提成.利润(i)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖金总数1.程序分析:请利用数轴来分界,定位.注意定义时需把奖金定义成长整型.2.程序源代码:main(){longinti;intbonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",i);bonus1100000*0.1;bonus2bonus1+100000*0.75;bonus4bonus2+200000*0.5;bonus6bonus4+200000*0.3;bonus10bonus6+400000*0.15;if(i100000)bonusi*0.1;elseif(i200000)bonusbonus1+(i-100000)*0.075;elseif(i400000)bonusbonus2+(i-200000)*0.05;elseif(i600000)bonusbonus4+(i-400000)*0.03;elseif(i1000000)bonusbonus6+(i-600000)*0.015;elsebonusbonus10+(i-1000000)*0.01;printf("bonus%d",bonus);}【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果.请看具体分析:2.程序源代码:#include"math.h"main(){longinti,x,y,z;for(i1;i2)/*如果是闰年且月份大于2,总天数应该加一天*/sum++;printf("itisthe%dthday.",sum);}【程序4】题目:输入某年某月某日,判断这一天是这一年的第几天?1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。2.程序源代码:main(){intday,month,year,sum,leap;printf("\npleaseinputyear,month,day\n");scanf("%d,%d,%d",year,month,day);switch(month)/*先计算某月以前月份的总天数*/{case1:sum0;break;case2:sum31;break;case3:sum59;break;case4:sum90;break;case5:sum120;break;case6:sum151;break;case7:sum181;break;case8:sum212;break;case9:sum243;break;case10:sum273;break;case11:sum304;break;case12:sum334;break;default:printf("dataerror");break;}sumsum+day;/*再加上某天的天数*/if(year%4000
(year%40year%100!0))/*判断是不是闰年*/leap1;elseleap0;if(leap1month2)/*如果是闰年且月份大于2,总天数应该加一天*/sum++;printf("Itisthe%dthday.",sum);}【程序5】题目:输入三个整数x,y,z,请把这三个数由小到大输出.1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果xy则将x与y的值进行交换,然后再用x与z进行比较,如果xz则将x与z的值进行交换,这样能使x最小.2.程序源代码:main(){intx,y,z,t;scanf("%d%d%d",x,y,z);if(xy){tx;xy;yt;}/*交换x,y的值*/if(xz){tz;zx;xt;}/*交换x,z的值*/if(yz){ty;yz;zt;}/*交换z,y的值*/printf("smalltobig:%d%d%d\n",x,y,z);}【程序6】题目:用*号输出字母c的图案.1.程序分析:可先用'*'号在纸上写出字母c,再分行输出.2.程序源代码:#include"stdio.h"main(){printf("helloc-world!\n");printf("****\n");printf("*\n");printf("*\n");printf("****\n");}【程序7】题目:输出特殊图案,请在c环境中运行,看一看,verybeautiful!1.程序分析:字符共有256个.不同字符,图形不一样.2.程序源代码:#include"stdio.h"main(){chara176,b219;printf("%c%c%c%c%c\n",b,a,a,a,b);printf("%c%c%c%c%c\n",a,b,a,b,a);printf("%c%c%c%c%c\n",a,a,b,a,a);printf("%c%c%c%c%c\n",a,b,a,b,a);printf("%c%c%c%c%c\n",b,a,a,a,b);}【程序8】题目:输出9*9口诀.1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列.2.程序源代码:#include"stdio.h"main(){inti,j,result;printf("\n");for(i1;i10;i++){for(j1;j10;j++){resulti*j;printf("%d*%d%-3d",i,j,result);/*-3d表示左对齐,占3位*/}printf("\n");/*每一行后换行*/}}【程序9】题目:要求输出国际象棋棋盘.1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格.2.程序源代码:#include"stdio.h"main(){inti,j;for(i0;i8;i++){for(j0;j8;j++)if((i+j)%20)printf("%c%c",219,219);elseprintf("");printf("\n");}}【程序10】题目:打印楼梯,同时在楼梯上方打印两个笑脸.1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数.2.程序源代码:#include"stdio.h"main(){inti,j;printf("\1\1\n");/*输出两个笑脸*/for(i1;i11;i++){for(j1;ji;j++)printf("%c%c",219,219);printf("\n");}}【程序11】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....2.程序源代码:main(){longf1,f2;inti;f1f21;for(i1;i20;i++){printf("%12ld%12ld",f1,f2);if(i%20)printf("\n");/*控制输出,每行四个*/f1f1+f2;/*前两个月加起来赋值给第三个月*/f2f1+f2;/*前两个月加起来赋值给第三个月*/}}【程序12】题目:判断101-200之间有多少个素数,并输出所有素数.1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数.2.程序源代码:#include"math.h"main(){intm,i,k,h0,leap1;printf("\n");for(m101;m200;m++){ksqrt(m+1);for(i2;ik;i++)if(m%i0){leap0;break;}if(leap){printf("%-4d",m);h++;if(h%100)printf("\n");}leap1;}printf("\nthetotalis%d",h);}C语言程序设计编程题:1、#include “stdio.h”main(){ double r; double pi=3.14159; printf("请输入圆的半径:"); scanf("%lf",r); printf("圆的周长为:%.2lf",2*pi*r); printf("圆的面积为:%.2lf",pi*r*r); getch();}2、#include “stdio.h”main(){ char c; printf("请输入一个大写字母:"); scanf("%c",c); printf("小写字母为:%c",c+32); getch();}3、#include “stdio.h”#include "math.h"main(){ double a,b,c; double p; double area; printf("请分别输入三条边的长度:"); scanf("%lf %lf %lf",a,b,c); p=(a+b+c)/2; area=sqrt( p*(p-a)*(p-b)*(p-c)); printf("三角形的面积为:%.2lf",area); getch();}C语言程序设计作业题-《C语言程序设计》作业与思考题解答 说明:习题中P119:2.7 表示《C/C++上机实践及习题选解》中第119页的2.7题,其它以此类推,书后有解答。非《C/C++上机实践及习题选解》中的习题提供习题参考答案。 习题解答 作业一 1.合法的标识符: a12 A21 sum2 _fun C_program 不合法的标识符:f(x) $a21 21a while tan@sohu.com 2. main( ) { int i, j, s; i=2; j=3; s=i*j; printf(“ %d %d=%d”,i,j,s) } 作业二 1.指出下列哪些为C语言正确的整型(int)常量、实型(float)常量、字符型(char)常量? 正确的整型(int)常量:0 -325 128 03456 正确的实型(float)常量: 0.0 2. 1.2e-3 5e2 正确的字符型(char)常量: ‘b’ ‘104’ ‘108’ ‘ ’ ‘8’ 2.表达式的结果 (1) 1 (2) 0 (4) 0 (5) 9.5 (9) ‘A’ (11) 2 (12) 4.5 3. Y=sin(2*x)+(a+b)/(a*b)/(1+a/b)+*a*a/2 4.设m为整数,用逻辑表达式表示:能同时被3与7整除或者被5除余2且小于100的整数。 m%3= =0
m%7= =0
m%5= =2
m100 作业三 1.华氏温度通过公式C=5/9(f-32)转换成摄氏温度。试编程并上机调试运行:从键盘上输入华氏温度,利用公式计算后输出摄氏温度(要求:保留一位小数;记录调试过程中遇到的问题及解决方法)。 #include
main( ) { float f,c; scanf(“%f”,f); c=5.0/9*(f-32); printf(“c=%.1f”,c); } 2. 用IF语句: #include
#include
main( ) { float x,y; scanf(“%f”,x); if (x0) y=fabs(x); else if (x10) y=x; else if (x20) y=3-x/5; else if (x40) y=3*x-10; else y=0; printf(“y=%f’,y); } 用switch 语句: #include
#include
main( ) { float x,y; scanf(“%f”,x); if (x0) y=fabs(x); else switch ( int(x/10) ) { case 0: y=x; break; case 1: y=3-x/5;break; case 2,3: y=3*x-10; break; defaut y=0; } printf(“y=%f’,y); } 3. 解答见P151; 4.程序如下: #include
#include
main() { int i=0; char ch; ch=getchar(); while (ch!=' ') { if (ch=='(') i++; if (ch==')') i--; if (i0) break; ch=getchar(); } if (i==0) printf("(与)匹配") ; else if (i0) printf(" 缺) ") ; else printf("缺少)"); } 5. 程序如下: #include
main() { int i,j,k,m=0; for (i=1;i10;i++) for (j=1;j20;j++) { k=100-i*10-j*5; if (k0) { printf(" i=%-3dj=%-3dk=%-3d",i,j,k); m++; if (m%4==0) putchar(' '); } } printf(" m=%d ",m); } 6. 在横线上填写合适语句,完善程序,使之完成如下功能:从键盘上输入一个不多于7位的正整数,统计其中2的个数,并求各位数字中的最小数。 #include
main( ) {int count,min,temp; long n; min=9; count=0; scanf( “%ld” ,n); do { temp= n % 10 ; if (temp= =2) count++; if (mintemp) min=temp; n=n/10; }while ( n ); printf(“count=%d,min=%d”,count,min) } 作业四 1.p128: 4.6 解答见p156 2. p128: 4.11 解答见p158 3.编写一递归函数计算mn ,并从键盘输入m,n的值(如4,3),求mn 的值(上机调试)。 funm_n(int m,int n) { int y; if (n==1) y=m; else y=m*funm_n(m,--n); return y; } main() {int m,n,y; printf("Input integer(m,n):"); scanf("%d,%d",m,n); y=funm_n(m,n); printf(" %d^%-d=%-d",m,n,y); } 4.P128: 4.12 (3); 答案:12345678 5.求3-100中的素数,要求编写一函数来判断某数是否为素数。 main() { int prime,i,n=0; for (i=3;i=100;i++) { prime=prime_num(i); if (prime) { if (n%10==0) printf(" ");printf("%4d",prime);n++;} } } prime_num(int m) { int k=2,r; do { r=m % k; if (r==0) break; k++; }while(km); p="" /m);
if (r!=0) return m; else return 0; } 6. 结果如下: main0:x=12,y=2 fun: x=6,y=25 main:x=12,y=2 fun:x=7,y=26 main:x=12,y=2 作业五 1.从键盘上输入一串英文字符(不含空格与其他字符),统计每个字符的数目,并输出字母及相应的数目。 #include
#include
main() { int i=0,c[52]={0},m=0; char str[80]; printf("Input a string:"); scanf("%s",str); while (str[i]) { if (str[i]='A'
str[i] ='Z') c[str[i]-'A']++; if (str[i]='a'
str[i] ='z') c[str[i]-'a'+26]++; i++; } for (i=0;i26;i++) if (c[i]){ if (m%8==0) putchar(' ');m++; printf("%c:%-d ",i+'A',c[i]); } for (i=0;i26;i++) if (c[i+26]){if (m%8==0) putchar(' ');m++; printf("%c:%-d ",i+'a',c[i+26]); } } 2. P132: 5.15 程序见p167 3.从键盘上输入8个数,用选择法按由大到小的顺序排列并输出,要求用指针实现。 #include
#include
main() { int data[8],i,*p1,*p2,temp; p1=data; printf("Input 8 numbers:"); for (i=0;i8;i++) { scanf("%d",p1);/* 或 (*p1) */ ; p1++; } for (p1=data;p1data+8-1;p1++) p="" /data+8-1;p1++)
for (p2=p1+1;p2data+8;p2++) p="" /data+8;p2++)
if (*p1*p2){ temp=*p1; *p1=*p2; *p2=temp;} for (i=0,p1=data;i8;i++,p1++) printf("%6d",*p1 ) ; } 4.从键盘上输入一个4 4整数矩阵,以主对角线()为对称轴,将左下角元素中较大元素代替右上角对应元素,并将右上角元素(含对角线元素)输出。 #include
#include
main() { int d[4][4],i,j,temp; printf("Input 16 numbers:"); for (i=0;i4;i++) for (j=0;j4;j++) scanf("%d",d[i][j]) ; for (i=0;i4;i++) for (j=0;ji;j++) p="" /i;j++)
if (d[i][j]d[j][i]) d[j][i]=d[i][j]; for (i=0;i4;i++) { printf(" "); for (j=0;j4;j++) if (j=i) printf("%6d",d[i][j] ) ; else printf("%6c",' ') ; } } 5.盘上输入两个字符串a,b,下面程序将a,b的对应字符中的较大者存放在数组c的对应位置上,填空完善之。 #include
#include
main( ) {int k=0; char a[80],b[80],c[80]={‘’},*p,*q; p=a; q=b; gets(a); gets(b); while (*p!=0
* q!=0 ) { if ( *p!=0 ) c[k]=*p; else c[k]=*q; p++; q++; k++; if ( *p !=0 ) strcat(c,p); else strcat(c,q); puts(c); } 作业六 1.P134:6.5 程序见p178 2.P135:6.7 程序见p181 3.P134:6.18 程序见p196c语言程序设计题分类:
电脑/网络
程序设计
其他编程语言
问题描述:
1、已知有定义int a,b;char c;对应输入语句:
scanf("%2d%d%c",a,b,c),若从键盘上输入125】56】P,执行,则a,b,c各为多少? 2、用一语句将键盘输入的一个字符直接在屏幕上显示出来。 3、用一语句将字串"ABCDEF"的前三个字符输出。4、已有定义long int m,n;若从键盘上输入m=12,n=15,使m,n分别获得相应值,试写出对应输入函数。
解析:
1. a=12 b=5 c=' ' 2.printf("%c",getchar()); 3.printf("%.3s","ABCDEF"); 4.scanf("m=%ld,n=%ld",m,n);c语言程序设计程序题的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言程序设计教程考试题、c语言程序设计程序题的信息别忘了在本站进行查找喔。c语言程序设计程序题
分享20级同学大一上学期用C语言(及少量C++)实现的小球进框游戏。由于同学们刚学了三个月的编程,实现还不够完善,工程代码、图片音乐素材可以从百度网盘下载:链接:https://pan.baidu.com/s/10buGBi6wT1PN4vWDpNrfUA?pwd=2pgb 提取码:2pgb1 设计思路该程序功能的主体设计参考了网页小游戏“炮弹进框”(Cannon Strike),通过C语言编程进行实现。其中应用了EasyX插件作为辅助工具,力求最大程度地还原游戏功能及特色(如小球的下落及碰撞效果),以提升玩家的游戏体验,增强游戏的趣味性。同时,我们也对其中部分内容进行了创新和优化,使各界面尽可能简洁美观,并增加了多个交互界面(如选关,暂停,存档),为玩家提供良好的视觉效果,和更人性化的操作要求。玩家可通过点击鼠标实现基本的游戏操作。2 功能描述游戏按照由易到难的顺序设计关卡,为了增加游戏的可玩性,我们每一关都导入了新的元素,以此逐步激发玩家的游戏兴趣和挑战激情。玩家可根据提示点击对应文字进入关卡,游戏中通过点击鼠标左键进行发射小球,使小球在空中碰撞或者躲避挡板和障碍物后落入框中,框中小球数量达到需要的数量即可过关。游戏过程中可随时暂停、存档、退出、重新开始,也可以选择进入任意已解锁的关卡。2.1 定义结构体和变量在代码开头,我们定义了关于小球参数的结构体和游戏中所要用到的全局变量,并进行了必要的初始化。2.2 初始化函数初始化函数为startup(),是为游戏的进行做一些提前准备。具体体现为:2.2.1 初始化画布用initgraph()函数开辟了画面,并将背景设为白色。2.2.2 导入文件导入了游戏中所需要的图片及背景2.2.3 循环播放背景音乐2.3 游戏主界面函数游戏主界面函数为Startmenu(),该函数功能为显示游戏主界面并通过代码:if (MouseHit()) // 如果有鼠标消息
{
m = GetMouseMsg(); // 获得鼠标消息
}
等待用户点击鼠标进行操作,在接收到鼠标信息后通过if语句进行判断,并执行对应指令。在此界面中用户可以看见游戏名称及游戏说明,并能够通过点击对应文字来进行“开始新游戏”、“读档”、“存档”、“退出游戏”等操作。2.4 关卡选择界面函数关卡选择函数为Maininterface(),该函数通过Access[]数组中存储的信息来判断对应关卡是否已经解锁,通过绘制图像向用户直观显示所有关卡的状态(绿色表示该关卡可进入,灰色表示该关卡不可进入),并等待用户点击鼠标进行选关操作,玩家可以在解锁的关卡中自由选择进行游戏。2.5 菜单界面函数菜单界面函数为Pausemenu(),按下Esc键可暂停游戏并通过该函数进入菜单界面。该函数与游戏主界面函数(详见2.3)相类似,绘制界面并等待接收用户鼠标信息进行“继续游戏”、“重新开始”、“返回主界面”、“退出”等操作。2.6 读取存档函数读取存档函数为readRecordFile(),可以读取存档中的关卡是否解锁的信息数据,并写入到Access[]数组中,以延续之前的解锁进度继续游戏。2.7 写入存档函数写入存档函数为writeRecordFile(),与读取存档函数(详见2.6)相对应,功能是将当前关卡数据写入文档。2.8 播放音效函数播放音效函数为PlayMusicOnce(const TCHAR fileName[80]),每次发射小球时读取发射音效文件并播放一次。为了尽可能还原原来的游戏,我们将原游戏的音效录制为了MP4文件。2.9 与关卡有关的数据更新与关卡有关的数据更新函数为Levelupdate(int n),其中n为关卡数,该函数中记录每个关卡的数据。在确定需要加载的关卡数后调用此函数可以对本关所有数据进行初始化。2.10 计算所有小球间距离的平方计算所有小球间距离的平方函数为get_distance(struct Ball BALL[]),将已经发射的小球参数(x,y坐标)传入函数,通过遍历计算小球间两两距离的平方,得到该小球最近的小球距离及其下标,记录在小球参数结构体(struct Ball)中的distance[]数组中,方便小球间的碰撞判断。2.11 判断游戏是否结束判断游戏是否结束函数为isfinished(),顾名思义,该函数通过if语句判断单次游戏是否已经结束。如果框中小球数量达标或者所有小球都已落到框中或框外则当前关卡结束,函数返回值为1,否则函数返回值为0。2.12 判断碰撞判断碰撞函数为knock(struct Ball BALL[]),判断碰撞可分为以下部分:2.12.1 球与球碰撞对小球进行遍历先利用get_distance(struct Ball BALL[])函数(详见2.10)中计算出的两个小球间的距离的平方与四倍半径的平方进行比较,判断两小球是否碰撞。对所有碰撞的小球,通过两者的坐标判断它们的相对位置,最终实现两个小球的运动状态改变。2.12.2 球与挡板碰撞球与挡板碰撞后球的速度方向、大小改变,实现反弹效果。2.12.3 球与框碰撞框的形状是不规则的,因此在判断球与框碰撞的过程中我们对框进行了拆分,根据碰撞点的不同分成了多种情况进行设计,不断地调试数据达到理想的碰撞效果。2.12.4 球与障碍物碰撞球与障碍物碰撞后小球将被击碎,通过更改坐标使其直接落出对话框外,再绘制分裂出的几个更小的小球,其中小小球的个数和每个小小球的大小、方向随机。2.13 小球及挡板的运动move()函数通过对小球及挡板速度、坐标的不断更新来实现它们的运动的描述,用结构体数组记录所有小球的状态。2.14 与输入无关的更新与输入无关的更新函数为updateWithoutInput(),在该函数中通过精确延时函数MyTimer()(详见2.17),每隔8帧执行move()函数,进行小球及挡板的位置更新。另外,此函数中还通过对小球遍历,分别判定它们所处的位置,从而更新框中小球的个数和失去小球的个数。2.15 与输入有关的更新与输入有关的更新函数为updateWithInput(),该函数可根据用户输入执行相应操作。实现点击鼠标发射小球并播放一次音效(详见2.8)的功能,并且按下“ESC”键可将游戏暂停,切换为菜单界面(详见2.5)。2.16 进行绘制进行绘制函数为show(),该函数通过判定游戏状态gameStatus来进行对应绘制:2.16.1 绘制主菜单界面当游戏在主界面状态时,通过调用游戏主界面函数Startmenu()(详见2.3)绘制主界面,并等待下一步操作。2.16.2 绘制关卡选择界面当游戏在关卡选择界面状态时,调用关卡选择界面函数Maininterface()(详见2.4)绘制关卡选择界面,并等待下一步操作。2.16.3 绘制菜单界面当游戏暂停状态时,调用菜单界面函数Pausemenu()(详见2.5)绘制菜单界面,并等待下一步操作。2.16.4 游戏中的绘制当处于正常游戏状态且游戏未结束时,进行游戏中发射器、小球、挡板、框等各元素图像的绘制以及必要的文字提示。通过调用isfinished()函数(详见2.11)判断游戏是否结束。2.16.5 游戏结算的绘制当isfinished()函数(详见2.11)返回值为1,即游戏结束时,用if语句判断是否通关(框内小球数是否达标),并绘制对应结算界面,如果游戏胜利则继续通过损失的小球数判断并绘制对应星星。最后绘制对应按钮并等待用户鼠标操作,如果接收到有效的鼠标信息则更新关卡数据,进入对应关卡或改变游戏状态。2.17 精确延时函数精确延时函数MyTimer可以通过获取时钟来进行计时,这种方法起到的延时效果较为稳定,受电脑性能影响较小。3 实现过程中的重点和难点3.1 关卡数据关卡数据影响着难度系数和玩家体验,为了增强玩家体验,我们反复测试关卡的难度是否合理,并邀请其他同学一起体验,不断改进,以达到最终合理的效果。3.2 精确延时函数在初始代码中,我们用了以下的延时函数: static int waitIndex = 1; // 静态局部变量,初始化时为1
waitIndex++; // 每一帧+1
if (waitIndex == 15) // 如果等于15才执行
{
move(); // 调用移动函数
waitIndex = 1; // 再变成1
}
但是在运行游戏时发现,游戏一开始的速度很快,但由于电脑性能的原因,运行速度会逐渐慢下来。面对这样一个严重的问题,我们最终通过查阅资料,发现可以用时钟的时间使程序运行帧率稳定。所以在最终代码中,我们加入了<windows.h>头文件,以调用时钟信息,使用了MyTimer进行精确延时。3.3 各函数间调用的逻辑关系协调在每次完成一个游戏基本功能的设计和编写,并封装成相应函数后,我们时常会面临了一个难题:怎样将这些功能整合进游戏中去。为解决这一问题,我们先是梳理了各部分间的逻辑关系,发现函数的调用大都需要对具体情况进行判断。于是我们又新增了一些参数(如游戏状态gameStatus、关卡是否解锁Access[]、是否加载对应关卡isReloadLevel、关卡数Level)以及函数(如判断游戏是否结束isfinished())来判断具体情况。最终,在具体代码中,我们就能按照最初拟定的设想,将这些功能通过逻辑关系串联进去。当然,在这个过程中也少不了反复耐心地调试,因为一点点小小的逻辑错误就很有可能使得程序实现和最初设想大相径庭。3.4 小球的碰撞效果——knock()函数的编写3.4.1 小球间的碰撞小球间的碰撞判定一直是困扰我们的一大难题。由于小球发射下落与碰撞的不确定性使得这个问题看起来异常复杂。最终我们想到了一个可行的思路,那就是通过小球间距离的计算来判定小球间是否会碰撞。在编写了计算所有小球间距离的平方函数get_distance(struct Ball BALL[])(详见2.10)和小球间碰撞的相应代码后,我们又发现了另一个重大问题:由于速度变化后极短时间内小球仍处于碰撞状态,有可能小球速度被再次交换。于是我们通过对小球距离重新赋值来解决这一问题,具体代码如下:BALL[j].distance[0] = 99999999;
BALL[j].distance[1] = -1;
BALL[i].distance[0] = 99999999;
BALL[i].distance[1] = -1;
3.4.2 小球与框的碰撞框是一个不规则图形,因此在判断碰撞时要将框进行拆分,如图所示,框被拆分成1、2、3三个部分。第一部分是框的底部,球与框的底部碰撞后将落在框中。第二部分是框的左右两侧,球碰撞后会反弹进框中,x方向速度改变,但不影响y方向速度。第三部分是框的上面,球碰撞后将被弹起,y方向速度改变,但不影响x方向速度。由于小球是逐帧移动,前后的位置并不连续,因而在反弹时要对小球的坐标进行校准。(需添加代码:BALL[i].y = HEIGHT - 257;)3.4.3 小球在框内的堆放在框内的小球碰撞时,我们适当减小了反弹的效果,以免小球被反弹出框外。然而这样也会导致一定的问题。同样也是由于逐帧移动而带来的位置不连续性,需要对小球位置进行校准。对应代码为:while ((BALL[i].x - BALL[j].x) * (BALL[i].x - BALL[j].x) + (BALL[i].y - BALL[j].y) * (BALL[i].y - BALL[j].y) < 4 * Radius * Radius + 8){
if (BALL[i].y < BALL[j].y)
BALL[i].y -= 0.1;
if (BALL[i].y > BALL[j].y)
BALL[j].y -= 0.1;
if (BALL[i].x < BALL[j].x){
BALL[i].x -= 0.05;
BALL[j].x += 0.05;}
if (BALL[i].x > BALL[j].x){
BALL[j].x -= 0.05;
BALL[i].x += 0.05;}}
在碰撞情况中这样类似的细节还有很多,在此就不一一赘述了。4. 感悟本次游戏开发大作业从框架设计到代码编写修改,再到最终的整合运行,让我体会到了太多。始终需要保持代码的整洁规范,变量的命名也要有意义,否则一旦出错就可能崩盘,让人抓狂却又无能为力。成百上千次的调试运行更是一种考验,严谨细致、精益求精,也许就是一个优秀编程者应具备的品质。这次开发不仅是对编程能力的锻炼,更是对良好习惯与能力的培养。在与组员讨论、整合代码的过程中,我学会了交流合作;在尝试解决问题的过程中、我学会了自主学习与查询资料;在每个功能得以实现的那一刹那,我也体会到了无比的激动与喜悦……相信这次课程带给我的收获将会使我终生受用。

我要回帖

更多关于 日期格式化c语言怎么写 的文章

 

随机推荐