C语言基础之流程控制

 

     一.流程结构

包括:

        * 顺序结构 : 默认的流程结构.按照代码编写顺序执行语句

        * 分支结构 : 对给定的条件进行判断,再根据判断结果执行相应的代码

        * 循环结构 : 在给定条件成立的条件下,反复执行某段代码

  1) 顺序结构:

    代码默认的执行顺序,按照代码由上到下的顺序执行;

  2) 分支结构:

    if语句:

    1.if语句的三种形式

     *1

      if (conditon) {

        statements;

      }

     *2

      if (condition) {

                  statements;

      } else {

        statements;

      }

     *3

      if (condition) {

        statements;

      } else if (conditon) {

        statements;

      } else {

        statements;

      }

    注意: 这里的conditon是相当于一个bool类型的变量;

  2.switch..case 语句

    switch (expression){

     case 1:

        statements;

     case 2:

        statements;

     ...

     default:

        break;

    } 

这里分享一个if 和 switch相结合解决实际问题的小例子:

 1 #define adultAge 18 // 18周岁
 2 #define entranceFee 100 // 网吧最低消费金额,即入场费
 3     int isVip = 0;    //vip 至尊码是999
 4     int isCafeOwner = 0;  // boss 验证码是888
 5     
 6     printf("Please choose the number of your ID information \n");
 7     printf("0:Nomal 1:Vip  2:Super \n");
 8     
 9     int c = 0;
10     scanf("%d" , &c);
11     
12     int i = 0;
13     // 输入合理性判断
14     while(c < 0 || c >2)
15     {
16         printf("Error,please enter again \n");
17         printf("%d \n" , i);
18         scanf("%d" , &c);
19         i++;
20     }
21     //printf("%d %d" , c , i);
22     
23     int age = 0;    // 年龄
24     int money = 0;  // 金额
25     
26     switch (c){
27         case 0:
28             
29             printf("Please enter your age and money, and divided with a blank \n");
30             scanf("%d %d" , &age, &money);
31             break;
32         
33         case 1:
34             
35             printf("Please enter your vip card number \n");
36             scanf("%d" , &isVip);   // 是vip
37             break;
38         
39         case 2:
40             
41             printf("Please enter your super number \n");
42             scanf("%d" , &isCafeOwner);     // 是网吧的所有者
43             break;
44         
45         default:
46             break;
47     }
48     
49    
50    // 判断是否有资格进入网吧消费
51     if (age >= adultAge && money >= entranceFee){
52         printf("Welcome to our Internet cafe \n");
53     }else if (isVip == 999) {  // Vip至尊码是999
54         printf("Welcome back, our Vip \n");
55     }else if (isCafeOwner == 888) {// Super boss码是888
56         printf("Welcome back, our boss \n");
57     }else {
58         printf("Sorry,we can not provide the service \n");
59     }
60     
61     
62     
63     }
64     
65     return 0;

这段代码,对网吧消费的问题进行了一定的定义解释。

    3)循环结构

// 循环  :在满足某种特定的条件下,重复的做某件事情。

1 while (条件表达式) {
2     循环体
3 }

  当条件表达式为真时,就执行循环体,一旦条件表达式为假,循环停止。

这里提下两个常用的小知识:

  1.关于计算取位的问题

  解决c简单函数算法问题时,我们常会遇到关于取出一个数十位、个位、百位,甚至是千位等这样的问题,那么小伙伴们不禁会好奇了,这该怎么办呢?

so here ,we could get it!

  for axample :

  对于 m = 12345,怎么取出它的各位数呢?

// 先看比较容易理解的2个

// single
single = m % 10;    // mol 10得到个位数
// 最高位max
max = m / 10000;   // 最高位

decade = m / 10 % 10;
hundred = m / 100 % 10 ;
thound = m / 1000 % 10;

怎么样?有没有发现什么共性?

除了最高位和个位数的提取,其他位的提取都可以写作

x位数 = m / pow(10,x) % 10;

其实,个位数和最高位数只是如上表达式的特殊情况罢了。

  2.arc4random问题

for example :how to get a random from [30,50]

ok,let us get it fllowingly:

int temp = arc4random() % (50 - 30 + 1) + 30;

arc4random 函数的实质是取余的函数转换,[30,50]可以看做 [0,20] +30 的函数区间变动;而对于[0,20]这个区间我们通过对21做mol运算得到。那么,它有什么用呢?

首先,我们一起来看下这个,

”用户从控制台 输入一个n ,while打印n个随机数,范围是[30,70],并找出n的最大值“

    printf("please input a random number \n");
    int n = 0;
    scanf("%d" , &n);
    int max = 0;
    while (n--) {
        int temp = arc4random() % (70 - 30 + 1) + 30;
        printf("%d " , temp);
        max = max > temp ? max : temp;
    }
    printf("\nthe max random number is %d \n" , max);

那么这个功能有什么用呢?做彩票?dream on,彩票站的算法,hehe,中国的故事你懂的,嘎啦,我只是随便说,千万不要当真的说,那么我们看点贴近生活的,如这个:

  // 关于上面随机程序的一点联想 ,结合指针数组
    char *name[5] = {"Jack" ,"Bob" ,"Lucy" ,"lol" ,"Tom"};
    
    int random = arc4random() % 5;
    printf("%s \n" , *(name +random));

做个名字的随机抽取功能总还是可以的吧,哈哈~

 

————————————————

书归正传,继续来看循环结构:

//    do{

//        // 语句

//    } while (条件表达式);

    

//    do while ,先执行一次循环语句,再判断条件是否成立,至少会走一次循环体

    

//    int i = 0;

//    do {

//        i++;

//        printf("%d " , i);

//    } while (i < 10);

这个和while语句比较像,也没有什么特别需要强调的,只要注意转换是condition的判断区间就好~

重点还是for循环的使用,

  for (initialization; conditon; increment){

  statements;

执行顺序,

  first -> initialization;

  second -> conditon judgement;

  third -> run statements;

  fourth -> increment;

一个例子:

//打印菱形
    //思路 : 分析了下,感觉还是要加强点用户的互动性,但是具体开放哪个接口给用户,也没有太好的想法,感觉还是通过  菱形对角线的星星数  来定义一个菱形的形状会好一点吧
           // 所以接口数据 选择了星星的个数,如果星星的个数是n,两个*的间距是d,对象线长度是 (n - 1)*d ,则菱形的边长是 (n - 1) * d / sqr(2);        ------- 说明
    printf("Please input an odd number of the stars on the diagonal \n"); // diagonal 星星
    int n = 0;
    scanf("%d" ,&n);   // 对角线行的星星个数是n ,那么对角线所在行数是i = (n + 1) / 2;
    // 输入上半部分
    for (int i = 1; i <= ((n + 1) / 2); i++ ) {     // 行数i
        for (int j = 1; j <= (( (n + 1) /2) - i ); j++) {        // 空格 j
            printf(" ");
        }
        for (int k = 1; k <= (2 * i - 1); k++) {                 // 星星 k
            printf("*");
        }
        printf("\n");
    }
    //输入下半部分
    for (int i = 1; i < ((n + 1) / 2); i++) {
        for (int j = 1; j <= i; j++) {
            printf(" ");
        }
        for (int k = 1; k <= (n - 2 * i); k++) {
            printf("*");
        }
        printf("\n");
    }

当然,这里还有另一种写法也可以作为推荐:

    int i,j,k;    // i来控制行数, j控制空格数,k控制星数
    scanf("%d", &k);
    for (i=0; i2+1; i++) {
        for (j=0; j) {
            printf(" ");
        }
        for (j=0; j<2*i+1; j++) {
            printf("*");
        }
        printf("\n");
    }
// 下半部分
    for (i=k/2; i>0; i--) {
        for (j=k-i+1; j>0; j--) {
            printf(" ");
        }
        for (j=2*i-1; j>0; j--) {
            printf("*");
        }
        printf("\n");

 

ok,fighting ,today is today.

 

转载于:https://www.cnblogs.com/renlovej/p/4445279.html

你可能感兴趣的:(C语言基础之流程控制)