《人人都能学会的编程入门课》学习笔记(3)

252 阅读7分钟

语言基础篇:C 语言的基础语法(一)。

一、printf 程序输出,让计算机“说话”

printf() 输出函数,把程序中数据信息输出到屏幕上。

二、类型和变量,组织语言让计算机理解你的意思

将现实世界的“信息”,映射到计算机世界中的“数据”。如:

现实生活计算机中类型解释
这里有107家时髦的金拱门int整数类型
艾伦巨人身高15.3float / double浮点数类型
我的名字叫Adachar[]字符串类型

在程序中,我们把信息记录在变量里。变量是用来存储数据的

类型和变量是两个完全不同的概念。

类型与其格式占位符之间的对应关系

#include <stdio.h>

int main() {
  // 定义变量a,b
  int a = 167, b = 543;
  
  // 输出
  printf("%d + %d = %d", a, b, a + b);
  
  return 0;
}

// 输出:167 + 543 = 710
  • 格式控制字符串%d + %d = %d,其中 %d 是整型的“格式占位符”。
  • 参数列表a, b, a + b,每一项依次对应一个“格式占位符”要输出的内容。
格式占位符作用对应类型
%d十进制形式的整型数据int
%f小数形式的浮点型数据float / double
%s字符串数据char[]

操作颜色的转义字符

设置颜色,以 \033 开始,也以 \033 结束。具体格式如下:

\033[属性代码{;属性代码...}m输出内容\033[0m
  • 0 代表关闭所有属性
  • 1 代表高亮,粗体
  • 4 代表下划线
  • 33 代表换色
#include <stdio.h>

int main() {
    printf("\033[1;4;33mhello color\033[0m");
    return 0;  
}

示例图

三、scanf 输入函数,让计算机“捡起”你的话

scanf() 输入函数,把用户输入的信息捡起来存储在变量中。

四、if...else... 给代码添加判断能力

如果……就……否则……

  • 如果 if 后面接 假设条件
  • 后面接条件 成立后的结果
  • 否则 else 接条件 不成立后的结果

if...else...语法结构

if (条件表达式) 一条语句1;
else 一条语句2;

表达式的值,非 0 即为真

一条语句

  1. 空语句
    if (a == 3) ;
    
    单纯以一个分号结尾,不存在任何实质上的操作。
  2. 单一语句
    if (a == 3) printf("hello Ada!");
    
    以分号结尾,比空语句多了语句内容。
  3. 复合语句
    if (a == 3) {
      printf("hello One\n");
      printf("hello Two\n");
      printf("hello Three");
    }
    
    被大括号包裹,中间是若干条语句。
  4. 结构语句
    if (a == 3) {
      if (a == 4) {
        printf("hello World!");
      }
    }
    
    ifforwhile 等开头的分支语句或循环语句。

五、forwhile 给程序添加重复执行功能

while 语句

while (循环条件) 一条语句;

while 关键字开头,后面跟着循环条件(一个条件表达式),然后是一条语句。

当循环条件成立时,就会执行一次后面的语句,之后就是再判断循环语句是否成立,如果成立就再执行,一直到循环条件不成立为止。

for 语句

for (初始化①; 循环条件②; 循环后操作③) 一条语句④;

for 语句会按照①②④③②④③...循环,知道某一次循环条件②不成立了为止。

①只在循环开始时执行了一次,真正的循环是以循环条件②,一条语句④以及循环后操作③组成的。

闰年的规则

  1. 能被4整除,但不能被100整除;
  2. 能被400整除。
// 闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  // your code here...  
}

六、随机函数

  • 真随机 前后两次出现的数字是两次独立事件,没有任何关系。
  • 伪随机 一旦上一个随机函数的值确定了,下一个数字也就确定了。

程序中的随机函数

计算机中随机函数的基本原理。

全是伪随机,根据上一个随机值和一个固定的计算规则,得到下一个随机值

rand() 函数,获得一个随机值,将依次返回随机序列中的每一个值。

随机种子

在设置随机函数中记录的上一个随机值。

srand() 函数,设置随机种子,即设置随机过程中的第一个起始点的位置。

#include <stdio.h>
#include <stdlib.h>
# include <time.h>

int main() {
  // 永远输出固定值
  printf("%d\n", rand() % 1000);
  
  // 设置随机种子
  srand(time(0));
  // 每次运行输出都不同
  printf("%d\n", rand() % 1000);
  
  return 0;
}

七、数组

数组,一组数据。规模化存储工具。

字节与地址:数据的住所和门牌号

  • 字节:计算机中最基本的存储单位,像一个个不可分割的小格子,存在于我们计算机的内存中。

    不同类型的元素占用的格子数量不一样。可以使用 sizeof() 这个运算符来计算变量占用字节数量。

    想要查看什么元素或者类型所占用字节数量,就把什么传入 sizeof() 即可。

    int a;
    // 计算变量a占用的字节数量
    sizeof(a);
    // 计算一个整型元素占用的字节数量
    sizeof(int);
    

    每一种基础类型,在内存中存储时,一定是占用若干个连续的存储单元。

    字节是存储数据的基本单位,比特是表示信息的最基本单位

    一个比特就是一个二进制位,要么是 0 ,要么是 1

    1 个字节等于 8 比特位。即:1 btye = 8 bit

  • 地址:每一个字节的唯一标记。

    内存地址采用 %p 格式占位符进行输出。

    #include <stdio.h>
    
    int main() {
      int a;
      
      // 输入变量a的值
      scanf("%d\n", &a);
      
      // 输出变量a的地址
      printf("%p\n", &a);
      
      return 0;   
    }
    

    单一的 & 运算符放到变量前面,取到的就是这个变量的首地址

    一个变量占用若干个字节。第一个字节的地址,就是这个变量的首地址。

    在程序中,单独使用数组名字的时候,实际上就代表了整个数组的首地址,整个数组的首地址就是数组中第一个元素的首地址,即 arr[0] 的地址。

    地址支持 + / -法,arr + 0 等价于 arr[0] 的地址,arr + 1 等价于 arr[1] 的地址。即:arr + i 就等价于 arr[i] 的地址

八、值和变量

变量:变化的量。

具体结果就是值,明确知道等于多少的就是值。存储这些值的地方,就是变量,就是在程序中用来指代某片存储空间的名称。值就是存储空间里面的具体内容。

九、字符串和字符数组

字符内容用单引号,字符串内容用双引号

杠零字符

写作 \0,对于底层是一个很重要的字符,标记字符串结束。我们的程序在看到这个字符串的时候,会从第一个字符开始,直到碰到 \0 字符为止,这中间的内容就是字符串的内容。

字符串长度 vs. 字符串占用空间

字符串长度字符串占用空间
定义字符串内容所占字节数量字符串所占用的空间大小
"hello world"1112(字符串长度 + \0

字符数组

字符数组,用来存放字符串的变量空间。本质上是一个数组,数组的每一个元素类型都是字符型,即 char 类型。

字符串操作

运算:使用现有值产生新值的一个过程。

函数作用
strlen获取字符串长度
strcopy拷贝字符串
strcmp对比字符串
strcat连接两个字符串

详见 string.h 头文件中的相关函数使用。

sscanf

提供一种将字符串信息转换成其他信息的方式。

char str[20] = "123.45";
double num;

// 将一个字符串转换成一个浮点型数据
// 使用sscanf从str所存储的字符串中读入一个浮点型数据,然后赋值给num变量
sscanf(str, "%lf", &num);

sprintf

提供一种将字符串信息赋值给指定变量的方式。

char str[100];

// 将原本输出到标准输出流中的内容,输出到str数组中
sprintf(str, "hello world");

sscanfsprintf 函数本质上是以字符串为中间值,做各种数据类型之间的转换