for(initialization;condition;update)
dosomething();
other();
【建议】尽可能在定义变量的同时初始化该变量(就近原则)
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。
如果引用了未被初始化的变量,可能会导致程序错误。
本建议可以减少隐患。
例如:
intwidth=10;//定义并初绐化width
intheight=10;//定义并初绐化height
intdepth=10;//定义并初绐化depth
3.代码行内的空格
【规则3-1】关键字之后要留空格。
象const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。
象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
【规则3-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
【规则3-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
【规则3-4】‘,’之后要留空格,如Function(x,y,z)。
如果‘;’不是一行的结束符号,其后要留空格,如for(i=1;i<10;i++)。
【规则3-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
【规则3-6】一元操作符如“!
”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。
【规则3-7】象“[]”、“.”、“->”这类操作符前后不加空格。
【建议】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如:
for(i=0;i<10;i++)和if((a<=b)&&(c<=d))
代码行内的空格示例:
voidFunc1(intx,inty,intz);//良好的风格
voidFunc1(intx,inty,intz);//不良的风格
if(year>=2000)//良好的风格
if(year>=2000)//不良的风格
if((a>=b)&&(c<=d))//良好的风格
if(a>=b&&c<=d)//不良的风格
for(i=0;i<10;i++)//良好的风格
for(i=0;i<10;i++)//不良的风格
for(i=0;i<10;i++)//过多的空格
x=a
a:
b;//良好的风格
x=a
a:
b;//不好的风格
int*x=&y;//良好的风格
int*x=&y;//不良的风格
array[5]=0;//不要写成array[5]=0;
a.Function();//不要写成a.Function();
b->Function();//不要写成b->Function();
4.对齐
【规则4-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【规则4-2】{}之内的代码块在‘{’右边数格处左对齐。
风格良好的对齐示例:
voidFunction(intx)
{
…//programcode
}
if(condition)
{
…//programcode
}
else
{
…//programcode
}
for(initialization;condition;update)
{
…//programcode
}
While(condition)
{
…//programcode
}
如果出现嵌套的{},则使用缩进对齐,如:
{
…
{
…
}
…
}
风格不良的对齐示例:
voidFunction(intx)
{…//programcode}
if(condition){…//programcode}
else{…//programcode}
for(initialization;condition;update)
{…//programcode}
while(condition){…//programcode}
5.长行拆分
【规则5-1】代码行最大长度宜控制在70至80个字符以内。
代码行不要过长,否则眼睛看不过来,也不便于打印。
【规则5-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。
拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
例如:
if((very_longer_variable1>=very_longer_variable12)
&&(very_longer_variable3<=very_longer_variable14)
&&(very_longer_variable5<=very_longer_variable16))
{
dosomething();
}
for(very_longer_initialization;
very_longer_condition;
very_longer_update)
{
dosomething();
}
在C语言中,是如何取得这个随机数的?
一个语句:
rand();
它的作用就是随机取0到RAND_MAX之间的任何数。
ANSI标准指出,RAND_MAX值的范围至少是32767,也就是双字节整数的最大值。
下面我们用一个例子来取得从1到6的随机整数:
#include
#include
main()
{
inti;
for(i=1;i<=20;i++)
printf("%10d",1+(rand()%6));
}
第2行的stdlib.h是rand()函数的头文件,第7行就是实现功能的语句了。
前面我们以经说过函数取的值是介于0到RANDMAX之间的,而我们所要的是1到6之间的整数。
想一想就知道:
任一整数除以6所得的余数是0~5之间的整数,再加一之后就是1到6了,也就是我们的目标。
利用这个原理我们使用%号对随机数进行了缩放。
OK,运行两次程序:
一:
66556511536624262341
二:
66556511536624262341
发现:
两次运行的结果完全一样。
结论:
这算什么随机数。
具有讽刺意味的是,这种重复性是rand的一个重要特点,在调试程序时,这种重复性是必不可少的,因为它可以证明对程序的修改能够正常运行。
实际上,rand函数产生的是伪随机数。
但我们需要的是随机数。
于是,需要对程序进行随机化,这就需要使用标准库函数srand来实现了。
这二个函数的具体工作过程如下:
1)首先给srand()提供一个种子,它是一个unsignedint类型,其取值范围从0~65535;
2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3)根据需要多次调用rand(),从而不间断地得到新的随机数;
4)无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
以下是一个产生随机数的例子
#include
#include
main()
{
inti;
unsigndeseed;
printf("Enteraseed:
");
scanf("%u",&seed);
srand(seed);
for(i=1;i<=20;i++)
printf(""%10d",1+(rand()%6));
}
程序的运行结果是当我们输入不同的SEED时,产生不同组的随机数。
这句话的意思有两个:
一:
当输入相同的SEED时,产生的同组随机数;二:
每次运行我们都要输入一个SEED。
如果我们希望不用每次输入SEED值,而且每次运行时SEED值都是不同的,我们可以用下面语句代替上面的第三块的三个语句:
srand(time(NULL));
这会使计算机自动读取自己的时钟以获得SEED值。
于是我们就获值了每次运行都会改变的SEED,同样也就获得了真正的随机数。
下面是两个使用随机数的例子。
例1:
输出10个在[60-100]之间随机的整数。
利用公式rand()%(b-a)+a,就会产生在[a,b]之间的一个随机数
#include
#include
#include
main()
{intmagic,i;
srand(time(NULL));
for(i=1;i<10;i++)
{magic=rand()%40+60;
printf("%10d",magic);
}
printf("\n");
}
例2:
输出5个在[4-30]之间随机的整数。
#include
#include
#include
main()
{intmagic,i;
srand(time(NULL));
for(i=1;i<10;i++)
{magic=rand()%(30-4)+4;
printf("%10d",magic);
}
printf("\n");
}
例3:
猜数游戏(范围:
10-100)
#include
#include
#include
main()
{intmagic,num;
intcount;
srand(time(NULL));
magic=rand()%(100-10)+10;
count=0;
while
(1)
{
printf("pleaseguessthenum:
\n");
scanf("%d",&num);
count++;
if(num>magic)printf("big");
elseif(num else{printf("right");printf("count=%d",count);break;}
}
}
3顺序题
方法不是唯一的,仅供参考。
题目4:
#include"stdio.h"
main()
{floatf,c;
printf("inputf:
");
scanf("%f",&f);
c=5*(f-32)/9;
printf("c=%6.2f\n",c);
}
题目5:
#include"stdio.h"
main()
{charc1,c2,b,d;
printf("pleaseinputasmallletter:
");
scanf("%c",&c1);
c2=c1-32;
b=c2-1;
d=c2+1;
printf("thebigletteris%c\n",c2);
printf("beforeis%c,lateris%c\n",b,d);
}
题目6:
#include"stdio.h"
main()
{intx,y,h,f;
scanf("%d%d",&h,&f);
x=2*h-f/2;
y=f/2-h;
printf("x=%d,y=%d\n",x,y);
}
题目7:
#include"stdio.h"
main()
{floatx,y,h,s;
scanf("%f%f%f",&x,&y,&h);
s=(x+y)*h/2;
printf("s=%f\n",s);
}
题目8:
#include"stdio.h"
main()
{charx,y;
printf("pleaseinputtwoletter:
\n");
scanf("%c,%c",&x,&y);
printf("theloweris%c,%c\n",x+32,y+32);
printf("theasciiis%d,%d\n",x+32,y+32);
}
题目9:
#include"stdio.h"
#include"math.h"
main()
{floatx,y,z;
scanf("%f%f",&x,&y);
z=sqrt(y)+pow(x,5)/2;
printf("z=%f\n",z);
}
选择题
方法不是唯一的,仅供参考。
。
题目1:
main()
{inta,b,c,max;
printf("inputthreeinteger:
");
scanf("%d%d%d",&a,&b,&c);
if(a
if(bmax=c;
else
max=b;
else
if(amax=c;
else
max=a;
printf("max=%d",max);
}
题目2:
main()
{intx,y;
printf("inputx:
");
scanf("%d",&x);
if(x<1)
{y=x;printf("x=%d,y=x=%d",x,y);}
elseif(x<10)
{y=2*x-1;printf("x=%d,y=2x-1=%d",x,y);}
else
{y=3*x-11;printf("x=%d,y=3x-11=%d",x,y);}
}
题目3:
main()
{
floatscore;
chargrade;
printf("pleaseinputascore:
");
scanf("%f",&score);
switch((int)(score/10))
{
case10:
case9:
grade='A';break;
case8:
grade='B';break;
case7:
grade='C';break;
case6:
grade='D';break;
case5:
case4:
case3:
case2:
case1:
case0:
grade='E';break;
}
printf("score:
%5.1f,grade:
%c\n",score,grade);
}
题目5:
main()
{inta,b,x,y;
printf("inputa,b:
");
scanf("%d%d",&a,&b);
x=a*a+b*b;
if(x>100)
{y=x/100;printf("%d",y);}
else
printf("%d",a+b);
}
题目6:
#include"stdio.h"
main()
{charch;
printf("pleaseinputachar:
");
ch=getchar();
if(ch<32)
printf("\nThecharisacontrolchar.\n");
elseif(ch>='A'&&ch<='Z')
printf("\nThecharisacaptalchar.\n");
elseif(ch>='a'&&ch<='z')
printf("\nThecharisalowerchar.\n");
elseif(ch>='1'&&ch<='9')
printf("\nThecharisadigitchar.\n");
else
printf("\nThecharisanotherchar.\n");
}
题目8:
operator
break
default
说明:
g格式符:
以f格式或e格式输出实数,且不输出无意义的零。
选择f格式或e格式的原则是:
那种格式输出时所占宽度较小,即使用其为g格式符的输出形式。
题目9:
#include"math.h"
main()
{inta,b,c,t,min;
scanf("%d,%d,%d",&a,&b,&c);
t=(abs(a)a:
b;
min=(abs(t)t:
c;
printf("%d",min);
}
题目10:
main()
{intm,n,x;
scanf("%d,%d,%d",&m,&n,&x);
if((x%n==0&&x%m==0)&&(n%x==0&&m%x==0))
printf("既是公约数,又是公倍数\n");
elseif(x%n==0&&x%m==0)
printf("公倍数\n");
elseif(n%x==0&&m%x==0)
printf("公约数\n");
else
printf("既不是公约数,又不是公倍数\n");
}
题目11:
#include"math.h"
main()
{inta,b;
scanf("%d,%d",&a,&b);
if(sqrt(a*a+b*b)<15)
printf("in");
elseif(sqrt(a*a+b*b)==15)
printf("on");
else
printf("out");
}
题目12:
#include"stdio.h"
main()
{charch;intm;
ch=getchar();
switch(ch)
{case'1':
scanf("%d",&m);
printf("
(1):
10to16---%x",m);break;
case'2':
scanf("%d",&m);
printf("
(2):
10to8---%o",m);break;
case'3':
scanf("%o",&m);
printf("(3):
8to10---%d",m);break;
case'4':
printf("quit");}
}
循环试题
实验题
题目4:
sn=sn+tn
tn=tn+a
题目5:
(1)
main()
{inti,j,k,m;
for(i=100;i<=999;i++)
{
j=i/100;
k=i/10-j*10;
m=i%10;
if(i==j*j*j+k*k*k+m*m*m)
printf("%5d",i);
}
}
(2)
main()
{inti,j,k,n,m;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
{m=i*100+j*10+k;
n=i*i*i+j*j*j+k*k*k;
if(m=