12天学好C语言——记录我的C语言学习之路(Day 6)

时间:2022-10-30 11:28:39

12天学好C语言——记录我的C语言学习之路



Day 6:



今天,我们要开始学习数组了。



//①数组部分,数组的大小不能够动态定义。如下:

//int n;   scanf("%d,&n"); int a[n];  这样就是错误的。数组的大小不能够依赖程序运行中变量的值。

//②但是在函数中这样确实允许的。如下:

//void func(int n) { int a[n]; ... }  这样是合法的,因为n是从实参传来的。这种情况被称为可变长数组,但是在执行函数的时候,n的值是不变的。但是如果指定数组是静态的,那么也不能使用这种可变长数组了。如下:

//static int a[3*n];



//对10个数组元素依次赋值为0~9,并逆序输出

/*//program 6.1

 #include "stdio.h"

 int main()

 {

 int i,a[10];

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

 {

 a[i]=i;

 }

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

 {

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

 }

 return 0;

 }

 */



//当对数组初始化的时候,如果只初始化前几个元素,那么后面没有初始化的元素默认为0。

//用数组解决Fibonacci数列问题



/*//program 6.2

#include <stdio.h>

int main()

{

    int f[20]={1,1};

    int i;

    for(i=2;i<=19;i++)

    {

        f[i]=f[i-1]+f[i-2];

    }

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

        if(i%5==0){

            printf(“\n");   //先调整格式(每5个换一行),然后再输出下一个值,因为f[5的倍数]这些项都是每行第一个。所以要再换行之后输出该值。

        }

        printf("%4d ",f[i]);

    }

    return 0;

}

*/



进入数组的学习,排序问题首当其冲,大家对冒泡排序和选择排序一定不陌生,这是我们学习数组必须会的,也是最经典的两个排序,下面逐个为大家讲解说明:



//冒泡排序法。

//输入10个数字,然后由小到大排序输出。



/*//program 6.3

#include "stdio.h"

int main()

{

    printf("请输入10个数字:\n");

    int a[10],i;

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

    {

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

    }

    int j,temp;

    for(j=1;j<=9;j++)  //j控制的是比较的趟数,比如10个数字比较,前9个需要和后面的数字比较,第十个数字不需要向后面的比较(因为第十个后面没有数字),所以说10个数字,需要进行9趟比较,故j<=9;

    {

        for(i=0;i<=10-j;i++) //i是每一趟需要比较的次数,第一个数,需要和他后面的9个数比较,就需要比较9次,此时是第一趟比较,j为1,10-j=9,正好是第一趟比较的次数。所以说这个for的表达式2中需要写为 i<=10-j;

        {

            if(a[i]>a[i+1])  //相邻的数如果满足比较条件就交换,不满足则不执行交换,i继续+1比较下面的。每一趟都会出来一个最大值。(这个最大值是所剩数字的最大值。)

            {

                temp=a[i];

                a[i]=a[i+1];

                a[i+1]=temp;

            }

        }

    }

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

    {

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

    }

    return 0;

}

*/



//选择排序法。

//(如果是从小到大)其原理就是每一趟比较(共n-1趟,最后一个不需要和自己比较~)选出一个最小值,然后和第一个值交换(在其中,可能涉及到很多次下标的交换,但原理只是先把这个需要交换的值的下标取出来),每一趟的结束交换一次,所以说选择排序法只交换了n-1次。当然在比较的时候需要定义另一个变量k,用来储存暂时得到的最小值的下标。直至出来每一趟比较出来的最终的最小值,那么才作交换。所以说实际上每趟比较只交换一次。(隐形的交换却很多,因为牵扯到暂时储存的问题)



/*//program 6.4

 #include <stdio.h>

int main()

{

    int a[10],i,j,temp;

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

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

    }

    int k;

    for (i=0; i<=8; i++) {//只有前n-1个数需要和后面的比较,共比较n-1趟

        k=i;//用k来记录最值的下标,这个题是由大到小排列,自然k记录的是当前一趟最大值的下标。

        for (j=i+1; j<=9; j++) {//从当前的a[i+1]开始(此时我们设定为a[j]),逐一增加与a[i]比较,满足要求的值的下标赋给k,用k暂时储存当前满足条件的值。

            if(a[j]>a[k])

                k=j;//将当前的最大值下标赋给k,为什么不用i呢,因为i的值不能随便变化。

        }

        temp=a[k];//当所有a[i]以后的值都和a[i]比较过后,此时第一趟筛选结束了,最符合要求的值的下标已经存在了k中,这样将a[k]与第一个值交换。第一个值就出来了。经过一趟比较,交换了一次值。

        a[k]=a[i];

        a[i]=temp;

    }

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

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

    }

    return 0;

}

*/



冒泡和选择排序不要弄混,一个是相邻的值互换,另一个是满足要求先存下标,然后再互换。

还要注意这些变量怎么控制的,for循环的含义也要重点记忆。



//二维数组表示的时候下标应该是整型的,不要有杂乱的形式。如:a[1][2],a[3][6]。而不要写成a[2-1][2*1+3]这种形式。

//对二维数组的赋值应该尽量的表示的界限清楚,可读性高。比如a[2][3]={{1,1,1},{2,2,2}},虽然这个两行三列的数组可以表示成a[2][3]={1,1,1,2,2,2},但是显然不是很清晰,很容易遗漏,出错。(注意,大括号里面的还是大括号,里面的大括号表示每行的值分别是什么)

//有这样的赋值:a[2][3]={{1},{0,3}},这样赋值,最后的数组元素是这样的,如下

/*

    1 0 0

    0 3 0     没有被赋值到的,默认为0

*/



//将一个二维数组的行与列互换,存在一个新的数组之中并输出



/*//program 6.5

 #include "stdio.h"

int main()

{

    int a[2][4],b[4][2],i,j;

    printf("请为一个2行4列的数组赋值:\n");

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

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

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

        }

    }

    printf("您输入的二维数组如下:\n");

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

    {

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

            printf("%d    ",a[i][j]);

        }

        printf("\n");

    }

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

    {

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

        {

            b[i][j]=a[j][i];//这是本程序中最关键的一行,可以先把两个互换完毕的数组的每个元素的下标写出来。然后看看规律何在。就知道怎么写转换的表达式了。这里的b[i][j]是按照下标赋值的,而不是一行一行一列一列的来的,这里读者可以画个矩阵验证一下。会明白很多。

            printf("%d   ",b[i][j]);

        }

        printf("\n");

    }

            return 0;

}

*/



//存在一个3*4的二维数组,输出数组中的最大值及其下标(下面程序的不足之处是如果最大值有两个的话,就只能输出一个)



/*//program 6.6

#include "stdio.h"

int main()

{

    int a[3][4]={1,1,1,1,1,1,1,1,1,1,1,1};

    int max=a[0][0]; //先默认数组中第一个元素的值最大

    int i,j,x,y;

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

    {

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

        {

            if(max<=a[i][j]) //等号很重要,因为如果给出的所有元素都一样,则最大值就是a[0][0],那么永远不会执行if,所以说x和y就没有赋值,就输出错误了。当然如果不加等号,只需先把x和y均赋值为0

            {

                max=a[i][j]; //如果在循环的时候发现有比max大的,立即用这个值取代max,然后将这个值的下标赋给x,y。在循环的过程中,x和y是不断发生变化,直到不需要替换或者循环结束。

                x=i;

                y=j;

            }

        }

    }

    printf("max is %d\nx=%d,y=%d",max,x,y);



    return 0;

}

*/



休息一下,写一个比较简单的程序。(program 6.7)



/*//program 6.7

//求一个3*3整型矩阵的对角线元素之和(对角线指的是由左上至右下的线,sum=a[0][0]+a[1][1]+a[2][2])

#include<stdio.h>

int main()

{

    int a[3][3],sum=0,i,j;

    printf("Please assign a 3*3 array:\n");

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

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

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

        }

    }

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

        sum+=a[i][i];

    }

    printf("%d",sum);

    return 0;

}

*/



再来一个稍微难点的程序。

//有一个已经排好序的数组,要求键盘输入一个数,按照原来排序的顺序将它插入数组中



/*//program 6.8

#include "stdio.h"

int main()

{

    int a[11]={2,3,5,9,12,14,16,16,17,19};//10个数字,但是定义的数组有11个位置,因为要留出一个位置储存新插入的数字

    int i,j,n,k;

    printf("请输入一个数字:\n");

    scanf("%d",&n);



    for(i=0;i<=9;i++)//将每一个元素都与新数比较

    {

        if(n>a[i])

        {

            if(i==9)

            {

                a[10]=n;

                break;

            }

            else

                continue;

        }//①如果插入的数比当前数组的元素大,就跳出(因为这个给定的数组是由小到大的顺序),往后顺移比较下一个(continue),接着比较下一个

        

        else//②如果a[i]>=n的话,说明n找到了需要插入的位置,那么n就应该取代a[i]的位置,然后a[i]依次取代后一个

        {

            k=i;//将i拿出来,最后插入的时候n是插入到a[k]的位置

            for (j=10; j>=i; j--) {//这里就是本题的重点了。从后往前,依次取代每个值的下一个值,因为这样不会乱。这里需要记住,必须是从后往前,可尝试验证一下

                a[j+1]=a[j];

            }

            a[k]=n;

            break;

        }

    }

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

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

    }

    return 0;

}

 */



写今天最后一个程序吧



//输出杨辉三角

/*

 1

 1   1

 1   2   1

 1   3   3   1

 1   4   6   4   1

 1   5   10  10  5   1

*/

/*//program 6.9

#include<stdio.h>

int main()

{

    int i,j;

    int a[10][10]={1};

    for (i=1; i<=9; i++) {//i控制行数,j控制列数

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

            a[i][j]=a[i-1][j-1]+a[i-1][j];//任一元素等于 它上面的元素 与 它左上的元素 之和

            printf("%-4d",a[i][j]);//左对其只需要设置每一个元素的长度为4d,然后加个符号就可以了

        }

        printf("\n");

    }

    return 0;

}

*/



今天我们认识了数组,写了数组入门中最经典的程序,今天需要消化的内容很多,希望读者多敲代码,多分析,吃透今天的内容。

版权声明:本文为博主原创文章,未经博主允许不得转载。

12天学好C语言——记录我的C语言学习之路(Day 6)的更多相关文章

  1. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  2. 12天学好C语言——记录我的C语言学习之路(Day 11)

    12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...

  3. 12天学好C语言——记录我的C语言学习之路(Day 10)

    12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...

  4. 12天学好C语言——记录我的C语言学习之路(Day 9)

    12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 7)

    12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 5)

    12天学好C语言--记录我的C语言学习之路 Day 5: 第五天的学习开始了,今天我们主要对几个程序进行编写,让自己充分的熟练编程语言,大量的题目会让自己变的精炼.以一个程序(program 5.1) ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 4)

    12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1  2  3   4   5 2  4  6   8   10 3  6  9   12 ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

随机推荐

  1. React Native知识8-WebView组件

    创建一个原生的WebView,可以用于访问一个网页.可以加载一个URL也可以加载一段html代码: 一:属性 1:iosallowsInlineMediaPlayback bool 指定HTML5视频 ...

  2. I&period;MX6 Android 5&period;1 快速合成系统

    /**************************************************************************** * I.MX6 Android 5.1 快速 ...

  3. svn版本库包含多个项目 &semi; git svn clone&semi; 某一个子项目,有多个分支;

    情况描述: 公司的svn版本库,包含了多个项目,每个项目对应于1个文件夹 假设版本库名字为Main,其下的项目用 A项目,对应文件夹A B项目,对应文件夹B 通过git svn clone获取了svn ...

  4. 深度优先算法DFS

    英雄要从H点出发,去解救位于M点的美女. 迷宫的围墙用#表示,带*号的位置表示有杀手埋伏,这些点都是不能走的, 那么英雄要最少走多少步才能解救美女呢? package myalgorithm; imp ...

  5. java 正则匹配int型

    private static Pattern DIGIT_PATTERN = Pattern.compile("=\\d++"); Matcher goodsTypeMatcher ...

  6. &lbrack;Linux&rsqb; PHP程序员玩转Linux系列-搭建代码开发环境

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 有些同学可能觉得我写的都是啥yum安装的,随便配置一下而已,没啥技术含量,我的目的 ...

  7. UVA - 1220 Party at Hali-Bula 树的最大独立集

    题意:  给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集.并判断最大独立集是否唯一 思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示以i为根的子 ...

  8. 删除N天前的文件(夹)与拷贝文件到共享盘的批处理

    rem ======= 删除目录 7天前目录 ========= forfiles /P "E:\Folder" /S /D -7 /C "Cmd /C If @isdi ...

  9. Berlekamp-Massey算法学习笔记

    Berlekamp-Massey算法 很久之前就听说过这个算法,当时六校联考的时候Day1T1是一道很有意思的递推,神仙zzx不会做于是就拿BM算法艹出了递推式Orzzzzzzzzzzx 推荐一篇讲的 ...

  10. c&num; usercontrol 用户自定义控件无法显示在工具箱的解决办法

    由于最开始x86平台,后来换成anyCPU 重新编译也没有删除x86目录下的dll ,也没重新生成 费x86 下的dll , 导致工具箱无法找到目录下的dll 无法加载自定义控件 右击工具栏中的内容选 ...