C语言有三种循环:while,for,do while
P138summing
//根据用户键入的整数求和
#include<stdio.h>
int main(void){
long num;
long sum=0L;
int status;
printf("please enter an integer to be summed\n");
printf("q to quit\n");
status=scanf("%ld",&num);
while(status==1){
sum+=num;
printf("please enter another num\n");
status=scanf("%ld",&num);
}
printf("the sum is %ld",sum);
return 0;
}
scanf()返回成功读取项的数量,如果用户输入的不是数字scanf()将会读取失败并返回0.
每次循环都被称为一次迭代
关系运算符:< = > == != <= >=
浮点数比较因为浮点数的舍入误差,会导致逻辑上相等的两数并不相等。使用fab()函数可以方便的比较浮点数,该函数可以返回一个浮点值的绝对值。
#include<math.h>
#include<stdio.h>
int main(void){
const double ANSWER=3.14159;
double response;
printf("what is the value of pi\n");
scanf("%lf",&response);
while(fabs(response-ANSWER)>0.0001)
{
printf("try again\n");
scanf("%lf",&response);
}
printf("close enough");
return 0;
}
对于C语言而言表达式为真的值是1,表达式为假的值是0.并且一般而言所有的非零值都是true,只有0被视为假
P148 bool类型
#include<stdio.h>
int main(void){
long num;
long sum=0L;
_Bool input;
printf("please enter an integer");
printf("enter q to quit: ");
input=scanf("%d",&num);
while(input){
sum+=num;
printf("please enter another num,use q to quit: ");
input=scanf("%d",&num);
}
printf("result is %d",sum);
return 0;
}
关系运算符的优先级比算术运算符低(包括+ -),但是比赋值运算符高并且关系运算符之间也有两种不同的优先级 高优先级组:<<= >>= 低优先级组:== != ,关系运算符的结合律也是从左往右的。
不确定性循环,指在测试表达式为假之前不知道要执行多少次循环,还有一类叫做计数循环
for循环,将计数器的初始化,测试和更新结合在一起。
P151打印一个立方表
#include<stdio.h>
int main(void){
int num;
printf(" n ncubed\n");
for(num=1;num<=6;num++){
printf("%4d %4d\n",num,num*num*num);
}
return 0;
}
1.在for循环中可以省略表达式但不可以省略分号
2.省略第二个语句将会永远为真
3.第一个表达式不一定是给变量赋值,也可以使用printf
P154 for-show
#include<stdio.h>
int main(void){
int num=0;
for(printf("keep entering nums\n");num!=6;){ ///在执行其他部分前第一部分只执行一次
scanf("%d",&num);
}
printf("that is the one i want");
return 0;
}
其他赋值运算符:+= *= %=。。。
注:x*=3y+12与x=x(3*y+12)相同
//逗号运算符扩展了for循环的灵活性
P156 postage
#include<stdio.h>
int main(void){
const int FIRST_OZ=46; //2013邮费
const int NEXT_OZ=20 ; //2013邮费
int ounces,cost;
printf(" ounces cost\n");
for(ounces=1,cost=FIRST_OZ;ounces<=16;ounces++,cost+=NEXT_OZ){
printf("%5d %9.2f\n",ounces,cost/100.3);
}
return 0;
}
//逗号是一个序列点,即逗号左侧的所有副作用都在逗号右侧产生作用
例:int a=200,300; //a的值为200 相当于int a=200; 300;
int a=(200,300) //a的值为300
P158zeno悖论计算1+1/2+1/4+1/8.。。。。
#include<stdio.h>
int main(void){
int t; //项计数
double time,power;
int limit;
printf("enter the number of terms you want: ");
scanf("%d",&limit);
for(time=0,power=1,t=1;t<=limit;t++,power=power*2){
time+=1.0/power;
printf("time = %f when terms= %d\n",time,t);
}
return 0;
}
dowhile循环: while与for循环都是入口条件循环,即在每次迭代前都要检查条件是否成立,所以有可能不执行代码。 C语言还有出口条件循环,即在每次迭代后检查条件是否成立。
P159dowhile
#include<stdio.h>
int main(void){
const int secret_code=13;
int code_entered;
do
{
printf("please enter the secret_code number\n");
scanf("%d",&code_entered);
}while(code_entered!=secret_code);
printf("you are right");
return 0;
}
do while的通用格式
do
statement //statement可以是一条语句或复合语
while(expression);
**嵌套循环:**指在一个循环中包含另一个循环,常用于按行和列显示数据,一个循环用于处理行另一个循环用于处理列
#include<stdio.h>
#define ROWS 6
#define CHARS 10
int main(void){
int row;
char ch;
for (row=0;row<ROWS;row++){
for(ch='A';ch<('A'+CHARS);ch++){
printf("%c",ch);
}
printf("\n");
}
return 0;
}
**P163rows2:**可以使用外部循环控制内层循环
#include<stdio.h>
int main(void){
const int ROWS=6;
const int CHARS=6;
int row;
char ch;
for(row=0;row<ROWS;row++){
for(ch=('A'+row);ch<('A'+ROWS);ch++){
printf("%c",ch);
}
printf("\n");
}
}
**数组(array)**是按顺序储存的一系列类型相同的值,通过下标访问数组中单独的项或元素,
声明:float debts【20】
这是一个内含20个元素的数组,每个元素都可以存储float内型的值 debts【0】 debts【1】直到debts【19】
注意数组元素的编号不是从1开始的
debts【2】=32.54
scanf(“%f“,&debts【2】); //c编译器不会检查数组的下标是否正确
注意字符数组与字符串的区别在普通字符数组的末位加上\0的空字符才是字符串也是字符数组
P165 score
#include<stdio.h>
#define SIZE 10
#define PAR 72
int main(void){
int index,score[SIZE];
int sum =0;
float average;
printf("enter %d golf scores:",SIZE);
for(index=0;index<SIZE;index++){
scanf("%d",&score[index]);
}
printf("the scores read are as follows:\n");
for(index=0;index<SIZE;index++){
printf("%d\n",score[index]);
}
return 0;
}
p167 POWER
#include<stdio.h>
double power(double n,int p);
int main(void){
double x,xpow;
int exp;
while(scanf("%lf %d",&x,&exp)==2){
xpow=power(x,exp); //函数调用
printf("%.3f的%d次方是%.5f",x,exp,xpow);
printf("输入另一组数,输入q退出");
}
return 0;
}
double power(double n,int p)
{
double pow=1;
int i;
for(i=1;i<=p;i++){
pow*=n;
}
return pow;
}