C语言—数组详解

描述

一、数组

开发环境: 

虚拟机+Linux操作系统。

虚拟机:虚拟一台电脑。

Linux操作系统:redhatubuntu系统、红旗系统

Linux基本指令、C语言数据结构、C语言语句、C语言运算符、数组。

 

数组:多个同类型数据的集合。

一维数组的定义语法:int data[10];  <数据类型> <数据名称>[常量-整数-数据数量];

定义一个int类型的数组,数组的名称是data,长度是10,所占空间大小:4*10 字节。

 

二维数组的定义语法:int data[10][5];

int data[3][5]=

    {

       {1,2,3,4,5},

       {1,2,3,4,5},

       {1,2,3,4,5},

    };

#include

int main()

{

    int data[3][5]=

    {

       {1,2,3,4,5},

       {11,12,13,14,15},

       {21,22,23,24,25},

    };

    printf("%d\n",data[1][1]);

    return 0;

}

多维数组的定义语法:int data[][][]…

 

 特点:

  1. 访问数组成员的时候:下标是从0开始的。int data[10];  下标 (0~9)
  2. 数组只是支持在定义的时候进行整体赋值。
  3. 数组定义的时候,[]里只能填常量。数组在定义之后就无法更改大小。
  4. 数组的空间是连续的—内存。
  5. 数组的名称就是数组空间的首地址。
  6. 数组初始化时,如果没有赋值,那么数组空间里的数据是未知的---局部变量。
  7. 数组初始化时,只要给一个空间赋值,剩余空间都自动初始化为0---局部变量。

示例1:

#include

int main()

{

    char i;

    int data[10]={12,13,14,15}; //下标

    int a[5];

    for(i=0;i<10;i++) //0~9

    {

       printf("data[%d]=%d\n",i,data[i]);

    }

    for(i=0;i<5;i++) //0~4

    {

       printf("a[%d]=%d\n",i,a[i]);

    }

    return 0;

}

示例2:

#include

int main()

{

   int i;

   int data[5]={0}; //下标

   //从键盘上读取5个数据存放到数组里

   printf("请输入5个数据:");

   for(i=0;i<5;i++)

   {

       scanf("%d",&data[i]); //两种: 空格 、 回车-换行

   }

   

   for(i=0;i<5;i++)

   {

       printf("data[%d]=%d\n",i,data[i]);

   }

   

   for(i=4;i>=0;i--)

   {

       printf("data[%d]=%d\n",i,data[i]);

   }

   return 0;

}

 

配置VIM编辑器:在命令行上运行命令:  vim /etc/vimrc   

打开文件之后,在文件结尾加上两行代码保存退出。

set number

set tabstop=4

作业:

  1. 定义数组,从键盘上录入5个浮点类型数据存放到数组,计算平均值和最大、最小值,输出到屏幕上。

 

#include

int main()

{

   int i;

   float sum=0;

   float data[5];

   float max=0;

   float min=100;

   printf("请输入5个数据:");

   /*1.  输入数据*/

   for(i=0;i<5;i++)

   {

       scanf("%f",&data[i]);

   }

   /*2.  处理数据*/

   for(i=0;i<5;i++)

   {

       sum+=data[i]; //累加

       if(data[i]>max)max=data[i];

       if(data[i])min=data[i];<>

   }

   printf("平均值:%.1f\n",sum/5.0);

   printf("最大值:%.1f\n",max);

   printf("最小值:%.1f\n",min);

   return 0;

}

 

  1. 定义数组,从键盘上录入5个整数数据,求和,输出结果。

 

#include

int main()

{

   int i;

   int sum=0;

   int data[5];

   printf("请输入5个数据:");

   /*1.  输入数据*/

   for(i=0;i<5;i++)

   {

       scanf("%d",&data[i]);

   }

   /*2.  处理数据*/

   for(i=0;i<5;i++)

   {

       sum+=data[i]; //累加

   }

   printf("和:%d\n",sum);

   return 0;

}

 

  1. 定义数组,从键盘上录入10个整数数据,计算里面大于5、大于10数据的数量,输出结果。

#include

int main()

{

   int i;

   int data[10];

   int cnt_10=0,cnt_5=0;

   printf("请输入10个数据:");

   for(i=0;i<10;i++)

   {

       scanf("%d",&data[i]);

   }

   //处理数据

   for(i=0;i<10;i++)

   {

       if(data[i]>5)cnt_5++;

       if(data[i]>10)cnt_10++;

   }

   printf("cnt_5=%d\n",cnt_5);

   printf("cnt_10=%d\n",cnt_10);

   return 0;

}

作业:

  1. 数组数据的替换:从键盘上输入10个整数数据之后,再将数组里等于5的数据替换成8.

 

#include

int main()

{

   int data[10];

   int i;

   for(i=0;i<10;i++)

   {

       scanf("%d",&data[i]);

   }

   for(i=0;i<10;i++)

   {

       if(data[i]==5)data[i]=8;

   }

   for(i=0;i<10;i++)

   {

       printf("%d ",data[i]);

   }

   return 0;

}

 

  1. 数组数据的排序:从键盘上输入10个整数数据,按照从大到小和小到大的两种方式排序再输出。--冒泡排序

 

#include

int main()

{

    int data[]={9,8,7,6,5,4,3,2,1};

    int i,j;

    int tmp;

    for(i=0;i<9-1;i++)

    {

       for(j=0;j<9-1;j++)

       {

           if(data[j]>data[j+1])

           {

              tmp=data[j];

              data[j]=data[j+1];

              data[j+1]=tmp;

           }

       }

    }

    for(i=0;i<9;i++)

    {

       printf("%d ",data[i]);

    }

    printf("\n");

    return 0;

}

 

/*

9 8 7 6 5 4 3 2 1

冒泡排序:相邻的两个数做比较,进行位置交换

第一轮排序:

8 9 7 6 5 4 3 2 1

8 7 9 6 5 4 3 2 1

8 7 6 9 5 4 3 2 1

8 7 6 5 9 4 3 2 1

8 7 6 5 4 9 3 2 1

8 7 6 5 4 3 9 2 1

8 7 6 5 4 3 2 9 1

8 7 6 5 4 3 2 1 9

 

第二轮排序:

7 8 6 5 4 3 2 1 9

7 6 8 5 4 3 2 1 9

7 6 5 8 4 3 2 1 9

*/

 

#include

int main()

{

    int data[]={1,2,3,4,5,6,7,8,9};

    int i,j;

    int tmp;

    int flag=0;

    for(i=0;i<9-1;i++)

    {

       for(j=0;j<9-1-i;j++)

       {

           if(data[j]>data[j+1])

           {

              tmp=data[j];

              data[j]=data[j+1];

              data[j+1]=tmp;

              flag=1;

           }

       }

       if(flag)flag=0;

       else break;

    }

    

    for(i=0;i<9;i++)

    {

       printf("%d ",data[i]);

    }

    printf("\n");

    return 0;

}

 

/*

9 8 7 6 5 4 3 2 1

冒泡排序:相邻的两个数做比较,进行位置交换

第一轮排序:

8 9 7 6 5 4 3 2 1

8 7 9 6 5 4 3 2 1

8 7 6 9 5 4 3 2 1

8 7 6 5 9 4 3 2 1

8 7 6 5 4 9 3 2 1

8 7 6 5 4 3 9 2 1

8 7 6 5 4 3 2 9 1

8 7 6 5 4 3 2 1 9

 

第二轮排序:

7 8 6 5 4 3 2 1 9

7 6 8 5 4 3 2 1 9

7 6 5 8 4 3 2 1 9

*/

 

  1. 数组数据的拼接:定义A,B,C 3个数组,分别从键盘上给A,B,数组录入数据,再将A,B两个数组的数据拷贝到C数组里,再打印出C数组的值。

#include

int main()

{

    int A[5]={1,2,3,4,5};

    int B[5]={11,12,13,14,15};

    int C[10];

    int i=0,j=0;

    for(i=0;i<5;i++)C[i]=A[i]; //将A数组的数据拷贝到C数组

    for(j=i;j+5;j++)c[j]=b[j-i];>

    for(i=0;i<10;i++)

    {

       printf("%d ",C[i]);

    }

    return 0;

}

 

  1. 数组数据的删除(不是真正意思的删除,这里相当于覆盖)。---数据库

先从键盘上录入10个整数数据:比如:12 34 56 78 12 34 12 5 12 77

比如:删除数组里所有的12这个数据:得到最终结果:34 56 78 34 5 77   其他后面空间清0

 

 

#include

int main()

{

    int data[10]={1,2,2,2,5,2,7,2,9,2};

    int a;

    int i,j;

    int cnt=9; //数组最后一个下标位置

    printf("原数组里的值:");

    for(i=0;i<10;i++)

    {

       printf("%d ",data[i]);

    }

    printf("\n");

    

    printf("请输入要删除的数字:");

    scanf("%d",&a);

    

    for(i=0;i<10;i++)

    {

       if(data[i]==a)

       {

           //实现数据覆盖

           for(j=i;j<10-1;j++)

           {

              data[j]=data[j+1];

           }

           data[cnt--]=0;

           i--;

       }

    }

    printf("现在数组里的值:");

    for(i=0;i<10;i++)

    {

       printf("%d ",data[i]);

    }

    printf("\n");

    return 0;

}

  1.  数组数据的插入(整数数组)

比如:12 ,4589,12,77 

在第2个位置后面插入一个888

结果:12,45,888,89,12,77

 

 

#include

int main()

{

    int data[11]={1,2,2,2,5,2,7,2,9,2};//10个数据

    int a,b;

    int i,j;

    printf("原数组里的值:");

    for(i=0;i<11;i++)

    {

       printf("%d ",data[i]);

    }

    printf("\n");

    

    printf("请输入要插入的数字值:");

    scanf("%d",&a);

    printf("请输入要插入的位置(数组的下标位置):");

    scanf("%d",&b);

    

    for(i=10-1;i>=b;i--)

    {

       data[i+1]=data[i];

    }

    data[b]=a; //插入数字

    

    printf("现在数组里的值:");

    for(i=0;i<11;i++)

    {

       printf("%d ",data[i]);

    }

    return 0;

}

6. 从键盘上输入一串整数,使用中文大写打印出来。--开具发票的时候就会用到

 比如中文:壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整

  数位分离

任务2

  1. 给普通用户增加sudo 命令权限
 
  1. gedit 文本编辑器命令。

vim  基于命令行编辑器。  (1) 修改代码-改错

任务3:语句章节作业

1.  计算一个unsigned int类型数据中有多少个1 (练习位运算、if语句、循环语句)

#include

int main()

{

   unsigned int data=0x1234;

   int i;

   int cnt=0; //计数器--计数

   for(i=0;i<32;i++)

   {  

       if(data&0x1) // 0与任何数相&,结果是0

       {

          cnt++;

       }

       data>>=1;//data=data>>1;

   }

   printf("data=%d\n",data);

   return 0;

}

/*

00000000 00000000 00000000 00000010  ---0x2

00000000 00000000 00000000 00000001

00000000 00000000 00000000 00000000

*/

1. 求100之内自然数中最大的能被17整除的数。(保存数据)

#include

int main()

{

   int i;

   for(i=100;i>17;i--)

   {

       if(i%17==0)

       {   

          printf("i=%d\n",i);

          break;

       }

   }

   return 0;

}

 

//for 循环:  已知循环

//while 循环: 未知循环  while(cnt--)

3. 计算并输出200—400之间不能被3整除的整数的和。

#include

int main()

{

   int i;

   int sum=0;

   for(i=200;i<=400;i++)

   {

       if(i%3!=0)

       {

          sum+=i;

       }

   }

   printf("sum=%d\n",sum);

   return 0;

}

3. 输出所有200-400以内能被3整除且个位数字为6的整数。

#include

int main()

{

    int i;

    for(i=200;i<=400;i++)

    {

       if(i%3==0)

       {

           //126

           if(i%10==6)printf("个位数为6:%d\n",i);

       }

    }

    return 0;

}

4,打印所有水仙花数。所谓水仙花是指一个三位数,其各位数字的立方和等于该数。

#include

int main()

{

   int i;

   int a,b,c;

   for(i=100;i<=999;i++)

   {

       //123

       a=i/100; //百位

       b=i%100/10;

       c=i%10/1;

       if((a*a*a+b*b*b+c*c*c)==i)

       {

          printf("%d\n",i);

       }

   }

   return 0;

}

5,判断某一年是否是闰年(条件是:1、能整除4且不能整除100 2、能整除400)。

#include

int main()

{

   int year;

   printf("请输入年份:");

   scanf("%d",&year);

   

   if((year%4==0&&year%100!=0) || (year%400==0))

   {

       printf("%d是闰年.\n",year);

   }

   else

   {

       printf("%d是平年.\n",year);

   }

   return 0;

}

6. 输入一个不多于5位的正整数,判断他是几位数,并逆序输出。--不需要循环

#include

int main()

{

   int data;

   printf("输入不多于5位数的整数:");

   scanf("%d",&data);

   

   //12345

   if(data/10000)printf("5位数\n");

   else if(data/1000)printf("4位数\n");

   else if(data/100)printf("3位数\n");

   else if(data/10)printf("2位数\n");

   else if(data/1)printf("1位数\n");

   return 0;

}

7. 输入一个华氏温度,输出摄氏温度,计算公式为(华氏度-32)×5÷9 要求结果保留两位小数。printf("%.2f",data);   *   /     //  \n     12*3

任务4:字符串

4.1 数组的知识点

1. 一维数组、二维数组、多维数组

2. 数组:基本数据类型数组(int、float、char类型)、结构体数组…..

3. 字符数组、字符串数组(学习很多字符串操作函数)

4.2 字符串数组

字符数组和字符串数组的区别?

字符串数组结尾有一个特殊的结束符:'\0'

#include

int main()

{

   int a[]={10,20,30}; //整数类型数组

   char b[]={'A','B','C','D'}; //字符数组

   char c[]="ABCD";  //字符串数组 '\0'

   

   printf("a数组的大小:%d\n",sizeof(a));//12   %d  %c %f %s %x

   printf("b数组的大小:%d\n",sizeof(b));//4

   printf("c数组的大小:%d\n",sizeof(c));//5

   printf("long的大小:%d\n",sizeof(long)); //4

   printf("int的大小:%d\n",sizeof(int));   //4

   //long int 

   return 0;

}

字符串是字符数组吗?是

字符数组是字符串吗?不一定

字符串的输入输出有哪些?

#include

int main()

{

   char str[100];

   scanf("%s",str); //从键盘上输入字符串

   printf("str=%s\n",str); //输出字符串

   return 0;

}

 

#include

#include

int main()

{

   char str[100]="12345";

   //scanf("%s",str); //从键盘上输入字符串

   //printf("str=%s\n",str); //输出字符串

   

   //char    *gets(char *);  //获取字符串

   //功能: 多了一个获取空格的功能,回车

   //gets(str);//从键盘上输入字符串

   //printf("你输入的字符串是:");

   //puts(str);//输出字符串

   printf("字符串的长度:%d\n",strlen(str)); //5

   return 0;

}

字符串常见的处理函数有哪些?

#include

#include

int main()

{

   char str[200];

   //常量: 不可修改     "中文字符串"

   //字符串拼接

   //strcat(str,"欢迎学习嵌入式开发");

   //strcat(str,"  学习单片机");

   //strcat(str,"  学习Linux");

   //printf("str=%s,%d\n",str,strlen(str));

   

   //字符串比较   如果相等返回0

   //printf("比较结果:%d\n",strcmp("1234","123"));

   

   //字符串拷贝

   //strcpy(str,"1123435gffbgfb");

   //printf("结果:%s\n",str);

   

   //字符串查找函数

   printf("查找结果:%s\n",strstr("dscdscdsc123ksdhsd","123"));

   

   return 0;

}

 

/*

const   声明常量---声明只读变量

 

//字符串拼接

char   *strcat(char *restrict, const char *restrict);

//字符串比较

int    strcmp(const char *, const char *);

//字符串拷贝

char   *strcpy(char *restrict, const char *restrict);

//计算字符串长度

size_t    strlen(const char *);

//字符串查找函数

char     *strstr(const char *, const char *);

*/

实现计算字符串长度的功能?

#include

int main()

{

   char str[200];

   int i=0;

   printf("请输入字符串:");

   gets(str);

   while(str[i]!='\0')

   {

       i++;

   }

   printf("字符串长度:%d\n",i);

   return 0;

}

练习题目: 从键盘上输入一串字符串,计算字符串里的空格、大写字母、小写字母、数字个数?

#include

int main()

{

   char str[200];

   int i=0;

   int cnt1=0,cnt2=0,cnt3=0,cnt4=0;

   printf("请输入字符串:");

   gets(str); //从键盘上录入数据

   while(str[i]!='\0')

   {

       if(str[i]==' ') //判断空格

       {

          cnt1++;

       }

       else if(str[i]>='0'&&str[i]<='9')

       {

          cnt2++;

       }

       else if(str[i]>='a'&&str[i]<='z')

       {

          cnt3++;

       }

       else if(str[i]>='A'&&str[i]<='Z')

       {

          cnt4++;

       }

       i++;

   }

   printf("空格数量:%d\n",cnt1);

   printf("数字数量:%d\n",cnt2);

   printf("小写数量:%d\n",cnt3);

   printf("大写数量:%d\n",cnt4);

   return 0;

}

4.3 字符的输入

解决字符不能连续输入的问题:

#include

int main()

{

   char a;

   char b;

   char c;

   printf("请输入字符1:");

   scanf("%c",&a);  //A\n

   printf("请输入字符2:");

   scanf(" %c",&b); 

   printf("请输入字符3:");

   scanf(" %c",&c);

   

   printf("输入字符:%c,%c,%c\n",a,b,c);

   return 0;

}

 

方式2:

#include

int main()

{

   // int      getchar(void);

   // int      putchar(int);

   char a;

   char b;

   char c;

   printf("请输入字符1:");

   scanf("%c",&a); //\n

   while(getchar()!='\n'){}

   

   printf("请输入字符2:");

   scanf("%c",&b);

   while(getchar()!='\n'){}

   

   printf("请输入字符3:");

   scanf("%c",&c);

   while(getchar()!='\n'){}

   

   printf("输入字符:%c,%c,%c\n",a,b,c);

   return 0;

}

从键盘上输入字符的方式:常用的两种

#include

int main()

{

   // int      getchar(void);

   // int      putchar(int);

   char a;

   //scanf("%c",&a);

   //printf("%c",a);

   

   a=getchar(); //从标准输入获取一个字符

   putchar(a);  //输出字符

   

   return 0;

}

输入字符串的常见方式:

#include

int main()

{

   // int      getchar(void);

   // int      putchar(int);

   char str1[100];

   char str2[100];

   printf("请输入字符串1:");

   //scanf("%s",str1);

   gets(str1);

   printf("请输入字符串2:");

   //scanf("%s",str2);

   gets(str2);

   printf("结果:%s,%s\n",str1,str2);

   return 0;

}

使用字符获取函数充当字符串输入功能:

#include

int main()

{

   // int      getchar(void);

   // int      putchar(int);

   char str[100];

   int i=0;

   char a;

   while(1)

   {

       a=getchar(); //读取一个字符 

       if(a=='#')

       {

          str[i]='\0';

          break;

       }

       str[i++]=a;

   }

   printf("%s",str);

   return 0;

}

4.4 字符串作业

1. 从键盘上输入一串字符串,计算字符串里的空格、大写字母、小写字母、数字个数

2. 字符串比较:从键盘上录入2个字符串,判断是否相等。

3. 字符串删除:从键盘上录入一个字符串,删除字符串里指定的单词,输出结果。

   比如:原字符串”akjbcds123dfjvbf123fdvbfd123”

   删除单词:“123”

   输出的结果:”akjbcdsdfjvbffdvbfd”

4. 字符串查找:从键盘上录入一个字符串,查找字符串里有几个特定的单词。再输出结果。

  比如:原字符串”akjbcds123dfjvbf123fdvbfd123”

   查找的单词:“123”

输出结果:3

  5. 字符串排序:从键盘上录入一个字符串,按照小到大的顺序排序。

6. 字符串的插入:从键盘上录入一个字符串,从指定位置插入一个字符串,再输出结果。

   比如:原字符串“1234567890”

(1). 从指定位置插入新的单词。 比如 从第2个下标插入一个“ABC”字符串。

结果: “123ABC4567890”

(2). 从指定单词后面插入新的单词。 比如 从”123”这个单词后插入一个“ABC”字符串。

结果: “123ABC4567890”

7. 字符串替换: 从键盘上录入一个字符串,将指定单词替换成想要的单词。

   比如:原字符串“123jfvfdj123dkfvbfdvdf”

   想要将“123”替换成“888”或者“8888”或者“88”

 8. 从键盘上输入一个整数:将整数转为字符串输出。

  比如:int a; scanf(“%d”,&a); 使用字符串形式打印出a的值。

 9. 从键盘上输入一个字符串,转为整数输出。

审核编辑:符乾江

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分