c语言3月10日学习总结

1.break语句
// break 语句放在循环中,表示结束循环
// 也就是说,直接跳到循环以后,执行后面的代码

int i = 0;

    while (1) {
        break; //循环体什么也不做,直接跳出

        i++;

        break; //i+1 跳出

        printf("%d\n", i);

        break; //循环体整个执行一次 跳出
    }

break使用案例
// 写一段代码,要求用户输入一个数字,但是数字的范围必须是0到10(取不到)之间
// 如果输入不在此范围,或输入有误,请重新输入

   int inputNum;

    while (1) {
        printf("请输入一个数字\n");
        scanf("%d", &inputNum);

        if(inputNum >= 0 && inputNum < 10) break;

    }

2.continue语句
// continue;// 代码从这里进入下一次循环
// 例如当前为第0次循环,那么就跳至第1次循环
// 其后的循环体中的代码忽略

  long int i = 0;

    while (1) {

        i++;

        continue;  // i = 1 时跳出,执行下一次循环 

        printf("%d\n", i);

        continue;  //无意义,无作用
    }

使用案例:找出100内不能被3整除的数

int i = 1, temp;
    while (i <= 100) {
        temp = i;
        i++;

        if(temp % 3 == 0) continue;

        printf("%d\n", temp);

3.函数
C 语言中已经提供的函数的分类
1)字符型函数
2)转换函数
3)目录路径函数
4)诊断函数
5)图形函数
6)输入输出函数
7)接口函数
8)字符串函数
9)内存管理函数
10)数学函数
11)日期与时间函数
12)进程控制函数

  • 函数的使用分成三个部分:声明、定义、调用 函数是代码的打包,可以将有特定功能的代码写在函数里,使用时直
  • 接调用函数即可

char c;
int num = 0, inputNum;
int flag = 0; // 标记,0代码没有输入q,1代表输入q
int sum;


// 用户输入,判断为q,如是数字进行累加
int inputAndAdd() {
    // 逻辑
    scanf("%c", &c);
    if(c != '\n') {
        if(c >= '0' && c <= '9') {
            inputNum = c - '0';
            num = num * 10 + inputNum;
        } else if(c == 'q') {
            flag = 1;
        }
    }
    while (!(c == '\n' || c == 'q')) {
        scanf("%c", &c);
        if(c != '\n') {
            if(c >= '0' && c <= '9') {
                inputNum = c - '0';
                num = num * 10 + inputNum;
            } else if(c == 'q') {
                flag = 1;
            }
        }
    }
    if(flag == 0) {
        sum += num;
    }
    num = 0;

    return 0;
}


int main(int argc, const char * argv[]) {


    do {
        inputAndAdd();
    } while (flag == 0);

    printf("所求和为%d\n", sum);

    return 0;
}
  • 函数按照参数与返回值的分类:

    1,无参无返回值函数
    2,有参无返回值函数
    3,无参有返回值函数
    4,有参有返回值函数

  • 写一个函数,实际上就是写这个函数的执行过程,会处理的逻辑
    1),无参无返回值函数
    // 此类函数的使用最简单,一般就是一个固定的功能个
    // 基本语法:
    /*
    void 函数名() {
    函数体
    }
    */
    // 注意:
    // 1)函数不允许在函数内定义
    // 2)函数也是有名字的,这个也是标识符,命名规则与变量一致
    // 3)不允许有同名的函数(C 语言中没有函数重载的概念)
    // 4)此类函数一般表示一个固定的语法,或固定的执行逻辑,一般就是一段代码的打包

   void print_logo() {
    printf("********************************\n");
    printf("*      I love C programming    *\n");
    printf("********************************\n");
}
// 输入数字,打印数字的平方
    int num;
    do {
        printf("请输入数字:");
        scanf("%d", &num);

        // 打印平方
        printf("%d 的平方 是 %d\n", num, num * num);
        // 如果需要调用函数,直接使用语法 函数名()
        // 主调函数:主动调用函数的函数
        // 被调函数:被调用的函数
        print_logo();

    } while (1);

2).无参数有返回值的函数
无参有返回值函数,表示在函数调用的过程中,不需要传入参数
函数执行结束后会得到一个执行的结果

基本语法:

返回的数据类型 函数名() {
    函数体
    return 需要返回的值;
}

如果函数或得到一个整数,那么可以写: int getNum() ...
如果函数是要求平均值,即得到一个小数,那么可以写: 
        double getAvg() ...   
        float getAVG() ...
        char getChar() ...
return 值;
    表示的是函数的返回结果
    如果函数中是 return 1, 那么表明函数执行完就得到结果 1
    如果函数写的时 return 'a', 那么就表明函数执行完,得到结果 'a'

函数调用:
    函数名();

如何获得函数的返回值呢?
    将函数的调用看做成"函数调用表达式"
    如何获得表达式的值?   num = 1 + 2;    printf("%d\n", 1 + 2);
    num = getNum();  也支持直接使用: printf("%d\n", getNum());

案例:

// 写一个函数,要求用户输入数字,如果输入数字不在指定范围,即重新输入

int getNum10() {
    int num;
    do {
        printf("请输入数字:");
        scanf("%d", &num);
        if(num >= 10 || num < 0) printf("输入有误,");
    } while(num >= 10 || num < 0);

    return num;
}

// 获得运算符的函数:+ - * /
int getOperator() {
    int c;
    do {
        printf("请输入运算符(+0,-1,*2,/3):");
        scanf("%d", &c);
        // 要求的输入的是 0 1 2 3
        if(!(c == 0 || c == 1 || c == 2 || c == 3)) printf("输入有误,%d", c);
    } while (!(c == 0 || c == 1 || c == 2 || c == 3));

    return c;
}


int main(int argc, const char *argv[]) {

    int num1, num2, res = 0;
    int oper;


    // 提示用户输入
    num1 = getNum10();
    oper = getOperator();
    num2 = getNum10();

    // 进行计算
    switch (oper) {
        case 0/* + */:res = num1 + num2;break;
        case 1/* - */:res = num1 - num2;break;
        case 2/* * */:res = num1 * num2;break;
        case 3/* / */:res = num1 / num2;break;
    }


    // 打印结果:
    printf("%d %d %d = %d\n", num1, oper, num2, res);

3).有参数无返回值的函数

有参数无返回值的函数表示在调用的过程中,需要给定参数
函数执行结束不会生成数据返回

定义的语法:
    void 函数名(形式参数列表) {
        函数体
    }
形式参数列表决定了函数可以接受什么数据类型的值,以及需要接收多少个值
例:求两个数的平均值
    avg(1, 3)
如上函数在调用的时候需要接收两个数据(数值),并且数据是整数类型
因此形式参数列表可以写成:
    int num1, int num2
函数的定义:
    void avg(int num1, int num2) {
        ...
    }
函数: test(123, 'a', 123.456f)
    void test(int num, char ch, float num2) {...}
参数的名字:num, ch, num2 等可以随意取(复合标示符规范) 


参数一般是传入函数中进行处理,处理传入数据直接可以使用形式参数变量
     void avg(int num1, int num2) {
        // int num1, num2;
        printf("%d\n", (num1 + num2) / 2);
     }

案例:

void print_max(int num1, int num2) {

    if(num1 > num2) {
        printf("第一个数较大\n");
    } else {
        printf("第二个数较大\n");
    }
}


int main(int argc, const char * argv[]) {

    print_max(1, 2);
return 0;
}
// 根据传入的数字打印星星矩阵
// *********
// *********
// *********
// *********
void printStar(int rows, int columns) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            printf("* ");
        }
        printf("\n");
    }
}

4).有参数有返回值的函数
函数有参数,表示在调用的时候需要传递参数
函数有返回值,表示函数在执行结束时,会生成一个值以供返回

语法:
返回值类型 函数名(形式参数列表) {
    函数体
    return 值;
}
  • 当两个函数功能相似时,可以用一个函数调用另一个函数来实现部分功能
 // int getNumRange(-100, 50)    可以输入指定范围的数字
// int getNumFrm0(100)  可以输入0到100的数字`

int getNumRange(int min, int max) {
    int num;
    do {
        printf("请输入数字:");
        scanf("%d", &num);
        if(!(num >= min && num < max))
            // printf("输入数字不在指定反问,");
     printf("输入数字%d不在[%d, %d),", num, min, max);
    } while (!(num >= min && num < max));
    return num;
}
//第二个函数可以看成第一个函数min=0时的特例
int getNumFrm0(int max) {
    return getNumRange(0, max);
}

5).函数调用的补充说明
1>函数的return语句

  • 在有返回值的函数中 return 是用与函数值的返回

  • 在无返回值的函数中 return 是结束函数的标志

     return 的返回值格式:
         return 0;
         return (0);
     return 语句的位置
    
  • return放在循环体内表示函数结束

  • break放在循环体内表示循环结束

    2>函数声明

  • 就是在代码开始的时候,或函数开始的使用,声明函数,以告知编译器该函数的参数与返回值和名字,以便在函数定义出现前可以调用函数

    如何声明:
        一般直接将函数的花括号去掉(即函数的头部),将其加上分号放到代码的前面即可
    函数声明的位置
        1)放在文件开始的前面
        2)放在主调函数的开始的位置
    一个较为特别的写法
    
    函数声明语法的另一写法
        1)直接将函数头部加上分号写在前面
        2)将函数头部取出,删除所有形式参数的变量名,加分号
    

    3>实际参数与形式参数
    void func(int num) {…}
    称参数变量 num 为形式参数(形参)

    func(123);
    这里的 123 就是实际参数(实参)
    

    4>函数调用中实参与形参的传递过程

  • 函数在调用被调函数的时候,会及时的创建一段内存(栈),用于存储该函数需要的数据与变量

  • 主调函数调用被调函数的同时,会将参数变量所指的内存中的数据复制一份,传递给被调函数

  • 被调函数的变量与主调函数中的变量没有任何关系,只是内存里面存储的数值刚好相等

  • 参数传递以后,在被调函数中,修改参数的数据,与主调函数没有关系,是值传递

4.递归

  • 递归调用就是函数直接调用自己,或间接调用自己

  • 递归会不断的进行自我调用,因此需要考虑一个临界条件,让其不在继续递归下线

 函数() {
        ...
        if(要递归么) {
            函数();
        }else {
            做点别的
        }
        ...
    }

    递归就是自己调用自己(不考虑间接),即为递推结构
    等差数列:后一项与前一项的差是一个固定的数
        0 1 2 ...
        1 3 5 7 9 11 ...100项的值?
    func(100)
    第n项与第n-1项的关系
    func(n) == func(n - 1) + 2

    int func(int num) {
        if(num == 0) return 1;
        return func(num - 1) + 2;
    }
  • 要实现递归算法:

    1)找到地推关系
    2)找到临界条件

// 等差数列的递归函数
int func(int num) {
    if(num == 0) return 1;
    return func(num - 1) + 2;
}
int main(int argc, const char * argv[]) {

    for(int i= 0; i < 101; i++) {
        printf("%d\n", func(i));
    }

    return 0;
}

//计算Fibonacci数列第n项
// 1    1   2   3   5   8   13  ...
// 递推与临界

// func(n) == func(n-1) + func(n-2);
int func(int n) {
    if(n == 1 || n == 0) return 1;
    return func(n-1) + func(n-2);
}

//计算n!
// 1!   1
// 2!   2 = 2 * 1
// 3!   6 = 3 * 2 * 1
// 4!   24
// 5!   120
int f(int n) {
    if(n == 1) return 1;
    return f(n - 1) * n;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值