这是谭浩强教授编写的"C程序设计"中的一个程序,但是我看不懂答案,请求高手给予指教.
程序中设longest函数的作用是找最长单词的位置.此函数的返回值是该行字符中最长单词的起始位置.用flag表示单词是否开始,flag=0表未开始,flag=1表已开始;len代表当前单词已累计的字母个数;length代表先前单词中最长单词的长度;point代表当前单词的起始位置(用下标表示);place代表最长单词的起始位置.函数alphabetic的作用是判断当前字符是否是字母,若是则返回1,否则返回0.
#include"stdio.h"
#include"string.h"
void main()
{int alphabetic(char); /*为什么不用char c*/
int longest(char []); /*为什么不用char string[]*/
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("the longest word is:");
for(i=longest(line);alphabetic(line[i];i++)
printf("%c",line[i]);
}
int alphabetic(char c)
{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else return(0);
}
int longest(char string[])
{int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++)
if(alphabetic(string[i])) /*这是要满足什么条件*/
if(flag) /*同上*/
{point=i;
flag=0;
}
else len++;
else
{flag=1;
if(len>=length)
{length=len;
place=point;
len=0;
}
}
return(place);
}
除注释外,请详细说一下longest函数,小弟在此先行谢过各位大侠了.
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。
常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,TurboC等等......
C语言的优点
1. 简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
2. 运算符丰富
C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
3. 数据结构丰富
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
4. C是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
5. C语法限制不太严格,程序设计自由度大
虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。
6. C语言允许直接访问物理地址,可以直接对硬件进行操作
因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。
7. C语言程序生成代码质量高,程序执行效率高
一般只比汇编程序生成的目标代码效率低10へ20%。
8. C语言适用范围大,可移植性好
C语言有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。
C语言的缺点
1. C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别。
2. C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
[C语言指针]
指针就是C语言的一大特色,可以说C语言优于其它高级语言的一个重要原因就是因为它有指针操作可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素。C++在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。Java取消了指针操作,提高了安全性。
C源程序的结构特点
1.一个C语言源程序可以由一个或多个源文件组成。
2.每个源文件可由一个或多个函数组成。
3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。
4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。
5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
学习C语言
在初学C语言时,可能会遇到有些问题理解不透,或者表达方式与以往数学学习中不同(如运算符等),这就要求不气馁,不明白的地方多问多想,鼓足勇气进行学习,待学完后面的章节知识,前面的问题也就迎刃而解了,这一方面我感觉是我们同学最欠缺,大多学不好的就是因为一开始遇到困难就放弃,曾经和好多同学谈他的问题,回答是听不懂、不想听、放弃这样三个过程,我反问,这节课你听过课吗?回答又是没有,根本就没听过课,怎么说自己听不懂呢?相应的根本就没学习,又谈何学的好?
学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。
那么,我们如何学好《C程序设计》呢?
一.学好C语言的运算符和运算顺序
这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序.
二.学好C语言的四种程序结构
(1)顺序结构
顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。
例如;a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。
(2) 分支结构
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。下面我介绍几种基本的分支结构。
①if(条件)
{
分支体
}
这种分支结构中的分支体可以是一条语句,此时“{ }”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过分支体,这时分支体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0) x=-x;
②if(条件)
{分支1}
else
{分支2}
这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(“x1=%8.4f+%8.4fi\n”r, i);
printf(“x2=%8.4f-%8.4fi\n”r,i)
}
③嵌套分支语句:其语句格式为:
if(条件1) {分支1};
else if(条件2) {分支2}
else if(条件3) {分支3}
……
else if(条件n) {分支n}
else {分支n+1}
嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。
④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。
(3)循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。
顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。
(4)模块化程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。
三.掌握一些简单的算法
编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义
结语:当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学
要先学C语言!!
清华大学出版社----潭浩强
学C语言的99%都用他的书
以下在网络上看到对他的书的评价
按∶谭浩强教授编写的《C程序设计》一书受到广泛的欢迎和高度评价。下面刊登几所大学讲授C语言课程的老师对《C程序设计》一书的评价意见。
清华大学计算机与信息管理中心承担着清华大学非计算机专业的“计算机软件技术基础”课,自1994年起选用清华大学出版的谭浩强教授编写的《C程序设计》一书作为本课程教材,取得了很好的教学效果,深受师生们的欢迎,现正使用第二版作为教材。此书的特点及对教学的促进作用主要表现在以下几方面:
1.内容全面,实用性强
此书涵盖了程序设计基础知识及C语言程序设计的全部内容,并介绍了大量常用算法。通过学习此教材,初学程序设计的学生可以达到熟练运用C语言进行小规模应用开发的能力。
2.讲解透彻,深入浅出
此书对概念讲解透彻,使初学计算机程序设计的学生不仅学习了一种高级语言,而且能够对相关基础知识有准确深入的理解,例如在介绍变量的存储类型时、介绍指针时都对计算机的存储管理做了清楚的论述,使读者知其然也知期所以然。广大非计算机专业的学生学习计算机课程的学时很少,没有足够的时间系统地学习计算机专业基础知识。因此像这样将必要的基础知识融会贯通到程序设计课程中,对学生的知识结构建设以及今后的深造和提高都大有裨益。
3.通俗易懂,易于自学
此书的一个突出优点就是,语言优美、举例生动、浅显易懂。学生在学习C语言之前,普遍有些畏难情绪,因为听说C语言比较难学。的确C语言最初是面向专业开发人员的。但是读了这本书之后,学生们不再惧怕C语言。很多学生说,读这本书不仅学会了C语言,而且读的过程本身就是一种享受,不像有些专业书籍,堆砌大量技术名词,艰涩难懂。由于这本书易于自学,给我们的教学工作带来很大帮助,使我们可以达到精讲多练,逐步实现教师指导下的学生自主式学习模式。
4.结构清晰,循序渐进
由于本书结构清晰,知识点明确,循序渐进的内容组织方式非常符合初学者的认知规律,因此给教师组织课堂教学提供了很好的指导。我们按照这本书的内容结构组织教学,取得了学生和教务处的一致好评。
5.习题丰富,利于复习
计算机程序设计是一门实践性很强的课程,因此仅仅通过阅读教科书或听课是不可能掌握的,学习程序设计的最重要环节就是实践。本书每章都附有大量习题,并且有配套的习题解答,非常有利于学生复习巩固课上所学的知识。也便于教师设计实验课的教学内容。
作为计算机语言来说,没有一种是有窍门的,只有通过自己不断的练习,实习,演练,并且分析别人的软件才能提高自己.
作为C语言,计算机语言中最基础的一种,其实并不需要什么基础,只要能掌握简单的一些英语单词就可以了,至于数学方面可以不用担心,因为用于计算的软件并不多,高等计算的更是少之又少,而且多数是由国家程序员开发制作的,免得私人程序员在软件中做手脚.所以你不用担心你的数学会跟不上C语言.
如果你是初学者,不要贪多,一天学习一点,因为这个东西的逻辑思维能力很强,如果没有过硬的基本功夫是没有办法深入了解的.C语言在计算机语言中就好象少林功夫在武林中的意思一样,学的慢,没有窍门,只有不断的苦练才能有成就和基础去学习更高难度的技术.比如ASP.NET,如果你没有C语言的基础,你就学习不了C#,没有C#就学不好ASP.NET.
还有一点你自己要考虑清楚,学习C语言开始并不难只是你是不是有毅力去坚持深入,很多人学到了皮毛就感觉自己是程序员了,其实离那个条件还差很远,这是你在今后学习中必须要知道的,不能因为自己做了个什么什么软件出来就开始骄傲,这门学问虽然是语言中的基础,可是也不是三两年能学好的,差不多4-5年,天天苦练才有可能有一定的成就.
另外,你是对这个科目非常感兴趣还是为了今后工作硬着头皮去学?你要想清楚,对于这个科目来说,你必须要有兴趣去学才能学好,如果只是为了工作去学,我估计你要吃苦头了,没有热情,没有创造力的人学这个根本没有成功的希望,做个小小的程序员都勉强.
学C语言虽然不需要什么基础,也不需要多高的文化,但是学这门语言必须要能吃苦,要有耐心,它既不算是文科,也不算是理科,文科就算一个论文在长,写100张纸也总有完的时候,理科的数学题在难,只要套上了公式就能得出得数,1就是1,2也是错.可是计算机语言并不是这样,你可能写程序的时候2天就能做出来,也可能两个月也写不出,有一定的运气在里面.
好好学吧,这个科目没有什么难的,也不需要什么基础只是,即使是初中生去学,只要是自己愿意去学,并且能学进去也是能成功的.如果你有恒心那就尽快去学,越年轻越能学好!!加油兄弟!
只要我们有恒心,就一定能学会!!!我现在也在自学C语言,自己买了一些关于C语言的书!只要不断上机操作就会学习的更多!
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。
常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,TurboC等等......
C语言的优点
1. 简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
2. 运算符丰富
C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
3. 数据结构丰富
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
4. C是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
5. C语法限制不太严格,程序设计自由度大
虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。
6. C语言允许直接访问物理地址,可以直接对硬件进行操作
因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。
7. C语言程序生成代码质量高,程序执行效率高
一般只比汇编程序生成的目标代码效率低10へ20%。
8. C语言适用范围大,可移植性好
C语言有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。
C语言的缺点
1. C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别。
2. C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
[C语言指针]
指针就是C语言的一大特色,可以说C语言优于其它高级语言的一个重要原因就是因为它有指针操作可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素。C++在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。Java取消了指针操作,提高了安全性。
C源程序的结构特点
1.一个C语言源程序可以由一个或多个源文件组成。
2.每个源文件可由一个或多个函数组成。
3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。
4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。
5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
学习C语言
在初学C语言时,可能会遇到有些问题理解不透,或者表达方式与以往数学学习中不同(如运算符等),这就要求不气馁,不明白的地方多问多想,鼓足勇气进行学习,待学完后面的章节知识,前面的问题也就迎刃而解了,这一方面我感觉是我们同学最欠缺,大多学不好的就是因为一开始遇到困难就放弃,曾经和好多同学谈他的问题,回答是听不懂、不想听、放弃这样三个过程,我反问,这节课你听过课吗?回答又是没有,根本就没听过课,怎么说自己听不懂呢?相应的根本就没学习,又谈何学的好?
学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。
那么,我们如何学好《C程序设计》呢?
一.学好C语言的运算符和运算顺序
这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序.
二.学好C语言的四种程序结构
(1)顺序结构
顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。
例如;a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。
(2) 分支结构
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。下面我介绍几种基本的分支结构。
①if(条件)
{
分支体
}
这种分支结构中的分支体可以是一条语句,此时“{ }”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过分支体,这时分支体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0) x=-x;
②if(条件)
{分支1}
else
{分支2}
这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(“x1=%8.4f+%8.4fi\n”r, i);
printf(“x2=%8.4f-%8.4fi\n”r,i)
}
③嵌套分支语句:其语句格式为:
if(条件1) {分支1};
else if(条件2) {分支2}
else if(条件3) {分支3}
……
else if(条件n) {分支n}
else {分支n+1}
嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。
④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。
(3)循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。
顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。
(4)模块化程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。
三.掌握一些简单的算法
编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义
结语:当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学
要先学C语言!!
清华大学出版社----潭浩强
学C语言的99%都用他的书
以下在网络上看到对他的书的评价
按∶谭浩强教授编写的《C程序设计》一书受到广泛的欢迎和高度评价。下面刊登几所大学讲授C语言课程的老师对《C程序设计》一书的评价意见。
清华大学计算机与信息管理中心承担着清华大学非计算机专业的“计算机软件技术基础”课,自1994年起选用清华大学出版的谭浩强教授编写的《C程序设计》一书作为本课程教材,取得了很好的教学效果,深受师生们的欢迎,现正使用第二版作为教材。此书的特点及对教学的促进作用主要表现在以下几方面:
1.内容全面,实用性强
此书涵盖了程序设计基础知识及C语言程序设计的全部内容,并介绍了大量常用算法。通过学习此教材,初学程序设计的学生可以达到熟练运用C语言进行小规模应用开发的能力。
2.讲解透彻,深入浅出
此书对概念讲解透彻,使初学计算机程序设计的学生不仅学习了一种高级语言,而且能够对相关基础知识有准确深入的理解,例如在介绍变量的存储类型时、介绍指针时都对计算机的存储管理做了清楚的论述,使读者知其然也知期所以然。广大非计算机专业的学生学习计算机课程的学时很少,没有足够的时间系统地学习计算机专业基础知识。因此像这样将必要的基础知识融会贯通到程序设计课程中,对学生的知识结构建设以及今后的深造和提高都大有裨益。
3.通俗易懂,易于自学
此书的一个突出优点就是,语言优美、举例生动、浅显易懂。学生在学习C语言之前,普遍有些畏难情绪,因为听说C语言比较难学。的确C语言最初是面向专业开发人员的。但是读了这本书之后,学生们不再惧怕C语言。很多学生说,读这本书不仅学会了C语言,而且读的过程本身就是一种享受,不像有些专业书籍,堆砌大量技术名词,艰涩难懂。由于这本书易于自学,给我们的教学工作带来很大帮助,使我们可以达到精讲多练,逐步实现教师指导下的学生自主式学习模式。
4.结构清晰,循序渐进
由于本书结构清晰,知识点明确,循序渐进的内容组织方式非常符合初学者的认知规律,因此给教师组织课堂教学提供了很好的指导。我们按照这本书的内容结构组织教学,取得了学生和教务处的一致好评。
5.习题丰富,利于复习
计算机程序设计是一门实践性很强的课程,因此仅仅通过阅读教科书或听课是不可能掌握的,学习程序设计的最重要环节就是实践。本书每章都附有大量习题,并且有配套的习题解答,非常有利于学生复习巩固课上所学的知识。也便于教师设计实验课的教学内容。
作为计算机语言来说,没有一种是有窍门的,只有通过自己不断的练习,实习,演练,并且分析别人的软件才能提高自己.
作为C语言,计算机语言中最基础的一种,其实并不需要什么基础,只要能掌握简单的一些英语单词就可以了,至于数学方面可以不用担心,因为用于计算的软件并不多,高等计算的更是少之又少,而且多数是由国家程序员开发制作的,免得私人程序员在软件中做手脚.所以你不用担心你的数学会跟不上C语言.
如果你是初学者,不要贪多,一天学习一点,因为这个东西的逻辑思维能力很强,如果没有过硬的基本功夫是没有办法深入了解的.C语言在计算机语言中就好象少林功夫在武林中的意思一样,学的慢,没有窍门,只有不断的苦练才能有成就和基础去学习更高难度的技术.比如ASP.NET,如果你没有C语言的基础,你就学习不了C#,没有C#就学不好ASP.NET.
还有一点你自己要考虑清楚,学习C语言开始并不难只是你是不是有毅力去坚持深入,很多人学到了皮毛就感觉自己是程序员了,其实离那个条件还差很远,这是你在今后学习中必须要知道的,不能因为自己做了个什么什么软件出来就开始骄傲,这门学问虽然是语言中的基础,可是也不是三两年能学好的,差不多4-5年,天天苦练才有可能有一定的成就.
另外,你是对这个科目非常感兴趣还是为了今后工作硬着头皮去学?你要想清楚,对于这个科目来说,你必须要有兴趣去学才能学好,如果只是为了工作去学,我估计你要吃苦头了,没有热情,没有创造力的人学这个根本没有成功的希望,做个小小的程序员都勉强.
学C语言虽然不需要什么基础,也不需要多高的文化,但是学这门语言必须要能吃苦,要有耐心,它既不算是文科,也不算是理科,文科就算一个论文在长,写100张纸也总有完的时候,理科的数学题在难,只要套上了公式就能得出得数,1就是1,2也是错.可是计算机语言并不是这样,你可能写程序的时候2天就能做出来,也可能两个月也写不出,有一定的运气在里面.
好好学吧,这个科目没有什么难的,也不需要什么基础只是,即使是初中生去学,只要是自己愿意去学,并且能学进去也是能成功的.如果你有恒心那就尽快去学,越年轻越能学好!!加油兄弟!
只要我们有恒心,就一定能学会!!!我现在也在自学C语言,自己买了一些关于C语言的书!只要不断上机操作就会学习的更多!
回答者:百弟弟 - 助理 三级 1-6 16:39
int alphabetic(char); 这是函数声明,也可以写成这样:int alphabetic(char c);两种写法都是正确的,只是第二种方法更加明了
int longest(char []); 也是一样的道理
关于if(alphabetic(string[i]))是指如果函数alphabetic(string[i])返回0就不执行,否则执行,如alphabetic(string[i])=1,则执行if语句,if(flag)也是一样的用法,如果flag=1,4……就表示符合条件,反之flag=0则表示不符合条件
函数int longest(char string[]) 的作用是找出最长字符串第一个字符所在的位置(place),
这东西最主要还是理解,以后还有什么问题可以问我啊,我也是初学的,想同大家交流一下啊
回答者:hemanzi2006 - 江湖新秀 四级 1-6 16:55
#include"stdio.h"
#include"string.h"
void main()
{int alphabetic(char); /*为什么不用char c*/ 函数声明可以写全也可以不写全形参
int longest(char []); /*为什么不用char string[]*/ 同上
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("the longest word is:");
for(i=longest(line);alphabetic(line[i];i++)
printf("%c",line[i]);
}
int alphabetic(char c)
{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else return(0);
}
int longest(char string[])
{int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++)
if(alphabetic(string[i])) /*这是要满足什么条件*/ 判断数组各个字符是否是字母,大小写都算,A-Z,a-z
if(flag) /*同上*/ 标志单词头开始,当发现单词头时,不再判断单词头
{point=i;
flag=0;
}
else len++;
else
{flag=1;
if(len>=length)
{length=len;
place=point;
len=0;
}
} #include"stdio.h"
#include"string.h"
void main()
{int alphabetic(char); /*为什么不用char c*/ 参数可有可无
int longest(char []); /*为什么不用char string[]*/
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("the longest word is:");
//根据最长单词的起始位置,输出该单词
for(i=longest(line);alphabetic(line[i]);i++)
printf("%c",line[i]);
}
/*先判断字符是不是字母,是返回1,否0*/
int alphabetic(char c)
{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else return(0);
}
/**/
int longest(char string[])
{
int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++)
//第i个字符是不是字母,flag作为标识符,为1则表明没有记录单词,置0开始记录单词
if(alphabetic(string[i])) /*这是要满足什么条件*/
if(flag) /*同上*/
{//记录开始,point记住位置,flag标识开始记录
point=i;
flag=0;
}
else len++; //flag==0,单词长度加1
else
{//当前字符不是字母,单词结束,flag置1,判断是不是最长
flag=1;
if(len>=length) //如果当前记录len最长,则将最长的长度计入length,记录位置place,len置0重行开始寻找下面的字符
{
length=len;
place=point;
len=0;
}
}
return(place); //返回单词位置
}
int longest(char []); 也是一样的道理
关于if(alphabetic(string[i]))是指如果函数alphabetic(string[i])返回0就不执行,否则执行,如alphabetic(string[i])=1,则执行if语句,if(flag)也是一样的用法,如果flag=1,4……就表示符合条件,反之flag=0则表示不符合条件
函数int longest(char string[]) 的作用是找出最长字符串第一个字符所在的位置(place),
这东西最主要还是理解,以后还有什么问题可以问我啊,我也是初学的,想同大家交流一下啊本回答被提问者采纳
#include"string.h"
void main()
{int alphabetic(char); /*为什么不用char c*/ 函数声明可以写全也可以不写全形参
int longest(char []); /*为什么不用char string[]*/ 同上
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("the longest word is:");
for(i=longest(line);alphabetic(line[i];i++)
printf("%c",line[i]);
}
int alphabetic(char c)
{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else return(0);
}
int longest(char string[])
{int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++)
if(alphabetic(string[i])) /*这是要满足什么条件*/ 判断数组各个字符是否是字母,大小写都算,A-Z,a-z
if(flag) /*同上*/ 标志单词头开始,当发现单词头时,不再判断单词头
{point=i;
flag=0;
}
else len++;
else
{flag=1;
if(len>=length)
{length=len;
place=point;
len=0;
}
}
return(place);
}
#include"string.h"
void main()
{int alphabetic(char); /*为什么不用char c*/ 参数可有可无
int longest(char []); /*为什么不用char string[]*/
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("the longest word is:");
//根据最长单词的起始位置,输出该单词
for(i=longest(line);alphabetic(line[i]);i++)
printf("%c",line[i]);
}
/*先判断字符是不是字母,是返回1,否0*/
int alphabetic(char c)
{if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else return(0);
}
/**/
int longest(char string[])
{
int len=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(string);i++)
//第i个字符是不是字母,flag作为标识符,为1则表明没有记录单词,置0开始记录单词
if(alphabetic(string[i])) /*这是要满足什么条件*/
if(flag) /*同上*/
{//记录开始,point记住位置,flag标识开始记录
point=i;
flag=0;
}
else len++; //flag==0,单词长度加1
else
{//当前字符不是字母,单词结束,flag置1,判断是不是最长
flag=1;
if(len>=length) //如果当前记录len最长,则将最长的长度计入length,记录位置place,len置0重行开始寻找下面的字符
{
length=len;
place=point;
len=0;
}
}
return(place); //返回单词位置
}