乐趣区

关于c:小凯15天快速讲完c语言简单学习第四课

这节课笔记的排版有点问题,感觉是 markdown 语法有问题,当然不排除思否社区的排版问题,哈哈哈,已反馈官网啦,大家对付看。

0. 温习

0.1 运算符

1. 赋值
留神的点:
// 定义变量的时候,给的值 这时叫做初始化。
int a = 0;
int b = 10;
int c = 0;
// 定义完变量,再去给值,这个就叫赋值
a = 100; // 正确的
100 = a; // 谬误的
a = b = c = 500;
复合赋值运算
a+=b; // 相当于 a = a+b;
2. 算术运算符
有几个:+ – * / % ++ —
须要留神的:
除法运算:两个整数相除,后果就是一个整数
取模运算:参加运算的两个数,必须是整数 取模运算常常被用于判断 A 是不是 B 的倍数
自增自减:自增自减的同时参加了其余运算,前置自增是先自增,再参加其余运算,后置,反过来。3. 取地址

获取一个变量的地址,常常用于 scanf_s 输出数据
留神:数组的名字,就是数组的起始地址

4.sizeof

求得一个数据类型或者一个曾经定义好的变量的大小
 int a= 200; 
 sizeof(int)  就是 4
 sizeof(a)    也是 4
 int  arr[8] = {0};
 sizeof(arr);  这个就是 32 

5. 逗号

 他是优先级最低的运算符

6. 关系运算符

>    >=   < <=  ==  !=   他们是用于比拟大小关系的,后果只能是 true 或者 false
true 和 false  是 bool 类型。从数值上看  true  就是 1    false 就是 0

7. 逻辑运算符

&&     
||    
!

0.2 数组

定义:
数据类型 数组名 [数组长度] = {初始值};
应用:

   数组名[数组下标] = 数值;

比方:

  int   arr[10] = {0};
  arr[2] = 100; 
 scanf_s("%d",&arr[2]);

数组名是下标,给 0 号元素输出数据的时候,能够写成上面的形式:

 scanf_s("%d",arr);
 scanf_s("%d",&arr[0]);

留神:
如果数组有 10 个元素,那么下标就是 0~9
数组越界,个别是比拟难以寻找的 BUG
字符数组
char arr[20] = “hello”;
如果想要用字符数组当成字符串应用,个别就能够间接应用数组名。
scanf_s(“%s”,arr,20);
如果想要打印:
printf(“%s”,arr);

还有四个函数:
strlen 求长度 留神 不算结尾的 0
strcpy 拷贝 留神应用平安版
strcat 拼接 也是应用平安版
strcmp 比拟 相等 0 不等为非 0

每一个函数,都有对应的 wchar 版本的函数。

0.3 三大构造

程序
抉择
a 单 if
if()
{
}
b if-else
if()
{
}
else
{
}
c if-else-if
if()
{
}
else if()
{
}
else if()
{
}
else if()
{
}
else
{
}
switch-case
switch(数值)
case 常量 1:
break;
case 常量 2:
break;
case 常量 3:
break;
default:
都不匹配执行这个

1. 循环

while()
{

}

输入 0 -100 的值(理论有很多种办法,能输入即可)

1.1while 循环输入

#include <stdio.h>
#include <stdlib.h>
int main()
{
    // 第一种办法:循环输入 0 到 100
    int n = 1;
    int nNum = 0;
    while (n<=101)
    {printf("%d", nNum);
        nNum++;
        n++;
    }
    printf("\n");

// 第二种办法:循环输入 0 到 100

int nNum1 = 0;
while (nNum1 <= 100)
{printf("%d", nNum1);
    nNum1++;
}

return 0;

}


### 2.do-while 循环

include <stdio.h>

include <stdlib.h>

int main()

{
    int i = 0;
    do
    {printf("%d\n", i);
        i++;
    }
    while (i < 100);
    return 0;
}


### 3.for 循环



include <stdio.h>

include <stdlib.h>

int main()
{

// 输入 0~100
for (int i = 0; i <= 100; i++)
{printf("%d", i);
}
return 0;

}



对于 for 的总结:1.for 有三条语句,第一句 用于初始化一个循环变量  第二句  用于管制循环条件  第三句  用于循环变量的变动。2. 三条语句标准上,应该依照以上的写法,实际上,写什么都行

### 1.4 对于三种循环的总结
1. 三种循环个别状况下,是能够互相替换的。2. 当明确循环次数的时候,个别应用 for 循环,不能明确循环次数的时候,个别应用 while 循环。3.while 和 for 有可能一次循环体都不执行,do-while 至多执行一次循环体

对于 while 和 for   while 就是简化版的 for


for (; ;)
    {printf("我是循环体 \n");
    }

    while (1)
    {printf("我是循环体 \n");

    }

### 1.5 有限循环

当循环条件始终为真的时候,就会有限循环。也称之为死循环

### 1.6 break 和 continue
break 是完结循环
continue 是完结本轮循环,间接开始下一轮循环

1. 输入 0~100 以内的所有偶数 --- 要求应用 continue


 #include <stdio.h>
 #include<stdlib.h>
int main()
{for(int i=0;i<=100;i++)
    {if (i % 2 == 1)
        {continue;}
        else
        {printf("%d", i);
        }
        system("pause");
        return 0;



2. 如果咱们有一个数组  int  arr[8] = {5,3,6,7,1,2,9,0}, 从键盘上输出一个数字,判断这个数字在不在数组中,如果在的话,输入他的下标,如果不在的话,输入 NO--- 应用 break


//2. 如果咱们有一个数组 int arr[8] = {5,3,6,7,1,2,9,0},

//    从键盘上输出一个数字,判断这个数字在不在数组中,//    如果在的话,输入他的下标,如果不在的话,输入 NO-- - 应用 break
int  arr[8] = {5,3,6,7,1,2,9,0};
int nNum = 0;
printf("请输出一个整数:");
scanf_s("%d", &nNum);
//_contof 是用来获取数组元素的个数的
// 比方这个地位_countof(arr) 就是 8
// 这个代码是有问题的
//for (int i = 0; i < _countof(arr); i++)
//{//    if (nNum == arr[i])
//    {//        printf("%d\n", i);
//        break;
//    }
//    else
//    {//        printf("NO\n");
//    }
//}
// 如何可能比拟好的解决这种,找到还是没找到的问题
// 办法 2:应用下标去判断
//int i = 0;
//for (; i < 8; i++)
//{//    if (nNum == arr[i])
//    {
//        break;
//    }
//}
//if (i == 8)
//{//    printf("NO\n");
//}
//else
//{//    printf("%d\n", i);
//}
// 办法 2:应用标记
bool nFind = false;
for (int i = 0; i < 8; i++)
{if (nNum == arr[i])
    {printf("%d\n", i);
        nFind = true;
        break;
    }
}
if (nFind == false)
{printf("NO\n");
}
return 0;

### 1.7 循环的嵌套
![图片.png](/img/bVc3veg)


 #include <stdio.h>
 #include <stdlib.h>
int main()
{for (int i = 1; i <= 9; i++)
    {for (int n = 1; n <= i; n++)
        {printf("%d", n);
        }
        printf("\n");
    }

    //for (int n = 1; n <= 1; n++)
    //{//    printf("%d", n);
    //}
    //printf("\n");
    ////....
    //for (int n = 1; n <= 7; n++)
    //{//    printf("%d", n);
    //}
    //printf("\n");
    //for (int n = 1; n <= 8; n++)
    //{//    printf("%d", n);
    //}
    //printf("\n");
    //for (int n = 1; n <= 9; n++)
    //{//    printf("%d",n);
    //}
    //printf("\n");
    return 0;
}


练习 2:打印 99 乘法表

#include <stdio.h>
#include <stdlib.h>
int main()
{

// 打印一个 99 乘法表
for (int i = 1; i <=9; i++)
{for (int n = 1; n <= i; n++)
    {printf("%d*%d=%d", n, i, n * i);
    }
    printf("\n");
}


//for (int n = 1; n <= 8; n++)
//{
// printf(“%d%d=%d “, n, 8, n 8);
//}
//printf(“\n”);
//for (int n = 1; n <=9; n++)
//{
// printf(“%d%d=%d “, n, 9, n 9);
//}
//printf(“\n”);
}


练习 3:鸡兔同笼
办法 1:

include <stdio.h>

include <stdlib.h>

int main()
{

// 鸡    i 只
// 兔子  j 只
//i+j==40 
//2*i+4*j == 110
int n = 0;
bool bSign = false;
for (int i = 0; i <=40; i++)
{for (int j = 0; j <= 40; j++)
    {if (i+j==40&&2*i+4*j==110)
        {printf("鸡的数量是 %d 兔子的数量是 %d\n", i, j);
            bSign = true;
            break;
        }
        n++;
    }
    if (bSign == true)
    {break;}
}
printf("内层循环执行了 %d 次", n);
return 0;

}


办法 2:

for (int i = 0; i < 40; i++)

{if (i * 2 + (40 - i) * 4 == 110)
    {printf("鸡的数量是 %d 兔子的数量是 %d\n", i, 40 - i);
        break;
    }
}




## 2. 预处理
以 #结尾的命令,称之为预处理命令。在编译之前,对于源代码进行一些  复制  粘贴 替换的操作。### 2.1  #include 蕴含
 #inlucde 的作用,就是将头文件复制粘贴到命令所在的地位。有两种用法:#include  < 文件名.h>
 #include  "文件名.h"
尖括号 <> 和双引号 ""  有什么区别呢???<> 是去系统目录寻找头文件。所以个别库函数的头文件,都应用  <>“”先到工程所在的当前目录中寻找文件,找不到,再去系统目录外面找。个别状况下,零碎的头文件,都应用 <>
本人工程的头文件,都应用  " "

### 2.2 #define 宏定义
2.2.1 无参宏
常常会被用于定义一个符号常量

include <stdio.h>

include <stdlib.h>

define PI 3.1415926

int main()
{

// 如果咱们编写了一个 UFO 的程序
// 在这个程序中有 100 万个中央用到了圆周率
//double pi = 3.1415926;
double r = 4.8;
double s = 0;
double l = 0;
//........
//s = 3.141592 * r * r;
s = PI * r * r;
// 这里有 10 万行代码
//l = 2 * 3.141592 * r;
l = 2 * PI * r;
return 0;

}

为什么要应用无参宏???1. 便于代码的批改
2. 平安,因为这是一个常量,无奈在运行中去批改值
3. 起了一个名字,加强了可读性
无参宏的实质就是  替换

2.2.2 有参宏
能够给替换的地位,填充一个参数

include <stdio.h>

include <stdlib.h>

define PI 3.1415926

define GETS(r) PIrr

// 有参宏的局限性

define M(n) n*n

int main()
{

double r1 = 4.8;
double r2 = 8.7;
double s = 0;
double l = 0;
// 好多代码
s = PI * r1 * r1;
s = GETS(r1);//PI*r1*r1
// 好多代码
//s = PI * r2 * r2;
s = GETS(r2);

// 有参宏的局限性:int n = M(8);// 8*8
printf("%d", n);
int m = M(4+4);// 宏是纯替换,不会先把 4 + 4 算进去,再去替换
               // 所以后果就是:4+4*4+4  也就是 24 了
printf("%d", m);
return 0;
## 3. 二维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{int arrTest4[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int arrTest1[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int arrTest2[3][4] = {{1,2,3},{4,5},{6} };
    int arrTest3[][4] = {{0},{0} };// 相当于是 2 行

    for (int i = 0; i < 3; i++)
    {for (int j = 0; j < 4; j++)
        {printf("%d", arrTest1[i][j]);
        }
        printf("\n");
    }


    return 0;
退出移动版