C语言入门笔记整理 03

字节

字节是存储数据的单位
是硬件所能访问的最小单位
1个字节 == 8 位
1K = 1024字节
1M = 1024K
1G = 1024M

1.5G可以存放的数据:
					1.5x1024x1024x1024x8

内存条的控制只能精确到位
一个字节 由 8个位 组成。

一个 int 占 4个字节
一个long占 8个字节
一个char占 1个字节

在这里插入图片描述

不同类型数据之间相互赋值的问题

int i = 45;
long j = 102345;
i = j;
printf("%d %d\n", i, j);
float x = 6.6;
double y = 8.8;
printf("%f %lf", x, y);

暂不考虑

什么是SCII


#include <stdio.h>

int main(void) {
    // insert code here...
    char ch = 'A';
//    char ch = 'AB'; // AB是字符串。所以error,类型不一致
    
    return 0;
}

字符 和 字符串的区别

#include <stdio.h>

int main(void) {

    
    char ch = 'A';
//    char ch = 'AB'; // error: AB是字符串。所以error,类型不一致
//    char ch2 = "A"; // error: 所有字符串末尾都默认有\0 作为结尾,这里应该是两个字符 A 和 \0,char只能存放一个字符
//    char ch3 = 'AB'; //error 'AB'是错误的
//    char ch = 'B'; //error: 以为ch变量已经在12行定义了,这样会导致重复定义
    
    return 0;
}

以下代码不会报错
因为任何字符 都是以数字,二进制存储的

#include <stdio.h>

int main(void) {

    
    char ch = 'A';
    printf("%d\n",ch); // 65
    return 0;
}


什么是ASCII

ASCII不是一个值,而是一种规定,

ASCII规定了不同的字符是使用哪个装数值去表示
它规定了

‘A‘ -- 65
‘B‘  -- 66
‘a’ -- 97
'b' -- 98
'0' -- 48

还有其他不同的码
GB2312
utf-8

不同的码 规定 字符使用不同的数字去表示。

处理遗留垃圾值的情况

#include <stdio.h>

int main(void) {
    int i;
    scanf("%d", &i);
    printf("i = %d\n", i);
    
    char ch;
    // 清楚用户上面遗留的非法输入
    while ((ch = getchar()) != '\n') {
        continue;
    }
    
    int j;
    scanf("%d", &j);
    printf("j = %d \n", j);
    return 0;
}

运算符

算术运算符

+ - * / %  加 减 乘 除 取余数

除法/的运算结果和运算对象的数据类型有关,两个数都是int 则商就是int,若商有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。
在这里插入图片描述
取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同
在这里插入图片描述

关系运算符

> >=  < <= != ==

逻辑运算符

!&& 并且 ||

在这里插入图片描述

c语言对真假的处理

非零是真

零是假

真是1表示假是0表示
#include <stdio.h>

int main(void) {
    
    int i = 10;
    int k = 20;
    int m;
    
    m = (3 > 2) && (k = 8); // m要么0 要么1. 左边 真 右边 真
    printf("m = %d, k = %d\n", m ,k);
    
    
    return 0;
}


m = 1, k = 8
#include <stdio.h>

int main(void) {
    
    int i = 10;
    int k = 20;
    int m;
    
    m = (1 > 2) && (k = 8);
    printf("m = %d, k = %d\n", m ,k);
    
    
    return 0;
}

m = 0, k = 20

为什么k为20?

&& 左边的表达式为假右边的表达式肯定不会执行。

因为 k = 8没有执行
在第一个条件判断为假的时候,右边就不执行了。

同理 当 || 左边为真的时候,右边就不执行了。

#include <stdio.h>

int main(void) {
    
    int i = 10;
    int k = 20;
    int m;
    
    m = (3 > 2) || (k = 8);
    printf("m = %d, k = %d\n", m ,k);
    
    
    return 0;
}


m = 1, k = 20

赋值运算符

= += *=  /= -=

优先级

算术 > 关系 > 逻辑 > 赋值

scanf 用法

#include <stdio.h>

int main(void) {
    
    int i;
    scanf("%d", &i);
    printf("i = %d\n", i);
    
    int ch;
    scanf("%c", &ch);
    printf("ch = %c\n", ch);
    
    return 0;
}
9km
i = 9
ch = k

流程控制

什么是流程控制

程序代码执行的顺序

流程控制的分类

顺序

选择

什么是选择

某些代码,可能执行,也可能不执行,选择性执行某些代码。

分类
if
switch
if
  1. if最简单的用法
  2. if的范围问题
  3. if… else. … 的用法
  4. if. . else if…e1se…的用法
  5. C语言对真假的处理
  6. if举例–求分数的等级
  7. if的常见问题解析
  1. if最简单的用法
#include <stdio.h>

int main(void) {
    
    if (3>2) {
        printf("AAAA\n");
    }
    return 0;
}
#include <stdio.h>

int main(void) {
    
    if (3) {
        printf("AAAA\n");
    }
    
    if (0) {
        printf("BBBB\n");
    }
    
    if (0 == 0) {
        printf("CCCC\n");
    }
    
    return 0;
}

AAAA
CCCC
  1. if的范围问题
    在这里插入图片描述

if 只能控制离它最近的一个语句,如果不用 brackets 括号。

或者这么说:

if默认的只能控制一个语句的执行或不执行。

#include <stdio.h>

int main(void) {
    
    if (1 > 2)
        printf("AAAA\n");
        printf("BBBB\n");
    return 0;
}

BBBB

在这里插入图片描述
3. if… else. … 的用法

#include <stdio.h>

int main(void) {
    
    int i, j;
    
    scanf("%d %d", &i, &j);
    
    if (i > j) {
        printf("i 大于 j\n");
    } else{
        printf("i 小于 j\n");
    }
    
    return 0;
}

4.if. . else if…else…的用法

#include <stdio.h>

int main(void) {
    
    double delta = 3;
    
    if (delta > 0) {
        printf("有两个解!\n");
    } else if (delta == 0){
        printf("有一个唯一解!\n");
    } else{
        printf("无解!\n");
    }
    return 0;
}

在这里插入图片描述

例子:
成绩判断

//
//  main.c
//  helloworld
//
//

#include <stdio.h>

int main(void) {
    
    float score; // socre分数
    printf("请输入您的考试成绩:");
    scanf("%f", & score);
    
    if (score >= 100) {
        printf("这是梦!\n");
    } else if (score >= 90){
        printf("优秀A\n");
    } else if (score >= 80){
        printf("良好B\n");
    } else if (score >= 60){
        printf("及格C!\n");
    } else if (score >= 0){
        printf("不及格D!\n");
    } else{
        printf("输入分数过低!");
    }
    
    return 0;
}



求三个数字的最大值

#include <stdio.h>

int main(void) {

    int a, b, c;
    
    printf("请输入三个数字: ");
    
    scanf("%d %d %d", &a, &b, &c);
    
    int t;
    // a最大值 b中间值 c最小值
    if (a < b){
        t = a;
        a = b;
        b = t;
    }
    
    if (a < c) {
        t = a;
        a = c;
        c = t;
    }
    
    if (b < c) {
        t = b;
        b = c;
        c = t;
    }

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

  1. if的常见问题解析

在这里插入图片描述

#include <stdio.h>

int main(void) {
    
    if (1 > 2);
        printf("AAAA\n");
    printf("BBBB\n");

    return 0;
}

在这里插入图片描述

下面代码报错

#include <stdio.h>

int main(void) {
    
    if (3 > 2);
        printf("哈哈\n");
    else
        printf("嘿嘿\n");

    return 0;
}

在这里插入图片描述

#include <stdio.h>

int main(void) {
    
    if (3 > 2)
        printf("AAAA\n");
    else if (3 > 1)
        printf("BBBB\n");
    else
        printf("CCCC\n");
    
    return 0;
}
AAAA

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>

int main(void) {
    
    if (3 > 2)
        printf("AAAA\n");
    else if (3 > 1)
        printf("BBBB\n");
    else (5 > 10);
        printf("CCCC\n");
    
    return 0;
}


AAAA
CCCC
switch

循环

什么是循环

某些代码被重复执行

分类
for

简单例子
1+2+3+。。。。+99+100
求和

#include <stdio.h>

int main(void) {
    
    int i = 0;
    int sum = 0;
    
    for (i = 1; i <= 100; i++)
        sum = sum + i;
    
    printf("sum = %d\n", sum);
    
    return 0;
}

sum = 5050

在这里插入图片描述

先执行1,判断2是否成立,成立执行4,执行3 标志循环1次结束
判断2,成立执行4,执行3
判断2,成立执行4,执行3
判断2,成立执行4,执行3
判断2,不成立,退出循环。

1只有刚开始会执行1次,然后就再也不执行了。
3完了,表示循环1次结束。
3玩了,一定会执行2。
2不成立,退出循环。

A3B4 例子

#include <stdio.h>

int main(void) {
    
    int i = 0;

    for (i = 1; i < 4; ++i)
        printf("AAAA\n");
        printf("BBBB\n");
    
    return 0;
}
AAAA
AAAA
AAAA
BBBB
#include <stdio.h>

int main(void) {
    
    int i = 0;
    int sum;
    for (i = 3; i < 12; ++i){
        
        if (i % 3 == 0) {
            sum = sum + i;
        }
    }
    
    printf("sum = %d\n", sum);
    
    return 0;
}

3 6 9 = 18
sum = 18

求 1+ 1/2 + 1/3 + … + 1/ 99 + 1/100的和的结果

int main(void) {
    
    int i = 0;
    float sum;
    for (i = 1; i <= 100; ++i){
//        sum = 1/(i * 1.0) + sum;
        sum = (float)1/i + sum;
    }
    
    printf("sum = %f\n", sum); // float 必须用%f输出
    
    return 0;
}

sum = 5.187378

在这里插入图片描述

浮点数存储问题

float 和 double 都不可以保证 精确存储一个小数
在这里插入图片描述

在这里插入图片描述

例子
求1到100之间的奇数之和
在这里插入图片描述
求1到100之间的奇数的个数
在这里插入图片描述
1到100之间的奇数的平均值

在这里插入图片描述

多个for循环的嵌套使用

在这里插入图片描述

1 2 4 5 A 6 
5 A 6
5 A 6
5 A 6
5 A 6
5不符合 退出
 3 2
4 5 A 6
5 A 6
5 A 6
5 A 6
5 A 6
5不符合 退出
 3 2 
4 5 A 6
5 A 6
5 A 6
5 A 6
5 A 6
5不符合 退出
 3 
2 不符合 退出
B
执行完毕
while

1.执行顺序

格式:

while(表达式)
			语句;

2.和for的相互比较

在这里插入图片描述

3.举例子

从键盘输入一个数字,如果该数字是回文数, 则返回yes,否则返回no 回文数:
正着写和倒着写都一样
比如:121 12321 都是回文数

#include <stdio.h>

int main(void) {
    
    int val;
    int m;
    int sum;
    
    printf("请输入您需要判断的数字: ");
    scanf("%d", &val);
    
    m = val;
    sum = 0;
    while (m) {
        sum = sum * 10 + m % 10;
        m /= 10;
    }
    
    if (sum == val) {
        printf("Yes!\n");
    } else {
        printf("No!\n");
    }
    
    return 0;
}

试数

/**
1.  m = 1234  成立
 sum = 0 * 10 + 1234 % 10 = 4
  m = m/10 = 123
 
2. m = 123 成立
 sum = 4 * 10 + 123%10 = 43
 m = 123/10 = 12
 
 3. m = 12 成立
 sum = 43 * 10 + 12%10 = 432
 m = 12/10 = 1
  
 4. m = 1 成立
 sum = 432 * 10 + 1%10 = 4321
 m = 1/10 = 0
 
 5. m = 0 不成立
 
 最终sum = 4321
 */

斐波拉契数列

/**
        斐波拉契数列
        1 2 3 5 8 13 21 34
 */
#include <stdio.h>

int main(void) {
    int n;
    int f1,f2,f3;
    
    f1 = 1;
    f2 = 2;
    
    printf("请输入您需要的序列:");
    scanf("%d",&n);
    
    if (1 == n) {
        f3 = 1;
    } else  if (2 == n){
        f3 = 2;
    } else{
        for (int i = 3; i <= n; ++i) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
    }
    
    printf("%d\n", f3);

试数

/**
 n = 5
 i = 3
 f3 = 1 + 2 = 3
 f1 = 2
 f2 = 3
 
 
 f1 = 1 f2 = 2
 n   5
 i    3 4 5 6
 f3  3 5 8 13
 f1  2 3 5 8
 f2  3 5 8
 */

4.什么时候用while,什么时候用for

自己体会

do while

主要是用于 人机交互

在这里插入图片描述

do while 先执行后执行
while 先判断后执行

while内部很可能1次都不执行
do while 内部一定会执行1次

例子

#include <stdio.h>
#include <math.h>

int main(void) {
    double a, b, c;
    double delta;
    double x1, x2;
    char ch;
    
    do
    {
        printf("请输入一元二次方程的三个系数: \n");
        printf("a = ");
        scanf("%lf", &a);
        
        printf("b = ");
        scanf("%lf", &b);
        
        printf("c = ");
        scanf("%lf", &c);
        
        delta = b * b - 4 * a * c;
        
        if (delta > 0) {
            x1 = (-b + sqrt(delta)) / (2 * a);
            x2 = (-b - sqrt(delta)) / (2 * a);
            printf("有两个解 x1 = %lf, x2 = %lf", &x1, &x2);
        } else if (delta == 0){
            printf("有唯一解, x1 = x2 = %lf", &x1);
        } else{
            printf("无解!");
        }
        
        printf("您想继续吗? (Y/N): ");
        scanf(" %c", &ch); // %c前面必须加一个空格
    } while('y' == ch || 'Y' == ch);
    
    return 0;
}
break 和 continue

在这里插入图片描述

case1
case2
case3
case4
case5
等这些都是程序的入口,判断从哪里进入。
当一旦找到入口之后,就开始从这里 往下全部执行。

#include <stdio.h>

int main(void) {
    int val;
    
    printf("请输入您想进入的楼层: ");
    scanf("%d", &val);
    
    switch (val){
        case 1:
            printf("1层开\n");
            break;
        case 2:
            printf("2层开!\n");
            break;
        case 3:
            printf("3层开!\n");
            break;
        case 4:
            printf("4层开!\n");
            break;
        case 5:
            printf("5层开!\n");
            break;
        default:
            printf("没有盖到这一次层!\n");
            break;

    }

    return 0;
}

break 和 for 连用
用来终止 for 循环

在这里插入图片描述
在多层循环中,break只能终止距离它最近的那个循环

#include <stdio.h>

int main(void) {
    int i , j;
    for (i = 0; i < 3; i++) {
        for (j = 1; j < 4; j++) {
            break;
            printf("同志们好!\n");
        }
        printf("为人民服务!\n");
    }

    return 0;
}

为人民服务!
为人民服务!
为人民服务!
continue

用于跳过本次循环环余下的语句, 转去判断是否需要执行下次循环
在这里插入图片描述

在这里插入图片描述

getchar() 表示 从键盘上获取 字符

如何看懂一个程序

分为三步:

  1. 流程 即 执行顺序
  2. 每个语句的功能
  3. 试数

如何掌握程序

在这里插入图片描述

进制

什么叫n进制

逢n进一

把r进制转为10进制

把10进制转为r进制

除r取余,直至商0,余数倒序排列。

在这里插入图片描述

不同进制代表数值之间的关系

十进制 3981 转化为 16进制 F8D

十进制 3981 和 16进制 F8D 本质上所代表的都是同一个数字

自增 自减

分类

前自增 ++i
后自增 i++

前自增 整体表达式的值是 i 加1之后的值
后自增 整体表达式的值是 i 加1之前的值

#include <stdio.h>

int main(void) {
    
    int i;
    int j;
    int k;
    int m;
    
    i = j = 3; // 等价于 i = 3; j = 3;
    k = i++;
    m = ++j;
    
    printf("i = %d, j = %d, k = %d, m = %d\n", i,j,k,m);

    return 0;
}
i = 4, j = 4, k = 3, m = 4

为什么会出现 自增

使代码 更精练
自增的速度 更快

自增在寄存器
寄存器 比存储即更快

三目运算符

A ? B : C
等价于
	if(A)
		B;
	else:
		C;

例子;

#include <stdio.h>

int main(void) {
    
    int i;
    i = (0 > 2 ? 5 : 1);
    printf("%d\n", i);
    return 0;
}


1

逗号表达式

(A, B, C, D)
功能:
	从左到右执行
	最终表达式的值是 最后一项的值
	
#include <stdio.h>

int main(void) {
    
    int i;
    i = (1, 2, 3, 4, 5, 6);
    printf("%d\n", i);
    return 0;
}

6
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值