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_Prime_Plus笔记_01_概览

C是一种强大、简洁的编程语言,之所以流行是因为它提供了有用的编程工具和对硬件良好的控制,还因为C程序在从一个系统向另一个系统移植方面比大多数程序方便。

C是一种需要编译的语言。C编译器和链接器市将C语言源代码转换为可执行代码的程序。

学习内容

  • C的历史和特性;
  • 编写程序所需要的步骤;
  • 关于编译器和链接器的知识;
  • C的标准

就编程而言,可移植性代表什么?

在一个系统上编写的C程序经过很少改动或者不经修改就可以在其他系统上运行。如果修改是必要的,则通常只须改变伴随主程序的一个头文件中的几项内容即可。


解释源代码文件、目标代码文件和可执行代码文件之间的区别。
  • 源代码文件中包含着程序员使用任何语言编写的代码。
  • 目标代码包含着机器语言代码,它并不需要市完整的程序代码。
  • 可执行文件包含着组成可执行程序的全部机器语言代码。

编程的7个主要步骤是什么?
  1. 定义程序目标;
  2. 设计程序;
  3. 编写代码;
  4. 编译;
  5. 运行程序;
  6. 测试和调试程序;
  7. 维护和修改程序;

编译器的任务是什么?

编译器是一种程序,其工作是将源代码转换为可执行代码。可执行代码市用计算机的本机语言或机器语言表示的代码。不同的计算机具有不同的机器语言,C编译器用来将C语言转换为特定的机器语言。最后的结果是,形成一个包含计算机可以理解的代码并且能够运行的可执行文件。


链接器的任务是什么?

编译器将源代码转换为中间代码,链接器将此中间代码于其他代码相结合来生成可执行文件。链接器的作用市将目标代码、系统的标准启动代码和库代码结合在一起,并将它们存放在单个文件中。


练习

英制公制转换器

九九乘法表

啊哈C语言!逻辑的挑战

使用for循环打印九九乘法表

#include<stdlib.h>
int main(){ 
    int i,j;
    for(i=1;i<10;i++){
        for(j=1;j<=i;j++){
        printf("%dx%d=%-4d",i,j,i*j);
        }
        printf("\n");
    }
    return 0;
}

备注一个do_while循环的九九乘法表

#include<stdlib.h>
int main(){ 
    int a,b;
    a = 1;
    do{
        b = 1;
        while(b<10){
            printf("%dx%d=%-3d ",a,b,a*b);
            b++ ;
        }
        printf("\n");
        a++;
    }while(a<10);
    return 0;
}

求数列中的奇偶数量

你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
输入格式:一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。
输出格式:两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。
输入样例:9 3 4 2 5 7 -1
输出样例:4 2
时间限制:500ms内存限制:32000kb

//while()循环
//输入一个整数,判断是否大于-1、是否为偶数,然后输出
#include<stdio.h>
int main(){
    int x,i = 0, j = 0;
    scanf("%d",&x);

    while( x != -1 ){
        if (x % 2 == 0){
            i++; }
        else{
            j++; }  

        scanf("%d",&x);
        }       
    printf("%d %d", j,i);
    return 0;
}

时间换算

UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
有效的输入范围是0到2359,即你的程序不可能从测试服务器读到0到2359以外的输入数据。
你的程序要输出这个时间对应的UTC时间,输出的格式和输入的相同,即输出一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。
提醒:

要小心跨日的换算。

输入格式:
一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。
输出格式:
一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果分小于10分,需要保留十位上的0。
输入样例:903
输出样例:103
时间限制:500ms内存限制:32000kb

#include<stdio.h> 
int main(){
    int bjt,utc,hour,minute;
    scanf("%d",&bjt);
    if(0<=bjt && bjt<=2359){
        hour = bjt/100 - 8; //时间转换只需要考虑小时数
        minute = bjt - bjt/100*100 ;
//负数,则为跨天,所以需要处理一下
        if(hour>=0){
            utc = hour * 100 + minute;
            printf("%d",utc);
        }
        else{
            utc = ( hour + 24 ) * 100 + minute;
            printf("%d",utc);
        }
    }   
    return 0;
}