Press "Enter" to skip to content

Category: C_Prime_Plus

C控制语句:循环

循环是一个强大的编程工具。

在建立循环时应该特别注意三个方面:
1. 明确定义结束循环的条件;
2. 确保在循环判断中使用的值在第一次使用之前已经初始化;
3. 确保循环在每个周期中更新了判断值。

C通过数值计算来处理判断条件。

结果为0表示假,任何其他值都为真。使用了关系运算符的表达式通常被用来进行判断,它们有些特殊。如果为真,关系表达式的值为1,为假则为0,这与布尔类型所允许的值保持一致。

数组由相同类型的邻近内存位置组成。

需要谨记数组元素是从0开始编号,这样最后一个元素的下标就比元素的个数少1。C并不检查是否使用合法的下标值。

使用一个函数需要完成三个步骤:

  • 使用函数原型声明该函数;
  • 在程序中通过函数调用来使用函数;
  • 定义函数
    原型使编译器可以检查您是否正确使用了函数,而定义则规定了函数如何工作。现代的编程习惯市把程序的元素分为接口和实现部分。

C为实现程序的结构话提供了很多帮助。

while和for语句提供了入口条件循环,for语句特别适合那些包含有初始化和更新的循环。逗号运算符使您可以在一个for循环中初始化和更新多个变量。在不多的场合中也需要退出条件循环,do while语句就是一个典型。
所有这些循环都使用一个判断条件来决定是否执行另一个循环周期。一般而言,如果判断表达式等于一个非零值,循环就继续;否则就结束。

逗号运算符

//postage.c -- 一类邮资费率
#include<stdio.h>
#include<stdlib.h>
int main(void){
    const int FIRST_OZ = 37;
    const int NEXT_OZ = 23;
    int ounces, cost;

    printf(" ounces cost\n");
    for(ounces=1, cost=FIRST_OZ; ounces<=16; ounces++, 
                                    cost=cost+NEXT_OZ)
    /*逗号运算负扩展了for循环的灵活性,
     * 可以在一个for循环中使用多个初始化或者更新表达式。
     * 该运算符具有两个属性。
     * 1.被它分开的表达式按从左到右的次序进行计算。
     * 2.整个逗号表达式的值都是右边成员的值。*/
    {
        printf("%5d $%4.2f\n", ounces, cost/100.0);     
    }
    return 0;   
}

在for循环中使用数组

// scores_in.c  --  使用循环进行数组处理
#include<stdio.h>
#define SIZE 10
#define PAR 70
int main(void){
    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;
}

带返回值的函数

//power.c -- 计算数值的整数次幂
#include <stdio.h>
#include <math.h>  //数学头文件
double power(double n, int p);  //函数原型
double power(double n, int p)   //函数定义
    {
    double pow = 1;
    int i;

    for(i=1;i<=p;i++){
        pow *= n;
        }
        return pow; //!带返回值的函数
    }

int main(void){
    double x, xpow; //属于的双精度浮点数
    int exp;    //整数次幂

    printf("Enter a number and the postive integer power.");
    printf(" to which\nthe number will be raised.Enter q");
    printf(" to quit.\n");

    while(scanf("%lf%d", &x, &exp) == 2)
    /*当scanf()成功读入两个值的时候开始循环*/
    {
        xpow = power(x,exp);
        printf("%.3g to the power %d is %.5g\n", x, exp, xpow);
        printf("Enter next pair of numbers or q to quit.\n");
    }
    printf("Hope you enjoyed this power trip -- bye!\n");

    return 0;   
}

运算符、表达式和语句

C语言使用运算符来提供多种服务。

每个运算符的特性包括所需操作数的数量、优先级和结合性。当两个运算符共享一个操作数时,最后的两个特性决定了先应用那个运算符。运算符与值结合可以产生表达式,并且C的每一个表达式都有一个值。C允许写出将不同的数值类型组合在一起的表达式。但算术运算要求操作数是同一类型的,所以C进行自动转换。然而,不依赖于自动转换是一个很好的编程习惯。

C有多种运算符,比如赋值和算术运算符。

带一个操作数的运算符(例如负号和sizeof)被称为一元运算符。要求两个操作数的(例如加法和乘法运算符)被称为二元运算符。

表达式是运算符和操作数的组合。

运算符优先级的规则帮助决定当对表达式进行求值时,如何组合表达式的各项。如果运算符有相同的优先级,结合性决定那个运算符先被应用。语句市对计算机的完整指示,在C中使用分号标识。

//min_sec.c -- 把秒转换为分钟和秒
#include<stdio.h>
#define SEC_PER_MIN 60  //定义常量值为每分钟60秒
int main(void){
    int sec,min,left;

    printf("Convert seconds to minutes and seconds!\n");
    printf("Enter the number of seconds(<=0 to quit):\n");
    scanf("%d",&sec);

    while(sec>0){
        min = sec / SEC_PER_MIN;
        left = sec % SEC_PER_MIN;
        /*取模运算(modulus operator)用于整数运算。
        * 该运算符计算出用它右边的整数去除它左边的整数得到的余数。
        * 例如,13%5所得值为3,因为13除以5得2并余3。
         */
        printf("%d seconds is %d minutes. %d seconds\n", sec, min, left);
        printf("Enter next value (<=0 to quit):\n");
        scanf("%d",&sec);
    }
    printf("Done!\n");

    return 0;   
}

字符串和格式化输入输出

//talkback.c -- 一个能为您提供一些信息的对话程序
#include<stdio.h>
#include<string.h> //使用string头文件,提供strlen()函数原型
#include<stdlib.h>
#define DENSITY 62.4
/*预处理定义常量DENSITY
 * 预处理允许定义常量,只需在顶部添加定义。
 * 被称为编译时代入法(compile-time subsitution).
 * 这个被定义的常量称为明显常量(manifest constant)
 * 请注意格式!赋值没有=号,结尾没有;号。#define 常量 值
 * 常量的符号名要全部大写,这是C的传统。
 * 另外,也可使用c_或k_标示常量。
 * 常量的符号名也必须符合变量命名规则。
 * #define 也可以用于定义字符和字符串常量。
 * 前者用单引号,后者用双引号。*/
int main(void){
    float weight,volume;
    int size,letters;
    char name[40];  //有40个字符的一元数组

    //printf()和scanf()被称为输入输出函数,简称为I/O函数。
    printf("Hi! What's your first name?\n");
    scanf("%s",name);   //注意,name没有使用&前缀
    printf("%s,what's your weight in pounds?\n",name);
    scanf("%f",&weight);
    /*使用scanf()来提取变量的值,前面需要加&。
     * 使用scan()把一个字符串读入数组中时,不需要加&*/
    size = sizeof name;
    letters = strlen(name);
    /*strlen()函数以字节为单位给出数据的大小。
     * string.h文件主要包含了与字符串有关的函数原型。*/
    volume = weight / DENSITY;
    printf("Well, %s,"
            " your volume is %2.2f cubic feet.\n",
            name, volume);
    printf("Also, your first name \
has %d letters.\n",letters);
//注意,换行之后有空格也会输出。
    printf("and we have %d bytes to store it in.\n",size);
    /*打印较长的字符串可用的方法有:
    * 使用多个printf();
    * 使用反斜线(/)符号和回车键来结束一行;  
    * 使用字符串连接的方法。如果在一个用双引号引起来的
    字符串后面跟有另一个用双引号起来的字符串,
    而且二者之间仅用空白字符分隔,
    那么C会把该组合当做一个字符串来处理*/
    return 0;
}

标志意义
-项目是左对齐。
+若为正,则显示带+号字符;若为负,则显示带减号字符 。
空格值为正,则显示前导空格;若为负,则带减号。
#转换说明的可选形式,若为%x和%X格式,则以0x或者0X开始。
0对于数字格式用零,而不是空格填充字段宽度。
//width.c   --  字段宽度
#include <stdio.h>
#define PAGES 931
int main(void)
{
    printf("*%-d*\n",PAGES);
    printf("*%2d*\n",PAGES);
    printf("*%10d*\n",PAGES);
    printf("*%-10d*\n",PAGES);
    printf("*%+d*\n",PAGES);
    printf("*%#X*\n",PAGES);
    return 0;
}

数据和C

/* rhodium.c 用金属铑衡量您的体重 */
#include<stdio.h>
int main(void){
    float weight;
    float value;
    printf("Are you worth your weight in rhodium?\n");
    printf("Let's chek it out.\n");
    printf("Please enter your weight in pounds:");

    scanf("%f", &weight);

    value = 770 * weight * 14.5833;
    printf("Your weight in rhodium is worth $%.2f.\n",value);
    printf("You are easily worth that! If rhodium prices drop.\n");
    printf("eat more to maintain  your value.\n");

    return 0;
}

变量与常量的区别在于变量的值可以在程序执行过程中变化与指定,而常量不可以。


整数和浮点数的区别:
1. 整数没有小数部分、浮点数可以有小数部分;
2. 浮点数表示范围大于整数;
3. 对于一些算术运算,浮点数会损失更多精度;
4. 浮点数往往只是实际值的近似;
5. 浮点运算通常比整数运算慢。


int类型市有符号整数,一般取值范围市-32768~32768.系统通过使用一个只是正负符号的特定位来表示有符号整数。

使用printf()打印语句时,切记每个要显示的值都必须对应自己的格式说明符,并且显示值的类型要同说明符相匹配。


/* bases.c -- 十进制书以十进制、八进制、十六进制形式输出 */
#include<stdio.h>
#include<stdlib.h>
int main(void){
    int x;
    printf("Please input your number :\n");
    scanf("%d",&x);

    printf("dec = %d; octal = %o; hex = %x \n",x, x, x);
    printf("dec = %d; octal = %#o; hex = %#x \n",x, x, x);

    return 0;
}

/*charcode.c -- 显示一个字符值的编码值*/
#include<stdio.h>
int main(void){
    char ch;
    ch = getchar();

    printf("The code for %c is %d.\n", ch, ch);
    return 0;   
}

关键字

int,long,short,unsigned,char,double,signed,_Bool,_Complex,_Imaginary

有符号整数

  • int
  • short 或者 short int
  • long 或者 long int
  • long long 或者 long long int

无符号整数

只有0和正值
+ unsigned

字符

  • char

布尔值

_Bool

实浮点数

  • float
  • double
  • long double

复数和虚浮点数