709数组

思维导图

一、数组的特点

数组是用于连续存储多个同种数据类型数据的结构

二、一维整形数组

【1】定义

数据类型 数组名[长度];
//长度指的是数组中元素的个数
int arr[4];

【2】数组中元素访问

数组名[下标];
//数组中元素的下标从0开始最大到长度-1

【3】初始化和赋值

#include<myhead.h>
int main(int argc, const char *argv[])
{
    //定义了一个能存5个整形数据的数组arr,随机生成值
	int arr[5];
    //完全初始化
	int arr1[5]={1,4,6,8,10};
    //不完全初始化,未初始化的部分,默认为0
	int arr2[4]={3,6};
	printf("%d\n",arr2[2]);
    //给arr数组中的元素赋值
	    arr[0]=2;
	    arr[1]=4;
	    arr[2]=6;
	    arr[3]=8;
	printf("%d\n",arr[0]);

	return 0;
}

【4】数组越界*

访问不属于数组的空间
  1. 随机值
  2. 段错误

例子:

定义一个数组,使用循环,完成对数组中元素的终端输入和输出

#include<myhead.h>
int main(int argc, const char *argv[])
{
	int i,j;
	int arr[4];
	for(i=0;i<4;i++)
	{
		scanf("%d",&arr[i]);
	}
	for(i=0;i<4;i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

【5】数组的大小和长度

长度:sizeof(arr)/sizeof(arr[0])

大小:个数*单个元素的大小

例子:

#include<myhead.h>
int main(int argc, const char *argv[])
{
	int arr[4];//定义数组
	int b=0;
    //利用for循环给数组赋值
	for(int i=0;i<4;i++)
	{
		scanf("%d",&arr[i]);

	}
    //用for循环计算数组之和
	for(int i=0;i<4;i++)
	{
		b=b+arr[i];

	}
    //输出
	printf("和为%d\n",b);
	printf("平均值为%d\n",b/4);

	return 0;
}

【6】冒泡排序

冒泡排序是一个排序算法,思想:相邻的两个元素,两两比较

排序需要排长度-1次

例子:

#include<myhead.h>
int main(int argc, const char *argv[])
{
	int arr[]={12,9,45,7,34,73};
	int len=sizeof(arr)/sizeof(arr[0]);
	int i,j=0;
	int a=0,b=0;
    //外层循环控制排序次数,n个数排n-1次
	for (int i=1;i<len ; i++)
	{
        //内层循环控制相邻元素比较
		for(int j=0;j<len-i;j++)
		{
            //判断相邻两个数的大小关系
			if(arr[j]>arr[j+1])
			{
				b=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=b;
			}
		}
	}
	for(int i=0;i<len;i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

【7】选择排序

逻辑:

每次从待排序序列中找到最大/最小的元素和待排序序列中的第一个元素交换

例子:

#include<myhead.h>
int main(int argc, const char *argv[])
{
	int arr[]={4,35,24,5,9,2};
	int len = sizeof(arr)/sizeof(arr[0]);
	int min,i,j;
	int a=0;
    //外层控制排序次数
	for(i=1;i<len;i++)
	{
		min=i-1;
		for(j=i;j<len;j++)
		{
			if(arr[j]<arr[min])
			{
                //更新最小值下标
				min=j;
			}
		}
        //退出内层循环说明找到了最小值
        //判断是否是待排序序列中的第一个元素
		if(min!=i-1)
		{
			a=arr[min];
			arr[min]=arr[i-1];
			arr[i-1]=a;
		}
	}
	for (i=1; i<len; i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

三、一维字符数组

【1】定义

char 数组名[长度];

C语言中不提供字符串类型,所以常常用字符数组存储字符串

【2】初始化和赋值

方法一:使用字符初始化

方法二:使用字符串给字符数组初始化

#include <stdio.h>
int main(int argc, const char *argv[])
{
	//完全初始化
	char arr[3]={'a','b','c'};
	//不完全初始化,未初始化的部分默认为0
	char arr1[5]={'a','b','c'};
	//不给长度的初始化,需要给'\0'预留出空间
	char str[] = "hello";   //使用字符串给字符数组初始化时,注意要给结尾的'\0'预留出空间
	char str1[2] = "hi";
	printf("%ld\n",sizeof(str));
	int i = 0;
	while(str[i])    //等价于str[i]!=0
	{
		putchar(str[i]);
		i++;
	}
	return 0;
}

作业:

定义一个有10个元素的数组,终端输入学生成绩,将成绩排序后输出

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int arr[10];
    int len = sizeof(arr) / sizeof(arr[0]);
    int i, j, temp;
    //输入数据(从 0 开始存储)
    for (i = 0; i < len; i++)
    {
        printf("输入第 %d 个成绩:", i + 1);
        scanf("%d", &arr[i]);
    }
    //冒泡排序(外层循环控制轮数,内层循环比较相邻元素)
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    // 输出排序后的结果(从 0 开始输出)
    printf("\n排序后的成绩:\n");
    for (i = 0; i < len; i++)
    {
        printf("%d\n", arr[i]);
    }

    return 0;
}
输出结果:
终端输入一串字符,以'#'结束,统计大写字母、小写字母和数字字符的个数
#include<myhead.h>
int main(int argc, const char *argv[])
{
	char arr[100];//定义数组
	int i,j;
	int a=0,b=0,c=0;
	printf("请输入一串字符,以‘#’结束:\n");//输入
	for(i=1;i<100;i++)
	{
		arr[i]=getchar();//吸取字符,赋值给arr[i]
		if(arr[i]=='#')
		{
			break;
		}
        //计算小写字母个数
		if(arr[i]>='a'&&arr[i]<='z')
		{
			a++;
		}
        //计算大写字母个数
		else if(arr[i]>='A'&&arr[i]<='Z')
		{
			b++;
		}
        //计算数字字符个数
		else if(arr[i]>='0'&&arr[i]<='9')
		{
			c++;
		}
	}
    //输出
	printf("小写字母有%d个,大写字母有%d个,数字字符有%d个\n",a,b,c);

	return 0;
}

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值