初学C语言的一些建议

Comments: No Comments
Published on: 2009 年 04 月 21 日

大一还是大二的时候写的,从QQ空间转过来的

学C语言有一段时间了,不敢说学得好吧,但是对C语言也有一些认识了,但越来越感觉自己对C语言的无知了……很矛盾吧?呵呵。
就不跟大家废话了,仅仅是想告诉大家,一定要深入的学习它。
平时很多同学问我关于C语言方面的问题,大家问的多了,也就大概了解了一些大家到底哪里有问题、哪里有困难,经过总结,罗列以下:
1、基础太差。学习C语言,就像学习语文、数学一样,你首先必须了解,也可以说是必须掌握基本语法和概念。你要学语文,首先要认识汉字,会写汉字吧?学习数学,你也要先认识十个阿拉伯数字吧?C语言也是这样,你想学它,就要先掌握这些概念和语法。如果你真正的掌握了这些,并且把这些融入到你的血液里,我想像“忘记‘;’”、“\85表示什么”、“SCANF()控制输入函数应用”这些基本的问题你也不会问我了。还有多同学问“sizeof”是什么函数,我都无法回答,课本上都很明显的写着“运算符”!根本不是什么函数。平时加括号用是因为计算括弧内整体字符长度。
2、操作太少。C语言,作为一门语言,实际的练习是必不可少的,因为你无论把课本看多少遍,记多么熟,也是无法学好这门语言的。平时也有很多这样的同学,常问一些稀奇古怪的问题,“这样行不行、那样行不行?”。如果你直接操作这些,是不是比你问别人更容易记忆和理解呢?
3、不自己思考。现在常操作的这部分同学里,还有很大一部分只能称之为“所谓的操作”。怎么这么说呢?因为他们操作的时候就对着课本抄,所以叫“抄做”。你写程序的过程中,是否有自己的思想?是否想过算法?碰到一个问题,你是否首相想到这个问题是怎么回事?如何产生?还是你有问题就直接找同学、老师帮忙了?有一些这样的同学,你们必须思考一下了!我平时碰到这样问我的同学,都是直接让他自己去想了,不是我闲麻烦,也不是不想帮忙,仅仅是想让你自己想,自己思考。因为这些问题都比较简单,只要稍微思考就可以解出来。这类现象的另一个表现就是:“我看着书都懂了,也很熟练,就是一操作什么都不知道,脑子里一片空白。”这说明了什么?仅仅说明你不懂,也不熟练,甚至是不理解!就像求500-1000之间的所有素数,就这个课本上的原题,可以难道一大片同学,不是我夸张,我已经见过很多这样的情况了。一拿走他的课本,然后让他自己写,一个字母都写不出来!这个问题十分严重,不知道以前我让你自己想的同学是否有了这些认识?很多时候,我仅仅是想让你自己思考。
4、没有认识到C语言的博大,轻视它。也有这样一些同学,当学习到“C语言是最低级的编程语言”以后,就对这门经历30多年,经久不衰的语言产生了轻视它的心理。认为以后学习好高级语言就行了。对于这些可能也是正常反应,因为就像一个圆一样,你这个圆越大,接触的外界就越大——“知道的越多,越无知”或者“无知者无畏”。这里没有别的意思,仅仅是想告诉大家C语言很强大,你使用的windows操作系统都是C语言写的!而且经过几十年无数先辈们的算法积累,很多很好、很厉害的算法都是你以后学习任何一门语言所不可缺少的!只要算法你铭记于心,你学任何语言都比别人强!
以上是我暂时想到的一些比较突出的问题,本人也是新手,说出的东西可能也很无知,高手见谅。

上边提到了算法的重要性,我想有可能的话就尽自己所能帮助大家多学习一些好的算法。很多同学问过我递归的算法。接这个机会再次跟大家详细解释一下:
先给大家写两个程序:
(一)、
#include"stdio.h"
int a(int n)
{ if(n==1)
return 1;
else
return 2*a(n-1)+1;
}
main()
{ int i;
scanf("%d",&i);
printf("%d",a(i));
}
(二)、
#include"stdio.h"
int sum(int *a,int n)
{ if(n==1) return a[0];
else return sum(a,n-1)+a[n-1];
}
main()
{ int a[]={1,2,3,4,5};
printf("%d",sum(a,5));
}
第一个程序是:求解递推数列An,后一个是求N个数的和。个人认为很具有代表性、也很简单,所以拿来给大家做演示用。
套用其实很简单,不用想那么复杂,如果你对此比较陌生,那就用数学思想直接思考就可以了,比如第一个程序:如果n=3,那么在IF判断中执行ELSE得到式子:2*a(2)+1,很明显,还得不到结果,并且又用了一次a()函数,那就接着套用得到式子:2*(2*a(1)+1)+1,
此时n为1了,当再执行函数时,就不再执行ELSE后边的程序了,而是执行IF。套用最终结果就是2*(2*1+1)+1=7 然后才执行RETURN。我想这样解释有助于大家理解递归了吧?
后一个程序仅仅是复杂一点点,但前边的方法同样奏效,最后套用结果是:a[4]+a[3]+a[2]+a[1]+a[0]=15。这两个程序都很简单,并且常用,具有代表性,但对学有余力的同学,再给出后边两个程序,帮助大家进步,这两个自己思考!
(三)、#include
int max (int* a,int n)
{int v;
if(n == 1)
return a [0];
else v = max (a,n - 1);
return v > a [n - 1] ? v : a [n - 1];
}
main()
{int s[4] = {2,5,7,3};
printf("max () returns %d\n",max (s,4));
}
(四)、#include
int max(int* a,int n)
{int j;
if(n == 1)
return 0;
j = max(a,n - 1);
return (a[j] > a[n - 1]) ? j : n - 1;
}
void swap(int* a,int* b)
{int i = *a;
*a = *b;
*b = i;
}
void sort(int* a,int n)
{int k;
if(n == 1)
return;
k = max(a,n);
swap(&a[k],&a[n - 1]);
sort(a,n - 1);
}
int main()
{int a[5] = {3,5,1,4,2};
sort(a,5);
printf("%d %d %d %d %d",a[0],a[1],a[2],a[3],a[4]);
}
后边两个是扩展,三是求一组数中最大数,四是对一组数排序,均是利用递归套用实现的,大家可以研究研究。看不懂了可以找我再互相讨论讨论,前提是必须自己思考过了,否则就没法了。如果你实在不想更深入研究,那用循环控制实现这些也可以。

最多留言日志

No Comments - Leave a comment

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>


Welcome , today is 星期二, 2017 年 10 月 24 日