C语言学习笔记---数组

最近用到程序发现以前自己的C语言学得很不扎实,逻辑也很混乱。
于是决定从数组开始自己手把手打程序,把基础知识补一补。
纯粹记录自己的程序和注意点,不写概念。

1.1.1二维数组练习
1【示例】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int i,j;
 int a[5][3];
 int v[3];
 int sum=0;
 int average;
 for(i=0;i<3;i++)
   {
     for(j=0;j<5;j++)
       {
         printf("Please input the No.%d number:",j+1);
         scanf("%d",&a[i][j]);
         sum+=a[i][j];
       } 
        v[i]=sum/5;
         if(i==0)
          {
             printf("The Math sum is: %d\n",sum);
             printf("The Math average is: %d\n",sum/5);  
          }
           if(i==1)
          {
             printf("The C sum is: %d\n",sum);
             printf("The C average is: %d\n",sum/5);     
          }
           if(i==2)
          {
             printf("The English sum is: %d\n",sum);
             printf("The v average is: %d\n",sum/5);     
          }
            sum=0;

   }
    average=v[0]+v[1]+v[2];
    printf("The average number is: %d " ,average);
    printf("Math:%d,C:%d,English:%d",v[0],v[1],v[2]);

  }

二维数组可以看作是由一维数组嵌套而成的,把一维数组的每个元素看作一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组,C语言允许这种分解。

如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:a[0]、a[1]、a[2]。

对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0], a[0][1], a[0][2], a[0][3]。必须强调的是,a[0], a[1], a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量

1.1.2 对无序数组进行查询
让用户输入一个数字,判断该数字是否在数组中,如果在,就打印出下标。

#include <stdio.h>
int main()
{
  int num,i;
  int temp=-1;
  int numbers[10]={1,26,23,25,43,8,96,48,5,66};
  printf("Please input a number:");
  scanf("%d",&num);
 for(i=0;i<10;i++)
   {
        if(num==numbers[i])
        { 
          temp=i;
          break;
        }

   }
   if(temp<0)
     {

       printf("The number is not in the array!");   
     }
    else
     {
        printf("%d is in the array, and it's subscript is %d.\n", num,temp);
     }
     return 0;
}

1.1.4有序数组查询
有序数组就不需要重复查询了,只要设置一定的限制就可以认为不在了。
有一个长度为10的整型数组,它所包含的元素按照从小到大的顺序(升序)排列,假设比较到第4个元素时发现它的值大于输入的数字,那么剩下的5个元素就没必要再比较了,肯定也大于输入的数字,这样就减少了循环的次数,提高了执行效率。

#include<stdio.h>
int main()
{
    int array[10]={23,24,56,78,99,105,120,114,365,1024};
    int i,num,temp=-1;
    printf("Please input a number :");
    scanf("%d",&num);
    for(i=0;i<10;i++)
    {

        if(array[i]>=num) //如果数组array[i]>=num 才会执行 
        {
           if (array[i]==num)
             {
                temp=i; //跟数组中的数值相等则直接赋值 
             }
            break;   //如果数组中的值大于这个数,那么num肯定不在这个数列中 
        }
    }
    if(temp<0)
    printf("The number is not in the array!");
    else
      {
    printf("%d is in the array, and it's subscript is %d.\n", num, temp); 
     } 
   return 0;
}

需要注意的是,用字符串给字符数组赋值时由于要添加结束符 ‘\0’,数组的长度要比字符串的长度(字符串长度不包括 ‘\0’)大1。例如:

char str[] = "C program";

这里写图片描述

1.1.5 字符串长度函数strlen

#include<stdio.h>
#include<string.h> //要对字符串进行操作要加入这个头文件 
 int main()
 {

    char str[]="C Program";//平常开发这样赋字符串比较常见
    int len;
    len=strlen(str);
    printf("The array len is %d\n",len); 
   } 

需要说明的是,strlen 会从字符串的第 0 个字符开始计算,直到遇到字符串结束标志 ‘\0’。

1.1.6字符串连接函数 strcat

#include<stdio.h>
#include<string.h> //要对字符串进行操作要加入这个头文件 
 int main()
 {

    char str[]="C Program";//平常开发这样赋字符串比较常见
    int len;
    len=strlen(str);
    printf("The array len is %d\n",len); 
    char str1[40]="My name is : " ;
    char str2[20];
    printf("Please input your name :");
    gets(name);
    strcat(str1,str2);
    puts(str1);
    return 0;

   } 

strcat 将把 str2连接到 str1后面,并删去 str1最后的结束标志 ‘\0’。这就意味着,str1 的长度要足够,必须能够同时容纳 str1和str2,否则会越界。
1.1.7字符串复制函数strcpy
1.1.8字符串比较函数strcmp
strcmp 是 string compare 的缩写,意思是字符串比较,语法格式为:
字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。

#include <stdio.h>
#include <string.h>
int main(){
char *a = "aBcDeF";
char *b = "AbCdEf";
char *c = "aacdef";
char *d = "aBcDeF";
printf("strcmp(a, b) : %d\n", strcmp(a, b));
printf("strcmp(a, c) : %d\n", strcmp(a, c));
printf("strcmp(a, d) : %d\n", strcmp(a, d));
return 0;
}

strcmp(a, b) : 1
strcmp(a, c) : -1
strcmp(a, d) : 0

1.1.9 数组越界
数组越界
C语言数组不会自动扩容,当下标小于零或大于等于数组长度时,就发生了越界(Out Of Bounds),访问到数组以外的内存。如果下标小于零,就会发生下限越界(Off Normal Lower);如果下标大于等于数组长度,就会发生上限越界(Off Normal Upper)。
越界访问的数组元素都是垃圾值,没有实际的含义,因为数组之外的内存我们并不知道是什么,可能是其他变量的值,可能是附加数据,可能是一个地址,这些都是不可控的。

由于C语言的”放任“,我们访问数组时必须非常小心,要确保不会发生越界。

1.1.10 构造可变长的数组

#include<stdio.h>
int main()
{
    int n;
    printf("Please input a number of string length: ");
    scanf("%d",&n);
    fflush(stdin);//清空缓存区 
    char str[n];
    printf("Input String : ");
    gets(str);
    puts(str);
    return 0;
}

数组的总结
对数组的总结
1) 数组的定义格式为:

type arrayname[length];

type 为数据类型,arrayName 为数组名,length 为数组长度。
2)访问数组的格式

arrayName[index]

index 为数组下标。注意 index 的值必须大于等于零,并且小于数组长度,否则会发生数组越界,出现意想不到的错误。

3)关于排序和查找
学完了数组,有两个重要的知识点要求大家掌握,那就是排序(Sort)和查找(Search),比如:
给你 10 个打乱顺序的整数,要能够按照从小到大或者从大到小的顺序输出;
给定一个字符串 str1,以及一个子串 str2,要能够判断 str2 是否在 str1 中。

排序和查找的方法有很多种,我们把它们设置成了单独的一章进行讲解.

猜你喜欢

转载自blog.csdn.net/qq_35989861/article/details/81546131