printf(“”);
如果需要依次输出所给的数值,则须在比较大小之后进行替换赋值
inta,b,t;
scanf(“%d,%d”,a,b)
if(a>b)
{此步的依次赋值体现了赋值运算自右向左的结合次序
t=a;先将a的值赋给t,此时a的值空出
a=b;将b的值赋给a,b值空出
b=t;将t中存储的a的值赋给b,此时t仍回复空值
}若混淆其中赋值规律则产生混乱
printf(“”);
二、连乘连加问题
page113、114、115page129/6.3page129/6.4、6.5
主要思想:容器+循环关联习语:while(dowhile)、for、(goto)
inti,sum=0;循环第一步,定初值,sum可视作是承载运算结果的容器,初为空i=1;
while(i<=100)构设循环条件,注意必须是有限循环,否则程序无终止
sum=sum+I;循环第二步,累计结果
i++;循环第三步,循环量自增。这两步保证循环为续,皆不可少
printf(“”);
除此之外,用for句型、dowhile也可就此推出,虽形式不同,但主要三个部分都不可少,而且过程中的分号和大括号划分不同的意群,因此必须注意。
三、闰年算法
page107
主要思想:自上而下细化关联习语:if、else判断句、
if(year%4==0)“==”才是等于号,而“=”号是赋值号
if(year%100==0)分层次的语句
{每一层的大括号都要完美配对
if(year%400==0)
Leap=1;
elseleap=0;
elseleap=1;
elseleap=0;
闰年的有关规定:上机指导page34
闰年算法主要体现了由上而下具体优化的程序设计方法,在表示时要特别注意每一个if都要有其相应的else,可以适当增大不同级别的大括号的缩进以便辨别。
四、连续小数相加减
page124
主要思想:引入可变符号位及可变分母位+循环关联习语:while
ints;
floatn,t,pi;选float是出于其位数容纳更多的考虑,其位数为10^38t=1;pi=0;n=1.0;s=1;循环第一步,定初值
while(fabs(t)>1e-6)选取小是为了避免二进制到十进制的转换误差的影响{
pi=pi+t;循环第二步,累计结果
n=n+2;
s=-s;
t=s/n;循环第三步,循环量自增,符号位改变
pi=pi4;
除去引入的定义符号位的量之外,此类基本是循环的基本应用。
五、素数问题
page126
intm,I,k;
scanf(“%d”,m);
K=sqrt(m);一般的数学函数难找到a^b,故开平方的公式熟记
for(i=2;i<=k;i++)for句型集成了初值、循环条件、自增三步
if(m%i==0)break;所求只需找到可以整除的数即可输出(即break),若无法找到if(i>k)printf(“%d为闰年”,m);可整除的数则到最后一个最接近k的整数并自增1
elseprintf(“%d不是闰年”,m);
本题中的“if(i>k)”最为难理解,满足素数的条件是在0~sqrt(m)之间的所有数都不能整除m,所以在程序中只需有一个i满足可整除m即可输出,至于其后的关于i和k的判断则意在如果在0~k范围内没有数满足条件,则检验k之后自增递出k+1,此时其为素数。
故应判断i与k的大小,若i<=k,则i为真正能够使m被整除的数,此时m不是素数,反之,当i>k时则i是0~k范围内寻求使m被整除的数无果之后输出的程序性数字,此时m为素数(此段理解的课本表述:page126)
六、大小写字母转换、密码问题
page51
主要思想:大小写字母ASCII码表数值差距32关联习语:char、getchar()
charc1,c2;定义的字符常量只能容纳一个字符
c1=’a’;在能够表达的数字范围内,字符常量和整数常量效果相同(page67/3.8)
c2=’b’;
c1=c1-32;大小写字母的ASCII码值差异、常用数值A-65,a-97
c2=c1-32;
printf(“%c%c”,c1,c2);
除此之外,更加繁杂的繁杂的密码转换问题还涉及到getchar()函数,其为单个位取的字符函数,类于循环函数
八、三角形面积问题
page86
主要思想:三角形海式关联习语:include
floata,b,c,s,area;编程步骤第一步,考虑所需用的量
scanf(“%f,%f,%f”,a,b,c);
s=1.0/2(a+b+c);
area=sqrt(s(s-a)(s-b)(s-c);海式,为求解三角形问题提供最可行方案printf();
程序的灵魂在于算法,而算法的脉络则在于其逻辑,按照程序所需的算法列下所需的步骤,具体细化每一步直到能够用C表示出来,之后的工作为定义所需量,开始编程
附:include中所包含的常用函数:1、fabs()绝对值;2、pow(a,b)是a的b次方;
3、sqrt()平方根;4、正弦余弦正切
九、一元二次方程
page87
主要思想:求根公式关联习语:include/if判断句
floata,b,c,disc,_1,_2,p,q;将解的形式划分为只有符号位变化的几部分scanf(“a=%f,b=%f,c=%f”,a,b,c);
disc=bb-4ac;定义每个部分的实际意义
p=-b/(2a);
q=sqrt(disc)/(2a);
_1=p+q;_2=p-q;
printf()
一元二次方程的解法已成惯例,熟记其每个过程有助于增加熟练度,如果题设中没有足够条件其为一元二次方程,则需讨论其解得个数,另需用if判断句,保持思路清晰,语句严谨当可无错。
十、分段一元函数
page100
int_,y;
scanf(“%d”,_);
if(_<0)
Y=-1;
else
if(_==0)y=0;如果写if(_=0)y=0,则不可以,“=”是赋值号,一个变量不可重复赋值
elsey=1;
If、else的语义连贯见page101、102,格式混乱突破了if所构成的无形意群则会发生不可预知的杯具。If句和else句的书写特别需注意的准则:1、每个if都有相应的else;2、else只和最近的if句配对;2内嵌的if句一般写在外层的else句中(典例:page101程序一Line8~10)。十一、位运算
page112/5.7(各十百千外各位的表示方法模板)、page129/6.2
主要思想:各十百千万的各位表示法+ASCII码所代表数符关联习语:char、getchar()、while、if,else
while((c=getchar())!=’
’)作用同于scanf,getchar()每次从输入中取一个字符量
if(c>=’a’c<=’z’‖c>=’A’c<=’Z’)验证其ASCII码大小,以判断其类型letters++;计数过程
elseIf(c==‘’)
space++;
elseif(c>=’0’c<=’9’)
digit++;
else
other++;
除去各位数的表示方法之外,直接关联ASCII值的操作则多需要验证其ASCII码值所在的区域,这将影响其外在表现。本例中还涉及了逻辑与运算的运算优先级先于逻辑或运算的事实,page365的运算符的结合性足以对许多问题进行支持
十二、公约数公倍数
page129/6.1
主要思想:辗转相除法关联习语:if、while
【附】辗转相除法,又名欧几里德算法(Euclideanalgorithm)乃求两个正整数之最
大公因子的算法。它是已知最古老的算法,其可追溯至30__年前。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。事实上能够被C语言作为解题算法的方法具有近似的特点,比如不进行除去基本运算之外的算术逻辑运算,即使计算量庞大但是逻辑清楚等特点,这主要是考虑到
计算机在只运行加法运算时比较简单易处理(反码补码的出现也是以这样的理由)。
if(ntemp=n;
n=m;
m=temp;将m、n按照大小顺序排列,使m小于n,为下一步的求余作铺垫
p=nm;
while(m!=0)
r=n%m;
n=m;
m=r;让人辗转反侧难以入睡的方法的主题内容
printf(“它们的最大公约数为:
”,n);
printf(“它们的最小公倍数为:
”,p/n);
此类采用先前不可知的方法写出的算法最应该熟记并当作模板,其中的大小换位和辗转纠结法的相除过程可以不求理解。
十三、迭代法、二分法
page129-130/6.11-13
想见者详见上机指导page41