黑马程序员---C语言--流程控制和函数

来源:互联网 发布:mac上使用的ios模拟器 编辑:程序博客网 时间:2024/04/30 13:14
                **第一讲 流程控制**

一、 流程控制
顺序结构:默认的流程结构。按照书写顺序执行每一条语句。
选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。
循环结构:在给定条件成立的情况下,反复执行某一段代码。

二、 选择结构-if
1. 简单使用
if (表达式) 语句1;
if(count>50) 开班; 上课;

if(表达式)  语句1;  else 语句2;f(count>50)  开班;  else 不开班;if(表达式)  {  }if(count>50)  {开班; 布置课室;}  else {}{ }的作用域if -else if-elseif(a==0) else if (a>0)  else 特点:只有一个括号会被执行
/* 1.if的第1种结构 if(条件) {    语句1;    语句2;    ...... } 2.if的第2种结构 if(条件1) {     语句1;     语句2;     ...... }  else { } 3.if的第3种结构 if(条件1) {     语句1;     语句2;     ...... } else if(条件2) { } else if(条件3) { } else if(条件4) { } else  { } 4.if的第4种结构 if (条件)   语句1;*/#include <stdio.h>int main(){    /*    // 人数    int count = 40;    if ( count >= 50 )    {        printf("开班!!!\n");        printf("准备机器!!!\n");    }    else    {        printf("不开班!!!\n");        printf("不准备机器!!!\n");    }*/    /*    int a = 6;    if (a++ > 10) // a == 7    {        printf("A\n");    }    else if (a++ > 5) // a == 8    {        printf("B\n");    }    else if (a++ > 3)     {        printf("C\n");    }    else    {        printf("D\n");    }    printf("a的值是%d\n", a);     */    int a = -10;    if (a>1)        printf("A\n");    printf("B\n");    return 0;}
复合条件上课时间的取值范围(9~12 ||  14 ~17)陷阱  if(a!=0)  { a不是0;} else {a是0;}if (a); {  }if (a=0)  a == 0;if (10) int a = 9;
#include <stdio.h>int main(){    /*    if (0)    {        printf("A\n");    }    else    {        printf("B\n");    }*/    /*    int a = 1044343;    比较大小时,常量值放左边,变量放右边    //if (a = 0)    if (0 == a)    {        printf("a等于0\n");    }    else    {        printf("a不等于0\n");    }*/    /*    int a = 10;     // 注意赋值运算符,不要写成两个=    a = 15;    printf("%d\n", a);     */    /* if语句后面不要写;    if ( 5>6 );    {        printf("A\n");    }*/    /*    if (10 > 6)    {        int a = 5;    }    printf("%d\n", a);     */    // 下面的代码是错误的:作用域不明确    if (10 > 6)        int a = 5;    // 如果要在if后面的语句中定义新的变量,必须用大括号{}    //printf("%d\n", a);    /*     书写格式    int a = 10;    if (a>10) {    } else if (a>5) {    } else {    }    if ()    {    }    else if ()    {    }    else    {    }*/    return 0;}

三、 选择结构-switch
1. 简单使用
switch(表达式) { case 数值1: break; … default: break;}
举例
int a = 10;
switch (a) {
case 0:
printf(“这是一个0”);
break;
case 5:
printf(“这是一个5”);
break;
case 10:
printf(“这是一个10”);
break;
default:
printf(“什么也不是”);
break;
}

#include <stdio.h>/* if (条件) { } switch (数值) {    case 数值1:        语句1;        break;    case 数值2:        语句2;        break;    default :        语句3;        break; } */int main(){    //int a = 10;    // break:退出整个switch语句    // 如果case后面没有break,就会执行后面所有case中的语句,直到遇到break为止    /*    int b = 10;    switch (a)    {        case 10:            printf("A\n");            b++;        case 5:            printf("B\n");            b++;        case 0:            printf("C\n");            b++;            break;        default:            printf("D\n");            break;    }    printf("b的值是%d\n", b);*/    char c = '+';    int a = 10;    int b = 20;    // 如果要在case后面定义新的变量,必须用大括号{}包住    switch (c) {        case '+':        {            int sum = a + b;            printf("和是%d\n", sum);            break;        }        case '-':        {            int minus = a - b;            printf("差是%d\n", minus);            break;        }    }    return 0;}
  1. if和switch的对比
    很多情况可以互换
    if用得比较多,比较灵活,switch只能某个单值

四、 循环结构-while
1. 简单使用
连续printf(“俯卧撑”)20次;
while(表达式) { }
continue:输出5次休息一下
break的使用:某次的时候停止循环
2. 特点
只有条件成立才会执行循环体

#include <stdio.h>/* if (条件) { } while (条件) {    循环体 } 运行原理 1.如果一开始条件就不成立,永远不会执行循环体 2.如果条件成立,就会执行一次循环体,执行完毕,再次判断条件是否成立...... break 直接结束整个while循环 continue 结束当前的循环体,进入下一次循环体的执行 */int main(){    // 1.先确定需要重复执行的操作    // 2.再确定约束条件    // 定义一个变量记录做的次数    int count = 0;    /*    while (count<50)    {        ++count;        if (count%10 != 0)        {            printf("做第%d次俯卧撑\n", count);        }    }*/    /*    while (count<50)    {        ++count;        if (count%10 == 0)        {            // 直接结束这一次循环体,进入下一次循环            continue;        }        printf("做第%d次俯卧撑\n", count);    }*/    while (count < 50)    {        ++count;        printf("做第%d次俯卧撑\n", count);        if (count == 20)        {            break;        }    }    return 0;}

五、 循环结构-do while
特点:一定会执行一次循环体
while和do while循环对比
int i=0;
while(i<0){
i++;
}

int i=0;
do{
i++;
} while(i<0);

/*while (条件) { }do {} while(条件); whiledo-while的区别 1.很多情况下,whiledo while可以互换 2.while特点:如果一开始的条件不成立,永远不会执行循环体 do while特点:不管一开始的条件是否成立,至少会执行一次循环体 3.最好使用while*/#include <stdio.h>int main(){    int i = 0;    /*    while (i<0)    {        i++; // 5    }*/    do {        i++; // 5    } while (i<0);    printf("i=%d\n", i);    return 0;}

六、 循环结构-for
1. 简单实用
运行过程
初始化语句等可以是多句(把printf放到for的括号中)

/* for (语句1; 条件; 语句2) {    循环体 } 语句1:初始化语句 语句2:增量语句(执行完循环体后再执行的语句) 1.for一开始就会执行一次语句1(整个for循环只会执行一次) 2.判断条件是否成立,如果条件成立,就会执行一次循环体,然后就会执行语句2,再次判断条件是否成立 */#include <stdio.h>int main(){    /*     "做俯卧撑"50次     */    /*    int count = 0;    for ( ; count < 50; )    {        printf("做俯卧撑\n");        count++;    }*/    /*    for (int count = 0; count < 50; )    {        printf("做俯卧撑\n");        count++;    }*/    /*    for (int count = 0; count < 50; count++)    {        printf("做俯卧撑\n");    }*/    /*    for (int count = 0; count < 50; printf("做俯卧撑\n"),printf("哈哈哈\n"),count++)    {    }*/    return 0;}
#include <stdio.h>int main(){    /* 不要随便在for()后面写分号    for (int i=0; i<5; i++);    {        printf("哈哈\n");    }*/    /* 错误:变量a的作用域不明确     如果要在循环体中定义新的变量,必须用大括号{}包住    for (int i=0; i<5; i++)        int a = 10;    */    /* 错误    for (int i = 0; i<10; i++, a++)    {        // a只能用在循环体{}中        int a = 10;    }*/    /*    int a = 10;    for (int i=0, a= 9; i<5; i++)    {        //int i = 10;        int a = 11;        printf("a=%d\n", a);    }*/    // 最简单的利用for循环实现死循环    // for(;;);    return 0;}
  1. for循环嵌套
    好友列表1
    好友1
    好友2
    好友列表2
    好友1
    好友2
    好友列表3
    好友1
    好友2

  2. 陷阱
    1> 死循环 for(;;);
    2> for循环体内部变量的作用域
    3> 作用域混淆
    for (int i = 0; i<5; i++) int a = 10;

  3. while循环和for循环的比较
    可以互换
    for循环的变量可以及时回收

七、 break和continue
1. break
使用场合:switch\循环结构
循环嵌套下的break

  1. continue
    使用场合:循环结构
    循环嵌套下的continue
#include <stdio.h>/* break: 1.使用场合 1> switch语句:退出整个switch语句 2> 循环结构:退出整个循环语句   * while   * do while   * for 2.注意点 只对最近的循环结构有效 continue1.使用场合  循环结构:结束当前这次的循环体,进入下一次循环体     * while     * do while     * for 2.注意点  只对最近的循环结构有效 */int main(){    /*    for (int i = 0; i<5; i++)    {        printf("%d\n", i);        if (i%2)        { // i为奇数:13            continue;        }    }*/    /*    for (int i = 0; i<5; i++)    {        printf("哈哈哈\n");        continue;        printf("哈哈哈23\n");    }*/    for (int i = 0; i<3; i++)    {        for (int j = 0; j<2; j++)        {            if (j==1)            {                break;            }            printf("A\n");        }        break;        printf("B\n");    }    return 0;}
                 **第二讲  函数**

一、 什么是函数
任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”。所以,你可以说C语言程序是由函数构成的。

二、 函数的定义
1. 定义函数的目的
将一个常用的功能封装起来,方便以后调用

  1. 定义函数的步骤
    函数名:函数叫什么名字
    函数体:函数是干啥的,里面包含了什么代码

  2. 格式
    固定格式(很多语言的函数都是这么写的)
    返回值类型 函数名(形式参数列表)
    {
    函数体
    }
    举例
    定义一个函数,计算两个整数的和
    sum(int a, int b)
    {
    int c = a + b;
    }

#include <stdio.h>/* 1.什么情况下定义函数:添加一个常用的新功能 2.函数的定义格式 返回值类型  函数名(形式参数列表) {    函数体 } 3.定义函数需要明确的东西 1> 起一个有意义的函数名 2>  */int printLine(){    printf("-------------\n");    return 0;}int average(int num1, int num2){    return (num1 + num2)/2;}int main(){    /*    printLine();    printLine();    printLine();     */    int a = 10;    int b = 9;    int c = average(a, b);    printf("c is %d\n", c);    int a1 = 11;    int b1 = 20;    int d = average(a1, b1);    printf("d is %d\n", d);    return 0;}

三、 函数调用“
sum(10, 11); 引出返回值

四、 函数的参数
1. 形参和实参的基本概念
2. 形参个数和实参一致:sum(10, 11, 12)
3. 参数的传递是值传递
4. 参数名不能跟函数内的局部变量同名
5. 函数可以没有参数:设计一个函数返回PI

五、 函数的返回值
1. 返回值的基本概念、return的作用
2. void
3. return
void可以省略return
可以多次使用return
return后面不能有其他语句
4. 函数的弱语法
如果没有写返回值类型,默认是int
如果写了返回值,可以不返回
调用一个没有定义过的函数

六、 定义函数的步骤
1. 明确函数作用,起一个有意义的函数名称
2. 明确函数的参数和返回值

七、 函数注意
不能嵌套定义函数
死循环调用,自己调用自己
不能重复定义、可以重复声明

八、 函数的补充
1. main函数
返回值:0,正常退出;1,异常退出
2. printf函数
#include
返回值:字符串的长度

九、 函数的声明
1. 函数的定义顺序
2. 函数的声明作用:声明和定义,类似于身份证和人的关系,编译买机票、链接登机
3. 只有函数声明、没有定义,编译警告、链接报错

#include <stdio.h>/* 参数注意点 1.形式参数:定义函数时函数名后面中的参数,简称形参 2.实际参数:调用函数式传入的具体数据,简称实参 3.实参个数必须等于形参个数 4.函数体内部不能定义和形参一样的变量 5.如果是基本数据类型作为函数形参,纯粹是值传递,修改函数内部形参的值,并不会影响外面实参的值 6.一个函数可以没有形参,也可以有无限多个形参 */// 形式参数,简称形参int sum(int num1, int num2){    // 函数体内部不能定义和形参一样的变量    // int num1;    num1 = 50;    return num1 + num2;}/* return的作用: 1> 退出函数 2> 返回一个具体值给函数调用者 返回值注意点 1> void代表没有返回值 2> 如果没有明确说明返回值类型,默认是返回int类型 3> 就算明确声明了返回值类型,也可以不返回任何值 默认情况下,C语言不允许两个函数的名称一样 */char test(){    return 'A';}/*void test(int a, int b){}*/void test5(){}/* 伪代码void login(QQ, 密码){    // 1.验证QQ有没有值    if (QQ没有值) return;    // 2.验证密码有没有值    if (密码没有值) return;    // 3.把QQ、密码发送到服务器}*/int test3(){    printf("999999999\n");}// 如果不明确声明返回值类型,默认就是int类型test2(){    printf("888888888\n");    return 10;}int main(){    int c = test2();    printf("c=%d\n", c);    test3();    //test();    /*    int a = 100;    int b = 27;    // a、b称为函数的实际参数,简称实参    int c = sum(a, b);    printf("a=%d, b=%d, c=%d\n", a, b, c);*/    return 0;}

十、 .h文件和.c文件的分工
1. 单文件的坏处
一个文件的内容太多,不利于阅读、调试
多人修改同一个文件出问题
公司里面是团队合作

  1. 将sum函数抽取到另一个.c文件中
    先直接调用sum函数,编译警告、链接main.c错误.#include “sum.c”, 编译链接main.c,运行成功如果avr.c中使用sum.c,编译链接main.c,运行程序
  2. 在其他文件中声明sum函数
    int sum(int,int);
    编译链接main.c
    编译链接sum.c
    编译链接main.c sum.c,运行成功
    avr.c利用一样的方法

  3. 将int sum(int,int)抽取到另外一个文件中
    不抽取声明的坏处:增加新的函数了
    抽取到.c文件中?开发工具会将所有的.c进行编译链接
    抽取到.h文件中

  4. 抽取步骤总结
    .c文件写函数的定义
    .h文件写函数的声明
    要想用我的函数,请包含我的.h文件

0 0
原创粉丝点击