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

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;
}

相关文章:

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

1实现一个对整形数组的冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的&#xff0c;直到没有再需要交换的元…...

实验3 Hadoop集群运行环境搭建和使用

实验3 Hadoop集群运行环境搭建和使用 一、实验介绍 本节实验旨在引导学生通过实际操作搭建一个基本的Hadoop集群,并进行基本的使用验证。实验包括在集群节点上添加域名映射以实现节点间的相互识别,配置免密SSH登录以便无密码访问各节点,安装和配置JDK以满足Hadoop的运行需求…...

前端文件上传全过程

特别说明&#xff1a;ui框架使用的是蚂蚁的antd 这里主要是学习前端上传接口的传递参数包括前端上传之前对于代码的整理 一、第一步将前端页面画出来 源代码&#xff1a; /** 费用管理 - IT费用管理 - 费用数据上传 */ import { useState } from "react"; import {…...

MySQL中的函数简单总结,以及TCL语句的简单讲解

文章目录 一、函数1、ifnull2、if3、case4、exists 存在5、字符串函数&#xff08;重点&#xff09;6、数学函数7、日期函数 二、TCL语句1、创建用户2、赋予权限3、修改mysql允许远程登录 一、函数 1、ifnull 当前⾯的值是null的时候&#xff0c;使⽤后⾯的默认值 ifnull(字段…...

GPS在Linux下的使用(war driving的前置学习)

1.ls /dev/tty* 列出所有与 tty 相关的设备文件。这些设备文件通常对应终端设备 ttyUSB0是GPS端口 2.cat /dev/ttyUSB0 用于读取并显示连接到 /dev/ttyUSB0 串口设备发送的原始数据 这种是GPS定位不全的&#xff0c;要拿到更开阔的地方 这种是GPS定位全的 因为会持续输出…...

开发经验总结: 读写分离简单实现

背景 使用mysql的代理中间件&#xff0c;某些接口如果主从同步延迟大&#xff0c;容易出现逻辑问题。所以程序中没有直接使用这个中间件。 依赖程序逻辑&#xff0c;如果有一些接口可以走读库&#xff0c;需要一个可以显示指定读库的方式来连接读库&#xff0c;降低主库的压力…...

MySQL(面试题 - 同类型归纳面试题)

目录 一、MySQL 数据类型 1. 数据库存储日期格式时&#xff0c;如何考虑时区转换问题&#xff1f; 2. Blob和text有什么区别&#xff1f; 3. mysql里记录货币用什么字段类型比较好&#xff1f; 4. MySQL如何获取当前日期&#xff1f; 5. 你们数据库是否支持emoji表情存储&…...

【C++ Primer Plus习题】17.7

问题: 解答: #include <iostream> #include <vector> #include <string> #include <fstream> #include <algorithm>using namespace std;const int LIMIT 50;void ShowStr(const string& str); void GetStrs(ifstream& fin, vector<…...

vue3(整合版)

创建第一个vue项目 1.安装node.js cmd输入node查看是否安装成功 2.vscode开启一个终端&#xff0c;配置淘宝镜像 # 修改为淘宝镜像源 npm config set registry https://registry.npmmirror.com 输入如下命令创建第一个Vue项目 3.下载依赖&#xff0c;启动项目 访问5173端口 …...

复制他人 CSDN 文章到自己的博客

文章目录 0.前言步骤 0.前言 在复制别人文章发布时&#xff0c;记得表明转载哦 步骤 在需要复制的csdn 文章页面&#xff0c;打开浏览器开发者工具&#xff08;F12&#xff09;Ctrl F 查找"article_content"标签头 右键“Copy”->“Copy element”新建一个 tx…...

【算法——二分查找】

理论基础&#xff1a; 程序员面试经典题&#xff0c;二分搜索一个区间&#xff0c;区间查找 (LeetCode 34)_哔哩哔哩_bilibili 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_bilibili 这个是红蓝法&#xff0c;很牛…...

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接&#xff1a;https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码&#xff1a;frkb 点击第一个进行安装&#xff0c;按步骤来即可。 2.汉化 &#xff08;1&#xff09;复制chinese.ptl文件 &#xff08;2&…...

MMain函数定义为WinMain函数看port1632.h和pwin32.h文件

编译win2k3的源代码的时候有时候看到MMain函数 ..//public/sdk/inc/port1632.h #if defined(WIN16) /* ---------------- Maps to windows 3.0 and 3.1 16-bit APIs ----------------*/ #include "ptypes16.h" #include "pwin16.h" #include "plan16.…...

单词搜索问题(涉及递归等)

目录 一题目&#xff1a; 二思路解释&#xff1a; 三解答代码&#xff1a; 一题目&#xff1a; newcode题目链接&#xff1a; 单词搜索_牛客题霸_牛客网 二思路解释&#xff1a; 思路&#xff1a;个人理解是找到word中的第一个元素&#xff0c;然后去递归的上下左右查找&am…...

Redis的一些通用指令

首先我们需要先连接客户端服务器&#xff0c;此时我们需要通过redis-cli和redis服务器进行交互&#xff0c;输入ping来确保通路的流畅 &#xff08;一&#xff09;get和set redis中最核心的两个命令就是get和set&#xff0c;get就是根据key来取出对应value&#xff0c;set就是把…...

C++中vector类的使用

目录 1.vector类常用接口说明 1.1默认成员函数 1.1.1构造函数(constructor) 1.1.2 赋值运算符重载(operator()) 2. vector对象的访问及遍历操作(Iterators and Element access) 3.vector类对象的容量操作(Capacity) 4. vector类对象的修改及相关操作(Modifiers and Stri…...

cmaklist流程控制——调试及发布

cmaklist流程控制 目前只会配置-编译调试-打包发布&#xff0c;并且不会workflow控制 后续学习配置-编译调试-测试-打包发布&#xff0c;workflow控制&#xff0c;理解整个流程&#xff0c;目前对流程控制理解也不够。 1.CMake Presets 先于Cmakelist文件&#xff0c;指导项…...

制作一个能对话能跳舞的otto机器人

OTTO机器人是一个开源外壳&#xff0c;硬件和软件的桌面机器人项目&#xff0c;非常适合新手研究和拓展。记住&#xff0c;他是一个能移动有表情能声音的机器人。 b站有很多演示和组装的视频&#xff0c;我就不多说了&#xff0c;照着做就好&#xff0c;因为硬件我也是刚入门&…...

git配置SSH

1 打开cmd窗口 2 在窗口中输入如下命令&#xff1a; 配置用户名&#xff1a; git config --global user.name “gyk” 配置邮箱&#xff1a; git config --global user.email “247929163qq.com” 继续在Git命令窗口中输入如下命令&#xff0c;即可生成SSH公钥和私钥 ss…...

mozilla/pdf.js view.html加载指定页码

mozilla/pdf.js view.html加载指定页码 在Mozilla’s PDF.js中&#xff0c;如果你想要在viewer.html加载时直接跳转到指定的页码&#xff0c;你可以通过修改URL来实现。 PDF.js使用查询参数来处理URL&#xff0c;其中page参数用于指定页码。你可以通过修改URL的查询字符串来设…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...