zoukankan      html  css  js  c++  java
  • C语言初学者该如何着手写代码

    我有一些相对初学编程的人想说的话,写在这里,希望可以给有缘看到这些内容的入门级编程人员一些帮助。

    C语言难吗?

    第一个问题,C语言难吗?或者说编程难吗?在目前的环境里,第一次接触 C 语言的人应该大多数都是大学生了。你们大部分人已经经历过中国的高考,而且大部分人都在高考中取得了不错的成绩,说实话,编程比起很多高中的课程都简单,举两个真实的例子:

    比尔·盖茨出生于1955年,但是他在1971年,已经开始为湖畔中学编写程序,其中包括一款课表安排软件【来源百度百科】。大家可以算一下,他在 1971 年应该是 16 岁。另一个人就更厉害了,来自芬兰的 Linus,也是在高中的时候就写出了 Linux 操作系统最初的版本。(Android 可以说就是 Linux 在手机上的一个分支)

    虽然这两个人都是天才,我们可能没办法和他们比,但是仔细想想你们现在做的题,题目中要解决的问题真的很难吗?

    写代码的一般步骤

    今天以群里一个小伙伴的题目,讲一下写代码的一般步骤,我把题目内容摘抄在这里:

    “键盘输入一个3行4列的整型二维数组a[3][4]的数据,找到鞍点。所谓鞍点,就是该位置上的数,在它所在行最大(没有跟它相等的数),在它所在列最小(没有跟它相等的数)。注意:也可能没有鞍点。若没有鞍点,输出:“not exist””

    这道题涉及到了多位数组,有些同学就有点害怕了,但是如果抛开写代码,假如你自己就是一个程序,如果别人给你一个二维数组,你能从中找出鞍点吗?我相信大部分人都是可以吧?甚至于找个小学四五年级的学生,只要你把什么是鞍点给他解释清楚,他也能给你找出给定数字中的鞍点。

    假如你自己就是一个程序,说点题外话,我这样说是希望你们可以设身处地的站在计算机的角度考虑问题,举个简单的例子,比如scanf("%d,%d", &a, &b);这句代码,里面的“%d,%d”被称为格式化字符串,就是计算机希望你在输入的时候以这种格式输入,比如这个地方的格式就是两个数之间有个逗号,所以输入a和b的值时,最好是输入“3,4”这样的。

    看到一个题目,首先要做的事就是想思路,而不是直接写代码。比如我看到这道题,我脑海里出现的思路是这样的:

    1. 找到第一行最大的数,看一下它是不是在所在列最小。
    2. 找到第二行最大的数,看一下它是不是在所在列最小。
    3. 找到第三行最大的数,看一下它是不是在所在列最小。

    当然了,因为每个人思考问题的方式不一样,所以每个人的思路也是不一样的,这也就导致我们每个人写出来的代码也会不一样,所以编程的题目是没有标准答案的。

    想思路是写代码最重要的步骤,如果没有思路,肯定写不出代码。比如这道题的这个思路,相信大部分人都能想出来,但是就是写不出来是不是?这就是另一项能力,把自己的思路转换成代码的能力,这项能力没有捷径,只能通过多写多练来达成。最怕的就是眼高手低,觉得自己有思路,代码就不写了。另外,多思考也是非常重要的,脑子这个东西一定要多用,不要一遇到问题就在群里问,说不定自己离成功就差一点点了。

    编写代码

    接下来就是把我们的思路写成代码,说难也难,说不难也不难。

    #include <stdio.h>
    
    int main()
    {
        // 为了可读性,这里定义了变量 line 和 column 代表数和列数。
        int lineCount = 3, columnCount = 4;
        // 定义数组
        int array[lineCount][columnCount];
        // 输入二维数组的值
        for (int line = 0; line < lineCount; ++line)
        {
            for (int column = 0; column < columnCount; ++column)
            {
                scanf("%d", &array[line][column]);
            }
        }
        // 定义一个变量存储是否存在鞍点
        int exist = 0;
        // 一行一行的查找鞍点
        for (int line = 0; line < lineCount; ++line)
        {
            // 定义一个变量代表一行中最大值所在列
            int maxCol = 0;
            // 定义一个变量代表这行是否存在不止一个最大值
            int hasEqualInLine = 0;
            // 循环一个行中的数,找出其中的最大值
            for (int col = 1; col < columnCount; ++col)
            {
                if (array[line][col] > array[line][maxCol])
                {
                    // 这个条件成立,说明在这一行中找到一个更大的数字
                    maxCol = col;
                    hasEqualInLine = 0;
                }
                else if (array[line][col] == array[line][maxCol])
                {
                    // 又找到一个数和当前的最大值相等
                    hasEqualInLine = 1;
                }
            }
            // 程序走到这里就是循环完一行了,这个时候就可以判断当前行存不存在鞍点了
            if (!hasEqualInLine)
            {
                // 这个变量表示这个数在所在列是否是最小数
                int isMin = 1;
                // 定义一个变量代表所在列是否有相等值
                int hasEqualInColumn = 0;
                for (int line2 = 0; line2 < lineCount; ++line2)
                {
                    if (line2 == line) {
                        // 没必要和这个数自身比
                        continue;
                    }
                    if (array[line2][maxCol] < array[line][maxCol])
                    {
                        // 此列中其他行中的数比我们找到的数小
                        isMin = 0;
                        break;
                    }
                    else if (array[line2][maxCol] == array[line][maxCol])
                    {
                        // 此列中其他行存在和我们找到的数相等的数
                        hasEqualInColumn = 1;
                        break;
                    }
                }
                if (isMin && !hasEqualInColumn)
                {
                    // 这个数是鞍点
                    exist = 1;
                    printf("a[%d][%d]=%d\n", line, maxCol, array[line][maxCol]);
                }
            }
        }
        if (!exist)
        {
            // 程序执行到最后都没有找到鞍点
            printf("not exist\n");
        }
    }
    

    这就是我按照我的思路写出来的代码,在写这个代码之前,我也没想到能写这么多行,为了保证已读性,里面加了很多注释,大家可以读一下,验证一下。

    写在最后

    如果想学好 C 语言,学校发的教科书起码要看一遍,看一遍书基本上语法就都掌握了。有一些问问题的人连 switch 语句怎么写都不知道就来问怎么改,遇到这样的人真是不知道该从何教起。另外就是在问问题前可以先尝试在网上查一下有没有现成的解决方案,毕竟每个人的时间都是宝贵的,我希望每个问问题的人都是在经过自己本人尝试过无果再问问题,而不是自己懒得去想懒得去做就来问别人,没有人有义务来帮你去思考。

  • 相关阅读:
    表数据转换为insert语句
    Google Map Api 谷歌地图接口整理
    VS预生成事件命令行 和 生成后事件命令行
    C#程序开机运行
    枚举数据源化
    winform分页管理
    数据库访问驱动
    sql时间格式
    sysobjects.xtype介绍
    编码标准的多样性
  • 原文地址:https://www.cnblogs.com/scfhao/p/15543264.html
Copyright © 2011-2022 走看看