版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编程理念讲解
ProgrammingConcept-2程序随便写随便对
平方根–简单算法九九乘法表forLoopvs.whileLoopPascalTriangle二进制也可以很有趣
--如何印出该六张卡片?-3印出根号2/*写个程序印出根号2*/#include<stdio.h>doublesqrt(double);//#include<math.h>
intmain(){printf("sqrt根号2=%f\n",sqrt(2.0));
//C++式的注解commentprintf("Byebye!\n");return0;}sqrt是程序库里的一个函数(function,函式)C型式的注解C++型式的注解-4印出根号3/*写个程序印出根号3*/#include<stdio.h>doublesqrt(double);//#include<math.h>
intmain(){printf("sqrt根号3=%f\n",sqrt(3.0));
//C++式的注解commentprintf("Byebye!\n");return0;}每次要重改程序吗?-5印出根号x/*写个程序印出根号x*/#include<stdio.h>
#include<math.h>doubley;
intmain(){printf("Givemex:"
);
scanf("%lf
",&y);printf("Sqrt(%f)=%f\n",y,sqrt(y));return0;}使用变量&y传address-6程序随便写求x的平方根蔡文能tsaiwn@.tw交通大学信息工程学系file:///c:\course\cs2\file:///c:\course\cs2\p3.c练习使用whileloop-7p3.c–练习whileloop#include<stdio.h>#include<math.h>intmain()/*Thisprogramcanfindsquarerootofanynumberthat>=0andwillstopwhenyouenteravaluethat<0
阿版权是蔡文能的,欢迎拷贝分享初学者!*/{floatonevar;/*变量名称随便我取的啦*/doubleans;/*用来放答案*/printf("FindsquarerootofX.Negativevaluewillceasetheprogram\n");printf("X=?");/*还是问"X=?"比较简洁有力,不用说onevar*/scanf("%f",&onevar);while(onevar>=0){/*只要onevar大于或等于零我们就一直重复做{...}*/ans=sqrt(onevar);/*其实sqrt的参数也应该为double型别*/printf("SQRT(%f)=%f\n",onevar,ans);printf("X=?");scanf("%f",&onevar);}/*while(onevar*/return0;}-8程序随便写求x的平方根自己如何写求SQRT?
file:///c:\course\cs2\p4.c
file:///c:\course\cs2\p5.c自己如何写求SQRT?
目的:练习想Algorithm长除法求平方根?适合手动做的方法不一定适合计算机做!-9p4.c–练习想Algorithm(1/2)/*Thisprogramcanfindsquarerootofanynumberthat>=0andwillstopwhenyouenteravaluethat<0*//*Thisversionistryingtoshowyouthatwecanwriteourfunction/proceduretosolvetheproblem,thoughthemysqrt()isactuallycallingthesystemstandardfunction.Wewillrewritethemysqrt()innextversion.*****************************/voidhello(void);/*我会用到一个没参数的函数叫hello()*/doublemysqrt(double);/*也会叫用一个叫mysqrt()的函数,参数是一个double数*/#include<math.h>/*sqrt()是在math.h内宣告的*/intmain()/*主程序开始囉*/{floatx;hello();/*givetheusersomemessage*/printf("X=?");scanf("%f",&x);while(x>=0){printf("SQRT(%f)=%7.3f\n",x,mysqrt(x));printf("X=?");scanf("%f",&x);}/*while*/return0;}/**************主程序到此为止***********/-10p4.c–练习想Algorithm(2/2)/*…*/voidhello(){printf("Thisprogramwillaskyoutoinputavalue,sayX.");printf("ThenitwillfindthesquarerootofX.");printf("Theaboveprocesswillcontinue...");printf("Negativevaluewillceasetheprogram.");}/*hello()*/doublemysqrt(doubley){doublemyans;myans=-1.0;if(y<0)printf("cannotprocessnegativenumber");elsemyans=sqrt(y);/*还没想好,先借用程序库的sqrt()*/returnmyans;}/*mysqrt*/-11p5.c–mysqrt()Algorithm(1/2)voidhello(void);/*我发誓我会用到一个没参数的函数叫hello()*/doublemysqrt(double);/*也会叫用一个叫mysqrt()的函数,参数是一个double数*/intmain()/*主程序开始囉*/{floatx;hello();/*givetheusersomemessage*/printf("X=?");scanf("%f",&x);while(x>=0){printf("SQRT(%f)=%7.3f\n",x,mysqrt(x));printf("X=?");scanf("%f",&x);}/*while*/return0;}/**************主程序到此为止***********/voidhello(){printf("Thisprogramwillaskyoutoinputavalue,sayX.");printf("ThenitwillfindthesquarerootofX.");printf("Theaboveprocesswillcontinue...");printf("Negativevaluewillceasetheprogram.");}/*hello()*/-12p5.c–mysqrt()Algorithm(2/2)doublemysqrt(doublex){/*这次真的要自己写求平方根的部份囉!*/doublemyans;myans=-1;if(x<0)printf("cannotprocessnegativenumber\n");else{myans=0;/*weguesstherootiszero*/while(myans*myans<x)myans++;/*猜0,1,2,...直到太大*/if(myans*myans>x){myans=myans-1;/*太大了,快减掉一;可写成myans--*/while(myans*myans<x)myans=myans+0.1;};if(myans*myans>x){myans-=0.1;/*thismeans:myans=myans-0.1*/while(myans*myans<x)myans+=0.01;}if(myans*myans>x){myans-=0.01;while(myans*myans<x)myans+=0.001;}/*Ithinktheprecisonisgoodenoughtnow*/}/*else*/returnmyans;/**returnmyansvalueasouranswer*/}/*endofmysqrt*/-13mysqrt()问题与思考?若想要求到更准呢?
这程序中函数mysqrt()所求出的平方根若非刚好就会太大,这并非最好的做法!
应该找出最接近的答案,例如,求2的平方根时,最后应考虑1.415*1.415与
1.414*1.414何者较接近2,如此比较合理!
加一句if检查看看就可以,想一想!-14程序随便写九九乘法表file:///c:\course\cs2\p6.c练习两层的forloopfor(i=1;i<=9;++i){for(k…){/****/}}-15九九乘法表p6.c#include<stdio.h>intmain(){inti,j;printf("\nX|");for(i=1;i<=9;i++)printf("%5d",i);printf("\n");for(i=1;i<=10;i++)printf("----");for(i=1;i<=9;i++){printf("\n%d|",i);for(j=1;j<=9;j++)printf("%5d",i*j);}printf("\n======\n");return0;}练习两层的forloop-16九九乘法表p6.c核心#include<stdio.h>intmain(){inti,k;
for(i=1;i<=9;i++){printf("第%d列:",i);
for(k=1;k<=9;k++)printf("%5d",i*k);printf("\n");}printf("\nByebye!\n");return0;}练习两层的forloop-17forLoopvs.whileLoopfor(i=1;i<=9;i++){/*Loopbody*/}i=1;for(;i<=9;){/*Loopbody*/
i++;}i=1;while(i<=9){/*Loopbody*/
i++;}
这三个写法意义完全一样-18forLoopvs.whileLoopfor(
;
;
)
;
;while(
){
;
;}==0!=0
-19whileLoop
拿盘子,拿饮料,找好位子;while(
肚子还饿
){
吃一盘;
喝一杯;
喘一口气;}结帐;回家;Allyoucaneat!-20whileLoop(cont-1)
拿盘子,拿饮料,找好位子;while(
肚子还饿
){
吃一盘;
if(有急事||很饱了)break;if(不会渴)continue;
喝一杯;
喘一口气;}结帐;回家;Allyoucaneat!-21whileLoop(cont-2)
拿盘子,拿饮料,找好位子;while(
不够本
){
吃一盘;
if(有急事||很饱了)break;if(不会渴)continue;
喝一杯;
喘一口气;}结帐;回家;-22p7.c巴斯卡三角形
练习Array(阵列)1111211331 1464115101051
(a+b)2=a2+2a.b+b2C(5,0)=1C(5,1)=5C(5,2)=10=C(5,3)ByBlaisePascal,1653-23巴斯卡三角形,方便写程序012345678...
011112121i31331414641515101051
intx[19][19];intx[MAX][MAX];#defineMAX19-24p7.c巴斯卡三角形
for(i=0;i<=n;i++){
x[i][0]=1;
x[i][i]=1;/*记得宣告/定义x阵列喔*/
for(j=1;j<=i-1;j++){x[i][j]=x[i-1][j]+x[i-1][j-1];}for(j=0;j<=i;j++){1printf("%5d",x[i][j]);
11};printf("\n");12
1};/*fori*/
133
11464
1
第i列第j格-25问题与思考(Pascal三角形)
其实只用一维阵列(onedimentionalarray)
就可以做出上述的巴斯卡三角形
Why?因为是横着填..填完一列就可印出
程序要如何修改?
提示:中间的要由右而左填!?巴斯卡三角形在数学上有哪些意义?-26二进制也可以很有趣
想一个0到63间的任一个数,不要告诉我答案...但是告诉我有没有在以下哪几张卡片中?我可以很快找出来喔!-27二进制也可以很有趣32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63-28二进制也可以很有趣16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63-29二进制也可以很有趣8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47,56,57,58,59,60,61,62,63-30二进制也可以很有趣4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31,36,37,38,39,44,45,46,47,52,53,54,55,60,61,62,63-31二进制也可以很有趣2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,34,35,38,39,42,43,46,47,50,51,54,55,58,59,62,63-32二进制也可以很有趣1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63-33二进制也可以很有趣(原理)
1,3,5,7,000001=19,11,13,15, 000010=217,19,21,23, 000011=325,27,29,31, 000100=433,35,37,39, 000101=541,43,45,47, 000110=649,51,53,55, 000111=757,59,61,63 001000=8-34二进制也可以很有趣(原理)
2,3,6,7, 000001=110,11,14,15, 000010=218,19,22,23, 000011=326,27,30,31, 000100=434,35,38,39,000101=542,43,46,47,000110=650,51,54,55, 000111=758,59,62,63 001000=8-35二进制也可以很有趣(原理)
4,5,6,7, 000001=112,13,14,15, 000010=220,21,22,23, 000011=328,29,30,31, 000100=436,37,38,39,000101=544,45,46,47,000110=652,53,54,55, 000111=760,61,62,63 001000=8-36二进制也可以很有趣(原理)
8,9,10,11, 000111=712,13,14,15, 001000=824,25,26,27, 001001=928,29,30,31, 001010=1040,41,42,43, 001011=1144,45,46,47, 001100=1256,57,58,59, 001101=1360,61,62,63 001110=14-37二进制也可以很有趣(原理)16,17,18,19,010000=1620,21,22,23,010001=1724,25,26,27,010010=1828,29,30,31,010011=1948,49,50,51,010100=2052,53,54,55,010101=2156,57,58,59,010110=2260,61,62,63010111=23-38二进制也可以很有趣(原理)32,33,34,35,100000=3236,37,38,39,100001=3340,41,42,43,100010=3444,45,46,47,100011=3548,49,50,51,100100=3652,53,54,55,100101=3756,57,58,59,100110=3860,61,62,63100111=39-39卡片玩法与原理
请玩者心里想一个0到63的整数不要告诉你(废话),然后你依第六张、第五张、第四张...第一张拿给他,请他告诉你上面有没有他想的数,
为了表示你是过目不忘,交给他之前假装看一看,交给他后不要立刻拿回来,只请他分别放不同手中作为证据。答案:如果六张都没有就是
0。
在每张给他之前看清楚第一个数,只要他说有就加到答案中,等到最后一张给他,等他说出有没有后,答案也出来了。原理:
其实每张纸都是代表一个二进制数(binarynumber)。有就是1,没有就是0。与上一游戏一样,他已经把答案告诉你了!
因每张纸上第一位数就是该位的比重(weight,加权)。-40二进制也可以很有趣/*写程序印出前述之六张卡片*/
for(inti=0;i<=5;i++){printf("二进制也可以很有趣\n\n");
/*印出第i张卡片*/printf("\n\n\n");}-41二进制也可以很有趣
for(inti=0;i<=5;i++){printf("二进制也可以很有趣\n\n");
for(k=0;k<=63;k++){if(k&(2的i次方)!=0){printf("%2d,",k);if(必要时)printf("\n");}}printf("\n\n\n");}?-42intyy[]={1,2,4,8,16,32};
for(inti=0;i<=5;i++){printf("二进制也可以很有趣\n\n");
for(k=0;k<=63;k++){if(k&yy[i]!=0){printf("%2d,",k);if(必要时)printf("\n");}}printf("\n\n\n");}用一个阵列记住
2的i次方?-43if(必要时)printf("\n");intnp=0;/*numbersprinted*/
for(k=0;k<=63;k++){if(k&yy[i]!=0){printf("%2d,",k);np++;//numberprintedif(np%8==0)printf("\n");}}
?-44if(必要时)printf("\n");intnp=0;
for(k=0;k<=63;k++){if(k&yy[i]!=0){printf("%2d,",k);
///np++;//numberprintedif((++np)%8==0)printf("\n");//每印完八个数就换列
(newline)}}
?-45二进制也可以很有趣完整程序/*写程序印出前述之六张卡片*/#include<stdio.h>intyy[]={1,2,4,8,16,32};intk,np;main(){
for(inti=0;i<=5;i++){printf("二进制也可以很有趣\n\n");np=0;
/*印出第i张卡片*/printf("\n\n\n");}}前一页程序码for..-46问题与思考*为什么要依第六张(32开头那张)、第五张、第四张...第一张拿给玩者?
*如果不用一个table(array)来记住2的i次方,
那要怎么做?
用乘的––有何缺点?*每张卡片最后一列也印了逗点,
如何改进?(hint:加一列if)-47问题与思考(ASCIIcode)#include<stdio.h>main(){printf("%c的ASCIIcode是%d\n",'0','0');printf("%c的ASCIIcode是%d\n",'A','A');printf("%c的ASCIIcode是%d\n",'a','a');}
如果系统使用EBCDIC码呢?-48问题与思考(ASCIIcode)#include<stdio.h>main(){inti,k=0;for(i=65;i<=122;++i){printf("%c的ASCIIcode",i);printf("是%d",i);++k;printf(k%3==0?"\n":"\t");}printf("\n");}
-49问题与思考(中文码?)#include<stdio.h>unsignedcharx[9]={0};main(){intm=0xa4,n=0x6a;x[0]=m;x[1]=n;x[2]=0xae,x[3]=97;x[4]=0xa6,x[5]=0x6e;printf("==%s==\n",x);}
-50问题与思考(中文码?)ccbsd2:tsaiwn>gcctestc.cccbsd2:tsaiwn>./a.out==大家好==ccbsd2:tsaiwn>先把前面程序存入testc.c编译与连结执行-51实数与准确度(precision)#include<stdio.h>floatx,xdelta;inti;/*precision.c*/main(){doubley;x=1234567.2,xdelta=0.0001;printf("Beforeloop,x=%f\n",x);for(i=1;i<=8000;i++){y=x+xdelta;/******/if(i==1)printf("firsty=%f\n",y);x=y;}printf("Afterloop,x=%f\n",x);}
-52float实数准确度七位多ccbsd2:precision/>gccprecision.cccbsd2:precision/>./a.outBeforeloop,x=1234567.250000firsty=1234567.250100Afterloop,x=1234567.250000ccbsd2:precision/>
float实数占用32bits-53double实数准确度#include<stdio.h>doublex,xdelta;inti;/*precdbl.c*/main(){doubley;x=1234567.2,xdelta=0.0001;printf("Beforeloop,x=%f\n",x);for(i=1;i<=8000;i++){y=x+xdelta;/******/if(i==1)printf("firsty=%f\n",y);x=y;}printf("Afterloop,x=%f\n",x);}
-54double实数准确十五位多ccbsd2:precision/>gccprecdbl.cccbsd2:precision/>./a.outBeforeloop,x=1234567.200000firsty=1234567.200100Afterloop,x=1234568.000001ccbsd2:precision/>
double实数占用64bits-55再练习array
与LoopMagicsquare魔方阵Diabolicsquare鬼方阵奇数阶魔方阵程序偶数阶魔方阵程序?四的倍数阶魔方阵-56魔方阵与鬼方阵Magicsquare横的直的斜的加起来都一样的方阵所有的数字必须是连号三阶魔方阵:如何排?
2
9
4
7
5
3
6
1
8-57当瑛姑遇上黄蓉(1/5)三阶魔方阵
(magicsquare)九子斜排,四维挺出上下互易,左右相更
1
2
4357
6
89
2
9
4
7
5
3
6
1
8射鵰英雄传结果如下-58当瑛姑遇上黄蓉(2/5)三阶魔方阵
(magicsquare)九子斜排,四维挺出上下互易,左右相更
214
2
4357
6
8698
2
9
4
7
5
3
6
1
8射鵰英雄传-59当瑛姑遇上黄蓉(3/5)三阶魔方阵
(magicsquare)九子斜排,四维挺出上下互易,左右相更
29
435761
8
2
9
4
7
5
3
6
1
8射鵰英雄传-60当瑛姑遇上黄蓉(4/5)三阶魔方阵
(magicsquare)九子斜排,四维挺出上下互易,左右相更
29
4
75361
8
2
9
4
7
5
3
6
1
8射鵰英雄传二四为肩六八为足左七右三戴九履一-61当瑛姑遇上黄蓉(5/5)三阶魔方阵
(magicsquare)九子斜排,四维挺出上下互易,左右相更
29
4
75361
8
8
1
6
3
5
7
4
9
2
2
9
4
7
5
3
6
1
8射鵰英雄传三阶魔方阵只有一解,右边两解相同转180度-62MagicSquare魔方阵(奇数阶)Place1inthemiddleofthetoprowafterintegerkhasbeenplaced,moveuponerowandonecolumntotherighttoplacethenextintegerk+1,unless:Ifamovetakesyouabovethetoprowinthej-thcolumn,movetothebottomofthej-thcolumnandplacetheintegerk+1thereIfamovetakesyououtsidetotherightofthesquareinthei-throw,placek+1inthei-throwattheleftsideIfamovetakesyoutoanalreadyfilledsquareorifyoumoveoutofthesquareattheupperright-handcorner,placek+1immediatelybelowk.
-63MagicSquare魔方阵intx[19][19];colrow
1724
181523
571416
4613202210121921
3111825
29Wraparound-64魔方阵(奇数阶)程序前面讲过的方法如何写成程序?何谓跑过上方要由下方走出来?(wraparound)何谓跑出右边要由左方卷出来?要如何判断往右上时该格子是否已经填过?真的需要判断往右上时是否已经填过吗?能不能有别的方法?
换个角度想?结果变成可用两层的Loop完成前面讲过的方法如何写成程序?何谓跑过上方要由下方走出来?(wraparound)何谓跑出右边要由左方卷出来?要如何判断往右上时该格子是否已经填过?真的需要判断往右上时是否已经填过吗?能不能有别的方法?
换个角度想?结果变成可用两层的Loop完成-65MagicSquare魔方阵先令hand=0,一开始站在themiddleofthetoprow之正上方(第-1列)Loop以下工作n次
往正下方走一格并将hand
加1后填入Loop以下工作n-1次
往右上角走一格并将hand
加1后填入
(注意Wraparound卷回来)AlgorithmPseudocode假码-66MagicSquare魔方阵(cont)hand=0;row=-1;col=(n-1)/2;/*在0列上方*/for(i=1;i<=n;i++){row++;if(row>=n)row=0;/*往正下方一步*/hand++;x[row][col]=hand;for(j=1;j<=n-1;j++){/*往右上角
n-1
步*/row--;if(row<0)row=n-1;/*上移一列*/col++;if(col>=n)col=0;/*右移一格*/hand++;x[row][col]=hand;};}-67MagicSquare魔方阵(cont2)//…//…印出该方阵,一列一列地印出for(row=0;row<=n-1;row++){for(col=0;col<=n-1;col++){printf("%4d",x[row][col])};printf("\n");/*每印完一打印出newline*/}-68问题与思考Magicsquare与PascalTriangle在使用Loop上有何异同?-69p7.c巴斯卡三角形
for(i=0;i<=n;i++){
x[i][0]=1;
x[i][i]=1;/*记得宣告/定义x阵列喔*/
for(j=1;j<=i-1;j++){x[i][j]=x[i-1][j]+x[i-1][j-1];}for(j=0;j<=i;j++){1printf("%5d",x[i][j]);
11};printf("\n");12
1};/*fori*/
133
11464
1
第i列第j格-70MagicSquare魔方阵(cont)hand=0;row=-1;col=(n-1)/2;/*在0列上方*/for(i=1;i<=n;i++){row++;if(row>=n)row=0;/*往正下方一步*/hand++;x[row][col]=hand;for(j=1;j<=n-1;j++){/*往右上角
n-1
步*/row--;if(row<0)row=n-1;/*上移一列*/col++;if(col>=n)col=0;/*右移一格*/hand++;x[row][col]=hand;};}-71MoreMagicSquaresOrder=4?Order=4k,wherek=1,2,3,…Order=2k,wherek=2,3,…-72偶数阶魔方阵前面所说方法只适用在奇数阶,偶数阶呢?二阶魔方阵不存在三阶魔方阵只有一个解(旋转..算一个)四的倍数阶方阵有一个简单解法四阶魔方阵共有880
个解二以外的偶数阶方阵也有解法-73四阶MagicSquare魔方阵Order=4162
313
5
1110
8
9
7
6
12
414151四阶魔方阵共有880个横的,直的,斜的加起来都是34当瑛姑遇上黄蓉-74四阶DiabolicalSquare鬼方阵Order=4112
138
14
72
11
4
9
16
5
156310卷动一列或卷动一直行仍为魔方阵横的,直的,斜的加起来都是34-75四阶DiabolicSquare鬼方阵Order=4
12
138
7
2
11
9
16
5
6310卷动一列或卷动一直行仍为魔方阵横的,直的,斜的加起来都是34
1
14
4
15-76四阶DiabolicSquare鬼方阵Order=4
14
72
11
4
9
16
5
156
310卷动一列或卷动一直行仍为魔方阵横的,直的,斜的加起来都是34112
13
8-77四阶MagicSquare制作方法Order=412
34
5
67
8
9
10
11
12
13141516横的,直的,斜的加起来都是34当瑛姑遇上黄蓉由左而右依序填入1到16对角线经过处取17补码-78四阶MagicSquare制作方法Order=4162
313
5
1110
8
9
7
6
12
414151四阶魔方阵共有880个横的,直的,斜的加起来都是34当瑛姑遇上黄蓉1+16=17对角线经过处取17补码-79八阶MagicSquare魔方阵Order=8123491011121718567813141516
57585960
616263641+64=65对角线经过处取65补码由左而右由上而下填入1到64-80八阶MagicSquare魔方阵Order=86423619555412172060675713515016?
1514858595
?1811104626311+64=65对角线经过处取65补码
0123456701234567-81四的倍数阶MagicSquare魔方阵intx[19][19];/*由左而右,由上而下填入1到n*n*/val=0;haha=1+n*n;for(i=0;i<=n-1;i++){
for(col=0;col<=n-1;col++){val++;if(isondiag(i,col))x[i][col]=val;elsex[i][col]=(1+n*n)–val;}}换成haha-82四的倍数阶MagicSquare魔方阵/*X[i][j]是否在对角线上?whenindex=
0,1,2,3,4,5,6,7,…*/ intisondiag(inti,intj){i=i%4;j=j%4;
if(i==j)return1;if(i+j==3)return1;return0;/*0meansfalse*/}-83四的倍数阶MagicSquare魔方阵//X[i][j]是否在对角线上?//whenindex=1,2,3,4,5,6,7,8,… intisondiag(inti,intj){//?//?//?return0;/*0meansfalse*/}-84八阶MagicSquare魔方阵Order=86423619555412172060675713515016?
1514858595
?1811104626311+64=65对角线经过处取65补码123456781
2345
6
78-85四的倍数阶MagicSquare魔方阵/*X[i][j]是否在对角线上?whenindex=1,2,3,4,5,6,7,8,…*/ intisondiag(inti,intj){i=(i-1)%4;j=(j-1)%4;if(i==j)return1;if(i+j==3)return1;return0;/*0meansfalse*/}-86四的倍数阶MagicSquare魔方阵//判断x[i][j]是否在对角线上?//whenindex=1,2,3,4,5,6,7,8,…
boolisondiag(inti,intj){i=(i-1)%4;j=(j-1)%4;if(i==j)returntrue;if(i+j==3)returntrue;
elsereturnfalse;/*else可去掉*/}//新版C++才认识bool-87再谈函数(函式)function函数–你给它一些参数,它回传给你一个值递回函数(Recursivefunction)–直接或间接叫自己参数(parameter)=让函数参考的资料给人家参考的叫argument
自变量函数的头部括号内叫parameter
参数Argument又叫做actualparameter(实际参数)Parameter
通常指formalparameter(形式参数)范例:ans=myfun(x,y);/*x,yareactualparameter*/doublemyfun(intm,floatp2){/*…*/}/*m与p2是形式参数或叫做虚拟参数,formalparameter,是别人传过来的*/-88常见Recursive问题FactorialN:求N阶乘能求到多大?写一程序印出1阶乘到52阶乘GCD(m,n)QuickSortFibonacciRabbitsproblemHanoiTower-89NFactorial(N阶乘,N!)longfactorial(intn){longk,ans=1;for(k=1;k<=n;++k)ans=ans*k;returnans;}/*给我n我就告诉你n阶乘*/#include<stdio.h>intmain(){printf("5!=%ld\n",factorial(5));}N阶乘就是1*2*…*(N-1)*N-90NFactorial(Recursive版)longfactorial(intn){if(n<0)return-factorial(-n);if(n==1||n==0)return1;returnn*factorial(n-1);}/*告诉我n-1阶乘,我就给你n阶乘*/#include<stdio.h>intmain(){printf("5!=%ld\n",factorial(5));}N阶乘就是N乘以N-1阶乘-91欧几里得的最大公约数辗转相除法(recursive概念!)GCD(m,n)=GCD(n,m%n)
但如果n是0则答案为mlonggcd(longm,longn){if(n==0)returnm;returngcd(n,m%n);}如何写成non-recursiveversion?-92最大公约数non-recursive版longgcd(longm,longn){intr;/*remainder*/while(n!=0){r=m%n;m=n;n=r;}returnm;}-93Recursive也可以很有趣(1/3)FibonacciSeries:(费氏数列)一开始有一对兔子小兔子隔一个月可以长大为成兔每对成兔每隔一个月可生出一对兔子假设兔子永远不死,
问第n个月时有几对兔子?1,1,2,3,5,8,13,21,34,55,89,144,.fib(n)01234567891011=n
-94Recursive也可以很有趣(2/3)longfib(intn){if(n<0)return0;if(n==1||n==0)return1;returnfib(n-1)+fib(n-2);}/*给我n我就告诉你第n个月时有几对兔子*//*第n个月兔子数=第n-1个月兔子+第n-2个月兔子*//*但是,最开始两个月例外!*/-95Recursive也可以很有趣(3/3)FibonacciSeries(费氏数列):1,1,2,3,5,8,13,21,34,55,89,144,…34/55=55/89=89/144=0.618黄金分割比:)神奇的费氏数列:任何事物接近这些数字会有变化
请看..可怕的
巧合:!?三重魔力...
民国34年台湾光复,民国89年变天国民党从日本手上抢回台湾执政刚好
55年!-96ProgrammingConceptSummary(1/3)为了方便,一些宣告被写在header档案(标题档案),要用#include<filename.h>把它抄进来变量(variable)就是占住存储器一小块地方且有个名字变量名字要用字母开头变量的种类(类型):整数:char,(byte),short,int,long,longlong(C99才有)实数:float,double,longdoublefloat
的准确度只有二进制24位,约十进制7位强double
的准确度只有二进制53位,约十进制15位强每个C程序都要有一个主程序intmain(){/*…*/}/*注解是给人看的*///C++是用两斜线开始注解-97ProgrammingConceptSummary(2/3)为了方便,用array(阵列)来表示一大堆同性质变数若寫的每一句(statement;指述)都只做一次,程序再大也是一下子就执行完了!ControlstatementsControlStatements(控制指述):Sequentialstatement(循序)---就是没控制Selection(Alternative)选择---if(expression)stat-1;elsestat-2;Repetition(Loop)whileloopforloopdowhileloop(repeatuntilinPascal)Functioncall/return;Recursivefunction:直接或间接叫自己程序库(Libraryfunction)---方便程序员-98ProgrammingConceptSummary(3/3)#include<stdio.h>/*C的标题档*/#include<iostream>//C++的标题档doublemyva
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025频标比对器校准规范
- 2025-2026年福建省北师大版五年级英语下册第5单元单词拼写测试卷
- 2025-2026年交通安全法规与驾驶操作考核试卷
- 2025-2026年天津市部编版小学四年级英语上册第3单元课时作业
- 2025-2026年四川省湘教版初中物理八年级下册力学知识点巩固习题
- 2026年北师大版高三化学一轮复习化学工业第五章测试卷
- 2025年浙江省部编版高中物理下册电磁学知识点巩固习题
- 2026年重庆市北师大版八年级物理下册电磁学专项测试卷
- 2025-2026年浙江省人教版三年级语文上册第3单元古诗文背诵检测卷
- 2025-2026年人教版三年级语文上册第3单元古诗鉴赏习题
- 智能网联汽车技术(第2版)高职全套教学课件
- 油藏工程动态开发笔试题-动态分析大全(含答案)
- 西游记:团结协作、战胜困难的励志故事
- 第1课《我是什么样的人》课件心理健康教育四年级上册(北师大版)
- 微信小程序开发实战(第2版)全套PPT完整教学课件
- 营销策划 -教育-华与华-“得到”品牌战略提报方案
- 深井泵说明书
- GB/T 6188-2017螺栓和螺钉用内六角花形
- GB/T 451.2-2002纸和纸板定量的测定
- GB/T 1690-1992硫化橡胶耐液体试验方法
- 南京农业大学农业设施工程学第一章 设施农业建筑材料2013课件
评论
0/150
提交评论