新手学C语言之入门.docx

上传人:b****5 文档编号:4848988 上传时间:2022-12-10 格式:DOCX 页数:24 大小:356.41KB
下载 相关 举报
新手学C语言之入门.docx_第1页
第1页 / 共24页
新手学C语言之入门.docx_第2页
第2页 / 共24页
新手学C语言之入门.docx_第3页
第3页 / 共24页
新手学C语言之入门.docx_第4页
第4页 / 共24页
新手学C语言之入门.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

新手学C语言之入门.docx

《新手学C语言之入门.docx》由会员分享,可在线阅读,更多相关《新手学C语言之入门.docx(24页珍藏版)》请在冰豆网上搜索。

新手学C语言之入门.docx

新手学C语言之入门

学习C语言(新手入门)

年轻的小荣子

事实上计算不仅要c),这些代码就是

阿尔法和李世石的围棋对弈让我们感受到了计算机的强大,靠硬件设备的支持,还需要在里面运行代码(很多种,包括它的灵魂(譬如我们的思想)。

介绍几部通过在计算机里头运行代码从而创造无限可能的电影,个人觉得不错

的:

黑客帝国,超验骇客,创战纪,人工智能等。

正题,能编辑C语言的软件非常多,比如visualC++6.0/7.0,turboc等。

理论总是离不开实践,在要学习C语言理论之前先要找到属于自己的能实现代码结果的软件。

这样说,计算机语言和人的语言的区别在于,人通过各种发音实现交流,但是计算机主要是通过电流来传达信息,所以只能用0/1来表示电流拥有的两种状态,这样最底层的计算运作就是通过一段长长的0/1代码,通过0和1的不同组合来

表示文字或者信息。

C语言当然不是最底层的0/1代码,他是一个沟通的中介,比如等于号在c语言里就是两个等号“==”,这样使得我们更容易和计算机交流了,只要学会了C语言,它就能把我们的语言翻译成计算机的语言。

以下内容从简单到困难,先来学会如何运行c语言代码(用vc6.0中文版):

1•按以下步骤打开界面(以后都可以这样打开):

ij|支住匡■「毎輻SS(V))0L\(D工isaifiiTfiffie口阻《阳型)色I.<■ftr.I---也|声唐斬

■中

2.—些常用的功能键:

(1是compile编译的意思,就是把这些我们能看懂的符号转换成计算机代码,同时按这个键可以检查错误和验证是否能运行。

2是build,建立一个可以运行的

EXE类文件,就是把这些代码弄成一个能运行的东西。

3就是run运行,只有经

过查错和建立才可以按运行。

是不是很简单,自己动手一遍就会)

3.输入代码并运行(里面的代码如下:

#includevstdio.h>main()

{

inta,b,c;

a=1,b=2;

c=a+b;

printf("%d",c);

}

Include的英文意思是包含、包括,顾名思义,#includevstdio.h>就是把stdio.h

这个东西包含进去,其实#include<>是c语言里的一种格式,就是把什么包含进来的意思(这里是口语表达)。

stdio.h叫做头文件,什么是头文件呢?

打个比方,在C语言里我们要用到很多的比如开根号、乘方、阶乘n!

等等数学公式函

数,那么就可以把这些常用的同类型的函数放到一起形成一个函数库,然后给它

取个名字比如叫math.h,这样当要用到这些函数的时候就不用自己的写了,直接用#includevmath.h>把整个库包含进来,里面的函数就可以直接调用。

同样的,stdio.h也是这样一个库,里面有输入输出函数(就是支持键盘输入和屏幕输出)可以调用。

类似的还有graphic.h图形函数库,string.h字符串函数库等等,调用格式一样的。

Main(){代码;}是C语言里必须有的一个格式,main翻译是”主要:

main函数就是主函数,相当于程序从这里入口并开始运行。

运行的内容就是花括号{}里头的代码。

了解#includevstdio.h>main(){}的功能之后,就真正的开始代码实现的部分了。

上面有一条简单的代码:

inta,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的,这就是为什么上面要写#includevstdio.h>原因。

inta,b,c;定义a,b,c三个变量,int是数据类型里的一种,int是整型,就是说a,b,c都是整数而不能是其他类型。

另外float浮点型,如果用floata,b,c,那么a,b,c就能赋予小数值。

还有char字符型,比如chara,b,,那么a,b只能赋予字符的值。

这是因为在定义a,b,c变量的同时,要在计算机内存中分配给它们空间,整数占用2个字节而小数占4个字节,所以inta后a分配到的空间就是能装下2个字节的东西,然后如果用a=1.23,由于1.23是小数占用4个字节装不下,那么这个赋值就出错。

因此,int,float,char等数据类型定义的意义就在于给变量分配一个多大的内存空间,存储对应类型大小的数据(任何没有定义数据类型的变量是不会分配内存空间所以是不能使用的!

)。

来看下运行结果(print出结果c的值):

W=

ttinclude

dio.h>

mainO

inta,b,c;

I画颐i虚

J

Pt'eESAnykeytocontinu.eg

a=1,b=2jc-a+b;

所以这样就实现了计算a+b赋值给c并输出c的值。

坷整型sboiT

数值类樂

型double

空艾型void

+

-

*

/

除;不存在+号,表达式里“/”就是除号。

%

取余数;17%5等于2,余数是2。

>

大于

<

小于

>=

大于等于

<=

小于等于

!

=

不等于

==

等于

=

赋值,右边值赋予左边变量(a=a+1+2)。

&&

与;(1==1)&&(1!

=2),判断两边都真结果为真。

II

或;判断有一边为真结果为真。

!

非;!

(1==1),判断条件的相反。

?

:

■■

条件运算;(2>1)?

3:

4判断为真,结果取3,否则取4.

++

自增;a++,相当于a=a+1。

--

自减;a--,相当于a=a~1。

其他

经历一遍胜过深思千回,在软件上尝试几遍便能熟记于心。

输出结%果Td。

);//ps:

#includevstdio.h>

intmain()

{inta,b,c,d;a=1;b=a+1;c=b*2;c++;d=c%3;printf(return0;}

写一个能计算圆的周长和面积的C代码:

ttinclude<5tdio.h>

FMmt"爸注,面积兀周长!

■,半径4

scanf;

1=2*3.1in50

p严intFL周长为;

return8;

定义三个浮点型float(含有小数)变量S、I、r。

scanf()是输入函数,scan是扫描的意思,从键盘扫描你的输入,这个函数也是stdio.h头文件里的一个函数。

Scanf()括号里的是参数,跟printf()一样,格式有所不同。

printf(“%(”C)表示输出结果c,c的数据类型是整型(int),用“%(格式。

如果输出结果是浮点型(float)则用“%格式,比如printf(“%f”1.23)。

如果是字符型(char),用printf(“%,')等。

“%_”

类型

Printf(%_对应数据类型格式

d

int,short

以十进制形式输出带符号整数(正数不输出符号)

o

以八进制形式输出无符号整数(不输出前缀0)

x,X

以十六进制形式输出无符号整数(不输出前缀Ox)

u

以十进制形式输出无符号整数

f

float,double

以小数形式输出单、双精度实数

e,E

以指数形式输出单、双精度实数

g,G

以%f或%e中较短的输出宽度输出单、双精度实数

c

char

输出单个字符

s

字符串

输出字符串

Scanf(“%d,&r)比printf“%d,r)多了个地址运算符&,因为scanf是输入,把数据存入到r变量的地址空间,所以scanf()函数统一要加个地址运算符。

(在代码中添加备注用//备注,本行此符号之后的都为备注,也可以用/*备注*/,两个符号之内的是备注,可囊括多行。

)上面代码中:

#includevstdio.h>

intmain()

{

return0;

}

标准主函数格式,intmain()表示返回int型,return表示返回,返回值为0。

不必深究。

floats,l,r;//备注:

面积s,周长I,半径r。

I=2*3.14159*r;

s=3.14159*r*r;

printf("周长为:

%f,面积为:

%f\n",l,s);

相当于一个能计算圆的周长和面积的计算器,只要seanf()输入r的值,就能

printf()输出I(周长)和s(面积)的值,结果图示:

可以通过输入不同的半径来得到其周长和面积。

同理可以利用e语言来求得其他数学公式的结果:

求y=x^2+2x-3当x取某个数时的值。

代码:

intx,y;

seanf("%d",&x);//这里输入x的值。

y=x*x+2*x-3;

printf("输出结果y:

%d",y);

对于这样的函数式:

「x*x+2*x-3(0

Y=-

(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。

因此上面数学函数式的代码:

#includevstdio.h>intmain()

{

intx,y;

//x>0和XV10是与的关系,若同时为真则结果为真。

if(x>0&&x<10)y=x*x+2*x-3;

else

if(x>=10)y=x+2;

printf("输出结果y:

%d",y);//双引号里的文字原样输出,%d输出为y的值。

return0;}

ps:

if()里的表达式常用到逻辑表达式“与或非”。

(3)switch语句

casedefault}

switch是匹配的意思,就是用表达式的值从常量1开始比较是否相等,如果相等,从相等的那条语句开始执行,到default的语句结束。

如果想执行完这一句就结束,可以在其后加上break;语句来打断跳出switch。

下面是输入小明同学的分数判断他的成绩级别的代码:

老他吕!

宜曲itQS

Binclu(leintnainO

Inti,a;

scanfC-^d'\&a):

"输入分数兀

"分数白除以10^去掉个位数剩下十位数爲

switchfi)"用十位数从r匝归开始匹配

10:

case

printi=C"ft">:

break;"10眶购吩是右等,break结束不再向下执行

S:

case

case

case

cas?

casedefault:

卩rintft-E-);"十位数是E到超的都不及格,输出E等级。

returnQ;

-pKe

LkUI

Qerrar(S),Bbiarnxng(s)

假如小明的成绩是a=76,那么十位数i=7,利用switch函数匹配,case7符合,执行之后的printf(“C\n”)语句,又因为break;语句打断,所以不再执行之后的case,直接跳出switch(){}。

如果是59到0,都只有一条语句可执行。

(4)while循环语句

写一个代码,让你输入一个数字,如果你输入的数字不大于100则重新输入,否则结束。

这里就用到了循环,循环必须要有判断条件语句,循环不能是没有结束条件的。

格式:

while(表达式)

{

语句1

}

如果表达式为真(判断正确),则执行语句1,直到表达式为假。

代码:

#includevstdio.h>

intmain()

{

inta;

scanf(“%d,&a);//

输入数字a。

while(a<=100)//

{

scanf(“%d,&a);//

}

判断是否小于等于100,是则循环,否则结束。

重新输入a

return0;

}

红色部分是循环体,花括号{}里可以写多条语句,作为一个整体一并运行。

执行的顺序是,判断while(表达式)真假,为真则执行循环体,执行完毕跳回到while(表达式)开始下一次的判断,直到判断为假结束循环。

所以上面会不断循环要输入a,直到输入的值大于100,表达式为假结束。

是,

另一种是do-while语句,区别只是先执行循环体,再判断,直到判断为假,while(表达式)后跟着一个分号!

代码如下:

#includevstdio.h>

intmain()

{

inta;

do

{

scanf(“%d,&a);//输入a

}while(a<=100);//判断是否小于等于100,是则循环,否则结束。

return0;}

 

(5)for循环语句

for(表达式1;表达式2;表达式3);循环体语句

实例:

ttinclude<5tdia.h>intnain[>

chara,b=h,c;

forfa-1;a>b;c-c+1)

a=a+1;

富注:

F时俵达式1;表达式表达式町;

循环休语句

*/

returnQ;

>

以上加入了一个for循环(/*多行备注*/),

表达式1“a=1”是for循环的入口,是进入for循环第一个运行的语句,而且只运行一次。

表达式1之后就到表达式2,表达式2“a>b”后面虽然没有问号,但是它是一个判断语句,就像if语句或者while语句的判断表达式一样,在这里如果a>b判断为真,则继续执行循环体语句,否则结束跳出for循环。

如果表达式2为真,接下来执行循环体语句,再接下来是表达式3,然后开始下一次的循环:

表达式2(先判断是否为真)一>循环体语句一>表达式3,表达式1会且只会运行一次,之后的循环都不再执行,而且以上的表达式和循环体都可以是多个语句的组合,比如表达式1可以是“a=2,b++,……”。

for(3=1:

广“-c=c¥l)

 

(3,4,5为一个循环)

让我们来输出一个星号构成的正方形:

◎圏*国丄*e

Kincludeintma-inO

<

inti,j;

furtl=1,Jl<=j:

1=1*1)

prlntft"*****");priiitFC-\n->;"输出换行符°

returnO;

C:

-DA<100\D*bLjg\133.es^e

H****

"****

p*开**

Pvc3aanyIicif右ocontinue

表达1赋值使得i=1,j=4,判断i<=j为真,执行循环体{}后输出五个星号和换行,然后i=i+1(即i变成了2,j不变),继续下一次的循环:

判断2<4为真,继续执行循环体语句,再输出一行星号并换行,如此重复到i=5大于j判断为假,结束for循环,这时共执行了4次循环体,打印出了4行星号,如上图。

事实上for循环里还可以套用for循环,也可以套用while循环,前者最为常见和好用。

门W'D:

WCADebug\123.eKe"

return0;

假如要输出3次上面的矩形星号,那么把上面的for循环嵌入到另一个for循环中即可:

兴趣是最好的老师,实践是最好的证明,如果有哪些记不住的地方,上机写代码运行处结果,让事实来让自己信服,这样不单更容易记住,而且还能提高动手能力。

如果遇到有疑问的地方,上网寻找答案,或者上机调试(就是对代码的执行结果有疑问,认为可能出现多种结果),看结果是否如自己所想,也是验证和解疑的一种好办法。

问题:

输入两个正整数m和n,求其最大公约数解题算法:

辗转相除法,又名欧几里德算法(Euclideanalgorithm)乃求两个正整数之最大公约数的算法。

算法思路:

假如求m和n的最大公约数(m>n,设y为m^n的余数,继续用除数n除以余数y,直到余数为0。

比如求99和21的最大公约数,有:

99-21余15

2115余6(这里的被除数和除数分别是上面的除数和余数,相当于后移一位)

15-6余3

6-3余0(整除)

那么最后一个除数3就是一开始两个数99和21的最大公约数,此算法可以应用到任何两个正整数上,这就是辗转相处求公约数的算法。

算法应用:

1、直接用scanf("%d%d",&m,&n)输入需要求公约数的两个正整数;

2、m%n勺余数为c3、把n的值赋给m把余数c的值赋给n(除数变成被除数,余数变成除数)

4、判断c是否为0,是则最后一个除数n(已经赋值给m就是最大公约数,并输出最大公约数m即可(printf("m和n的最大公约数是:

%d\n",m);)。

5、如果c不为0,继续执行步骤2,直到符合步骤4结束。

代码:

c=m%n;m=n;n=c;

printf("m和n的最大公约数是:

%d\n",m);

return0;

自定义函数

下面代码显示1个错误,0个警告,双击错误提示,会在错误的当行出现一个箭头标识:

原来是math.h前把<写成(,在printf()后漏了分号;。

B文昨甸⑥曲凹SA[D工程®盛®TSCDSQi也

礙二Siajlpa刁奄罔a固官|囁»

tfinclude^ftdio.h>

»|linclude(njth.h>

LntPiain(}

flOdLX;x=n.o;prirtft*'%F*\sqrt(x))return9;

在math.h中有一个求平方根的函数sqrt(x)用于求实数x的平方根,比如sqrt(1.21)的值等于1.1。

intmain(){return0;}是代码中仅有的一个主函数,其实sqrt(),printf

()都是函数,只是其他的非主函数一般都是在主函数中“调用”。

也就是说可

以在主函数main(){}的外面自己定义一个函数如love(){},在花括号中写这个函数实现的功能,然后在main()函数中调用自己定义的love()函数,它就能实现其功能。

好比sqrt()就是定义在math.h库中的一个函数,然后在主函数main()中直接调用就可以求平方根,这里只需要调用名称,不用管怎么实现的,功能实现只写在定义函数的花括号{}内。

自定义函数主要有三个点,函数的入口,内部代码实现,出口(返回值的输出)。

intAnd(inta,intb){

intc;

c=a+b;

returnc;

}

上面是一个计算a+b的自定义函数And(),其中()里的inta,intb是入口,表示到时将会有两个int型的数进来,然后里面的代码是实现a+b,最后的return用来返回这个函数的结果值C,并且在And前面的int是规定这个返回值c的数据类型的。

因此,在主函数main()中可以这样用:

main()

{

intd;

d=And(3,5);

(ps:

运行时不接受任何中文输入法符号)

printf(“%d,d);

}

int

ftinclude

flndCinta,intto);"定义g数必须在前面这样声明!

d=flnd(3,5);printf('"^d\n'\d);

returna;

//这里加分号

intc;c=a+b;returnc;

//这里不能加分号

定义函数为:

intgcd(intm,intn)

{

intc;

printf("输入两个正整数:

\n");

scanf("%d%d",&m,&n);//这一句去掉,通过入口传递进形参m和n的值

c=n;

while(c!

=O)/*余数不为0,继续相除,直到余数为0*/

{

c=m%n;

m=n;

n=c;

}

returnm;

}

//主函数

主函数为:

intmain()

{

inta,b,d;

scanf("%d%d",&a,&b);

d=gcd(a,b);//调用定义的函数gcd()

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

return0;

}

ttlnclude

gcdCiritii,intn);"自定义函数声明!

inta,b,d;

sc日nFd塔d・・,Ga,&b};

d=gcdCa,h);"调用定义的固数g匚(K)

printfC最大公约数是!

初\n-,d)ireturn0;

int

gcdClntPipintn)"自定义函数,求最大公约数

有兴趣可以写几个自定义函数:

分别求最大公约数,a+b,求1+2+3+••…+n,然

后在同一个主函数中调用它们。

自定义函数与递归:

递归,顾名思义就是传递过去,然后归来。

比如阶乘5!

传递过去成为

5X4!

再传递过去成为5X4X3!

直到变成5X4X3X2X1!

之后,再倒过来归回来,因为1是直接已知的,然后归来乘以2,再归来乘以3……递归的前提条件是下一步的形式跟原来的是一致的,比如n!

变成nX(n-1)!

(n-1)!

2X1。

变成(n-1)X(n-2)!

另外递归必须有个出口,不能无限的递下去却没有归回来,要有个终止点(具体的),比如阶乘最后的

用知乎作者Memoria的话来说就是:

假设你在一个电影院,你想知道自己坐在哪一排,但是前面人很多,你懒得去数了,于是你问前一排的人「你坐在哪一排?

」,这样前面的人(代号A)回答你以后,你就知道自己在哪一排了,因为只要把A的答案加一,就是自己所在的排了。

不料A比你还懒,他也不想数,于是他也问他前面的人B「你坐在哪一排?

」,这样A可以用和你一模一样的步骤知道自己所在的排。

然后B也如法炮制。

直到他们这一串人问到了最前面的一排,第一排的人告诉问问题的人「我在第一排」。

最后大家就都知道自己在哪一排了。

就是这样,以同样的形式向前传递问题,到第一排有具体的答案后向后一层层返回答案。

这里的第一排就是递归的出口。

if(0==i)return

(1);

else

m=i*Digui(i-1);

*Digui(i-I),Digui(3)又变

,不再调用自

假如输入实参i的值为4,不等于0,执行else之后语句m=i这样就变成了求4*Digui(3),调用了自身Digui(3),然后成了3*Digui

(2),直到参数等于0,执行if之后的return1身函数,最终计算出4*3*2*1。

递归的好处

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1