数组
1.数组的引入
#include<stdio.h>
int main() {
int i;
int sum = 0;
int array[100];//定义了一个能存放100个数的数组
for (i=1;i<=100;i++) {
array[i - 1] = i;//(填充数组)使数组里的第[i-1]个元素得到i的值
}
for (i=0;i<100;i++) {
sum += array[i];//数组内每个数的结果累加
}
printf("累加的结果是:%d\n",sum);
return 0;
}
2.数组的定义及访问
#include<stdio.h>
int main() {
//1.数组是数据的集合(如0-100)
//2.数组的数据是同类型的(如1和1.2不能放进同一数组)
//3.数组地址是连续的
int array1[100];//1.没有初始化的数组,只申请了100个整数型的内存空间,最好初始化(如int array[100]=0,全部初始化为0)
int array2[10] = {1,2,3,4,5,6,7,8,9,10};//2.完整初试化的数组,10个空间都进行了赋值
int array3[100] = {1,2,3};//3.不完整初始化,只赋值了前三个空间
//数组通过下标来引用当中的某个元素
//数组从头开始不是从1开始是从0开始
//array[0] array[1] array[2]
// 1 2 3
//变量声明时,array[n]表示数组具有n个变量,其余情况则为访问数组第n-1个变量
for (int i = 0;i <10;i++) {
printf("array[%d]的值是%d\n",i+1,array2[i]);
}
return 0;
}
3.数组的应用之初始化及找大小
#include<stdio.h>
#define N 10
//提示用户找到10个数,并找出其中的最大值、最小值,并计算它们的平均值
int main() {
//1.定义一个10个整数的整数型数组(初始化数组)
int array[10] = {0};
//2.提示用户输入第几个数
//3.获取用户的输入
int i;
for (i = 0;i < N;i++) {
printf("请输入第%d个数:", i+1);
scanf_s("%d",&array[i]);
if (array[i] > 100 || array[i] < 0) {
printf("超出范围,请重新进入程序");
system("pause\n");
exit(-1);
}
}
//4.找最高分
int max = array[0];
for (i = 0;i < N;i++) {
if (max < array[i])
max = array[i];//不断将更大值赋给max
}
printf("最大值为:%d\n", max);
//5.找最低分
int min = array[0];
for (i = 0;i < N;i++) {
if (min > array[i])
min = array[i];//不断将更小值赋给min
}
printf("最小值为:%d\n", min);
//6.算平均值
int sum=0, av=0;
for (i = 0;i < N;i++) {
sum += array[i];
}
av = (float)sum / N;
printf("平均值是:%d\n", av);
}
4.数组和函数(算数组大小,数组传参,数组形参)
知识点:
(1)形式参数是一个已定义大小或者未定义大小的数组,如void printf(int datas[])其大小是无效的,不管中括号里写多少,都不能代表形参数组有多大,它告诉编译器,该参数只是一个地址,只传递一个地址;
(2)使用sizeof()时要包含<stdlib.h>;
(3)当sizeof的参数是数组名时,计算的是整个数组的存储大小;当sizeof的参数是指针时,计算的是指针的大小(8字节,64位系统)。
(4)数组名作为地址传递时,地址为数组首地址
#include<stdio.h>
#include<stdlib.h>
void arrayprint(int datas[3]) //形参中数组的大小是无效的,该参数只是一个地址,windows中用四个字节表示地址(Linux64位中用八个字节)
{
printf("数组的大小是:%d\n",sizeof(datas));//输出形参的数组大小
printf("一个int数据大小是:%d\n",sizeof(int));//输出int(整型)的大小
printf("函数调用中:datas数组元素个数为%d个\n",sizeof(datas)/sizeof(datas[0]));//输出形参的元素个数
}
int main()
{
int array[3] = {11,22,33};
printf("array数组元素个数为%d个\n\n",sizeof(array)/sizeof(array[0]));
//数组的元素个数==数组的大小/数组单个元素的大小(int型元素大小为4个字节)
arrayprint(array);//数组名作为实际参数,调用arrayprint函数
}
5.数组和函数综合应用
#include<stdio.h>
//提示用户找到10个数,并找出其中的最大值、最小值,并计算它们的平均值
void inputing(int datas[],int size) //提示用户输入第几个数,获取用户的输入
{
int i;
for (i = 0;i < size;i++) {
printf("请输入第%d个数:", i + 1);
scanf_s("%d", &datas[i]);
if (datas[i] > 100 || datas[i] < 0) {
printf("超出范围,请重新进入程序\n");
system("pause\n");
exit(-1);
}
}
}
void printing(int datas[], int size)
{
for (int i=0;i<size;i++)
{
printf("第%d个学生的成绩是%d\n",i+1,datas[i]);
}
}
int best(int datas[], int size)
{
int max = datas[0];
for (int i = 0;i < size;i++) {
if (max < datas[i])
max = datas[i];//不断将更大值赋给max
}
printf("最大值为:%d\n", max);
return max;
}
int lowest(int datas[], int size)
{
int min = datas[0];
for (int i = 0;i <size;i++) {
if (min > datas[i])
min = datas[i];//不断将更小值赋给min
}
printf("最小值为:%d\n", min);
return min;
}
float av(int datas[], int size)
{
int sum = 0, ;
float av = 0;
for (int i = 0;i < size;i++) {
sum += datas[i];
}
av = (float)sum / size;
printf("平均值是:%d\n", av);
return av;
}
int main() {
//定义一个10个整数的整数型数组(初始化数组)
int array[10] = { 0 };
int len;
len = sizeof(array) / sizeof(array[0]);
//1.输入数据
inputing(array,len);
//2.打印数据
printing(array, len);
//3.找最高分
best(array, len);
//4.找最低分
lowest(array, len);
//5.算平均值
av(array, len);
}
6.斐波那契数列
斐波那契数列(Fibonacci sequence),指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
C语言实现:算法核心:arr[0]=0,arr[1]=1,arr[n]=arr[n-1]+arr[n-2]
#include <stdio.h>
void Fibonacci(int array[],int size)
{
int n;
for(n=2;n<=size;n++)
{
array[n]=array[n-1]+array[n-2];
}
printf("斐波那契数列前30个数为:");
for(n=0;n<=size;n++)
{
printf("%d ",array[n]);
}
printf("\n done \n");
}
int main(){
int arr[30]={0,1};
int len=sizeof(arr)/sizeof(arr[0]);
Fibonacci(arr,len);
}
7.冒泡排序
#include <stdio.h>
//演示为从大到小
//不停地左右互换,大的一直往左走
void BubbleSort(int array[],int lenth)
{
int i,j;
int temp;//用作交换
for(i=0;i<lenth-1;i++)
{
for(j=0;j<lenth-1-i;j++)
{
if(array[j+1]>array[j])
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
printf("重新排列后的结果是:");
for(i=0;i<lenth;i++){
printf("%d ",array[i]);
}
}
int main(){
int len;
int arr[]={10,20,30,40};
len=sizeof(arr)/sizeof(arr[0]);
BubbleSort(arr,len);
}
8.简单选择排序
#include <stdio.h>
//后面的数按顺序与第一个数对比,比出最大的放在第一位
//接着后面的数按顺序与第二个数对比,放在第二位
//以此类推,确认从大到小的顺序
void SimpleSorting(int array[],int lenth)
{
int i,j;
int temp;//用作交换
for(i=0;i<lenth;i++)
{
for(j=i+1;j<lenth;j++)
{
// printf("这是第%d次循环,array[%d]=%d,array[%d]=%d\n",i+1,i,array[i],j,array[j]);
if(array[j]>array[i])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
// printf("这是第%d次循环,更换后:array[%d]=%d,array[%d]=%d\n",i+1,i,array[i],j,array[j]);
}
}
}
printf("重新排列后的结果是:");
for(i=0;i<lenth;i++){
printf("%d ",array[i]);
}
}
int main(){
int len;
int arr[]={10,30,20,40};
len=sizeof(arr)/sizeof(arr[0]);
SimpleSorting(arr,len);
}
9.二维数组
9.1.定义
二维数组常称为矩阵,把二维数组写成**行**(column)和**列**(row)的排列形式,一般形式为
类型说明符 数组名[常量表达式] [常量表达式]
int a[3] [4],b[4] [5]
定义a为3x4(3行4列)的数组,b为4x5(4行5列)的数组
之所以说二维数组是**特殊的一维数组**,解释如下:
拿a[3] [4]举例把每行看作一个元素,那么有a[0] a[1] a[2]三个元素,把每个元素展开,他们又包含四个元素a[0] [0] ,a[0] [1] ,a[0] [2],a[0] [3]
9.2.初始化
1.分行赋值
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
//花括号里套花括号,每个花括号是一行
2.不分行(类似一维数组)
#include <stdio.h>
int main(){
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int i,j;
for(i=0;i<3;i++)//二维数组的遍历
{
printf("第%d行的各个元素及其大小:",i+1);
for(j=0;j<4;j++)
{
printf(" a[%d][%d]=%d ",i,j,a[i][j]);
}
printf("\n");
}
}
3.部分赋值
int a[3][4]={{1},{2},{3}};
//对每行的第一个元素进行赋值,反正不赋值就默认为0
如果对全部元素进行赋值,行的括号(第一维)可以不写,列(第二维)必须写
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//等价于
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
9.3.应用:二维数组找最大值及其对应下标
#include <stdio.h>
int main(){
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int hang,lie;
int max = a[0][0];
int i,j;
for(i=0;i<3;i++)
{
printf("第%d行的各个元素及其大小:",i+1);
for(j=0;j<4;j++)
{
printf(" a[%d][%d]=%d ",i,j,a[i][j]);
if(a[i][j]>max)
{
max=a[i][j];
hang = i;
lie
}
}
printf("\n");
}
printf("最大值的是第%d行第%d个,大小为%d",hang,lie,max);
}