学习日记6-数组

数组定义:具有一定顺序关系的若干变量的集合,变量的数据类型必须相同

数组分类:1.数值数组,字符数组,指针数组,结构体数组。

一维数组

1.下标只有一个的数组 :<数据类型><数组名>【<常量表达式>】

2.数组名要符合标识符的命名规定

3.数组名不能和其他变量重名

4.方括号中常量表示数组元素个数

5.数组名表示内存首地址,是地址常量

6.编译时给数组分配连续内存。

一维数组的引用

1.数组必须逐个元素引用,而不能整体引用

2.注意下标从0开始,范围为0-n-1。

一维数组初始化

1.对于普通局部数组不初始化,数组中的元素的值是不确定的。

2.对于static修饰的数组,没有初始化,元素默认为0。

3.全局数组不初始化,数组元素默认为0;

4.全部初始化,int a[]={1,2,3,4,5};注意只能写成一行不能换行写。

5.部分初始化,其余的自动赋0;

6.数组的元素不能整体赋值,只能单个赋值。

多维数组

1.定义:具有两个或以上的下标,称为多维数组 例:a[10][10]

2.<数据类型><数组名>[常量表达式1][常量表达式2]

常量表达式1为行数,表达式2为列数,行数可以省略,但第二维列数不能省略。

3.初始化:

按行初始化,每一行的初始值用{}括起来 int a[2][3]={{1,2,3},{4,5,6}};

按元素排列顺序初始化 int a[2][3]={1,2,3,4,5,6};

4.内存分配:类似一维数组,按行优先存,内存任然是连续的。

字符数组和字符串

1.定义:字符数组是元素的数据类型为字符类型的数组。char c[] char c[][10];

2.初始化

逐个字符赋值

使用字符串常量来赋值,注意字符串结尾有\0,所以实际内存要多占一个字节,注意越界问题。

3.字符串的定义:指以‘\0’作为结束字符的一组字符,当把一个字符串存入一个数组,也把专门的结束符'\0'存入,作为此字符串结束标志。

4.字符串的输入输出

printf("%s")输出字符数组内容时会一直输出直到达到'\0'字符

scanf("%s")输入时,遇空格或回车结束。

字符串处理函数

1.字符串拷贝函数strcpy /strncpy

格式:strcpy(字符数组1,字符数组2)  / strncpy(字符数组1,字符数组2,number)

功能:将字符串2拷贝到字符数组1中/将字符数组2的前n个拷贝到字符数组1

返回值:返回字符数组1的首地址

注意:字符数组1必须足够大,拷贝时连'\0'一起拷贝

2.字符串连接函数strcat / strncat

格式:strcat(字符数组1,字符数组2)/strnact(字符数组1,字符数组2,number)

功能:将字符数组2连接到字符数组1后/将字符数组2前n个连接到字符数组1

返回值:字符数组1的首地址

注意:字符数组1要足够大,数组1的\0删除,在新的字符数组后加\0

3.字符串比较函数strcmp / strncmp

格式:strcmp(字符串1,字符串2)/strncmp(字符串1,字符串2,number)

功能:从左到右比较字符串1和字符串2(ASCII值)大小,直到遇到不同字符/从左到右比较前n个字符大小

返回值:= 返回为0  < 返回为负数 >返回为正整数

4.字符串长度函数strlen

格式 strlen(字符数组名)

功能:计算字符串有效长度

返回值:返回字符串实际长度,不包括\0

转义时\不算在内 \xhh表示16进制数,\ddd表示八进制数

实际例子

1.#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])

    char ch1[100]="hello";
    char ch2[]="hewlo";
    char ch3[]="\x69\144\n";
    int a,b;
    strcat(ch1,ch2);//字符串连接函数
    puts(ch1);
    putchar('\n');
    //strcpy(ch1,ch2);//字符串拷贝函数
    //puts(ch1);
   // putchar('\n');
    a=strcmp(ch1,ch2);//字符串比较函数
    printf("%d\n",a);
    b= strlen(ch3);//字符串有效长度函数
    printf("%d\n",b);
    return 0;

2.#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])

    char arr1[100]={};
    char arr2[]="hello brother";
    strncpy(arr1,arr2,5);
    puts(arr1);
    putchar('\n');
    return 0;

3.

//计算斐波那契数列前十项并逆序输出结果
//斐波那契数列,后一个元素为前两个元素的和
#include <stdio.h>

int main(int argc, char *argv[])

    int disc[10];
    disc[0]=disc[1]=1;
    int i;
    for(i=2;i<10;i++)
    {
        disc[i]=disc[i-1]+disc[i-2];
    }
    for(i=9;i>=0;i--)
    {
        printf("%d ",disc[i]);
    }
    return 0;

4.冒泡排序法
#include <stdio.h>
#define N 10
int main(int argc, char *argv[])
{   
    int i,j,t;
    int a[N];
    printf("please input %d numbers\n",N);
    for(i=0;i<N;i++)//循环输入元素
        scanf("%d",&a[i]);
    for(i=0;i<N-1;i++)//第一层循环一共循环排序N-1次
        for(j=0;j<N-1-i;j++)//第二层循环,比较大小并交换元素,每比较一次下一次循环次数都会少一次
        {
            if(a[j]>a[j+1])//如果当前元素大于下一个则交换元素
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    for(i=0;i<N;i++)//循环输出数组元素
        printf("%5d",a[i]);
    printf("\n");
    return 0;

5.选择排序法

#include <stdio.h>
#define N 10

int main(int argc, char *argv[])

    int a[N],i,j,r,t;
    printf("please input %d numbers\n",N);
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    for(i=0;i<N-1;i++)//通過N-2次比較
    {
        r=i;
        for(j=i+1;j<N;j++)//如果後一位小於前一位,則將R和J交換,然後循環和下一位進行比較
        {
            if(a[j]<a[r])
                r=j;
        }
        if(r!=i)//判斷結束後如果R不等於I則說明最小的是目前的第R位,則將他與I位交換
        {
            t=a[r];
            a[r]=a[i];
            a[i]=t;
        }

    }
    printf("从小达到输出为:\n");
    for(i=0;i<N;i++)
        printf("%5d",a[i]);//循環輸出
    printf("\n");
    return 0;
}

6.打印杨辉三角前十行
#include <stdio.h>

int main(int argc, char *argv[])

    int a[10][10]={{0}};
    int i,j;
    for(i=0;i<10;i++)
    { 
        a[i][0]=1;//循环将第一列全部赋1
        for(j=1;j<=i;j++)//控制打印的数字为三角形
            a[i][j]=a[i-1][j-1]+a[i-1][j];//找规律得出表达式
    }
    for(i=0;i<10;i++)
    {
        for(j=0;j<=i;j++)
            printf("%-8d",a[i][j]);//-会使数字后加空格
        printf("\n");
    }
    return 0;

7.输入一个字符串,然后将其逆序输出
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])

   /* char arr[100]={0};//如果不初始化,后面会赋随机值,导致输出乱码
    int i,n;
    printf("please input word\n");
    gets(arr);
    n=sizeof(arr)/sizeof(char);
   // n=strlen(arr);
    for(i=n-1;i>=0;i--)//改变输出顺序来实现逆序输出
        putchar(arr[i]);
    putchar('\n');
    return 0;*/
    char arr[100]={0},ch;//交换位置来实现逆序输出
    int i,j,n;
    printf("please input a string:");
    gets(arr);
    i=0;
    n=strlen(arr);
    j=n-1;
    while(i<j)
    {
        ch=arr[i];
        arr[i]=arr[j];
        arr[j]=ch;
        i++;
        j--;
    }
    puts(arr);
    return 0;

8.把输入的字符串中的大写变小写,小写变大写
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])

    char arr[10]={0};
    int n,i;
    fgets(arr,sizeof(arr),stdin);//空间足够会把回车键存进去
    n=strlen(arr);
    for(i=0;i<n;i++)
    {
        if(arr[i]>='A'&&arr[i]<='Z')
            arr[i]=arr[i]+32;
        else if(arr[i]>='a'&&arr[i]<='z')
            arr[i]=arr[i]-32;
    }
    puts(arr);
    return 0;

9.求数组中的最大数
#include <stdio.h>

int main(int argc, char *argv[])

    int max,i;
    int a[10]={0};
    printf("please input 10 number\n");
    for(i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    max=a[0]; 
    for(i=1;i<10;i++)
    {
        if(a[i]>max)
        {
            max=a[i];   
        }
    }
    printf("max=%d\n",max);
    return 0;

10.输入10个整数存入一维数组,统计输出其中的正数,负数和零的个数
#include <stdio.h>
int main(int argc, char *argv[])

    int a[10],i;
    int j=0;
    int k=0;
    int m=0;
    printf("please input 10 number\n");
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    for(i=0;i<10;i++)
    {
        if(a[i]==0)
        {
            j++;
        }
        else if(a[i]>0)
        {
            k++;
        }
        else 
        { 
            m++;

        }
    }
    printf("正数个数为%d\n负数个数为%d\n零的个数为%d\n",k,m,j);
    return 0;

11.输入10个整数存入一维数组,再逆序存放后输出
#include <stdio.h>
int main(int argc, char *argv[])

    int a[10],i,t;
    printf("please input 10 number\n");
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    for(i=0;i<5;i++)
    {
        t=a[i];
        a[i]=a[9-i];
        a[9-i]=t;
    }
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    return 0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值