C primer plus ——C进阶探幽


前言

本章将介绍以下内容;

关键字——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;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值