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

目录

冒泡排序:

数组查找:

字符串和数组:

字符串函数:

多维数组:

多维数组初始化

多维数组的遍历:

数组综合题:


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

冒泡排序:

  1. 以升序排序为例冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。
  2. 就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。
  3.  
  4. 小明班级有10人要参加比赛,进场时要按大小个升序排队,老师要用冒泡排序写一个小程序进行排序;
  5. #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;    
    }

    数组查找:

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

字符串和数组:

  1. 在C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。
  2. 一般有以下两种格式:
  • 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;
}

字符串函数:

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

多维数组:

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

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

  • 多维数组初始化

  • 要注意以下事项:

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

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

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

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

    多维数组的遍历:

  5. 多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。
  6. 不一样的就是多维数组需要采用嵌套循环,如:遍历输出int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
  7. 注意:多维数组的每一维下标均不能越界;
  8. 现有三行三列的二维数组int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,
  9. 编写程序实现计算对角线元素之和。
  10. #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

数组综合题:

  1. 在一个长度为10的整型数组里面,保存了班级10个学生的考试成绩。
  2. 要求编写5个函数,分别实现计算考试的总分,最高分,最低分,平均分和考试成绩降序排序。
  3. #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

请按任意键继续. . .

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值