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



Day 1:



刚刚入门C语言,那么肯定要先把什么是C语言和大家讲清楚,那么大家看下面一段程序(program  1.1):



/*//program 1.1

#include<stdio.h>  //编译预处理指令,编译系统要求提供程序中有关函数的信息,而stdio是”standard input&output”的缩写(标准输入输出)

//后缀.h的意思是header file(头文件)

int main()    //定义主函数(main函数是int类型,也就是整数类型,执行主函数会得到一个值,其值应该为int类型)

{    //函数开始的标志

    printf("this is a C program.\n");    //  输出信息

    return 1;   //函数执行完毕返回函数值1,因为必须返回一个int类型的值。

}    //函数结束的标志

*/



各位上机敲一下 program1.1 中的代码,感受一下C语言的魅力所在,C语言是最基础的语言了,他是面向过程的语言,怎么理解呢?比方说你做一道数学题,那么C语言就是解题步骤了。如果你不会概率,你不会圆锥曲线方程,你不会函数,那么你也看不懂这道数学题的解体思路。所以说,C语言是给计算机读的,是给程序员看的,一般人看不懂,所以说是面向过程的。



下面看 program 1.2 ,在这个程序里我们认识到了变量,也对变量进行了一系列的操作。



/*//program 1.2

#include<stdio.h>

int main()

{

    int a=1,b=2,sum;   //这里的a,b,sum都是变量名,int为变量的类型

    sum=a+b;

    printf("sum is %d\n",sum);   //在输出时,变量sum取代了格式符%d,sum的计算结果是3,所以输出的结果也是3。

    return 1;

}*/



简单的处理了一个变量的程序之后我们不妨再来看看C语言中更富有魅力的东西。为什么要编程?因为我们用人脑无法处理大量的计算,那些人脑遥不可及的运算必须用计算机程序来实现,这就是计算机的优势所在了。下面我们就来初步感受一下。 program 1.3 为大家展示的是一个函数max。大家可能多少了解C语言,如果学过那就再好不过了,老师肯定会让大家先去写一个max函数来比较两个数字的大小并输出最大值,在这里我要为大家列举一个新手经常犯的错误。错误代码如下:



/*//program 1.3

#include<stdio.h>

#include<math.h>

int main()

{

    int a=1,b=3,c;

    c=max(a,b);    //我在这里直接调用了max函数,但是程序是错误的,我已经写了math.h的头文件了,为什么还是无法正确调用这个函数呢?      显然问题的答案就是math.h里面并没有max这个函数,我们需要自己去写一个比较两个数大小的max函数。

     printf("max is d%\n",c);

    return 0;

}*/

正确代码如下:

/*//program 1.4

#include<stdio.h>

int main()

{

    int a,b,c;

    scanf(“%d,%d”,&a,&b);   //这里格式上两个%d之间有“,”,所以说在输入的时候一定要加上逗号。如果格式中什么都不加,那么也可以,只是要在输入的时候加上空格或回车。scanf函数中包含两部分,一个是你输入的数据要按照什么格式,后一部分就是输入的两个数存入到两个地址中,&a就是变量a的地址,而&b就是变量b的地址,你定义的变量a,b,所以后面也要跟&a,&b,不能前面定义的a,b,而后面&e,&f

    int max(int a,int b);   //一定要在main函数中声明,因为程序自上而下的进行,执行到下一句c=max(a,b)的时候使用到了max函数,如果不去声明max函数,那么程序是不认识max这个函数的,就会报错。但是如果把下面max的定义部分代码提前到main函数的前面,那么执行的时候就不用加这一句话了(如下面 program 1.5)。(但是为了程序的可读性,还是要规范一点加上函数声明)

    c=max(a,b);

    printf("c= %d\n",c);

    return 0;

}

int max(int x,int y)    //被调用的函数,函数名后面必须跟圆括号

{

    int z;

    if(x<=y)

        z=y;

    else

        z=x;

    return (z);    //根据需要选择返回值,而不是每一个函数后面都要return 0;

}

*/



在上面的函数中,函数声明的地方我们看到声明了两个变量a,b,下面函数定义部分,我们也看到了,这里的a,b是函数的形参变量,而在调用函数的时候(  c=max(a,b); ),这里的a,b有具体的值,是定义好的或者是手动输入的,属于实参。那么形参和实参又有怎样的区别呢?



我们可以这样考虑:形参的本质是一个名字,不占用内存空间。实参的本质是一个变量,已经占用内存空间。



函数的形参和实参具有以下特点:  

 1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。  

 2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。

 3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。  

 4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。



读者一定要仔细把握上面的这几句话,并深入理解,这很重要。走好一小步,夯实基础,对以后的程序会有莫大的帮助。



/*//program 1.5

#include<stdio.h>



int max(int a,int b)

{

    int z;

    if(a<=b)

        z=b;

    else

        z=a;

    return(z);

}



int main(void)   //函数名后面必须跟小括号,括号内写参数名和参数类型,如果函数没有参数,小括号中写void或者是不写

//一个程序总是从主函数(main函数)开始执行的,所以main函数的位置可以靠前也可以靠后

{

    int a,b,c;

    scanf("%d%d",&a,&b); //记住,scanf和printf都是库函数,输入输出在C中实现函数化,C本身不提供输入输出的语句!!!!!

    c=max(a,b);

    printf("max is %d\n",c);

    return 0;

}



void abc()  //这是一个空函数,类型为void,这样写一个空函数在程序里,是合法的

{

}

*/



像 program 1.5 ,在主函数中并没有声明max函数,但是由于在main函数前我们定义了一个max函数,所以程序“认识”这个函数了,所以程序依旧正常执行。



上面我们又提到了一个新的知识点,就是空函数,空函数只是没有什么作用,但是却是合法的。比如下面程序 program 1.6,也是合法的。



/*//program 1.6

#include<stdio.h>

int main()

{



}

*/  //这也是没有错误的



下面,我们要探讨当遇到大量的循环数据的时候应该怎么操作呢?比方说求1+3+5+…+99的结果。显然这个式子我们不能把所有项都写下来,这时候我们就要考虑循环了。(如:program 1.7)



/*//program 1.7

#include<stdio.h>

int main()

{

    long p=0;

    for (int n=1; n<=99; n=n+2) {

        p=p+n;

    }

    printf("%ld",p);

    return 0;

}

*/



上面的循环仅供读者参考,具体的for循环如何实现,在后面的章节中有介绍。

在for循环中我们将处理好的变量p输出,这里我们必须要提一个事情,那就是在for循环中的什么变量可以输出,什么变量无法输出。这牵扯到一个变量释放的问题,再看下面 program 1.8 。



/*//program 1.8

#include<stdio.h>

int main()

{

    for(int i=1;i<=10;i++)

    {

        int j=4;

    }

    printf("%d",i);    //这里可以输出i,因为i并没有被释放,而如果输出j,j是被释放的,换句话说输出的时候j已经不存在了。因为大括号内声明的变量随大括号内的程序块消失而释放,而上面的i属于main函数下的大括号,所以只有main函数结束时,i才被释放,故在输出语句中,i是存在的,可以输出。这一点大家一定要小心注意!

    return 0;

}

*/



不管是哪个版本的C语言书籍,肯定会在前几章中就像大家介绍一个判断是否是闰年的C程序。下面我们就来写一下这个程序。(program 1.9)



/*//program 1.9

#include<stdio.h>

int main()

{

    int year;

    scanf("%d",&year);  //输入一个年份,判断是不是闰年。这个地方我们需要注意一点,那就是scanf(“%d\n",&year);  这样写是错误的,因为\n不能加在scanf中

    if((year%4==0&&year%100!=0)||(year%400==0))  //这一句就是整个程序的关键了,用了if语句,里面分好几个层次,用来分别判断条件是否满足。这里的数学运算判断符号过于简单,请读者自行查阅相关书籍进行学习,这里不做解释

        printf("是闰年");

    else

        printf("不是闰年");

    return 0;

}

*/



第一天我们粗略的认识了C语言最基本的变量,循环,判定语句,输入输出语句。并且对里面经常犯的错误和模糊的定义做了解释,上面的程序都很基础,比较适合初学者去读。之后的学习会逐渐深入,代码行数也会逐渐增加,变得越来越复杂。记住,编程和做数学题一样,多写多练就能成功。不要只是看书,看学习视频,看别人的总结。这些都是辅助工具。最重要的还是去自己敲一敲代码,去多练习。在调试程序的同时获得收获。15天学好C语言这篇连载的文章是我切身实践并总结的,我的的确确只用了15天的时间并将每天的收获记录下来,这个过程所需时间不长,半个月而已,但是速成也不是那么容易的,我建议读者每天至少写500行代码,15天之后你会感觉你对编程已经有初步了解了。

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

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

  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 6)

    12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n;   scanf("%d,& ...

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

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

  9. 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 ...

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

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

随机推荐

  1. Notepad++的一些常用的快捷键

    ctrl+/  一个一个单词的往后跳Ctrl+H 替换Ctrl+F  查找Ctrl+D 复制当前行到下一行Ctrl+L 删除当前行Ctrl+Shift+F 在文件中找F5 打开run对话框F11 全屏 ...

  2. 【STL源码学习】STL算法学习之二

    第一章:前言 学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起. 第二章:明细 copy 函数原型: template <class InputIterator, cla ...

  3. SQLite使用教程8 Insert 语句

    http://www.runoob.com/sqlite/sqlite-insert.html SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添 ...

  4. Redis实战之征服 Redis + Jedis + Spring (二)

    不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...

  5. 教你50招提升ASP.NET性能(八):检查你使用了什么客户端脚本

    (14)Review what client scripts you are using 招数14: 检查你使用了什么客户端脚本 Out of the box, many ASP.NET projec ...

  6. spring mvc+ajax分页

    分页大致思路:页面每次把当前页传到后台并获得从后台传过来的json数据,解析后布局到这个页面上. 1.服务端代码: @Controller public class MemcachedContrlle ...

  7. 从Eclipse到Android Studio经历

    现在不得不要和相处近两年的Eclipse分手了,很舍不得,谢谢你这些日子有你的陪伴,每天都会有些的期待和挑战.两年来,我们建立了很深厚的情感.曾经以为我的世界只能有你,而现在我的心里可能有了别人.起初 ...

  8. iOS开发——面试笔试精华(二)

    面试笔试精华(二) 警告:一定要把英文题目过一遍,有些公司的题目故意弄成英文的!!! 1.        Difference between shallow copy and deep copy? ...

  9. Android Settings 导入eclipse

    1.加载源码 Android Project from Existing Code 选择源码工程Settings: 2.加载所需要的jar包 (改下名字) out/target/common/obj/ ...

  10. 一个.Net程序员:既然选择了编程,只管风雨兼程(转)

    一个.Net程序员:既然选择了编程,只管风雨兼程 一次会议记录是不会有人感兴趣的,做标题党也是不道德的.所以,走了个折衷的路线,标题不叫会议记录, 内容不纯总结,技术加吐槽,经验加总结. 对于一个程序 ...