前言
本章将介绍以下内容;
关键字——for、while、do while;
运算符——<、>、>=、<=、!=、==、+=、*=、-=、/=、%=;
函数——fabs();
C语言的三种循环——for 、while、 do while;
使用关系运算符构建控制循环的表达式;
其他运算符;
循环常用的数组;
编写有返回值的函数;
一、while循环
首先看一个简单示例:
#include <stdio.h>
int main()
{
long num;
long sum=0L;
int status;
printf("PLease enter an integer to be summed ");
printf("(q to quit): ");
status= scanf("ld",&num);
while( status ==1)
{
sum=sum+num;
printf("please enter next integer (q to quit): ");
status =scanf("ld",&num);
}
printf("Those integers sum to %ld.\n",sum);
return 0;
}
这里的while 循环的测试表达式是
status==1;
==是C语言的相等运算符,意思是当status为1的时候表达式为真,进入while循环。
我们知道scanf函数返回成功读取项的数量,当成功读取一个整数之后就把该数存入num中然后返回一个1,随后这个1就被赋值给status。
这就保证了只有输入整数才能进入循环完成整数求和的功能。
C风格读取循环
下面的代码
status= scanf("ld",&num);
while( status ==1)
{
sum=sum+num;
printf("please enter next integer (q to quit): ");
status =scanf("ld",&num);
}
可以用这些代码替换
while(scanf("ld",&num)==1)
{
//函数内容
}
这样的写法更为精简。
概述
while循环的通用形式如下
while (expression)
statement
statement可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。
expression 一般都为关系表达式,当expression为真,就会进入循环然后执行statement部分。
终止while循环
需要注意我们使用while循环的目的是为了让程序帮我们做一些重复性高的事情,因此循环需要在合适的位置终止,如果我们设定的测试循环条件expression一直为真的话那么循环永远不会终止,这显然是不行的。
6.2 用关系运算符和表达式比较大小
虽然关系运算符也可用来比较浮点数,但是要注意:比较浮点数时,尽量只使用<和>。因为浮点数的舍入误差会导致在逻辑上应该相等的两数却不相等。例如,3乘以1/3的积是1.0。如果用把1/3表示成小数点后面6位数字,乘积则是.999999,不等于1。
使用fabs()函数(声明在math.h头文件中)可以方便地比较浮点数,该函数返回一个浮点值的绝对值(即,没有代数符号的值)。
6.3.1 什么是真
在C中,表达式一定有一个值,关系表达式也不例外。
对于C而言,表达式为真的值是1,表达式为假的值是0.
其实和前文所叙述的bool类型相似,bool类型声明的变量只有两个值,0或1。
0为假,1为真。广泛的来说,非零为真,0为假。
也可以说,只要测试条件的不为0,就认为是真,然后就会进入循环。
6.3.2 新的_Bool类型
在编程中,表示真或假的变量被称为布尔变量,所以_Bool是C语言中布尔变量的类型名。_Bool
类型的变量只能存储1(真)或0(假)。即使将非零值赋值给布尔变量,最后都会被设置为1。
6.4不确定循环和计数循环
所谓的不确定循环,就是在测试表达式为假之前,我们不知道将执行多少次循环。
而计数循环,就是我们已经知道了将会进行多少次循环。
例如下面就是一个简单的计数循环
#include <stdio.h>
int main()
{
const int NUMBER=22;
int count =1;
while(count<=NUMBER)
{
printf("Be my Valentine! \n);
count ++;
}
return 0;
}
下面是一个不确定循环的例子
#include <stdio.h>
int main()
{
int a, b;
printf("This program computes moduli.\n");
printf("Enter an integer to serve ");
printf("as the second operand: ");
scanf("%d", &b);
printf("Now enter the first operand: ");
while ((scanf("%d", &a) == 1) && (a > 0))
{
printf("%d %% %d is %d\n", a, b, a % b);
printf("Enter next number for first operand (<= 0 to quit): ");
}
printf("Done\n");
return 0;
}
6.5 for 循环
for循环把(初始化、测试、更新)组合在一起。
下面看一个例子
#include <stdio.h>
int main()
{
const int NUMBER=22;
int count;
for (count==1;count<= NUMBER; count++)
printf("Be my Valentine! \n");
return 0;
}
关键字for后面的圆括号中有三个表达式,分别用两个逗号隔开
count==1;
是初始化,只在循环开始时执行一次,
count<=NUMBER;
是测试语句,只要为真就会执行循环,本次循环结束后就会接着执行表达三
count++;
for (循环变量赋初值; 循环条件; 循环变量增值)
{
语句;
}
求解表达式1。
求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步。
求解表达式3。
转回上面第2步继续执行。
循环结束,执行 for 语句下面的语句。
for(initialize;test;update)
statement
在test为0或假之前会一直执行statement
6.6 其他赋值运算符
a+=b——a=a+b;
a*=b——a=a*b;
a-=b——a=a-b;
a/=b——a=a/b;
a%=b——a=a%b;
6.8 出口循环条件 do while
do while与for循环和while循环不一样,因为for和while最少的循环执行次数为0,但是do while不一样,do while 最少执行次数为1,即每次先进行循环后再进行条件测试,这就是出口循环 do while。
do
statement
while (expression);
6.10 嵌套循环
嵌套循环指的是在一个循环内包含另一个循环。循环嵌套常用于按行和列显示数据,也就是说
一个循环处理一行中所有的列,另一个循环处理所有的行。
#include <stdio.h>
#define ROWS 6
#define CHARS 10
int main()
{
int row;
char ch;
for(row=0;row<rows;row++) // 外层循环
{
for(ch='A';ch <('A'+CHARS);ch++) //内层循环
printf("%c",ch);
printf("\n");
}
return 0;
}
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
这里需要注意,for循环只能控制其后面的单条语句,所以内层循环的控制语句只有printf("%c",ch);
这一条。
写成如下形式可能更好理解
for(row=0;row<rows;row++) // 外层循环
{
for(ch='A';ch <('A'+CHARS);ch++) //内层循环
{ printf("%c",ch);}
printf("\n");
}
return 0;
}
在这里 首先看外层循环的测试条件,row=0,当row<ROWS即row<6的时候,会一直进行循环
所以第一次循环row等于0,然后判断为真,开始执行内层循环,内层循环判断为真,执行打印字符A,然后接着进行条件测试,测试为真,打印B,直到测试为假的时候已经打印出了
ABCDEFGHIJ,然后接着往下执行,到了第二个输出语句,打印了一个换行符。
然后回到外层循环,测试为真,row=1,又执行了内层循环10次。
等内层循环跑完之后回到外层循环。row=2......
如此重复后等到row<ROWS测试为假的时候,外层循环已经执行了0,1,2,3,4,5——六次
所以最后打印输出的结果是六行ABCDEFGHIJ.
6.11 数组简介
数组是若干个相同类型的变量在内存中有序存储的集合。
概念理解:
数组用于存储一组数据
数组里面存储的数据类型必须是相同的
数组在内存中会开辟一块连续的空间
int a[10];//定义了一个整型的数组a,a是数组的名字,数组中有10个元素,每个元素的类型
都是int类型,而且在内存中连续存储。
这十个元素分别是a[0] a[1] …. a[9]
a[0]~a[9]在内存中连续的顺序存储
下面看一个利用for循环和数组处理数据的例子
#include <stdio.h>
#define SIZE 10
#define PAR 72
int main()
{
int index,score[SIZE];
int sum=0;
float average;
printf("Enter %d golf scores:\n ",SIZE);
for (index=0;index<SIZE; index++)
scanf("%d",&score[index]);
printf("The scores read in are as follows: \n");
for (index=0;index<SIZE; index++)
printf("%5d",score[index]);
printf("\n");
for (index =0;index<SIZE;index++)
sum+=score[index];
average=(float)sum/SIZE;
printf("Sum of scores = %d,average =%.2f\n",sum ,average);
printf("That's a handicap of %.0f.\n",average-PAR);
return 0;
}
6.12 使用函数返回值的循环示例
首先看一个例子
#include <stdio.h>
double power(double n,int p);
int main()
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf("to which\nthe number will be raised. Enter q");
printf(" to quit .\n");
while (scanf("lf%d, &x,&exp) ==2)
{
xpow=power(x,exp);
printf("%.3g to the power %d is %.5g \n", x,exp,xpow);
printf("Enter next pair of number or q to quit .\n");
}
printf("Hope you enjoyed this power trip --bye !\n");
return 0;
}
double power (double n ,int p)
{
double pow =1;
int i;
for (i =1;i<=p;i++)
pow*=n;
return pow;
}
这里就是利用了有返回值的函数,
对于double power (double n,int p)
我们知道该函数是一个返回值类型为double,有两个参数的函数。
所以我们该函数体中使用了return pow去返回一个double 类型的数据。
二、编程练习
1.
#include <stdio.h>
#define LEN 26
int main()
{
int n;
char letters[LEN];
for (n = 0; n < LEN; n++)
{
letters[n] = 'a' + n;
}
printf("Here are %d letters:\n", LEN);
for (n = 0; n < LEN; n++)
{
printf("%-3c", letters[n]);
}
return 0;
}
2.
#include <stdio.h>
int main()
{
for(int i=0;i<5;i++)
{
for(int a=0;a<i+1;a++)
{
printf("$");
}
printf("\n");
}
return 0;
}
3.
#include <stdio.h>
int main()
{
int i, j;
for (i = 1; i <= 6; i++)
{
for (j = 0; j < i; j++)
{
printf("%c", 'F' - j);
}
printf("\n");
}
return 0;
}
4.
#include <stdio.h>
int main()
{
int i,j;
char c='A';
for (i=1;i<=6;i++)
{
for(j=0;j<i;j++,c++)
{
printf("%C",c);
}
printf("\n");
}
return 0;
}
5.
#include <stdio.h>
int main()
{
int i, j;
char ch;
printf("Please enter a upper letter: ");
scanf("%c", &ch);
int n = ch - 'A';
//获得循环次数;
for (i = 0; i <= n; i++)
{
char t = 'A' - 1;
for (j = 0; j < n - i; j++)
{
printf(" ");
}
//↑左侧空格数;
for (j = 0; j <= i; j++)
{
printf("%c", ++t);
}
//↑打印递增字母;
for (j = 0; j < i; j++)
{
printf("%c", --t);
}
//↑打印递减字母
printf("\n");
}
return 0;
}
6.
#include <stdio.h>
int main()
{
int i, MAX, MIN;
printf("Please input the upper limits: ");
scanf("%d", &MAX);
printf("Please input the lower limits: ");
scanf("%d", &MIN);
printf("%-10s%-10s%-10s\n", "number", "square", "cube");
for (i = MIN; i <= MAX; i++)
{
printf("%-10d%-10d%-10d\n", i, i * i, i * i * i);
}
printf("Done.\n");
return 0;
}
7.
#include <stdio.h>
#include <string.h>
#define LEN 20
int main()
{
int i;
char str[LEN];
printf("Please enter a word: ");
scanf("%19s", str);
printf("The word is:\n");
printf("%s\n", str);
printf("Reversing the word is:\n");
for (i = strlen(str) - 1; i >= 0; i--)
{
printf("%c", str[i]);
}
return 0;
}
8.
#include <stdio.h>
int main()
{
float a, b;
while (scanf("%f", &a) && scanf("%f", &b))//while((scanf("%f %f",&a,&b)==2))
{
if (a > b)
printf("The result is:%f", (a - b) / (a * b));
else
printf("The result is :%f", (b - a) / (a * b));
}
}
9.
#include <stdio.h>
void function(float a,float b)
{
if(a>b)
printf("%f",(a-b)/(a*b));
else
printf("%f",(b-a)/(a*b));
}
int main()
{
float i,j;
scanf("%f %f",&i,&j);
function(i,j);
return 0;
}
10.
#include <stdio.h>
int main()
{
int upp, low, i;
printf("Enter lower and upper integer limits: ");
while ((scanf_s("%d %d", &low, &upp) == 2) && (upp > low))
{
int sum = 0;
for (i = low; i <= upp; i++)
{
sum += i * i;
}
printf("The sums of the squares from %d to %d is %d\n", low * low, upp * upp, sum);
printf("Enter next set of limits: ");
}
printf("Done\n");
return 0;
}
11.
#include <stdio.h>
#define LEN 8
int main()
{
int i, a[LEN];
printf("Please enter 8 numbers:\n", LEN);
for (i = 0; i < LEN; i++)
{
scanf("%d", &a[i]);
}
printf("Reverse order printing 8 numbers:\n",LEN);
for (i = LEN - 1; i >= 0; i--)
{
printf("%-3d", a[i]);
}
return 0;
}
12.
#include <stdio.h>
int main()
{
int i, n;
printf("Please enter a number (<= 0 to quit): ");
while ((scanf("%d", &n) == 1) && (n > 0))
{
double res1 = 0.0;
double res2 = 0.0;
for (i = 1; i <= n; i++)
{
res1 += 1.0 / i;
if (i % 2 == 1)
{
res2 += 1.0 / i;
}
else
{
res2 -= 1.0 / i;
}
}
printf("1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ...");
printf("sum are %g\n", res1);
printf("1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ...");
printf("sum are %g\n", res2);
printf("The sum of the first %d items of the two sequences is %g\n", n, res1 + res2);
printf("\nYou can enter again (<= 0 to quit): ");
}
printf("Done.\n");
return 0;
}
13.
#include <stdio.h>
int main()
{
long long int a[8];
long long int temp=1;
int i=0;
for(i;i<8;i++)
{
for(int a=0;a<i+1;a++)
{
temp=temp*2;
}
a[i]=temp;
}
int c=0;
do
{
printf("%ld\n",a[c++]);
}
while(c<8);
{
printf("Done");
}
return 0;
}
14.
#include <stdio.h>
#define N 8
int main()
{
int i;
double a[N], b[N];
printf("Please enter %d numbers:\n", N);
for (i = 0; i < N; i++)
{
scanf("%lf", &a[i]);
}
b[0] = a[0];
for (i = 1; i < N; i++)
{
b[i] = a[i] + b[i - 1];
}
printf("Here are the results for array a:\n");
for (i = 0; i < N; i++)
{
printf("%-3g", a[i]);
}
printf("\nHere are the results for array b:\n");
for (i = 0; i < N; i++)
{
printf("%-3g", b[i]);
}
printf("\nDone.\n");
return 0;
}
15.
#include <stdio.h>
#define LEN 255
int main()
{
int i = 0;
char input[LEN];
printf("Please enter a string:\n");
do
{
scanf("%c", &input[i]);
} while (input[i] != '\n' && ++i && i < LEN);
//当输入换行符的时候停止输入
printf("Reversing print the string is:\n");
for (i--; i >= 0; i--)
{
printf("%c", input[i]);
}
printf("\nDone.\n");
return 0;
}
16.
#include <stdio.h>
#define RATE_SIMP 0.10
#define RATE_COMP 0.05
#define INIT_AMT 100.0
int main()
{
int years = 0;
double daphne = INIT_AMT;
double deirdre = INIT_AMT;
do
{
daphne += RATE_SIMP * INIT_AMT;
deirdre += RATE_COMP * deirdre;
years++;
} while (deirdre < daphne);
printf("Investment values after %d years:\n", years);
printf("Daphne: $%.2f\n", daphne);
printf("Deirdre: $%.2f\n", deirdre);
printf("Deirdre(invest) > Daphne(invest)\n");
return 0;
}
17.
#include <stdio.h>
#define OUT 10
#define RATE 0.08
int main()
{
int money=100;
int i=1;
do
{
money=money*(1+RATE)-OUT;
i++;
}
while(money>0);
{
printf("%d",i);
}
return 0;
}
18.
#include <stdio.h>
#define DENBA 150
int main()
{
int n=5;
int i=1;
do
{
n=(n-i)*2;
i++;
}
while(n<DENBA);
{
printf("%d",i);
}
return 0;
}