zoukankan      html  css  js  c++  java
  • c语言基础学习04_条件判断语句

    =============================================================================
    涉及到的知识点有:程序的三种结构、条件分支语句、循环语句、求自然数的和、
    求100到999之间所有的水仙花数、在屏幕输出一个等腰三角形、循环语句案例-窗口移动
    =============================================================================
    复习:
    (注意常量也是有类型的哦!)
    例如:

      #define MAX 100 说明定义的MAX是一个有符号的int
      const long a = 100u; 说明定义的a是一个无符号的long
      "a"字符串常量 相当于 'a' ''
      'a'字符常量,字符常量只能是一个ASCII字符

      int 4个BYTE、2个WORD 、1个DWORD
      c语言中不能直接书写二进制,用8进制和16进制来替代(和默认的十进制)。

      int a = 100;
      int b = sizeof(a);
      sizeof 关键字 作用是:得到某一数据类型在内存中占用的大小(内存大小没有负的),单位是:字节
      sizeof 不是函数,所以不需要包含任何头文件
      其实呢,sizeof返回值的类型是size_t,size_t类型在32位操作系统下是一个无符号的整数。
      在32位系统下,sizeof返回值是unsigned int,用 %u;在64位系统下,unsigned long,用%lu。
      例如:
      在32位系统下:
        int a = 100;
        printf("%u ", sizeof(a));
      在64位系统下:
        int a = 100;
        printf("%lu ", sizeof(a));
    -----------------------------------------------------------------------------
      int a; 等同于 signed int a;
      unsigned int a;

      long   在32位系统下是4个BYTE,在64位系统下是多少?windows是4个字节,linux是8个字节。

      200f   等同于 200.0   
    -----------------------------------------------------------------------------
      int a = 'a'; //a = 97,是可以存放的
      char a = 500; //是不可以存放的,溢出了,最大放127

      '2' 和 2 的区别在哪里?
      '2'是字符2dASCII
      2是整数2

      "100" 和 100 区别在哪里?
      '1' '0' '0' ''
      100是一个int型整数常量
    -----------------------------------------------------------------------------
      int a = a; //错误的写法!

      char a = 97;
      printf("%d ", a); //输出结果是97
      printf("%c ", a); //输出结果是字符a

    abc
    bcd(这里其实是回车+换行)

    abc
      bcd(只有换行,没有回车)

    bcd(abc是被bcd重叠了,这叫回车)

    回车键的由来:
    键盘:
    --------------------------------------------------打印头
        ------------------------
        -         -
        -     回车键 -
        -         -
        ------------------------
        在打字机上按回车键,打印头就会复位

    =============================================================================
    程序的三种结构:
      1,顺序结构
      2,分支结构
      3,循环结构
    =============================================================================
    条件分支语句:
    1、关系运算符:在c语言中0代表false,非0代表真。
    关系运算符有:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、!=(不等于)
           -----------------------------------------------------------------|-----------------------------
                 前四种优先级相同            大于        后两种优先级相同

      0   假
      1   真
      34   真
      -34  真,非0就是真

      条件运算符:(条件) ? 值1:值2
      当条件成立时,表达式的值为1;当条件不成立时,表达式的值为2。
      很多时候用问号来替代简单的if语句。
      例如:求绝对值的例子
      int i = -8;
      int x = (i < 0) ? -i: i;
    -----------------------------------------------------------------------------
    2、逻辑运算符:&&(逻辑与/and)、||(逻辑或/or)、!(逻辑非/not)
           -----------------------------------------|---------------------
          双目运算符(两边必须要有表达式叫双目)   单目运算符
    -----------------------------------------------------------------------------
    3、1)单分支语句
      if是条件分支语句:如果条件为真,则执行代码块中的代码。
      if (条件)
      {
        代码块;
      }
    -----------------------------------------------------------------------------
    2)双分支语句
      if else是双分支语句:
      if (条件)
      {
        代码块1;
      }
      else
      {
        代码块2;
      }
    -----------------------------------------------------------------------------
    3)多重分支语句(多重if):else总是跟上面最近那个if配对(特别注意)
      if (条件1)
      {
        代码块1;
      }
      else if (条件2)
      {
        代码块2;
      }
      else if (条件3)
      {
        代码块3;
      }
      ......
      else
      {
        代码块3;
      }

    例子如下:四则运算
    #include <stdio.h>

    int main()
    {
      int a;
      int b;
      char c;
      printf("please input a:");
      scanf("%d", &a);
      printf("please input b:");
      scanf("%d", &b);
      printf("please input c:");
      getchar(); //把调用scanf时候用户输入的回车键吃掉
      c = getchar();
      //printf("a = %d, b = %d, c = %c ", a, b, c); //打印结果测试下
      if (c == '+')
      {
        printf("%d ", a + b);
      }
      else if (c == '-')
      {
        printf("%d ", a - b);
      }
      else if (c == '*')
      {
        printf("%d ", a * b);
      }
      else if (c == '/')
      {
        if (b != 0)
          printf("%f ", (double)a / b);
        else
          printf("error ");
      }
      else
      {
        printf("input error ");
      }
      return 0;
    }
    -----------------------------------------------------------------------------
    4)多重分支语句(多重选择:switch与break,default)
      switch (量)
      {
      case 值1:
        语句1;
        break;
      case 值2:
        语句2;
        break;
      ......

        ......

        ......  
      case 值n:
        语句n;
        break;
      default:
        语句;   //当所有case都不满足时,执行default下面的语句。
    }

    例子如下:四则运算
    #include <stdio.h>

    int main()
    {
      int a;
      int b;
      char c;
      printf("please input a:");
      scanf("%d", &a);
      printf("please input b:");
      scanf("%d", &b);
      printf("please input c:");
      getchar(); //把调用scanf时候用户输入的回车键吃掉
      c = getchar();
      //printf("a = %d, b = %d, c = %c ", a, b, c); //打印结果测试下
      switch (c)
      {
      case '+':
        printf("%d ", a + b);
        break;
      case '-':
        printf("%d ", a - b);
        break;
      case '*':
        printf("%d ", a * b);
        break;
      case '/':
        if (b != 0)
          printf("%f ", (double)a / b);
        else
          printf("error ");
        break;
      default:
        printf("input error ");
      }
      return 0;
    }

    注意:当条件特别复杂时用if;当条件简单,但分支很多时用switch。
    -----------------------------------------------------------------------------
    if、switch与?(问号) 都是有条件分支语句;
    无条件分支语句:goto

      goto end; //无条件跳转到标号end去执行代码
      ...
      ...
      end: //标号

    但是不提倡大量使用goto,除非使用goto能大大简化代码量。

    =============================================================================
    循环语句:

    while (条件)
    {
      代码块;
    }
    -----------------------------------------------------------------------------
    continue语句
    当循环遇到continue语句时,不再执行continue下面代码,而是直接返回到循环起始语句处继续执行循环。
    (即当循环遇到continue时,就直接返回到开始重新判断条件的地方去了)
    -----------------------------------------------------------------------------
    break语句
    当循环遇到break语句时,立刻终止循环,循环结束。
    -----------------------------------------------------------------------------
    do while

    do
    {
      语句;
    }while (条件);
    -----------------------------------------------------------------------------
    while 是先判断条件,再决定是否循环
    do while 先循环,然后再判断条件

    while可能一次都不循环,但是do while至少能循环一次。

    注意:
    while (a != 10);   //该句话相当于 while (a != 10)
    {
    ;
    }
    相当于死循环,什么都没有干。
    =============================================================================
    小练习:求自然数的和。
    用户可以任意输入一个正整数,求从1到这个整数之间所有自然数的和。
    例如:输入5
    1 + 2 + 3 + 4 + 5 = 15

    VS2017下的代码如下:
    #include <stdio.h>
    #pragma warning(disable:4996)

    int main()
    {
      int sum = 0; //用来保存计算自然数之和的变量
      int a = 10;
      scanf("%d", &a);
      while (a > 0)
      {
        sum += a;
        a--;
      }
      printf("%d ", sum);
      return 0;
    }
    -----------------------------------------------------------------------------
    课堂作业:求整数的位数
    任意输入一个整数,假设用户输入了123,程序运行输出 百
    如果用户输入了2896,程序输出 千
    如果用户输入了10000,输出 万

    VS2017下的代码如下:
    #include <stdio.h>
    #pragma warning(disable:4996)

    int main()
    {
      int a = 0;
      scanf("%d", &a);
      int sum = 0; //sum是一个计数器

      while (a > 0) //c语言中 % 是取余运算, / 是取整运算
      {
      sum++;
      a /= 10;
      }

      switch (sum)
      {
      case 1:
        printf("个 ");
        break;
      case 2:
        printf("十 ");
        break;
      case 3:
        printf("百 ");
        break;
      }
      return 0;
    }
    -----------------------------------------------------------------------------
    小练习:求100到999之间所有的水仙花数。
    水仙花数是什么?
    一个数的百位的立方 + 十位的立方 + 个位的立方 = 这个数本身
    例如:371就是一个水仙花数
    3 * 3 * 3 + 7 * 7 * 7 + 1 * 1 * 1 = 371

    VS2017下的代码如下:
    #include <stdio.h>

    int main()
    {
      int a;
      for (a = 100; a < 1000; a++)
      {
        int a1; //百位
        int a2; //十位
        int a3; //个位

        a1 = a / 100 % 10; //a/100=5;5%10=5 注意:/ 和 % 的优先级一样,则结合性从左到右
        a2 = a / 10 % 10; //a/10=53;53%10=3
        a3 = a / 1 % 10; //a/1=537;537%10=7

        if ((a1 * a1 * a1 + a2 * a2 * a2 + a3 * a3 * a3) == a)
          printf("%d ", a);
      }
      return 0;
    }
    -----------------------------------------------------------------------------
    九九乘法表

    VS2017下的代码如下:
    #include <stdio.h>
    int main()
    {
      int a;
      int b;
      for (a = 1; a < 10; a++) //外循环,控制行,即外循环决定有多少行
      {
      for (b = 1; b <= a; b++) //内循环,控制列,即内循环决定每一行有几个列,外循环每循环一次,内循环循环4次
      {
        printf("%d ", a * b);
      }
      printf(" ");
      }
      return 0;
    }
    -----------------------------------------------------------------------------
    作业:在屏幕输出一个等腰三角形
    -------*-------
    ------***------
    -----*****-----
    ----*******----
    ---*********---
    --***********--
    -*************-
    ***************
    不能用printf一行一行打印输出等腰三角形
    printf("     * ");
    printf("    *** ");
    printf("   ***** ");

    分析:
    每一行的*和行号的关系是:行号 * 2 - 1
    每一行的*和减号的关系是:行号 - 1;行号 - 2;行号 - 3;......;行号 - 行号

    VS2017下的代码如下:
    #include <stdio.h>
    #pragma warning(disable:4996)

    int main()
    {
      int a;
      int b;
      int num = 0;
      scanf("%d", &num);
      for (a = 1; a <= num; a++) //外循环,控制行,即外循环决定有多少行
      {
        for (b = 0; b < num - a; b++)
        {
        printf("-");
        }
        for (b = 0; b < a * 2 - 1; b++) //内循环,控制列,即内循环决定每一行有几个,外循环每循环一次,内循环循环num次
        {
          printf("*");
        }
        for (b = 0; b < num - a; b++)
        {
          printf("-");
        }
        printf(" ");
      }
      return 0;
    }
    =============================================================================
    循环语句案例-窗口移动

    VS2017下的代码如下:

    #include <stdio.h>

    #include <Windows.h> //使用窗口移动,需要利用API函数,则需要包含一个头文件

    int main()
    {
      int x = 100;
      int y = 100;
      int status = 0;     //0代表从左往右跑,1代表从右往左跑。
      int status1 = 0;   //0代表从上往下跑,1代表从下往上跑。
      int status2 = 1;   //0代表x轴不动,1代表y轴不动

      while (1)
      {
        SetWindowPos((HWND)0x00830968, NULL, x, y, 300, 200, 0); //这个函数可改变一个窗口的位置和大小

      if (status == 0 && status2 == 1)
        x += 10;

      if (x >= 1000)
      {
        status1 = 0;
        status2 = 0;
      }
      if (status1 == 0 && status2 == 0)
        y += 10;

      if (y >= 800)
      {
        status = 1;
        status2 = 1;
      }
      if (status == 1 && status2 == 1)
        x -= 10;

      if (x <= 100)
      {
        status1 = 1;
        status2 = 0;
      }
      if (status1 == 1 && status2 == 0)
        y -= 10;

      if (y <= 100)
      {
        status = 0;
        status2 = 1;
      }
      //if (status == 0 && status2 == 1)
      //x += 10;
      Sleep(20); //Sleep函数的功能是程序休眠,参数单位是毫秒,1000ms代表1秒
    }
      /*
      该函数的参数解释如下:
      第一个参数:是窗口的句柄。句柄:是windows的一个概念,即所有的窗口都有一个唯一的编号,这个编号叫句柄。(注意句柄是16进制的)
      如何得到某一个窗口的句柄呢?在vs2017的/工具选项/Spy++(间谍的意思)/查找窗口/查找程序工具/拖动到对应的窗口
      第二个参数:默认写NULL。
      第三个参数:是窗口位置的x坐标。
      第四个参数:是窗口位置的y坐标。
      第五个参数:是窗口宽度。
      第六个参数:是窗口高度。
      第七个参数:默认写0。
      

      (0,0)左上角
      ------------------------------x轴
      |
      |
      |
      |y轴

      */
      return 0;
    }

    或者代码这样:
    #include <Windows.h>

    int main()
    {
      int x = -10, y = 0;
      int status = 0; //0代表从左往右,1代表从上往下,2代表从右往左,3代表从下往上

      while (1)
      {
        if (x == 0 && y == 10)
          status = 0;
        if (x == 1000 && y == 10)
          status = 1;
        if (x == 1000 && y == 600)
          status = 2;
        if (x == 0 && y == 600)
          status = 3;

        if (status == 0)
          x += 10;
        if (status == 1)
          y += 10;
        if (status == 2)
          x -= 10;
        if (status == 3)
          y -= 10;
        SetWindowPos((HWND)0x0016006C, NULL, x, y, 200, 300, 0);
        Sleep(20);
      }
      return 0;
    }

    =============================================================================

  • 相关阅读:
    探索MySql.Data.dll
    【翻译】为了3D游戏粉丝的[(超级)街头霸王4]图形讲座(前篇)
    《火影忍者:究级风暴》渲染技术究极解析!
    宅男把妹乐游《梦幻俱乐部》技术全剖析!
    CEDEC2010《偶像大师2》渲染动画技术公开第二弹!
    NBGI 2011年大作《偶像大师2》技术大揭秘!
    剑风2012年1月要出剧场版了,哇哈哈~~~~~
    《王牌空战:突袭地平线》(ACEAH)制作流程全放送!
    极具创意的3D推箱子游戏《凯瑟琳》制作流程全公开!
    SQUARE ENIX巨作《最终幻想13》制作流程全放送!(上)
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8109799.html
Copyright © 2011-2022 走看看