《新手学C语言知识之入门基础.doc》由会员分享,可在线阅读,更多相关《新手学C语言知识之入门基础.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、#+学习C语言(新手入门)年轻的小荣子阿尔法和李世石的围棋对弈让我们感受到了计算机的强大,事实上计算不仅要靠硬件设备的支持,还需要在里面运行代码(很多种,包括c),这些代码就是它的灵魂(譬如我们的思想)。介绍几部通过在计算机里头运行代码从而创造无限可能的电影,个人觉得不错的:黑客帝国,超验骇客,创战纪,人工智能等。 正题,能编辑C语言的软件非常多,比如visual c+ 6.0/7.0 ,turbo c等。理论总是离不开实践,在要学习C语言理论之前先要找到属于自己的能实现代码结果的软件。 这样说,计算机语言和人的语言的区别在于,人通过各种发音实现交流,但是计算机主要是通过电流来传达信息,所以只
2、能用0/1来表示电流拥有的两种状态,这样最底层的计算运作就是通过一段长长的0/1代码,通过0和1的不同组合来表示文字或者信息。C语言当然不是最底层的0/1代码,他是一个沟通的中介,比如等于号在c语言里就是两个等号“=”,这样使得我们更容易和计算机交流了,只要学会了C语言,它就能把我们的语言翻译成计算机的语言。 以下内容从简单到困难,先来学会如何运行c语言代码(用vc 6.0中文版):1.按以下步骤打开界面(以后都可以这样打开):2.一些常用的功能键:(1是compile编译的意思,就是把这些我们能看懂的符号转换成计算机代码,同时按这个键可以检查错误和验证是否能运行。2是build,建立一个可以
3、运行的EXE类文件,就是把这些代码弄成一个能运行的东西。3就是run运行,只有经过查错和建立才可以按运行。是不是很简单,自己动手一遍就会)3.输入代码并运行(里面的代码如下:#includemain()int a,b,c;a=1,b=2;c=a+b;printf(%d,c);Include的英文意思是包含、包括,顾名思义,#include就是把stdio.h这个东西包含进去,其实#include是c语言里的一种格式,就是把什么包含进来的意思(这里是口语表达)。stdio.h叫做头文件,什么是头文件呢?打个比方,在C语言里我们要用到很多的比如开根号、乘方、阶乘n!等等数学公式函数,那么就可以把这
4、些常用的同类型的函数放到一起形成一个函数库,然后给它取个名字比如叫math.h,这样当要用到这些函数的时候就不用自己的写了,直接用#include把整个库包含进来,里面的函数就可以直接调用。同样的,stdio.h也是这样一个库,里面有输入输出函数(就是支持键盘输入和屏幕输出)可以调用。类似的还有graphic.h图形函数库,string.h字符串函数库等等,调用格式一样的。 Main() 代码; 是C语言里必须有的一个格式,main翻译是”主要“,main函数就是主函数,相当于程序从这里入口并开始运行。运行的内容就是花括号里头的代码。 了解#include main() 的功能之后,就真正的开
5、始代码实现的部分了。 上面有一条简单的代码:int a,b,c;a=1,b=2;c=a+b;printf(%d,c);我们每句话结束用句号“。”来结束,C语言里用的是分号“;”来结束一个语句,上面每个语句后面都有一个分号。a=1 表示赋值,把等号右边的数值赋予给左边,赋值之后a等于1,b等于2。同理可知c=a+b就是把a+b的结果数值赋予给c,这样c的值就是3.print的翻译是打印,printf()函数实现的功能是输出(打印在屏幕上)。而printf()函数是属于stdio.h的,这就是为什么上面要写#include原因。int a,b,c; 定义a,b,c三个变量,int是数据类型里的一种
6、,int是整型,就是说a,b,c都是整数而不能是其他类型。另外float浮点型,如果用float a,b,c,那么a,b,c就能赋予小数值。还有char字符型,比如char a,b,,那么a,b只能赋予字符的值。这是因为在定义a,b,c变量的同时,要在计算机内存中分配给它们空间,整数占用2个字节而小数占4个字节,所以int a后a分配到的空间就是能装下2个字节的东西,然后如果用a=1.23,由于1.23是小数占用4个字节装不下,那么这个赋值就出错。因此,int,float,char等数据类型定义的意义就在于给变量分配一个多大的内存空间,存储对应类型大小的数据(任何没有定义数据类型的变量是不会分
7、配内存空间所以是不能使用的!)。 来看下运行结果(print出结果c的值):所以这样就实现了计算a+b赋值给c并输出c的值。数据类型一览(当想要使用何种类型变量,直接用以下来定义即可):C语言和数学语言也还是有所区别的,比如数学里判断a等于b用“a=b?”,但是C语言里“a=b?”就变成了赋值,它的等号是两个数学等号组成“=”,所以C里正确的表达是“a=b?”(不要纠结为什么要用两个等号,这是大神们设定的),为了能让计算机理解自己的代码,下面来认识C语言有哪些运算符:+加-减*乘/除;不存在号,表达式里“/”就是除号。%取余数;17%5等于2,余数是2。大于=大于等于1)?3:4,判断为真,结
8、果取3,否则取4.+自增;a+,相当于a=a+1。-自减;a-,相当于a=a-1。其他经历一遍胜过深思千回,在软件上尝试几遍便能熟记于心。#includeint main() int a,b,c,d; a=1; b=a+1; c=b*2; c+; d=c%3; printf(“%d”,d); /ps:输出结果d。 return 0;写一个能计算圆的周长和面积的C代码:定义三个浮点型float(含有小数)变量s、l、r。scanf()是输入函数,scan是扫描的意思,从键盘扫描你的输入,这个函数也是stdio.h头文件里的一个函数。Scanf()括号里的是参数,跟printf()一样,格式有所不
9、同。printf(“%d”,c)表示输出结果c,c的数据类型是整型(int),用“%d”格式。如果输出结果是浮点型(float)则用“%f”格式,比如printf(“%f”,1.23)。如果是字符型(char),用printf(“%c”,s)等。“%_”类型Printf(“%_”,s);对应数据类型格式d int,short以十进制形式输出带符号整数(正数不输出符号)o 以八进制形式输出无符号整数(不输出前缀0)x,X 以十六进制形式输出无符号整数(不输出前缀Ox)u 以十进制形式输出无符号整数f float,double以小数形式输出单、双精度实数e,E 以指数形式输出单、双精度实数g,G
10、以%f或%e中较短的输出宽度输出单、双精度实数c char输出单个字符s 字符串输出字符串Scanf(“%d“,&r)比printf(“%d“,r)多了个地址运算符&,因为scanf是输入,把数据存入到r变量的地址空间,所以scanf()函数统一要加个地址运算符。 (在代码中添加备注用/备注,本行此符号之后的都为备注,也可以用/*备注*/,两个符号之内的是备注,可囊括多行。)上面代码中:#includeint main()return 0;是标准主函数格式,int main()表示返回int型,return表示返回,返回值为0。不必深究。float s,l,r; /备注:面积s,周长l,半径r
11、。scanf(%f,&r);l = 2 * 3.14159 * r; s = 3.14159 * r * r;printf(周长为:%f,面积为:%f n,l,s);相当于一个能计算圆的周长和面积的计算器,只要scanf()输入r的值,就能printf()输出l(周长)和s(面积)的值,结果图示:可以通过输入不同的半径来得到其周长和面积。 同理可以利用c语言来求得其他数学公式的结果:求y=x2+2x-3当x取某个数时的值。代码:int x,y;scanf(%d,&x); /这里输入x的值。y=x*x+2*x-3;printf(输出结果y:%d,y); 对于这样的函数式: x*x+2*x-3 (
12、0x=10)要用到条件语句。(1)if语句if(表达式) 语句1;else语句2;(2)if语句的嵌套If(表达式1)语句1;/语句1也可以嵌套if语句。else if(表达式2) 语句2-1;else语句2-2;/这样的嵌套可以多重.if()里的表达式如果正确则为真,执行紧接着的语句1,否则执行else下面的语句2。因此上面数学函数式的代码:#includeint main()int x,y;scanf(%d,&x); /scanf输入x的值。if(x0 & x0和x=10)y=x+2;printf(输出结果y:%d,y); /双引号里的文字原样输出,%d输出为y的值。return 0;ps
13、:if()里的表达式常用到逻辑表达式“与或非”。(3)switch语句switch(表达式)case 常量1: 语句1case 常量2: 语句2case 常量3: 语句3case 常量.: 语句.case 常量n: 语句ndefault :语句n+1 switch是匹配的意思,就是用表达式的值从常量1开始比较是否相等,如果相等,从相等的那条语句开始执行,到default的语句结束。如果想执行完这一句就结束,可以在其后加上break;语句来打断跳出switch。下面是输入小明同学的分数判断他的成绩级别的代码:假如小明的成绩是a=76,那么十位数i=7,利用switch函数匹配,case 7符合,
14、执行之后的printf(“C n”)语句,又因为break;语句打断,所以不再执行之后的case,直接跳出switch() 。如果是59到0,都只有一条语句可执行。(4)while循环语句写一个代码,让你输入一个数字,如果你输入的数字不大于100则重新输入,否则结束。这里就用到了循环,循环必须要有判断条件语句,循环不能是没有结束条件的。格式:while(表达式)语句1如果表达式为真(判断正确),则执行语句1,直到表达式为假。代码:#includeint main() int a; scanf(“%d”,&a); /输入数字a。 while(a=100) /判断是否小于等于100,是则循环,否则
15、结束。 scanf(“%d”,&a); /重新输入areturn 0;红色部分是循环体,花括号 里可以写多条语句,作为一个整体一并运行。执行的顺序是,判断while(表达式)真假,为真则执行循环体,执行完毕跳回到while(表达式)开始下一次的判断,直到判断为假结束循环。所以上面会不断循环要输入a,直到输入的值大于100,表达式为假结束。 另一种是do-while语句,区别只是先执行循环体,再判断,直到判断为假,while(表达式)后跟着一个分号!代码如下:#includeint main() int a; do scanf(“%d”,&a); /输入a while(ab”后面虽然没有问号,但
16、是它是一个判断语句,就像if语句或者while语句的判断表达式一样,在这里如果ab判断为真,则继续执行循环体语句,否则结束跳出for循环。 如果表达式2为真,接下来执行循环体语句,再接下来是表达式3,然后开始下一次的循环:表达式2(先判断是否为真) 循环体语句 表达式3 ,表达式1会且只会运行一次,之后的循环都不再执行,而且以上的表达式和循环体都可以是多个语句的组合,比如表达式1可以是“a=2,b+,”。(3,4,5为一个循环)让我们来输出一个星号*构成的正方形:表达1赋值使得i=1,j=4,判断i=j为真,执行循环体后输出五个星号和换行,然后i=i+1(即i变成了2,j不变),继续下一次的循
17、环:判断2n),设y为mn的余数,继续用除数n除以余数y,直到余数为0。比如求99和21的最大公约数,有:9921余152115余6(这里的被除数和除数分别是上面的除数和余数,相当于后移一位)156余363余0(整除)那么最后一个除数3就是一开始两个数99和21的最大公约数,此算法可以应用到任何两个正整数上,这就是辗转相处求公约数的算法。算法应用:1、直接用scanf(%d%d, &m, &n) 输入需要求公约数的两个正整数;2、m%n的余数为c3、把n的值赋给m,把余数c的值赋给n(除数变成被除数,余数变成除数)4、判断c是否为0,是则最后一个除数n(已经赋值给m)就是最大公约数,并输出最大
18、公约数m即可(printf(m和n的最大公约数是:%dn,m);)。5、如果c不为0,继续执行步骤2,直到符合步骤4结束。代码:#include int main() /* 辗转相除法求最大公约数 */ int m, n, c; printf(输入两个正整数:n); scanf(%d%d, &m, &n); c=n; while(c!=0) /* 余数不为0,继续相除,直到余数为0 */ c=m%n;m=n; n=c; printf(m和n的最大公约数是:%dn,m); return 0; 自定义函数 下面代码显示1个错误,0个警告,双击错误提示,会在错误的当行出现一个箭头标识:原来是math
19、.h前把写成(,在printf()后漏了分号;。在math.h中有一个求平方根的函数sqrt(x)用于求实数x的平方根,比如sqrt(1.21)的值等于1.1。int main() return 0;是代码中仅有的一个主函数,其实sqrt(),printf()都是函数,只是其他的非主函数一般都是在主函数中“调用”。也就是说可以在主函数main()的外面自己定义一个函数如love(),在花括号中写这个函数实现的功能,然后在main()函数中调用自己定义的love()函数,它就能实现其功能。好比sqrt()就是定义在math.h库中的一个函数,然后在主函数main()中直接调用就可以求平方根,这里
20、只需要调用名称,不用管怎么实现的,功能实现只写在定义函数的花括号内。 自定义函数主要有三个点,函数的入口,内部代码实现,出口(返回值的输出)。int And(int a, int b) int c; c=a+b; return c;上面是一个计算a+b的自定义函数And(),其中()里的int a, int b是入口,表示到时将会有两个int型的数进来,然后里面的代码是实现a+b,最后的return用来返回这个函数的结果值c,并且在And前面的int是规定这个返回值c的数据类型的。 因此,在主函数main()中可以这样用:main() int d; d=And(3,5); printf(“%d
21、”,d); (ps:运行时不接受任何中文输入法符号)那么输出的d的值是多少呢?由于3和5都是int型符合And()函数的“入口”,事实上3和5叫做实参(实际的参数),a和b叫做形参(形式上的参数),在调用这个函数之后,会把实参的值传递给形参,所以a=3,b=5。计算之后得出c的值为8,这就是And()内部代码的实现,然后通过return提供int型的返回值c,所以最终整个And(3,5)的值就是8。这样,就可以把实现某个功能的代码自定义为一个独立的函数,然后在主函数中调用,好处是可以多次调用,而且调用只需要写一次调用的函数名和写入实参,简便许多。 另外自定义函数的函数名可以自己随便起,但是不能
22、使用中文等,只能是标识符,大小写有别,不能跟int,for这些关键字相同,标识符由字母,数字,下划线组合而成,不能以数字开头。一般使用英语单词或简称比较好记。下面用自定义函数实现a+b:截图自定义函数一般写在main函数后面或者放到其他地方,然后把定义函数的名称那一行照搬到main()函数的前面加个分号进行“声明”,声明之后的自定义函数才能在main()函数中合法被调用。所以,自定义函数就这样,根据需要,自己设定返回值的类型,自己设定函数名,自己设定有多少个形参和各个形参的类型,函数里就像main()里一样实现各种功能,然后return后写上想返回的值,返回值可以是一个数字如10,可以是一个存
23、在的变量如c,也可以是一个表达式如(2*c+a),以此返回值作为整个定义函数的结果。把上一节求最大公约数的解法写成一个自定义函数,返回值类型是int,取函数名为gcd,入口有两个形参设为(int m,int n),所以声明部分为:int gcd(int m,int n); /这里加分号(定义过形参m,n后在函数内部就不用重复定义了,直接用,其他没有定义的如果需要必须定义。)定义函数为:int gcd(int m,int n) /这里不能加分号 int c; printf(输入两个正整数:n); scanf(%d%d, &m, &n); /这一句去掉,通过入口传递进形参m和n的值c=n; whi
24、le(c!=0) /* 余数不为0,继续相除,直到余数为0 */ c=m%n;m=n; n=c; return m;主函数为:int main() /主函数 int a,b,d;scanf(%d%d, &a, &b); d=gcd(a,b); /调用定义的函数gcd()printf(%d n,d); return 0; 有兴趣可以写几个自定义函数:分别求最大公约数,a+b,求1+2+3+n,然后在同一个主函数中调用它们。自定义函数与递归: 递归,顾名思义就是传递过去,然后归来。比如阶乘5!,传递过去成为54!,再传递过去成为543!直到变成54321!之后,再倒过来归回来,因为1是直接已知的,
25、然后归来乘以2,再归来乘以3递归的前提条件是下一步的形式跟原来的是一致的,比如n!变成n(n-1)! ,(n-1)!变成(n-1)(n-2)!。另外递归必须有个出口,不能无限的递下去却没有归回来,要有个终止点(具体的),比如阶乘最后的21。 用知乎作者Memoria的话来说就是:假设你在一个电影院,你想知道自己坐在哪一排,但是前面人很多,你懒得去数了,于是你问前一排的人你坐在哪一排?,这样前面的人 (代号 A) 回答你以后,你就知道自己在哪一排了,因为只要把 A 的答案加一,就是自己所在的排了。不料 A 比你还懒,他也不想数,于是他也问他前面的人 B你坐在哪一排?,这样 A 可以用和你一模一样
26、的步骤知道自己所在的排。然后 B 也如法炮制。直到他们这一串人问到了最前面的一排,第一排的人告诉问问题的人我在第一排。最后大家就都知道自己在哪一排了。 就是这样,以同样的形式向前传递问题,到第一排有具体的答案后向后一层层返回答案。这里的第一排就是递归的出口。int Digui(int i) /求i的阶乘,返回值为i!int m = 0;if (0 = i)return (1);elsem = i * Digui(i-1);return m; (ps:也可以用单词来做变量,比如int sum,number;)假如输入实参i的值为4,不等于0,执行else之后语句m = i * Digui(i-1
27、),这样就变成了求4*Digui(3),调用了自身Digui(3),然后Digui(3)又变成了3* Digui(2),直到参数等于0,执行if之后的return 1,不再调用自身函数,最终计算出4*3*2*1。递归的好处显而易见:变化成一个跟自身形式相同但是更加简单的问题,从而可以再利用自身求解,直到这个问题最终变成一个具体的值,然后再逆推回来得到结果。 递归的基本思想无非就是把规模大的问题转化为规模小的相似的子问题来解决。另外递归跟循环有些相似,计算的方向刚好相反。有兴趣可以上各大高校acm、oj题库做题(网搜oj):题库:选ID1000题进去可以看到问题的描述:按summit键提交自己的
28、代码:然后看到系统的判断(通过与否):(分别给出所提交题的代码类型,运行时间,代码量和提交时间)水题:一、题目要求:求具有abcd=(ab+cd)2 性质的4位数。编写一个程序求出具有所有这样性质的4位数。示例:3025 这个数字是 (30 + 25) 的平方输入要求:无输入输出要求:输出所有的具有所有这样性质的4位数。提示:设abcd四个数,变成4位数是a*1000+b*100+c*10+d。 几层循环,a从19,b、c、d从0到9。二、题目要求:阶梯式打印出九九乘法表:提示:用嵌套的for循环,外层for决定输出几个等式,内层的for决定当行的具体内容。三、题目要求:输入任意一个正整数,将
29、其各位数字反序输出(例如输入123,输出321)【循环】1、int n;2、输入正整数n.3、输出n%10(n除以10的余数,即n的个位数)4、令n=n/10.(除以10去掉个位,使得十位变成个位)5、回到步骤3循环6、直到n最后为0.这样最终输出的就是n的反向。数组 数组名表达式 习惯上用a,b,c,d来表示变量,但是如果要表示100个变量,就太过繁琐了,数组的使用大大方便了多个变量的定义,最重要的是数组定义的多个变量之间是有顺序关系的,非常的条理清晰整齐。char a10;定义了10个字符变量,但是只有一个数组名标识符a,用来区分各个变量。比如int b3定义了3个整型变量,分别是b0,b
30、1,b2,使用上跟a,b,c是一样的。里的数字是数组的下标,所有数组的第一个变量都是从0下标开始,不是从1开始。int a3;a0=1,a1=2;a2=a0+a1;printf(“%d”,a2);数组的数字标识使得同名数组的各个变量之间有了顺序关系,不再是一个个独立的变量,这样我可以用for循环来有次序的改变数组变量的值:int i;int a10;for(i=0;i=9;i+) ai=i+1;那么for循环之后,a0=0+1=1,a1=2,a2=3直接用下标数字来确认变量。注意的是定义的时候数组的里面的必须是常量数字1,2,3,不能是变量。如此,可以用啊an=an-1+an-2来统一计算第三
31、个变量等于前两个变量之和,只需要改变下n的值即可。是不是so easy。主要还是在于运用。数组的一组变量在内存中的位置是有序的,上面的a0=1,a21=3,然后a1的地址比a0加1.数组题:按学号从1到30输入A班同学的数学成绩,并计算其中及格人数。首先int i , a31; (定义31个变量,就可以不用a0,直接a1对应1号)然后for(i=1;i=30;i+) scanf(“%d”,&ai); /把学号为i的同学的成绩放到变量ai中。再然后int n=0;for(i=1;i=60 )n+; /ai及格则n加1;这样经过for循环就可以从1号到30号都比较是否及格。有一个下标的是一维数组,
32、像a01这样的是二维数组的一个变量。在一维数组中,就相当于只有一行或者一列。但是在一个矩形表格中,m行n列对应的变量就难以表达,所以引用二维数组:amn,有两个下标,m表示行,n表示列,在表格平面中行与列的交叉点表示一个变量。跟一维数组类似,a00表示第一行,第一列的那个变量。这样,a0i可以通过i的变化表示第一行的第i个变量,也可以用ai0表示第一列的第i个变量。所以,定义 a34就定义了一个34的变量表,行与列的下标共同来决定一个变量。二维数组的优点再明显不过了,假如有3个班级,每个班级有4位同学,那么a01就代表1班的第2个同学,如此类推。无论是几维数组,在定义之后必须要初始化(就是定义
33、之后要给这些变量们都装上点东西,无论什么都好,比如统一0或者a),防止出错。二维数组因为有两个下标,所以只能用两个嵌套的for,一个循环行,一个循环列。分别设int i,j;int a1010;for(i=0;i10;i+) for(j=0;j10;j+) aij=i*10+j;这样,a12=10+2=12,a34=34.数组可以有n维的,比如a0123,自行脑补.指针:用于指向内存地址。常用p表示。自行百度了 比如啊a0的地址是1244996,那么a1的地址是1244997,如果用p表示a0的地址,那么a1的地址就是p+1。指针的好处就是能直接通过地址来计算,也可以通过地址来传递数据。以上,只为c的简单入门。若饥渴请网购C语言教程。其实,C语言的语法应用是很容易掌握的,多上机练习,有任何想法通过上机来实践下,每当你看到自己的代码能运行出结果时肯定是非常开心的。C语言的魅力所在主要是算法吧,学习完语法之后,能够解决问题就在于算法的精妙,在于思想的逻辑上的深度,任何的解题,都首先离不开自己的解题思路,然后上机实现只是把这个思路具体写成代码而已。不忘初心,方得始终。