控制流的高级用法或探讨更复杂的编程主题

好的!接下来我们可以继续深入学习一些控制流的高级用法或探讨更复杂的编程主题。以下是一些可以帮助你提升C语言水平的内容,你可以根据兴趣选择接着学:

1. 嵌套循环

在许多情况下,循环可以被嵌套在其他循环中,形成二维或多维的迭代过程。嵌套循环通常用于处理多维数组或矩阵。

示例:打印乘法表

c 复制代码
#include <stdio.h>

int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= 9; j++) {
            printf("%d * %d = %2d\t", i, j, i * j);
        }
        printf("\n");
    }

    return 0;
}

2. 循环控制:break 和 continue

breakcontinue 是控制循环行为的关键字。

  • break: 退出循环,终止当前循环的执行。
  • continue: 跳过当前迭代,直接进入下一次循环。

示例:break 和 continue

c 复制代码
#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            continue;  // 跳过5
        }
        if (i == 8) {
            break;  // 终止循环
        }
        printf("%d\n", i);
    }

    return 0;
}

3. 递归函数

递归是一种函数调用自身的编程技巧,常用于解决一些自相似问题,如阶乘、斐波那契数列、汉诺塔问题等。

示例:计算阶乘

c 复制代码
#include <stdio.h>

// 递归函数计算阶乘
int factorial(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

int main() {
    int num = 5;
    printf("Factorial of %d is %d\n", num, factorial(num));
    return 0;
}

4. 数组和字符串

数组是存储多个相同类型数据的结构。C语言中的字符串实际上是一个字符数组,以空字符 \0 结尾。

示例:处理数组

c 复制代码
#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += arr[i];
    }

    printf("Sum of array elements: %d\n", sum);
    return 0;
}

示例:处理字符串

c 复制代码
#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
    printf("%s\n", str);

    return 0;
}

5. 指针和内存管理

指针是C语言的一个强大特性,它使你可以直接操作内存。指针可以指向变量的地址,并通过解引用来访问变量的值。

示例:基本指针操作

c 复制代码
#include <stdio.h>

int main() {
    int num = 10;
    int *ptr = &num;  // 指针指向 num 的地址

    printf("Value of num: %d\n", num);
    printf("Address of num: %p\n", (void*)&num);
    printf("Value of ptr: %p\n", (void*)ptr);
    printf("Value at ptr: %d\n", *ptr);  // 解引用指针

    return 0;
}

6. 动态内存分配

在某些情况下,数组的大小可能在编译时无法确定,因此我们需要在运行时动态分配内存。mallocfree 是C语言中用于动态内存分配和释放的函数。

示例:动态分配数组

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr;
    int size;

    printf("Enter the size of the array: ");
    scanf("%d", &size);

    arr = (int *)malloc(size * sizeof(int));  // 动态分配内存
    if (arr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 输入数组元素
    for (int i = 0; i < size; i++) {
        printf("Enter element %d: ", i + 1);
        scanf("%d", &arr[i]);
    }

    // 打印数组
    printf("Array elements are: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }

    free(arr);  // 释放动态分配的内存

    return 0;
}

7. 综合练习题

  1. 递归计算斐波那契数列 :写一个递归函数,输入 n 并计算第 n 个斐波那契数。
  2. 矩阵乘法:编写一个程序,输入两个矩阵并计算它们的乘积。
  3. 冒泡排序算法:实现一个冒泡排序算法,对一个整数数组进行升序排序。

好的,下面是综合练习题的参考代码:

1. 递归计算斐波那契数列

斐波那契数列的定义是:F(0) = 0, F(1) = 1,对于 n >= 2F(n) = F(n-1) + F(n-2)。我们可以通过递归来计算第 n 个斐波那契数。

c 复制代码
#include <stdio.h>

// 递归函数计算斐波那契数
int fibonacci(int n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

int main() {
    int n;

    printf("Enter the value of n: ");
    scanf("%d", &n);

    printf("Fibonacci number %d is %d\n", n, fibonacci(n));

    return 0;
}

2. 矩阵乘法

矩阵乘法遵循行列乘法规则,两个矩阵 A 和 B 可以相乘的条件是 A 的列数等于 B 的行数。这里是一个计算两个矩阵乘积的程序。

c 复制代码
#include <stdio.h>

int main() {
    int m1, n1, m2, n2;

    // 输入第一个矩阵的行和列
    printf("Enter rows and columns for first matrix: ");
    scanf("%d %d", &m1, &n1);

    // 输入第二个矩阵的行和列
    printf("Enter rows and columns for second matrix: ");
    scanf("%d %d", &m2, &n2);

    // 检查是否可以相乘
    if (n1 != m2) {
        printf("Matrix multiplication not possible.\n");
        return -1;
    }

    int A[m1][n1], B[m2][n2], C[m1][n2];

    // 输入第一个矩阵
    printf("Enter elements of first matrix:\n");
    for (int i = 0; i < m1; i++) {
        for (int j = 0; j < n1; j++) {
            scanf("%d", &A[i][j]);
        }
    }

    // 输入第二个矩阵
    printf("Enter elements of second matrix:\n");
    for (int i = 0; i < m2; i++) {
        for (int j = 0; j < n2; j++) {
            scanf("%d", &B[i][j]);
        }
    }

    // 初始化结果矩阵为0
    for (int i = 0; i < m1; i++) {
        for (int j = 0; j < n2; j++) {
            C[i][j] = 0;
        }
    }

    // 矩阵乘法计算
    for (int i = 0; i < m1; i++) {
        for (int j = 0; j < n2; j++) {
            for (int k = 0; k < n1; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }

    // 输出结果矩阵
    printf("Product of the matrices:\n");
    for (int i = 0; i < m1; i++) {
        for (int j = 0; j < n2; j++) {
            printf("%d ", C[i][j]);
        }
        printf("\n");
    }

    return 0;
}

3. 冒泡排序算法

冒泡排序是一种简单的排序算法,它通过反复交换相邻元素来排序。下面是对一个整数数组进行升序排序的冒泡排序实现。

c 复制代码
#include <stdio.h>

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换相邻元素
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int n;

    // 输入数组大小
    printf("Enter number of elements: ");
    scanf("%d", &n);

    int arr[n];

    // 输入数组元素
    printf("Enter elements:\n");
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 冒泡排序
    bubbleSort(arr, n);

    // 输出排序后的数组
    printf("Sorted array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

说明

  • 斐波那契数列递归函数 :递归地计算斐波那契数列的第 n 项,使用简单的递归调用。

  • 矩阵乘法:程序要求用户输入两个矩阵的尺寸和元素,并根据矩阵乘法规则计算它们的乘积。

  • 冒泡排序算法:通过冒泡排序法,依次比较相邻元素,并交换不满足升序条件的元素,直到数组有序。

相关推荐
问道飞鱼39 分钟前
Redis缓存淘汰算法详解
redis·算法·缓存
喵~来学编程啦3 小时前
【经典机器学习算法】谱聚类算法及其实现(python)
算法·机器学习·聚类
六点半8883 小时前
【C++】“list”的介绍和常用接口的模拟实现
开发语言·数据结构·c++·算法·青少年编程·list
坊钰4 小时前
【Java SE 题库】移除元素(暴力解法)--力扣
java·开发语言·学习·算法·leetcode
转调4 小时前
每日一练:爬楼梯
c++·算法·leetcode
Liuxu09035 小时前
力扣 —— 跳跃游戏
算法·leetcode·游戏·力扣
t_181377845545 小时前
抖去推数字人---技术本地服务器技术开发步骤
算法·php·音视频
一颗星星辰6 小时前
C语言 | 第四章 | 常量 运算符-1
c语言·开发语言·算法
安於宿命6 小时前
【高效管理集合】并查集的实现与应用
数据结构·算法