今天要进行一个重要元素数组的学习了。这一章要掌握什么是数组,数组怎么样命名,数组怎么样使用,以及一些常见的错误和需要注意的事项。

一、      数组的基本概念

  • 数组是可以在内存中连续存储多个元素的结构//就像是多个int绑定在一起了,数据类型不一定非要是int也可以是其他的数据类型。
  • 数组中的所有元素必须属于相同的数据类型//说是int就要大家都是int,不然不能在一起愉快玩耍。
  • 二、      数组的特点

    • 只能存放一种类型的数据,比如int类型的数组、float类型的数组,//就像上面说的,一个数组只能有一种类型的数据。
    • 里面存放的数据称为“元素”
    • 三、         声明和使用数组

      • 声明数组的类型  // 就是基本数据类型选一个。
      • 声明数组的元素个数(需要多少存储空间)//标明以后电脑才能知道你这个数组到底是几个基本数据类型绑在一起的,需要多大的地方。
      • 书写格式:
      • 元素类型 数组名[元素个数];

        比如:int ages[3];

      • 简单使用
      • 简单初始化:int ages[5] = {19, 19, 20, 21, 25};

        元素有顺序之分,每个元素都有一个唯一的下标(索引),从0开始

        数组元素的访问:a[i]

      • 要注意不管是往数组里面赋值还是提取出来使用都是从下标0开始的。下标的意思就像是书名或者房间号,是一个数组里面其中一个数的标识。
      • 初始化方式

        int a[3] = {10, 9, 6};//正常书写方式

        int a[3] = {10,9};//少赋值一个也是可以的,没赋值的空位默认为0

        int a[] = {11, 7, 6};//前面没有标明数量,但是后面给了几个数值,电脑就会默认这个数组有几个位置。

        l   常见错误

        int a[];//既没给数量,也没赋几个值给它。

        int[4] a;//这种方式在java里面可以,但是在C语言中是错误的。

        int a[b];//中括号里面的是数量,数量必须是数字,还得是整数。

        a = {10, 11};//没给类型,而且不给数量也要加上中括号的。

        a[4] = {10,9,8,5}; //没给数据类型。

      • 示例:
      • //声明数组: 数据类型 数组名[数组长度] ;

        int scores[5];

        //为数组赋值: 数组名[下标]=值; --->下标从0开始

        scores[0]=10;

        scores[1]=20;

        scores[2]=30;

        scores[3]=40;

        scores[4]=50;

        //获取数组中的元素: 数组名[下标];

        printf("%d,%d,%d,%d,%d\n",scores[0],scores[1],scores[2],scores[3],scores[4]);

        //声明赋值一步完成: 数据类型 数组名[长度]={值1,值2....};注意:对应的值的个数应该与长度对应

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

        printf("%d,%d,%d,%d,%d\n",nums[0],nums[1],nums[2],nums[3],nums[4]);

        int arr[10] = {9,8,7,5};//正确,6个元素未赋值将使用默认值(0)

        int arr[] = {9,8,7};//正确 ,未指定数组的长度(数组长度取决于元素的个数)

        示例2:让用户输入5个成绩,根据用户输入的成绩计算最高分,最低分和平均分

      • int scores[5];//声明一个数组用于存储用户输入的成绩

        int sum=0,avg;//总成绩和平均成绩

        int max;//最高分

        int min;//最低分

        int i;

        //循环获取用户输入的成绩,并将其输入成绩保持到数组中

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

        printf("请输入第%d个人成绩:",i+1);

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

        sum+=scores[i]; //计算总成绩

        }

        avg=sum/5;//计算平均成绩

        min=max=scores[0];//假设第一个人的成绩是最高分,最低分

        for(i=1;i<5;i++){

        if(scores[i]>max){//获取最高分

        max=scores[i];

        }

        if(scores[i]<min){//获取最低分

        min=scores[i];

        }

        }

        printf("平均分为:%d,最高分是%d,最低分%d\n",avg,max,min);

        冒泡排序:主要精髓在于,升序:n个数字来排队,两两比较小靠前。外层循环N-1(控制需要比较的轮数)内层循环N-1-i(控制每轮比较的次数,i是外层循环变量)

      • 这个方法要记好,很多时候都能用到,下图是冒泡排序的一种示例和示例的图解。(没事要多看)

      • int nums[]={10,3,8,1,6};

        int i,j,temp;

        //外层控制比较的轮数(5个数字比较4轮)

        for(i=0;i<4;i++){

        //内层循环控制每轮比较的次数

        for(j=0;j<4-i;j++){

        if(nums[j]>nums[j+1]){//交换顺序

        temp = nums[j];

        nums[j]=nums[j+1];

        nums[j+1]=temp;

        }

        }

        }

        printf("排序后的数字为:");

        //利用循环遍历输出

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

        printf("%d\t",nums[i]);

        }

      • 以上是一维数组,接下来是二维数组:
      • 二维数组可以看作是由一维数组的嵌套而构成的,二维数组可以看成是一个表格,有长和宽的表格。
      • 二维数组: 一维数组中的值为一个数组.

        声明: 数据类型 数组名[rowsize][colsize];

        int nums[4][2];

      • 声明并赋值:

        int nums[4][2]={{10,11},{20,21),{30,31},{40,41}}; 正确//常规写法

        int nums[][2]={{10,11},{20,21),{30,31},{40,41}}; 正确//和一维数组一样行的数量可以由后面提供的数值数量进行默认处理

        int nums[4][]={{10,11},{20,21),{30,31},{40,41}}; 错误//二维数组可以忽略行的数量但是列的数量必须有

      • 示例:声明一个三行三列的二维数组用于保持用户输入的整型数据,打印用户输入的数据并计算对角线之和,下图是图解

      • int nums[3][3];

        int i,j,sum=0;

        //循环获取用户输入的数据,并将其数据保存到二维数组中

        for(i=0;i<3;i++){

        for(j=0;j<3;j++){

        printf("请输入第%d行第%d列数据\n",i+1,j+1);

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

        }

        }

        //循环遍历二维数组的数据,并打印成矩形

        for(i=0;i<3;i++){

        for(j=0;j<3;j++){

        printf("%d\t",nums[i][j]);

        if(i==j){

        sum+=nums[i][j];

        }

        }

        printf("\n");

        }

        printf("二维数组对角线之和为%d",sum);

      • 课后作业,由于格式原因下面的代码没有进行缩进,因为是课间抽时间写的博客,所以暂时没时间想办法调整,有时间了一定要调整一下。
      • 作业1.根据用户输入的10人成绩并将其保存到数组中,求最高成绩,最低成绩和平均成绩

      • #include <stdio.h>
        void main(){
        //作业1.根据用户输入的10人成绩并将其保存到数组中,求最高成绩,最低成绩和平均成绩.
        int sum[10];//数组名及长度
        int i,max,min,args,he=0;//循环变量,最高,最低,平均值,十个人总分
        for(i=0;i<10;i++){//获取及十个人总分
        printf("输入第%d个人的成绩:\n",i+1);
        scanf("%d",&sum[i]);
        he+=sum[i];
        }
        args=he/10;
        max=min=sum[0] ;
        for(i=1;i<10;i++){
        if(sum[i]>max){
        max=sum[i];
        }
        if(sum[i]<min){
        min=sum[i];
        }
        }
        printf("平均分为:%d,最高分是%d,最低分%d\n",args,max,min);

      • 作业2.根据用户输入的5个数字并将其保存到数组中,对其进行从高到低排序

      • .根据用户输入的5个数字并将其保存到数组中,对其进行从高到低排序.
        // 外层循环N-1(需要比较的轮数),
        // 内层循环N-1-i(每轮需要比较的次数,其中i为外层循环变量)
        int sum[5];//数组名及长度
        int i,j,k;//两个循环变量及临时变量
        for(i=0;i<5;i++){//获取输入的5个数值
        printf("输入第%d个数\n",i+1);
        scanf("%d",&sum[i]);
        }
        for(i=0;i<4;i++){//比较大小进行排序
        for(j=0;j<4-i;j++){
        if(sum[j]<sum[j+1]){
        k=sum[j];
        sum[j]=sum[j+1];
        sum[j+1]=k;
        }
        }
        }
        printf("排序后的数字是:");//打印得出的结果
        for(i=0;i<5;i++){
        printf("%d\t",sum[i]);
        }

      • //作业3.根据用户输入的10个数字并将其保存到数组中,用户输入要查找的数字,
        //如果查找到该数字打印其在数组中的位置,否则打印该数组中没有你要查找的元素。
        int sum[10];//数组名及长度
        int i,find,flag=0;//循环变量及用户查找的数值
        for(i=0;i<10;i++){//根据用户输入的10个数字并将其保存到数组中
        printf("输入第%d个数",i+1);
        scanf("%d",&sum[i]);
        }
        printf("你想找哪个\n");//获取用户想要查找的数值
        scanf("%d",&find);
        for(i=0;i<10;i++){//对比数值如果查找到该数字打印其在数组中的位置
        if(find==sum[i]){
        printf("%d在数组中的第%d个位置",find,i+1);
        flag=1;
        }
        }
        if(flag==0){//否则打印该数组中没有你要查找的元素。
        printf("对不起,该数字%d没有在数组中",find);
        }

      • 作业4.打印杨辉三角(用二维数组)
        1
        1 1
        1 2 1
        1 3 3 1
        1 4 6 4 1
        int sum[5][5];
        int i,j;
        for(i=0;i<5;i++){//第1列值为1,对角线的值为1
        sum[i][0]=1;;//为第一列赋值为1
        sum[i][i]=1;;//为对角线赋值为1
        }
        for(i=2;i<5;i++){//当前元素的值=头上的元素+头上左边的元素
        for(j=1;j<i;j++){//j=1从第二列下标1开始
        sum[i][j]=sum[i-1][j]+sum[i-1][j-1];
        }
        }
        for(i=0;i<5;i++){//循环变例输出
        for(j=0;j<=i;j++){
        printf("%d\t",sum[i][j]);
        }
        printf("\n");
        }

C语言学习第五章的更多相关文章

  1. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

  2. Java基础知识二次学习--第五章 数组

    第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...

  3. C#高级编程 (第六版) 学习 第五章:数组

    第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...

  4. C语言学习第六章

    今天开始尝试改变! 今天要学习函数,一个C语言中的重要组成部分. 首先先聊聊为什么要使用函数?随着学习的深入很多人会发现某段的代码重复使用的几率很大,而如果用一次写一次的话很明显的效率就会比较低,如果 ...

  5. C语言学习第四章

    今天学习C语言循环结构,为什么要用循环呢?因为有时候我们对一堆的数字进行重复的处理的时候要重复的编写一些相同或者差不多的代码,让程序显得很臃肿,而且写着也麻烦,如果用循环来写的话能简化很多,出错的话也 ...

  6. C语言学习笔记第一章——开篇

    本文章B站有对应视频 (本文图片.部分文字引用c primer plus) 什么是C语言 顾名思义,c语言是一门语言,但是和我们所讲的话不同,它是一门编程语言,是为了让机器可以听懂人的意思所以编写的一 ...

  7. C 语言学习 第五次作业总结

    第五次作业,主要学习和复习的是几种循环结构的使用. 在前一次的课堂上,同学们已经学习了分支语句的使用.分支语句和循环语句配合使用,就可以写出更多的,逻辑功能丰富的代码了. 逻辑功能的丰富,也意味着学习 ...

  8. C语言学习第七章

    今天开始学习指针,指针在C语言中具有很重要的地位,按照老师所说,学C学不好指针跟没学一样,可见指针在C语言中的重要地位.废话不多说,首先我们先要知道什么是指针. 指针:指针是一个变量,它存储另一个对象 ...

  9. C语言学习的第一章

    首先,学习编写程序要先知道什么是程序,我们为什么要写程序? 程序就是为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合.程序里有很多算法,算法是解决问题的具体方法和步骤,就像我们想要得 ...

随机推荐

  1. 2016: [Usaco2010]Chocolate Eating

    2016: [Usaco2010]Chocolate Eating Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 224  Solved: 87[Su ...

  2. CAEmitterLayer 粒子效果(发射器)

    //创建Layer CAEmitterLayer *emitterLayer = [CAEmitterLayer layer]; //边框 emitterLayer.borderWidth = 1.0 ...

  3. iOS网络编程笔记——GCDAsyncSocket使用

    CocoaAsyncSocket为Mac和iOS提供了易于使用且强大的异步通信库. 简单的Socket通信包括了建连.断开连接.发送socket业务请求.重连这四个基本功能. 1.建立连接:GCDAs ...

  4. js面向对象-原型链

    var Person = function (name) { this.name = name; } Person.prototype.say = function () { console.log( ...

  5. 开源的.NET媒体文件操作组件TagLib#解析

    人生得意须尽欢 莫使金樽空对月.写博客都会在吃饭后,每次吃饭都要喝上二两小酒,写博客前都要闲扯,这些都是个人爱好,改不掉了,看不惯的人,还望多多包含一下,有相同爱好的同学,咱们可以一起喝着小酒一边吹牛 ...

  6. Struts2之i18N国际化

    对于i18n其实没有太多内容,一般的公司用不到这些内容,除非是跨国公司,但即便是跨国公司也不一定会使用i18n来进行国际化处理,所以本篇内容仅供大家了解,不做深入的探讨,希望通过本篇内容,可以帮助大家 ...

  7. js 操作属性

    操作属性: 对象.setAttribute('属性名','值'); - 添加属性 对象.getAttribute('属性名'); - 获取属性值,如无此属性,那么返回null 对象.removeAtt ...

  8. 老李分享:持续集成学好jenkins之Git和Maven配置 1

    老李分享:持续集成学好jenkins之Git和Maven配置   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...

  9. 手机自动化测试:appium源码分析之bootstrap五

    手机自动化测试:appium源码分析之bootstrap五   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试 ...

  10. (删)Java线程同步实现一:synchronzied和wait()/notify()

    上面文章(2.Java多线程总结系列:Java的线程控制实现)讲到了如何对线程进行控制,其中有一个是线程同步问题.下面我们先来看一个例子: 1.一个典型的Java线程安全例子 package com. ...