美文网首页
第二、三章

第二、三章

作者: White541 | 来源:发表于2018-01-01 20:48 被阅读0次

17.12.31~18.1.1

[TOC]

第二章:设计入门

C程序:打印一行文字

//打印一行文字
#include <stdio.h>
int main(void)
{
  printf("第一个程序\n");
    return 0;
}
  • #include <stdio.h> 向C预处理程序发出指令。包含标准输入输出头文件到程序源中。
    • int main(void)integer整数。main函数。
  • 每一条语句都必须以分号 ; (语句结束符)结尾。
  • "" 为字符串的边界。
转义序列 描述
\n 换行
\t 水平制表
\a 响铃报警
\\ 字符串中插入反斜线
" 字符串中插入双引号

每一个函数的函数体在其定义的花括号内要有统一的缩进量。

C程序:两个整数求和

//对两个整数求和
#include <stdio.h>
int main(void)
{
    int integer1, integer2, sum;

    printf("输入第一个整数\n");
    scanf("%d" , &integer1);
    printf("输入第二个整数\n");
    scanf("%d" , &integer2);
    sum = integer1 + integer2;
    printf("两整数之和为%d\n", sum);
    return 0;
}
  • 第4行 int integer1, integer2, sum; 为定义变量;
  • scanf 函数用来从标准输入流读入数据。实参 %d 为格式控制字符串(易忽略双引号), % 表示一个转换说明符的开始,d 代表十进制整数。“与”符号 & 称为取地址运算符,后面紧跟变量名,获取紧随其后变量的储存地址。scanf 函数中变量名前必须加 &

定义了一个int型变量,但是你的输入计算机是没法控制的。int型在内存中开辟的大小有限,你如果输入一大串数,如果你进行了异常判断当然没问题,但是你没进行异常判断所以scanf会存在溢出风险,一旦发生溢出不处理,程序就会崩溃,这是为什么报错的原因。而scanf_s输入流则不同,它就是为了避免这种情况而诞生的,比如说输入char a[20] scanf_s("%s",a,20);这样一来,编译器就知道了这个输入长度最多为20,相当于帮你处理了异常。

​ 因此于预处理器定义加上_CRT_SECURE_NO_WARNINGS或使用 scanf_s 以解决C4996错误;

  • 适当精简为
printf("两整数之和为%d\n, integer1 + integer2");

算术运算符

C运算 算术运算符 C表达式
加法 + a + b
减法 - a - b
乘法 * a * b
除法 / a / b
求余 %(操作数为整数) a % b
() a + (b + c)

() 优先级最高,* / % 优先级次之。

C程序:相等和关系运算符

相等运算符 C相等运算符 C条件例子
= == a == b
!= a != b

关系运算符 > < >= <= 优先级大于相等运算符。

//比较两个整数大小
#include <stdio.h>
int main(void)
{
    int num1, num2;

    printf("输入两个数来比较大小\n");
    scanf_s("%d%d", &num1, &num2);

    if (num1 == num2) {
        printf("两个数大小相等\n");
    }   // end if

    if (num1 != num2) {
        printf("两个数不相等\n");
    }   // end if

    if (num1 > num2) {
        printf("第一个数大\n");
    }   // end if

    if (num1 < num2) {
        printf("第二个数大\n");
    }   // end if

    if (num1 >= num2) {
        printf("第一个数大于等于第二个数\n");
    }   // end if

    if (num1 <= num2) {
        printf("第一个数小于等于第二个数\n");
    }   // end if

    return 0;
}

运算符优先级降序排列及关键字表

运算符优先级
()
* / %
+ -
> < >= <=
== !=
=
关键字表
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sezeof volatile
do if static while

C99新规范关键字 _Bool _Complex _Imaginary inline restrict

作业

判断三者最小

//判断三个整数最小值
#include <stdio.h>
int main(void)
{
    int a, b, c;

    printf("输入3个整数\n");
    scanf_s("%d %d %d", &a, &b, &c);

    if (a < b) {
        if (a < c) {
            printf("最小为%d\n", a);
        }
    }

    if (b < a) {
        if (b < c) {
            printf("最小为%d\n", b);
        }
    }

    if (c < b) {
        if (c < a) {
            printf("最小为%d\n", c);
        }
    }

    return 0;
}

第三章:结构化的C程序设计

七种控制结构

顺序结构、选择结构(if if...else switch)、循环结构(while do...while for)。

if...else语句

//成绩通过检测
#include <stdio.h>
int main(void)
{
    int grade;

    scanf_s("%d", &grade);

    if (grade >= 60) 
        printf("passed\n");
    else
        printf("failed\n");

    return 0;
}

其中的 if...else 函数体可替换为

printf("%s\n", grade >= 60 ? "passed" : "failed");
  • ? 为条件运算符,需要 ”条件“、”条件为真表达的值“、”条件为假表达的值“ 三个操作数;
  • %s 为转换说明符,打印出一个字符串;

更进一步,? 的第二、第三操作数能是可执行的语句,如:

grade >= 60 ? printf("passed\n") : printf("failed\n");

这样使用的功能比 if...else 语句更强。

if...else语句的嵌套

//得分成绩
#include <stdio.h>
int main(void)
{
    int grade;

    scanf_s("%d", &grade);

    if (grade >= 90) 
        printf("A\n");
    else
        if (grade >= 80)
            printf("B\n");
        else
            if (grade >= 70)
                printf("C\n");
            else
                if (grade >= 60) 
                    printf("D\n");
                else
                    printf("failed\n");
  
    return 0;
}

为避免代码的右向偏移,可写为:

//得分成绩
#include <stdio.h>
int main(void)
{
    int grade;

    scanf_s("%d", &grade);

    if (grade >= 90)
        printf("A\n");
    else if (grade >= 80)
        printf("B\n");
    else if (grade >= 70)
        printf("C\n");
    else if (grade >= 60)
        printf("D\n");
    else
        printf("failed\n");

    return 0;
}

复合语句或语句块(block)

可放置单个语句的任何地方,都可通过 {} 放置多个语句,如:

if (grade >= 60)
  printf("passed\n");
else {
  printf("faild\n");
  printf("You must take this course again.\n");
}

同样的,可放置单个语句的任何地方,也可以不放置任何语句,用分号 ; 占位。

while语句

while语句的循环体只能是一条语句或一个复合语句。

//寻找第一个大于100的3的幂
#include <stdio.h>
int main(void)
{
    int a;
    a = 3;

    while (a <= 100)
        a = a * 3;              //end while

    printf("%d\n", a);
    return 0;
}

案例:计数控制的循环

//求解平均分(非浮点数)
#include <stdio.h>
int main(void)
{
    int counter, grade, total, average;
    total = 0, counter = 1;                          //注意对变量的初始化

    while (counter <= 10) {
        printf("输入第%d位学生的成绩:",counter);
        scanf_s("%d", &grade);
        total = total + grade;
        counter = counter + 1;
    }                                               //end while

    average = total / 10;
    printf("\n10位学生的平均成绩为:%d\n", average);

    return 0;
}

案例:标记控制的循环

//任意数目的成绩值浮点平均数
#include <stdio.h>
int main(void)
{
    int grade, counter, total;
    float average;                                  //定义average为浮点数据
    total = 0, counter = 1;

    printf("单个输入学生的成绩,以“-1”结束:");
    scanf_s("%d", &grade);

    while (grade != -1) {
        total = total + grade;
        counter = counter + 1;
        printf("单个输入学生的成绩,以“-1”结束:");
        scanf_s("%d", &grade);
    }

    if (total == 0)                                 //考虑除数为零的情况
        printf("\n没有输入学生成绩,请重新运行程序\n");
    else {
        average = (float)total / counter;            //强制类型转换运算符
        printf("\n%d位学生的平均成绩为:%.2f\n", counter,average);
    }
    return 0;
}
  • 除数为零的情况要特别考虑,予以排除;

  • float 为浮点数据类型,输出时,利用转换说明符 %.2f 打印(只用于printf)出精度为2的浮点数;

  • 强制类型转换运算符 (flaot) 为它的操作数创建一个浮点数据类型临时副本,是显示的类型转换。强制类型转换符是一个一元运算符,只有一个操作数,从右向左结合

案例:嵌套的控制结构

#include <stdio.h>
int main(void)
{
    int c1, c2, c3, grade;
    c1 = 1; c2 = c3 = 0;

    while (c1 <= 10) {
        printf("输入学生的成绩,“1”为及格,“2”为不及格:");
        scanf_s("%d", &grade);
        c1 = c1 + 1;
        if (grade == 1)
            c2 = c2 + 1;
        else
            c3 = c3 + 1;
    }                                           //end while

    printf("\n统计结束,考试通过学生数:%d,未通过学生数:%d。\n", c2, c3);

    if (c2 >= 8)
        printf("获得卓越教师奖!\n");

    return 0;
}

赋值运算符

赋值运算符 样例 解释
+= a += 1 a = a + 1
-= a -= 1 a = a -1
*= a *= 1 a = a * 1
/= a /= 1 a = a / 1
%= a %= 1 a = a % 1

运算符优先级及结合律(优先级从高到低)

运算符 结合律 类型
++(后缀) --(后缀) 从右向左 后缀类
+ - () ++(前缀) --(后缀) 从右向左 一元类
* / % 从右向左 乘法类
+ - 从左向右 加减类
< <= > >= 从左向右 关系类
!= == 从左向右 相等类
?: 从右向左 条件类
= += -= *= /= %= 从右向左 赋值类

相关文章

网友评论

      本文标题:第二、三章

      本文链接:https://www.haomeiwen.com/subject/eiqxnxtx.html