当前位置: 首页 > article >正文

c语言练习题1(数组和循环)

1实现一个对整形数组的冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素,这意味着数列已经排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端(或底端)。

冒泡排序的基本步骤:

  1. 比较相邻的元素:如果第一个比第二个大(升序排序),就交换它们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码1(调用函数):

#include <stdio.h>    
  
// 冒泡排序函数  
// 参数:arr[] 是要排序的数组,sz 是数组的长度  
void bubbleSort(int arr[], int sz) {    
    // 外层循环控制排序的总轮数  
    for (int i = 0; i < sz - 1; i++) {    
        // 内层循环负责在每一轮中进行相邻元素的比较和可能的交换  
        // 注意,由于每一轮都会有一个元素被放到正确的位置,所以内层循环的次数可以减少  
        for (int j = 0; j < sz - 1 - i; j++) {    
            // 如果当前元素比下一个元素大,则交换它们  
            if (arr[j] > arr[j + 1]) {    
                // 交换 arr[j] 和 arr[j + 1]  
                int temp = arr[j];    
                arr[j] = arr[j + 1];    
                arr[j + 1] = temp;    
            }    
        }    
    }    
}    
  
// 主函数  
int main() {    
    // 定义一个整型数组并初始化  
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};    
    // 计算数组的长度  
    int sz = sizeof(arr) / sizeof(arr[0]);    
  
    // 调用排序函数对数组进行排序  
    bubbleSort(arr, sz);    
  
    // 打印排序后的数组  
    for (int i = 0; i < sz; i++) {    
        printf("%d\t", arr[i]);  // 使用制表符\t使输出更整齐  
    }    
    printf("\n"); // 添加换行符以更美观地结束输出  
  
    return 0;  // 程序正常结束  
}

代码2(没有调用函数):

#include<stdio.h>  
  
int main() {  
    // 定义一个整型数组并初始化  
    int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };  
  
    // 外层循环,控制排序的总轮数  
    // 因为每轮排序后,最大的数会被放到正确的位置,所以总共需要n-1轮(n为数组长度)  
    for (int i = 0; i < 9; i++) {  
        // 内层循环,负责在每一轮中进行相邻元素的比较和可能的交换  
        // 注意,由于每轮都会有一个元素被放到正确的位置,所以内层循环的次数可以减少  
        for (int j = 0; j < 10 - 1 - i; j++) {  
            // 如果当前元素比下一个元素大,则交换它们  
            if (arr[j] > arr[j+1]) {  
                // 使用临时变量temp进行交换  
                int temp = arr[j];  
                arr[j] = arr[j + 1];  
                arr[j + 1] = temp;  
            }  
        }  
    }  
  
    // 打印排序后的数组  
    for (int i = 0; i < 10; i++) {  
        printf("%d\t", arr[i]); // 使用制表符\t使输出更整齐  
    }  
  
    // 程序正常结束  
    return 0;  
}

2二分查找法:

二分查找法(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的工作原理是通过将待搜索区间分成两半,判断要查找的元素可能在哪一半,然后继续在可能存在目标元素的那一半区间内查找,直到找到元素或区间被缩小为0(即未找到元素)。二分查找法大大减少了查找的时间复杂度,使得在有序数组中查找元素的时间复杂度降低到了O(log n),其中n是数组的长度。

基本步骤

  1. 初始化:设置两个指针(或索引),分别指向数组的开始(left = 0)和结束(right = n-1),其中n是数组的长度。

  2. 比较中间元素:计算中间元素的索引mid = left + (right- left) / 2(注意这里使用(right - left) / 2是为了防止left+right直接相加可能导致的整数溢出)。然后,将中间元素与目标值进行比较。

  3. 调整查找范围

    • 如果中间元素正好是要查找的目标值,则查找成功,返回中间元素的索引。
    • 如果目标值小于中间元素,则说明目标值在左半部分,因此将right更新为mid - 1,继续在左半部分查找。
    • 如果目标值大于中间元素,则说明目标值在右半部分,因此将left更新为mid + 1,继续在右半部分查找。
  4. 重复步骤2和3:直到找到目标值或low大于high(此时说明目标值不在数组中),查找结束。

注意事项

  • 二分查找的前提是数组必须是有序的。
  • 数组中的元素可以重复,但在查找特定元素时,通常返回第一个或最后一个匹配的元素的索引。
  • 在某些情况下,如果数组允许插入或删除操作,可能需要重新排序数组以保持其有序性,以便能够使用二分查找。
  • 二分查找是高效的,但不适用于无序数组或链表等数据结构。

代码:

#include <stdio.h>  
  
int main()  
{  
    // 定义一个有序数组  
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };  
    // 要查找的键  
    int key = 3;  
    // 初始化左边界为数组的第一个元素索引  
    int left = 0;  
    // 初始化右边界为数组的最后一个元素索引  
    // 注意:sizeof(arr) / sizeof(arr[0]) 计算数组的总元素个数,然后减1得到最后一个元素的索引  
    int right = sizeof(arr) / sizeof(arr[0]) - 1;   
  
    // 当左边界小于等于右边界时,继续查找  
    while (left <= right)   
    {  
        // 计算中间元素的索引,防止(left + right)直接相加可能导致的整数溢出  
        int mid = left + (right - left) / 2;  
  
        // 如果中间元素大于要查找的键,说明要查找的键在左半部分  
        if (arr[mid] > key)   
        {  
            // 更新右边界为中间索引减一  
            right = mid - 1;  
        }  
        // 如果中间元素小于要查找的键,说明要查找的键在右半部分  
        else if (arr[mid] < key)  
        {  
            // 更新左边界为中间索引加一  
            left = mid + 1;  
        }  
        // 如果中间元素等于要查找的键,说明找到了  
        else  
        {  
            printf("找到了,下标是:%d\n", mid);  
            // 找到后退出循环  
            break;  
        }  
    }  
  
    // 如果循环结束还没有找到(即left > right),则打印"找不到"  
    if (left > right)  
        printf("找不到\n");  
  
    return 0;  
}

3统计一维数组中各元素出现的次数

题目描述
给定一个一维整型数组,请编写一个程序,统计数组中每个元素出现的次数,并打印出每个元素及其对应的出现次数。

输入
一维整型数组,例如 {1, 5, 6, 8, 2, 1, 4, 5, 2, 5}

输出
按元素值升序(或任何顺序)打印出每个元素及其出现的次数,例如:

 

复制代码

1出现的次数为:2
2出现的次数为:2
4出现的次数为:1
5出现的次数为:3
6出现的次数为:1
8出现的次数为:1

 代码:

#include<stdio.h>  
  
int main() {  
    // 定义一个整型数组a,包含10个元素  
    int a[10] = { 1,5,6,8,2,1,4,5,2,5 };  
      
    // 定义一个整型数组b,用于统计数组a中每个元素出现的次数  
    // 假设数组a中的元素范围在0到9之间,因此数组b的大小设置为10  
    int b[10] = {0}; // 初始化为0,表示开始时每个元素都未出现  
      
    // 遍历数组a,统计每个元素出现的次数  
    for (int i = 0; i < 10; i++) {  
        // 对于数组a中的每个元素a[i],将其在数组b中对应索引的值加1  
        // 假设数组a中的元素都是非负整数,且不超过9  
        b[a[i]]++;  
    }  
      
    // 遍历数组b,打印出每个元素在数组a中出现的次数  
    for (int i = 0; i < 10; i++) {  
        // 注意:这里原本有一个语法错误,即if语句后的分号导致if语句没有实际作用  
        // 移除分号,确保只有在b[i]大于0时才执行打印操作  
        if (b[i] > 0) { // 修正后的if语句  
            printf("%d出现的次数为:%d\n", i, b[i]);  
        }  
    }  
      
    return 0;  
}

4题目:实现矩阵的转置

题目描述
给定一个m×n的矩阵,请编写一个程序实现该矩阵的转置,即行列互换,得到一个n×m的矩阵。

输入
一个m×n的矩阵,矩阵的元素以二维数组的形式给出。

输出
转置后的n×m矩阵,同样以二维数组的形式输出。

示例
输入矩阵:

 

复制代码

12 34 25
78 25 95

输出矩阵(转置后):

 

复制代码

12 78
34 25
25 95

注意

  • 矩阵的转置意味着原矩阵的行变成新矩阵的列,原矩阵的列变成新矩阵的行。
  • 在编写程序时,需要考虑原矩阵和目标矩阵的维度,确保有足够的空间存储转置后的结果。
  • 本示例中,原矩阵是2x3的,因此转置后的矩阵是3x2的。

代码:

#include <stdio.h>  
  
int main() {  
    // 定义一个2x3的矩阵  
    int arr[2][3] = { {12, 34, 25}, {78, 25, 95} };  
    int i, j;  
  
    // 打印原矩阵  
    printf("原矩阵:\n");  
    for (i = 0; i < 2; i++) { // 遍历矩阵的行  
        for (j = 0; j < 3; j++) { // 遍历矩阵的列  
            printf("%d ", arr[i][j]); // 打印当前元素  
        }  
        printf("\n"); // 换行,以便打印下一行的元素  
    }  
  
    // 打印转置后的矩阵  
    printf("\n转置后的矩阵:\n");  
    // 定义一个3x2的矩阵用于存储转置后的结果  
    int arr1[3][2];  
    // 进行矩阵转置  
    for (i = 0; i < 2; i++) { // 遍历原矩阵的行  
        for (j = 0; j < 3; j++) { // 遍历原矩阵的列  
            arr1[j][i] = arr[i][j]; // 将元素放置到新矩阵的对应位置,实现转置  
        }  
    }  
  
    // 打印转置后的矩阵  
    for (i = 0; i < 3; i++) { // 遍历转置后矩阵的行  
        for (j = 0; j < 2; j++) { // 遍历转置后矩阵的列  
            printf("%d ", arr1[i][j]); // 打印当前元素  
        }  
        printf("\n"); // 换行,以便打印下一行的元素  
    }  
  
    return 0;  
}

5题目:一个3×3的网格,将1-9的9个数字分别放入9个方格中,使每行每列人及每个对角
线上的值相加都相同。

解释:

  1. 网格结构:首先,你有一个3x3的网格,这意味着它有3行和3列,总共9个方格。

  2. 数字填充:你需要将1到9这9个数字填入这9个方格中,每个数字只能使用一次。

  3. 特殊条件:填入的数字需要满足以下三个条件,使得每行、每列以及两个对角线上的数字之和都相等:

    • 行和相等:每一行上的三个数字相加得到的和是相同的。
    • 列和相等:每一列上的三个数字相加得到的和也是相同的。
    • 对角线和相等:两条对角线(从左上角到右下角,以及从右上角到左下角)上的三个数字相加得到的和同样需要相等

代码:

#include <stdio.h>
int main() {
	// 定义一个 3x3 的网格
	int arr[3][3] = {
		{2, 7, 6},
		{9, 5, 1},
		{4, 3, 8}
	};
// 打印网格
	printf("3x3 网格为:\n");
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
// 打印每行、每列、对角线的和以验证网格
	int row, col, diag1Sum = 0, diag2Sum = 0;
// 打印每行的和
	printf("\n每行的和:\n");
	for (int i = 0; i < 3; i++) {
		row = 0;
		for (int j = 0; j < 3; j++) {
			row += arr[i][j];
		}
		printf("第 %d 行的和: %d\n", i + 1, row);
	}
	// 打印每列的和
	printf("\n每列的和:\n");
	for (int j = 0; j < 3; j++) {
		col = 0;
		for (int i = 0; i < 3; i++) {
			col += arr[i][j];
		}
		printf("第 %d 列的和: %d\n", j + 1, col);
	}
	// 计算并打印主对角线的和
	for (int i = 0; i < 3; i++) {
		diag1Sum += arr[i][i];
	}
	printf("\n主对角线的和: %d\n", diag1Sum);

	// 计算并打印另外一边对角线的和
	for (int i = 0; i < 3; i++) {
		diag2Sum += arr
			[i][2 - i];
	}
	printf("另外对角线的和: %d\n", diag2Sum);
	return 0;
}


http://www.kler.cn/news/315287.html

相关文章:

  • python发送邮件 - email smtplib
  • vue2项目实现国际化(若依框架示例)
  • c语言习题
  • JS领域的AI工程利器分享
  • Spring Cloud Gateway组件
  • 如何在 Spring Boot中更改默认端口
  • sql语法学习
  • 【HTTPS】对称加密和非对称加密
  • 【C++前缀和 状态压缩】2588. 统计美丽子数组数目|1696
  • Springboot使用ThreadPoolTaskScheduler轻量级多线程定时任务框架
  • 网传阿里云盘出现bug,可看到其他用户云盘图片
  • VideoFileClip 切割视频
  • C#往压缩包Zip文件的文件追加数据
  • go注册中心Eureka,注册到线上和线下,都可以访问
  • 通过示例来展示C++中Lumda函数的原理是什么及如何来使用它?
  • SOI 刻蚀气体
  • DHCP协议原理(网络协议)
  • 用apache httpd来实现反向代理
  • openFrameworks_如何使用ofxXmlSettings和ofxGui来创建识别界面
  • 机器人的动力学——牛顿欧拉,拉格朗日,凯恩
  • C++ —— vector 的模拟实现
  • 【计算机网络】运输层协议解析
  • Flutter - Win32程序是如何执行main函数
  • jmeter得到的文档数据处理
  • 后端接收数组,集合类数据
  • 数据结构之算法复杂度
  • 基于BiGRU+Attention实现风力涡轮机发电量多变量时序预测(PyTorch版)
  • 软考中级软件设计师——数据结构与算法基础学习笔记
  • 【图灵完备 Turing Complete】游戏经验攻略分享 Part.5 编程
  • 【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)