【C语言-55】数组的应用(冒泡排序),数组查找;字符串和数组,多维数组,多维数组初始化,多维数组的遍历,数组综合题;

    xiaoxiao2025-02-11  17

    目录

    冒泡排序:

    数组查找:

    字符串和数组:

    字符串函数:

    多维数组:

    多维数组初始化

    多维数组的遍历:

    数组综合题:


    [------慕课网:https://www.imooc.com/learn/249]

    冒泡排序:

    以升序排序为例冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。 小明班级有10人要参加比赛,进场时要按大小个升序排队,老师要用冒泡排序写一个小程序进行排序; #include <stdio.h> int main() { double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80}; int i,j; printf("\n************排队前*************\n"); for(i=0;i<10;i++) { if(i != 9) printf("%.2f, ", arr[i]); //%.2f表示小数点后精确到两位 else printf("%.2f", arr[i]); //%.2f表示小数点后精确到两位 } for(i=8; i>=0; i--) { for(j=0;j<=i;j++) { if( arr[j]>arr[j+1]) //当前面的数比后面的数大时 { double temp; //定义临时变量temp temp=arr[j];//将前面的数赋值给temp arr[j]=arr[j+1];//前后之数颠倒位置 arr[j+1]=temp; //将较大的数放在后面 } } } printf("\n************排队后*************\n"); for(i=0;i<10;i++) { if(i != 9) printf("%.2f, ", arr[i]); //%.2f表示小数点后精确到两位 else printf("%.2f", arr[i]); //%.2f表示小数点后精确到两位 } return 0; }

    数组查找:

    当我们购物之后,拎着购物袋回到家,会一一检查购物袋中的物品看是否缺少或者都是想购之物。那么应用到程序中,可以使用数组查找功能,看看是否存在该数据,如果存在并返回该元素的下标。数组元素的查找也有很多查找方式,但是我们这里可以最简单的方式,通过遍历实现数组元素的查找。比如以下程序实现在指定数组中查找指定元素的功能,如果找到该元素返回该元素的下标,否则返回-1: 

     

    字符串和数组:

    在C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式: char 字符串名称[长度] = "字符串值";char 字符串名称[长度] = {'字符1','字符2',...,'字符n','\0'};注意:

    1、[ ]中的长度是可以省略不写的;

    2、采用第2种方式的时候最后一个元素必须是'\0','\0'表示字符串的结束标志;

    3、采用第2种方式的时候在数组中不能写中文。

    4 在输出字符串的时候要使用:printf(“%s”,字符数组名字);或者puts(字符数组名字);。例如:

    #include <stdio.h> /* 定义say函数 */ void say(char string[]) { printf("%s\n",string);//打印字符串 } int main() { //定义字符串数组 char string[] = "千夜"; say(string); //调用say函数输出字符串 return 0; }

    字符串函数:

    常见字符串格式:

    使用字符串函数注意以下事项:strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的。比如:strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较;返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ASCII码小,例如:strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝,比如:、strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串,如:

    多维数组:

    多维数组的定义格式是:数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 这样定义了一个名称为num,数据类型为int的二维数组。其中第一个[3]表示第一维下标的长度;第二个[3]表示第二维下标的长度;我们可以把上面的数组看作一个3×3的矩阵,如下图:多维数组的初始化与一维数组的初始化类似也是分两种: 1、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};

    2、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;

    多维数组初始化

    要注意以下事项:

    1、采用第一种始化时数组声明必须指定列的维数。

    因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;

    2、采用第二种初始化时数组声明必须同时指定行和列的维数。

    以下程序中的主方法中分别定义名为arr1和arr2的两行两列的二维整型数组。arr1使用第一种初始化,arr2使用第二种初始化。分别给arr1和arr2数组元素初始化为10,20,30,40。第一行元素为10和20,第二行元素为30和40。 #include <stdio.h> int main() { int arr1[][2]={{10,20},{30,40}}; int arr2[2][2]{10,20,30,40}; return 0; }

    多维数组的遍历:

    多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。不一样的就是多维数组需要采用嵌套循环,如:遍历输出int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}};注意:多维数组的每一维下标均不能越界;现有三行三列的二维数组int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,编写程序实现计算对角线元素之和。 #include <stdio.h> int main() { int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; int i,j; int sum=0; for(i=0;i<3;i++) { for(j=0;j<3;j++){ if(i%2==0&&j%2==0) sum=sum+arr[i][j]; } } sum=sum+arr[1][1]; printf("对角线元素之和是:%d\n",sum); return 0; }

    运行结果为:对角线元素之和是:25

    数组综合题:

    在一个长度为10的整型数组里面,保存了班级10个学生的考试成绩。要求编写5个函数,分别实现计算考试的总分,最高分,最低分,平均分和考试成绩降序排序。 #include <stdio.h> #include<stdlib.h> int tatol(int score[10]) { for (int i = 0; i < 9; i++) { score[i + 1] += score[i]; } printf("本次考试总分为:%d\n\n本次考试平均分为:%d\n\n", score[9], score[9] / 10); return 0; } int Max(int score[10]) { int max = score[0]; for (int j = 1; j < 10; j++) { if (score[j] > max) { max = score[j]; } } printf("本次考试最高分为:%d\n\n", max); return 0; } int Min(int score[10]) { int min = score[0]; for (int k = 0; k < 10; k++) { if (score[k] < min) { min = score[k]; } } printf("本次考试最低分为%d\n\n", min); return 0; } int paixu(int score[10]) { for (int i = 0; i< 9; i++) { for (int j = 0; j< 9 - i; j++) if (score[j] <score[j + 1]) { int k = score[j]; score[j] = score[j+ 1]; score[j + 1] = k; } } printf("考试成绩降序如下:\n"); for (int j = 0; j< 10; j++) { printf("%d ", score[j]); } printf("\n\n"); return 0; } int main(){ int score[10] = { 67,98,75,63,82,79,81,91,66,84 }; tatol(score); Max(score); Min(score); paixu(score); system("pause"); return 0; }

    结果:

    本次考试总分为:786 本次考试平均分为:78 本次考试最高分为:786 本次考试最低分为67 考试成绩降序如下: 786 702 636 545 464 385 303 240 165 67 请按任意键继续. . .

     

    最新回复(0)