入门级 C语言期末复习(1)——基本概述

期末将至,希望同学们能好好复习,成绩理想,在此写下一些本学期的学习体会,希望能帮到大家。

写程序前的准备

我们这门课程的核心能力就是写程序,但是写一个程序不仅仅是敲几行代码这么简单,写程序是一个综合的过程需要我们分析问题、设计算法、编写程序、编译程序、调试程序、日后我们还需要编写程序文档。这些步骤缺一不可,而且都很重要。

有的同学看见一道题目想了想就直接开始在电脑上敲了,其实这是不对的,对于我们而言,在敲代码之前,首先要审题,把题目要求看懂,比方说【判断点是否在圆上】这一题,之前我就看见有同学判断的是点是否在园内,这样犯错得不到分是很冤的。
在这里插入图片描述
其次一定要有全局思考的过程,要非常清楚整个程序的思路流程,我的个人建议是:最好把程序思路写一遍,哪里需要注意的,哪里是实现算法的关键地方,哪里容易忽略的,都应该在草稿纸上呈现出来。因为当你思考整个程序的时候,一些细节就可以注意到,这样你在打代码的时候就不会疏漏。倘若是一边打代码,一边思考,很容易就会忽略重要的东西,最糟糕的是,当你把代码全部写好后,一编译,全是错误,辛辛苦苦把错误改正好后,一运行,结果跟自己想的不同,然后又重新开始看自己的代码哪里有问题(当然有时候这个环节不可避免,改程序会在后面讲到)。

在纸上把流程写好后,把代码打好,对于我们来说就是一个不难的事情了。从这点看来,我们实际上就是工程师,把我们已掌握的知识进行组合,再用程序这个工具加以实现。对于工程师来所,图纸是最重要的东西,有了图纸,万丈高楼才能搭建起来。

当然了,之前讲到,程序有错误是难以避免的,我们尽可能在准备阶段减少问题发生的可能性,但一旦问题发生了,我们还得去改正。

程序错误

程序错误无非就是三类,一是语法错误,这个是很容易改正的,因为编译器会报错。但有的语法在codeblocks上没问题,但是在OJ系统上是过不了的。暂时发现了几个,跟大家分享下:

1、 gets函数和puts函数在现在codeblocks的版本中是包含在stdio.h中的,一些数学函数如abs等在stdio.h中也是有的,这时后如果你没有写 <string.h>或<math.h>,OJ系统是判定你错误的。
2、 在写多个函数时最好现在main函数前声明,然后再在main函数下方写已声明的函数,否者的话,OJ系统有可能报错。
3、 定义结构体时,应该在main函数前定义,如果在main函数里面定义结构体,OJ系统会现实编译错误。
4、 没有return 0;有超时的可能性

第二类的错误是运行错误,即由于编译成功了,但是由于程序中的不合理操作,导致无法继续正常运行的错误,例如:

1、 死循环。
2、 用scanf语句输入时变量前没有取地址“&”.
3、 链表“断开”了(上一个结点的指针域不能指向下一个结点)

第三类错误是逻辑错误,这类错误往往比较难以发现和改正.

有时候表现为自己的结果和预期结果不同,这种可通过跟踪变量来改错。也就是Debug,当然也可以直接在程序的不同位置输出数据来跟踪变量的变化情况。

有的时候,表现为自己测试的数据正确,提交到OJ上判定为错,这时候情况呢比较棘手,需要通过自己设计数据来判断发现错误,一般可以设计边界值,特殊值。例如寻找鞍点这一道题,有没有可能鞍点在第一个位置但是程序判断不到呢,有没有可能鞍点有两个呢,有没有可能有重复数据呢,这些数据都是可以自己输入判断的,如果在设计最开始没有考虑到这些问题,就要在改程序的时候去验证,去改正。

代码风格

回到写代码这个问题上,首先希望大家能有一个好的代码风格,虽然C语言对源代码的格式没有特别规定,可以将几条语句写在一行,也可以换行不缩进,但是这样的程序可读性差,不易于理解。一方面不方便自己查改,另一方面不方便与人交流,再者当以后我们的程序写的很长的时候,不好的代码风格可能会影响你的思路开展。我们可以参照下课本的代码,或者我们写的题解的代码风格也基本和书本上是一致的。大家可以参照下面的例子:【学生信息管理】。

#include <stdio.h>

struct student
{
    int screo[11];
};
typedef struct student DEG;

int main()
{
    DEG stu[1005],t;
    int i,j,n,m,sum[20],t1;					//变量取名尽量望名知意
    double ave[20];
    scanf("%d%d",&n,&m);
											//一个较为完整的功能块结束后可以适当换行
    for (i=0;i<n;i++)
    {										//用大括号后缩进一个Tab
        for(j=0;j<m;j++)                    //读入数据(做适当的注释,方便自己和他人的理解)
        {
            scanf("%d",&stu[i].screo[j]);   //注意结构体的使用
            sum[i]+=stu[i].screo[j];
        }
    }

    for (i=0;i<m;i++)                       //注意m,n的使用
    {
        for (j=0;j<n;j++)
        {
            ave[i]+=stu[j].screo[i];
        }
        ave[i]/=n;                          //算出平均分
    }

    for (i=0;i<n-1;i++)                     //冒泡排序
    {
        for (j=0;j<n-1-i;j++)
        {
            if (sum[j]<sum[j+1])            //交换学生信息的同时还要交换总分
            {
                t=stu[j];
                stu[j]=stu[j+1];
                stu[j+1]=t;

                t1=sum[j];
                sum[j]=sum[j+1];
                sum[j+1]=t1;
            }
        }
    }

    for (i=0;i<n;i++)                       //输出数据
    {
        for (j=0;j<m;j++)
        {
            printf("%d ",stu[i].screo[j]);
        }
        printf("\n");
    }

    for (i=0;i<m;i++)
    printf("%.1lf ",ave[i]);

    return 0;
}

数据类型

关于数据类型,分为基本类型构造类型指针类型,和空类型(void)。基本类型的大类是整型、浮点型、字符型,只是在此基础上还可以细分,如有无符号,精度是单精度还是双精度等。基本使用上我们都懂,只是我们应该注重细节,加深理解。

整型的运用大家都比较熟练。浮点型大家记住没有特别要求就用double类型就好了,用float的话,某些情况下OJ有可能会判错,但是用double的话也要记得输入时要用“lf”的格式字符。这里要注意1.23e3是浮点型数据的一种表示方法,代表1.23*10^3。关于字符型的使用,大家要记得转义字符的使用,我们比较常用的是‘\n’、‘\0’,但还又其他的一些转义字符的使用,大家翻课本回忆下。

讲到数据类型就不得不提及数据存储的问题了,大家得清楚数据在内存中存储的原理,例如,声明了整型数据类型a后(int a),系统就为其开辟了一个4个字节(不同类型字节数不同)的空间,专门用于存放数据(以二进制的形式),并且给这4个字节命名为a,当你要使用这个数据是,通过变量名a就可以直接调用,亦或者你取a的地址,知道了这个数据所在的位置,你就可以通过地址直接定位到数据的位置使用。通过改动内存中这4个字节中存储的内容,就可以实现改变数据。理解清楚这一点后,对后面指针和链表的学习非常有帮助。

数据的存储,比较特别的是字符型的存储,在内存中是以ASCII码的形式存储的,其实也可以理解为用特定的一些数字代表特定的字符,这就意味着,字符型是可以做运算的。

对于不同数据类型之间的运算和数据类型数据的转换,大家也要注意。自动类型转化,浮点型和整型之间的计算,字符型和整型之间,都是一个怎么样的运算关系。强制类型转换,在判断整数如何使用。这里设计的细节比较多,而且课上都讲过,大家看看书,回忆一下,回忆不起来也没有关系,看书也可以看懂。

运算符和表达式

就运算符和表达式来说,值得注意的是数据的运算规则,尤其是一些比较细的地方,例如整型相除向0取整的规则,求模结果的符号与被除数的相同,自加自减运算(i++、++i)中,是先计算结果还是先运算的问题。还有各种运算符的优先级,结合性,大家都要搞清楚。在书本208页,有“运算符及其特征的表格”内容比较详细,大家可以稍加记忆。在这里插入图片描述

下一篇文章: 入门级 C语言期末复习(2)——基本控制结构

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值