【C语言】06-数组

此笔记由个人整理

尚观C语言

一、一维数组

定义

  • [存储类型] 数据类型 标志符 [下标]
#include "stdio.h"
#include "stdlib.h"
#define	M	3

int main()
{
    int arr[M];//定义,初始化
    
    printf("%d\n",sizeof(arr));
    printf("arr = %p",arr);
    
    for(i = 0;i < M;i++)
    {
        scanf("%d",&arr[i]);
    }
    
    for(i = 0;i < M;i++)
    {
        printf("%p --> %d\n",&arr[i],arr[i]);//元素引用
    }
    exit(0);
}

初始化

  • 不进行初始化
int arr[3];
  • 全部初始化
int arr[3] = {1,2,3};
  • 部分初始化(初始化到的值为原值,没有初始化的值为0)
int arr[3] = {1};
  • static(全0)
static int arr[3];

元素引用

  • 数组名[下标]
  • 下标从0开始

数组名

  • 数组名是表示地址的常量,也是数组的起始位置

数组越界

  • 数组下标越界,编译器是不会检查出错误的,但是实际后果可能会产生严重的后果。

练习

1)斐波那契数列,前十项(在数组中逆序存放)

#include "stdio.h"
#include "stdlib.h"

void fibonacci(void)
{
    int fib[10] = {1,1};
    int i,j,tmp;
    
    for(i = 2;i < sizeof(fib)/sizeof(fib[0]);i++)
    	fib[i] = fib[i-1] + fib[i-2];
    for(i = 0;i < sizeof(fib)/sizeof(fib[0]);i++)
        printf("%d\t",fib[i]);
    printf("\n");
    
    i = 0;
    j = sizeof(fib)/sizeof(fib[0])-1;
    
    while(i<j)
    {
        tmp = fib[i];
        fib[i] = fib[j];
        fib[j] = tmp;
        
        i++;
        j--;
    }
    for(i = 0;i < sizeof(fib)/sizeof(fib[0]);i++)
        printf("%d\t",fib[i]);
    printf("\n");
    
    return;
}
int main()
{
    fibonacci();
}
  • 结果

image-20200613212052284

2)数据排序:冒泡、选择法、快速排序

//冒泡排序
//让第一个数与后一个数相比,如果相比结果为小则不动,让后一个数与再后一个数相比;如果相比结果为大则后移,让后移的数与再后一个数相比。目的是将其中最大的数后移到最后一位。
#include "stdio.h"
#include "stdlib.h"
#define N	10
static void sort1()
{
    int a[N] = {12,8,45,30,98,67,2,68,11};
    int tmp;
    int i,j;
    for(i = 0;i < N ;i++)
        printf("%d ",a[i]);
    printf("\n");
    
    for(i = 0;i < (N-1);i++)
    {
        for(j = 0;j < (N-1-i);j++)
        {
            if(a[j] > a[j+1])
            {
                tmp = a[i];
                a[i] = a[j+1];
                a[j+1] =tmp;
            }
        }
    }
    for(i = 0;i < N ;i++)
        printf("%d ",a[i]);
    printf("\n");
}
int main()
{
    sort1();
    exit(0);
}
  • 结果

image-20200613212120894

//选择法排序
//找到其中最小的值,将其移位到最前面,被替换的值放到最小值之前所在的位置,剩下的内容不变;在找出了第一位的最小值,将其放到第二位,被替换的值放到最小值之前所在的位置,剩下的不变;依次移位,最终得到正确的排序。
#include "stdio.h"
#include "stdlib.h"
#define N	10
static void sort2()
{
    int a[N] = {23,45,90,76,13,55,76,45,3,8};
    int i,j,k,tmp;
    for(i = 0;i < sizeof(a)/sizeof(a[i]);i++)
        printf("%d",a[i]);
    printf("\n");
    
    for(i = 0;i < (N-1);i++)
    {
        k = i;
        for(j = i+1;j < N;j++)
        {
            if(a[j] < a[k])
                k=j;
        }
        if(i != k)
        {
            tmp = a[i];
            a[i] = a[k];
            a[k] =tmp;
        }
    }
    
    for(i = 0;i < sizeof(a)/sizeof(a[i]);i++)
        printf("%d",a[i]);
    printf("\n");
}
int main()
{
    sort2();
    exit(0);
}
  • 结果

image-20200613212211434

3)求逆序数

//gjl:求逆序数,要用户自己输入数组
#include "stdio.h"
#include "stdlib.h"
#define N	10
static void nixu()
{
	int arr[N];
	int i,j,count=0;
	printf("Please enter 10 number:\n");

	for(i = 0;i < 10;i++)
		scanf("%d",&arr[i]);

	for(i = 0;i < (N-1);i++)
	{
		for(j = i;j < (N-1);j++)
		{
			if(arr[i] > arr[j])
			{
				count++;
				printf("%d >%d\n",arr[i],arr[j]);
			}
		}
	}

	printf("逆序数=%d",count);
}

int main()
{
	nixu();
	exit(0);
}
  • 结果

image-20200613212244094

4)进制转换

  • 输入一个十进制数,转换为你想要的进制数
//gjl:求逆序数,要用户自己输入数组
#include "stdio.h"
#include "stdlib.h"
#define N	10
static void base_convert(void)
{
    int num,base;
    int n[128];
    int i = 0;
    
	printf("please enter the coverted num:");
    scanf("%d",&num);
    printf("please enter the base:");
    scanf("%d",&base);
    
    do
    {
        n[i] = num % base;
   		num = num / base;
    	i++;
    }while(num != 0);
    
    for(i --;i >= 0;i--)
	{
		if(n[i]>=10)
			printf("%c",n[i]-10+'A');
		else
        printf("%d",n[i]);
	}
    printf("\n");
}

int main()
{
	base_convert();
	exit(0);
}
  • 结果

image-20200614111528883

5)删除法求质数

//gjl:求逆序数,要用户自己输入数组
#include "stdio.h"
#include "stdlib.h"
#define N	1001
static void primer(void)
{
    char primer[N] = {0};
	int i,j;
    for(i = 2;i < 1001;i++)
    {
        if(primer[i] == 0)
        {
        	for(j = i*2;j < 1001;j += i)
            	primer[j] = -1;  
        }
    }
    
    for(i = 2;i < 1001; i++)
        if(primer[i] == 0)
            printf("%d ",i);
	printf("\n");
}

int main()
{
	primer();
	exit(0);
}
  • 结果

image-20200614113830760

二、二维数组

定义

  • [存储类型] 数据类型 标识符 [行下标] [列下标]
#include "stdio.h"
#include "stdlib.h"
#define M	2
#define N	3
int main()
{
    int a[M][N];
    int i,j;

    #if 0
	printf("please enter 6 num:\n");
    for(i = 0;i < M;i++)
        for(j = 0;j < N;j++)
            scanf("%d",&a[i][j]);
    #endif
    
    for(i = 0;i < M;i++)
    {
        for(j = 0;j < N;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }    
        
    exit(0);
}
  • 结果

image-20200614190408184

初始化

  • 不进行初始化
int a[2][3];
  • 全部初始化
int a[2][3] = {{1,3,2},{4,5,6}};
  • 部分初始化(初始化到的值为原值,没有初始化的值为0)
    • 行号可以省略,但列号不能省略
int a[2][3] = {{1,2},{3}};

元素引用

  • 数组名 [行下标] [列下标]

存储形式

  • 顺序存储,按行存储

深入理解二维数组

  • 二维数组是多个一维数组组成的连续存储空间
  • 一位数组:
int a[M];
//a+1为a[1]的存储位置-->a[0]的地址基础上增加一个int存储字节
//移动一个元素
  • 二维数组:
int a[M][N];
//a+1为a[1][0]的存储位置-->a[0][0]的地址基础上增加N个int存储字节
//移动一行元素

练习

1)行列互换

#include "stdio.h"
#include "stdlib.h"
#define M	2
#define N	3
static void change(void)
{
    int a[M][N] = {1,2,3,4,5,6},b[N][M];
    int i,j;
    
    for(i = 0;i < M;i++)
    {
        for(j = 0;j < N;j++)
        {
            printf("%d ",a[i][j]);
            b[j][i] = a[i][j];
        }
        printf("\n");
    }
    
    printf("\n");
    
    for(i = 0;i < N;i++)
    {
        for(j = 0;j < M;j++)
            printf("%d ",b[i][j]);
   		printf("\n");
    }
}

int main()
{
    change();
    exit(0);
}
  • 结果

image-20200614194543482

2)求最大值及其所在位置

#include "stdio.h"
#include "stdlib.h"
#define M	2
#define N	3
static void maxfunc(void)
{
    int a[M][N] = {1,2,3,4,5,6};
    int i,j;
    int max = a[0][0],row = 0,colum = 0; 
    
    for(i = 0;i < M;i++)
    {
        for(j = 0;j < N;j++)
        {
            if(max < a[i][j])
            {
                max = a[i][j];
                row = i;
                colum = j;
            }
        }
    }
    printf("max=a[%d][%d]=%d",row,colum,max);
}

int main()
{
    maxfunc();
    exit(0);
}
  • 结果

image-20200614202632665

3)求各行与各列的和

#include "stdio.h"
#include "stdlib.h"

static void sumfunc(void)
{
    int a[5][4] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
    int i,j;
 
    for(i = 0;i < 4;i++)
    {
        for(j = 0;j < 3;j++)
        {
            a[4][3] += a[i][j];
            a[4][j] += a[i][j];
            a[i][j] += a[i][j];
        }
    }
    for(i = 0;i < 5;i++)
    {
        for(j = 0;j < 4;j++)
            printf("%4d ",a[i][j]);
        printf("\n");
    }
}

int main()
{
    sumfunc();
    exit(0);
}
  • 结果

4)矩阵乘积

#include "stdio.h"
#include "stdlib.h"
#define M	2
#define N	3
#define K	2
static void func(void)
{
    int a[M][N] = {1,2,3,4,5,6};
    int b[N][K] = {1,3,4,1,2,7};
    int c[M][K];
    int i,j,k;
    
    for(i = 0;i < M;i++)
    {
        for(j = 0;j < K;j++)
        {
            for(k = 0;k < N;k++)
            	c[i][j] = a[i][k] * b[k][j];
        }
    }
    for(i = 0;i < M;i++)
    {
        for(j = 0;j < K;j++)
            printf("%4d",c[i][j]);
    printf("\n");
    }
}

int main()
{
    func();
    exit(0);
}
  • 结果

三、字符数组

定义

  • [存储类型] 数据类型 标识符 [下标] …
#include "stdio.h"
#include "stdlib.h"
#define N	3
int main()
{
    int i;
	char str[N] = {'a','b','c'};
    
    for(i = 0;i < N;i++)
        printf("%c ",str[i]);
    printf("\n");
}

初始化

  • 单个字符初始化
char str[3] = {'a','b','c'};
  • 字符串初始化(相比于单个字符初始化有尾零的区别)
char str[3] = "ab";

存储形式

输入输出

  • 输入
    • scanf():
  • 输出
#include "stdio.h"
#include "stdlib.h"
#define N	32
int main()
{
	char str[N],str1[N],str2[N];
    
    scanf("%s%s%s",str,str1,str2);
    printf("%s\n%s\n%s\n",str,str1,str2);
}
  • 结果

image-20200614214201156

常用函数

strlen与sizeof

  • strlen:计算字符串长度,不会包含尾零,以尾零为结束标记
  • sizeof:计算字符串长度,包含尾零
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
    char str[] = "hello";
    
    printf("strlen(str) = %d\n",strlen(str));
    printf("sizeof(str) = %d\n",sizeof(str));
    
}
  • 结果

image-20200614215036802

strcpy与strncpy

  • strcpy:将字符串拷贝到指定的位置
  • strncpy:根据设置的大小,拷贝向对应长度的值到指定的位置
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define STRSIZE	32
int main()
{
    char str1[32] = "hello";
    char str2[STRSIZE];
    
    strcpy(str1,"abcde");
    strncpy(str2,"fghigklm",STRSIZE);
    
    printf("strcpy-->%s\n",str1);
    printf("strncpy-->%s\n",str2);
}
  • 结果

image-20200614220115105

strcat与strncat

  • strcat:连接字符串
  • strncat:指定大小连接字符串
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define STRSIZE	32
int main()
{
    char str1[STRSIZE] = "hello";
    char str2[STRSIZE] = "hello";
    
    strcat(str1," ");
    strcat(str1,"c");
    
    strncat(str2," ",STRSIZE);
    strncat(str2,"world",STRSIZE);
    
    puts(str1);
    puts(str2);
}
  • 结果

image-20200614220844692

strcmp与strncmp

  • strcmp:前大为正,后大为负,相等为零
  • strncmp:前大为正,后大为负,相等为零(指定前多少为位相比)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define STRSIZE	32
int main()
{
    char str1[STRSIZE] = "hello";
    char str2[STRSIZE] = "helloa";
    
    printf("strcmp-->%d\n",strcmp(str1,str2));
    printf("strncmp-->%d\n",strncmp(str1,str2,5));
}
  • 结果

image-20200614221603666

练习

1)单词计数

#include "stdio.h"
#include "stdlib.h"

int main()
{
	char str[128];
    int count = 0;
    int flag = 0;
    int i;
    
    gets(str);
    for(i = 0;str[i] != '\0';i++)
    {
        if(str[i] == ' ')
            flag = 0;
        else//str[i] is a char
            if(flag == 0)
            {
                count++;
                flag = 1;
            }
    }
    
    printf("count = %d\n",count);
    exit(0);
}
//暂未支持tab键
  • 结果

image-20200615145550633

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值