• C 语言——分支和跳转


    一.介绍getchar()和putchar()

    我们已知使用scanf()和printf()来以%c说明符来读写字符,现在接触专门为面向字符I/O而设计的一对C函数:getchar()和putchar()。

    • getchar()函数没有参数,它返回来自输入设备的下一个字符。
    ch=getchar();        //相当于 scanf("%c",&ch);
    • putchar()函数打印它的参数。
    putchar(ch);        //相当于printf("%c",ch);

     例如:

    /*改变输入,只保留其中的空格*/
    char ch;
        ch=getchar();
        while(ch!='
    ')
        {
            if(ch==' ')
                putchar(ch);
            else
                putchar(ch+1);
            ch=getchar();
        }
        putchar(ch);

    如果只改变字母或者数字或者小写字母等等,可以使用ctype.h头文件,包含了这些函数原型。这些函数接受一个字符作为参数,如果该字符属于某特定的种类则返回非零值(真),否则返回零(0)。例如,isalpha()接受一个字母,返回真,islower()接受一个小写字母,返回真......

    该头文件含有字符映射函数:tolower()若参数是大写字母,返回相应的小写字母;否则,返回原参数。toupper()反之。这种函数不改变原参数,只返回改变后的值。

    二.给定一个整数,显示所有能整除它的约数;如果没有约数,则报告该数是个素数。

    首先进行总体设计,使用一个循环来让程序检验一个新数时不用每次重新运行程序。比如使用scanf()返回值达到这一目的

    其次,需要计划来找到约数,如下:

    for(div=2;div<num;div++)
            if(num%div==0)
                printf("%d is divisible by %d
    ",num,div);

    循环检查2到num之间的所有数。但是这种方法浪费计算机的时间。我们知道约数必定是成对的,例如144,它的约数有:2和47,3和48,4和36,6和24,8和18,9和16,12和12。你会发现,在得到12后就可以停止,因为后面必与前面的重复。这样节省了大量的循环周期。

    归纳以后,可以确定必须测定的数达到num的平方根即可,于是如下:

    for(div=2;(div*div)<=num;div++)
        if(num%div==0)
            printf("%d is divisible by %d and %d
    ",num,div,num/div);   

    为了避免重复输出两个12,可用嵌套循环使其只打印一个:

    for(div=2;(div*div)<=num;div++)
        {
            if(num%div==0)
            {
                if(div*div!=num)
                    printf("%d is divisible by %d and %d
    ",num,div,num/div);
                else
                    printf("%d is divisible by %d
    ",num,div);
            }
        }

    最后,怎样知道一个数是素数呢?如果是,程序进不了if语句。可以在循环外设置一个变量为某一值,例如1,在if语句将这个变量重设为0.循环完成后,可以检查该变量是否仍为1.如果是,则从没进过if语句,该数是素数。这样的变量通常称为标志。可以使用_Bool型变量极佳符合这种需求。

    最终结果为:

    #include <stdio.h>
    #include <stdbool.h>
    int main(void) 
    {
        unsigned long num;
        unsigned long div;
        bool isPrime;
        printf("Please enter a number: ");
        while(scanf("%lu",&num)==1)
        {
            for(div=2,isPrime=true;(div*div)<=num;div++)
        {
            if(num%div==0)
            {
                if(div*div!=num)
                    printf("%d is divisible by %d and %d
    ",num,div,num/div);
                else
                    printf("%d is divisible by %d
    ",num,div);
                isPrime=false;
            }
        }
        if(isPrime)
                printf("%lu is prime.
    ",num);
            printf("Please enter a number: ");
        }
        printf("Bye!
    ");    
        return 0;
    }

    三.条件运算符?:

    例如:得到一个数的绝对值

    x = (y < 0) ? -y : y

    “如果y小于0,那么x=-y;否则,x=y”

    expression1 ? expression2 : expression3

    如果expression1为真,整个条件表达式的值和expression2的值相同,否则和expression3的值相同。

    四.break和continue

    1.break

    导致程序终止包含它的循环,并进行程序的下一个阶段。如果位于嵌套循环里,它只影响包含它的最里层的循环。

    int p,q;
        scanf("%d",&p);
        while(p>0)
        {
            printf("%d
    ",p);
            scanf("%d",&q);
            while(q>0)
            {
                printf("%d
    ",p*q);
                if(q>100)
                    break;         //跳出里层循环
                scanf("%d",&q);
            }
            if(q>100)
                break;             //跳出外层循环
            scanf("%d",&p);
        }

    2.continue

    导致程序跳过包含它的循环的剩余部分,开始下一循环周期。若在嵌套循环中,也只作用于里层循环。

    五.一个统计字数的程序

    //统计字符、单词和行
    #include <stdio.h>
    #include <ctype.h>                    //为isspace()函数提供原型 
    #include <stdbool.h>                  //为bool、true和false提供定义 
    #define STOP '|'
    int main(void) 
    {
        char c;                           //读入字符 
        char prev;                        //前一个读入字符 
        long n_chars=0L;                  //字符数 
        int n_lines=0;                    //行数 
        int n_words=0;                    //单词数 
        int p_lines=0;                    //不完整的行 
        bool inword=false;                //如果c在一个单词中,则inword等于true 
        
        printf("Enter text: 
    ");
        prev='
    ';                        //用于识别完整的行 
        while((c=getchar())!=STOP)
        {
            n_chars++;                    //统计字符 
            if(c=='
    ')
                n_lines++;                //统计行 
            if(!isspace(c)&&!inword)
            {
                inword=true;              //开始一个新单词 
                n_words++;                //统计单词 
            }
            if(isspace(c)&&inword)
                inword=false;             //到达单词的尾部 
            prev=c;                       //保存字符值 
        }
        if(prev!='
    ')
            p_lines=1;
        printf("characters=%ld,words=%d,lines=%d,",n_chars,n_words,n_lines);
        printf("partial lines=%d
    ",p_lines);
        return 0;
    }

    ctype.h系列字符函数为创建基于分类字符的判断表达式提供了便利的工具。

  • 相关阅读:
    封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)
    计算机网络之数据链路层的基本概念和功能概述
    物理层设备(中继器、集线器)
    计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)
    计算机网络之编码与调制
    0953. Verifying an Alien Dictionary (E)
    1704. Determine if String Halves Are Alike (E)
    1551. Minimum Operations to Make Array Equal (M)
    0775. Global and Local Inversions (M)
    0622. Design Circular Queue (M)
  • 原文地址:https://www.cnblogs.com/mutouyky/p/8288484.html
Copyright © 2020-2023  润新知