1 / 83

蔡雪紅老師

程式設計. 蔡雪紅老師. 1. 輸出 “ 我是 xxx ” 50 次 for(c=0;c<50;c++) // 把控制迴圈的變數,集中在一起 { printf( “ 我是 xxx ” ) } or c=0; // c 是計數器,起始值為 0 while(c<50) // 每經迴圈一次, c 就加 1 ,直到 c=50 為止 { printf( “ 我是 xxx ” ); c++; // 每作完一次, c 就加 1 } 輸入 100 個整數,求其和

shana
Download Presentation

蔡雪紅老師

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 程式設計 蔡雪紅老師

  2. 1 輸出 “我是xxx” 50次 • for(c=0;c<50;c++) // 把控制迴圈的變數,集中在一起 • { • printf(“我是xxx”) • } • or • c=0; // c是計數器,起始值為0 • while(c<50) // 每經迴圈一次,c就加1,直到c=50為止 • { • printf(“我是xxx”); • c++; // 每作完一次,c就加1 • } 輸入100個整數,求其和 • for(a=0;a<100;a++) or a=0; • { while(a<100) • scanf(“%d”,&x); {scanf(“%d”,&x); • s+=x; s+=x; • } a++; }

  3. 程式語言為何需要陣列? • 有多量的資料需要輸入到記憶體 • 而這些資料的型態都相同 • 且資料處理的技巧能用比較簡單的算式表達

  4. 依結構分為 • ㄧ維陣列 • 二維陣列 • 多維陣列

  5. 2 如何寫出迴圈 • i=1:s=0; // i是起始值 • while(i<101) // 迴圈繼續的條件 • { • s=s+i;// 累加 • i+=2; // 變化量 • } • 1+3+5+....101 • 基本概念 s=0 • s=s+1 • s=s+3 • : • s=s+101 找出重覆的部分,放入loop 找出loop內不同的值,用變數取代它(變數為x) x之起始值求出來,在loop外加入x之起始值 求上下兩個statement內x之變化量放入loop之後 用x控制loop何時結束,在while後列入最後可執行之條件

  6. 3 例子一 • 1-1/2+3-1/4+……+1/n │1/n│<0.001 • s=0 #include<stdio.h> • s=s+1 main() • s=s+(-1/2) { s=0;x=1;sign=1; • s=s+1/3 while(abs(1/x)>=0.001) • s=s+(-1/4) { s=s+sign*1/x; • : x++; • : sign=sign*(-1); • : } • } • s=s+(1/n) • 1+1/2+1/3+1/4+……+1/n #include<stdio.h> • a=0 main() • a=a+1 { a=0;x=1; • a=a+1/2 while(x<=n) • a=a+1/3 { a=a+1/x; • a=a+1/4 x++; • : } • a=1+1/n }

  7. 4 輸入100個整數,求幾個大於平均值? • For(a=0;a<100;a++) • { scanf(“%d”,&A[a]) // 使用陣列的時機 • s+=A[a]; 1.多個元素 • } 2.被重覆使用 • avg=s/100; // 先求出平均值 • for(a=0;a<100;a++) • if(A[a]>avg)c++; // 再逐一檢查陣列值是否大於平均值 • a=0; • while(a<100) • { • if(A[a]>avg)c++; • a++; • } // 7,8改寫成while的型態

  8. 5 輸入10個實數到陣列到A內 • #include<stdio.h> • main() • { double A[10]; // 宣告實數陣列 • for(i=0;i<10;i++) // 已知有10個實數,可用陣列索引計數器 • scanf(“%f”,&A[i]); // 由鍵盤輸入實數到陣列各元素 • } 把陣列A的所有元素相加,求A[0]+A[1]+……+A[9] • #include<stdio.h> • main() • { s=0; // 起始值 • for(i=0;i<10;i++) • s=s+A[i] // 累加 • } • 或 • i=0; • while(i<10) • { • s=s+A[i]; • i++; • }

  9. 6 求陣列A內有多少個0 • #include<stdio.h> • main() • { int c=0; // c作為有幾個中的計數器 • for(i=0;i<10;i++) • { • if(A[i]==0)c++; // 逐一檢查A[0],A[1]…A[9]是否為0,否則c加1 • } • } • Debug // 找出下列程式的文法錯誤 • #include<stdio.h> • main(); // 多了 ; • { int x=2; // 少宣告b,c,t,s,f • if(x>2){ c=c+1;b=2; } • else if (x>4) c=c+2;t=3; • for(i=0;i!=1;i+=2) • s=s+i; • }

  10. 寫20次 7 1 宣告一整數陣列AAA,有20個元素 2 寫一程式把AAA之元素全部設為0 (1) 寫出non-loop statement //不用陣列 (2) 用wile-loop寫之 (3) 用for-loop寫之 • (1) #include<stdio.h> • main() • { int AAA[20]; • AAA[0]=0; • AAA[1]=0; • : • : • AAA[9]=0; } • (2) #include<stdio.h> • main() • { int AAA[20],i=0; • while(i<=19) • { AAA[i]=0;i++; } • } • (3) #include<stdio.h> • main() • { • int AAA[20]; • for (i=0;i<=19;i++) // 最簡潔 • AAA[i]=0; • }

  11. 8 寫一程式,求AAA內有幾個數目大於10 (1) 寫出non-loop statement (2) 用wile-loop寫之 (3) 用for-loop寫之 • (1) #include<stdio.h> • main() • { int AAA[20],c=0; • if (AAA[0]>10)c++; • if (AAA[1]>10)c++; • : • : • if (AAA[19]>10)c++; } • (2) #include<stdio.h> • main() • { int AAA[20],c=0,i; • i=0; • while(i<=19) • { if (AAA[i]>10) c++; } • } • (3) #include<stdio.h> • main() • { int AAA[20],c=0,i; • for (i=0;i<19;i++) • AAA[i]=0; • }

  12. 9 AAA陣列中第一個0在那個位置(索引位置) break: (中斷break所在的loop) • #include<stdio.h> • main() • { int AAA[20]; • for(i=0;i<=19;i++) • if (A[i]==0) • { printf(“%d”),i ;break;} • }

  13. 10 A陣列有1000個元素(int) 輸入若干整數到A,最後一數為-1(不超過1000個) 輸入A[0],若(A[0]==-1) break; 輸入A[1],若(A[0]==-1) break; : 寫成程式 • for(i=0;i<1000;i++) • { • scanf(“%d”,&A[i]); // 輸入到A[i] • if(A[i]==-1) break; // 若A[i]是-1,則停止loop • }

  14. 11 輸入兩個整數m,n,求mn • #include<stdio.h> • main() • { int m,n,x=1,i; • scanf(“%d %d”,&m,&n); • for(i=0;i<n;i++) • x=x*m; // m累乘n次,中間結果放入m • printf(“\n%d\n”,x); • getch(); // stop screen • }

  15. 12 有100個元素之整數陣列,有用的元素以-1為界 (1)求有用元素之和 (2)求有用元素中0的個數 (3)求有用元素中第一個0的位置 • (1)int i, s=0, A[100]; • for(i=0;i<100;i++) • if(A[i]==-1) break; • else s=s+A[i]; • printf(“%d”,s); • (2)int i, s=0, A[100]; • for(i=0;i<100 && A[i]!=-1;i++) • if(A[i]==0) c++; • (3)int i, A[100]; • for(i=0;i<100 && a[i!]=-1;i++) • if(A[i]==0) break; • printf(“%d”, i);

  16. 13 寫一個程式,尋找第一個-1的位置 • #include<stdio.h> • main() • { int i ,A[100] • for(i=0;A[i]!=-1;i++) //如果陣列內全部沒有-1? • printf(“%d”,i); • } 1*2*3*4……*n • s=1,x=1; • while(x<=n) • { s=s*x; • x++; • } for(x=1;x<=n;x++) { s=s*x; x++; } or

  17. 14 字串是字元陣列,最後一個字元是0(‘\0’) (1)輸入一個字串放在str,少於80字,由KB輸入 (2)尋找字串有幾個 ‘a’ (3)尋找字串中 ‘0’在哪個位置 (4)把str copy至 str2 • (1)char str[81] • scanf(“%”,str); • (2)for(i=0;i<81 && str[i]!= ‘\0’ ;i++) • if(str[i]== ‘a’) c++; • (3)for(i=0;i<81;i++) • if(str[i]==7) break; • (4)for(i=0;str[i]!= ‘0’ ;i++) • str2[i]=str[i]; • str2[i]= ‘0’; • printf(“%s” ,str);

  18. 15 有一個100個字元的陣列,以0為界,求0的位置(一定有0) • char A[100]; • for(i=0;A[i]!=0;i++); • if(A[i]==0) break;

  19. 16 由KB輸入10個整數,求其和 • #include<stdio.h> • main() • { int s=0, i ,x; • for(i=0;i<10;i++) • { scanf(“%d”,&x); • s+=x; } • } 1+1/2+1/3+……+1/n • #include<stdio.h> • main() • { int i ,x , float s=0; • scanf(“%d”,&x); • for(i=1;i<n;i++) • s=s+1/n; • printf(“%d”,s); • }

  20. 17 二維陣列基本樣式 • for(i=0;i<row;i++) • for(j=0;j<col;j++) • { • …A[i][j] • 掃描 • }

  21. 18 有一個4*8之二維實數陣列,求其元素和 • s=0 • s=s+A[0][0] • s=s+A[0][1] • : • s=s+A[0][7] 二維陣列4*3(實數) 宣告之 (2)將其內元素全部設為0 (3)求A內0有n個 (4)全部加10 • (1)float A[4][3]; • (2)for(i=0;i<4;i++) • for(j=0;j<3;j++) • A[i][j]=0; • (3)if((A[i][j])==0) c++; • (4) A[i][j]+=10; for(j=0;j<8;j++) { s=s+ A[0][j]; }

  22. 19 使用檔案file.ppt (1)由KB輸入10個整數,求其和 (2)由檔案a.dat輸入10個整數,求其和 • (1) for(i=0 ;i=<10;i++) • { • scanf(“%d”,&x); • s+=x; • } • (2) FILE *fp; • fp=fopen(“a.dat”, “r”); • { fscanf(fp, “%d”,&x); • s+=x;}

  23. 20 由a.dat檔輸入100個實數,copy到b.dat內 • FILE *fpin, *fpout ; int i, x ; float x; • fpin=fopen(“a.dat”, “r”); • fpout=fopen(“b.dat”, “w”); • for(i=0;i<99;i++) • { • fscanf(fpin, “%d”,&x); • fprintf(foput, “%d”,x); • while(EOF!=fscanf(fpin, “%d”,&x)) • fprintf(fpout, “%d”,&x); • } • end-of-file //eof:當scanf(…)唸到檔尾時會回傳一個eof的值

  24. 21 a.dat,b.dat 檔內各有若干實數,合併此二檔案進入c.dat • #include<stdio.h> • main() • { • (1)開三個檔 • (2)由a.dat讀入1個實數x,直到EOF,將x寫入c.dat • (3)由b.dat讀入1個實數x,直到EOF,將x寫入c.dat • } 開檔 • #include<stdio.h> • main() • { • FILE *fpin1,*fpin2,*fpout; • fpin1=fopen( “a.dat”, “r”); • fpin2=fopen( “b.dat”, “r”); • fpout=fopen( “c.dat”, “w”); • scanf或fscanf若讀入成功,則送為輸入的數目,fscanf(fp, %d,%d,%d”,&x,&y,&z);若執行成功,則返回3可偵測此數目,先看EOF或其他錯誤是否發生 • while(EOF!=fscanf( “fpin1”, “&f”,&x)) • fprintf( “fpout”, “&f”,x); • while(1==fscanf( “fpin2”, “&f”,&x)) • fprintf( “fpout”, “EOF”,x); • }

  25. 22 開2個檔案a.dat,b.dat由a.dat念2個整數至b.dat內 • main() • { int x,y; • FILE *fpin,*fpout; • fpin=fopen( “a.dat”, “r”); • fpout=fopen( “b.dat”, “w”); • fscanf=(fpin, “%d %d”,&x,&y); • fprintf=(foput, “%d %d”,x,y); • } 由a.dat念入100個整數求和 • main() • {int x; • FILE *fp; • fp=fopen(“a.dat”,“r”); • for(i=0;i<100;i++) • fscanf(fp, “%d”,&x); • s+=x; • printf(“%d”,x); • }

  26. 23 由檔案a.dat輸入若干實數,直到-1為止(停止)求和(不包含-1)至小數第二位 • #include<stdio.h> • main() • { • FILE *fpin; float x; • fpin=fopen(“a.dat”, “r”); • while(1) • { • fscanf(fpin, “%f”,&x); • if(x==-1) break; • s=s+x; • } • printf(“% 10.2f”,x); • }

  27. 24 由a.dat輸入所有直到檔尾實數,偵測檔尾 • while(1) • { n=scanf(fp, “%f”,&x); • if(n!=1) break; • s+=x; • } • #include<stdio.h> • main() • { int x,n; • FILE *fp; • fp=fopen(“a.dat”, “r”); • while(1) • { n=fscanf(“%f”,&x); • if(n!=1) break; • } • printf(“%f”,x); • }

  28. 25 結構~struct(ure) 把不同種同類數量(型態)的元素放在一起成為一個整體,稱為結構。 • struct Persontype • { char name[80]; • int age; int hair; • }; • struct Persontype x,y; • x.age=18; • x.hair=3; • y.age=13; • y.hair=7; • strcpy(x.name,”David”); • strcpy(y.name,”John”); • strcpy Persontype • { char name[8]; • char addr[20];int ID; • }; struct Persontype a;

  29. 26 • struct DOOHNameType • { • char name[8],addr[20]; • int ID; • }; • struct DOOHNameType Person1,Person2; • strcpy(Person1.name,”AAA”); • strcpy(person1.addr,”台北市”); • Person1.ID=6; • strcpy(Person2.name,”BBB”); • strcpy(Person2.addr,”高雄市”); • Person2.ID=26; • printf(“%s%s%d”,Person1.name,Person1.addr,Person1.ID); • printf(“%s%s%d”,Person2.name,Person2.addr,Person2.ID); • 同上由KB讀入”cc””新竹市””18”到Person1內 • struct DoorNameType • { • char name[8],addr[20]; • int ID; • scanf(“%s%s%d”,Person1.name,Person1.addr,&Person1.ID); • };

  30. 27 (1)宣告如上之結構叫Type (2)用程式-角告變數叫u.v並置入值”國文”,4,72.5於u中 (3)由KB輸入v • #include <stdio.h> • struct xType • { char course[12]; • int credit; • float score; • }; • main() • { struct xType u.v; • strcpy(u.course,”國文”); • u.credit=4; • u.score=72.5; • scanf(“%s%d%f”,v.course,&v.credit,&v.score); • }

  31. 28 宣告一個結構並宣告2個SType變數 x1,x2 • #include<stdio.h> • struct SType • { • char CHINESE[20],ENGLISH[30]; • int s1,s2; • }; • main() • { • struct SType x1,x2; • strcpy(x1.CHINESE,”Chap1”); • strcpy(x2.ENGLISH,”chap2”); • x1.s1=57; • x1.s2=82; • }

  32. 29 • 有一個100元素的整數陣列A.由a.dat輸入值直到碰到-1 • #include<stdio.h> • { int x,i; • FILE *fp; • fp=fopen(“a.dat”,”r”); • for(i=0;i<100;i++) • { fscanf(fp,”%d”,&x); • if(x==-1)break; • } • } • #include<stdio.h> • main() • { int j=99; • for(i=0;i<100;i++) • { • A[i]=j; • j--; • } • }

  33. 30 一個檔案a.dat念2個整數,printf至螢幕上 • #include<stdio.h> • main() • { int x,y; • FILE *fpin; • fpin=fopen(“adat”,”r”); • fscanf(fpin,”%d%d”,&x,&y); • printf(“%d%d”,x,y); • } • #include<stdio.h> • main() • { int x,y,i; • FILE *fpin; • fpin=fopen(“a.dat”,”r”); • for(i=1);i<=1;i++) • fscanf(fpin,:%d”,&x); • printf(“%d”,x); • }

  34. 31 • 開2個檔案a.dat,b.dat由a.dat念2個整數,輸入至b.dat內,念入若干實數, • 直到-1為止,求和 • main() • { int x,y; • FILE *fpin,*fout • fpin=fopen (“a.dat”,”r”); • fpout=fopen (“b.dat”,”w”) • fscanf (fpin,”%d%d”,&x,&y); • fprintf (fpout,”%d%d”,x,y); • } • main() • { int i; float x=0; • FILE *fpin; • fpin=fopen(“a.dat”,”r”); • for (i=0;A[i]!=-1;i++) • if (A[i]=-1) break; • else x=x+A[i]; • fscanf (fpin,”%f”,&x); • fprintf (fpout,”%f”,x); • }

  35. 32 • 寫一個完整的程式,輸入一個字串 • (1)求其內”x”的個數 (2)字串長度0的位置 (3)把s copy 到s2 • #include<stdio.h> • main() • { char s[81],s2[82]; int i,c=0; • scanf(“%s”,s); • for(i=0;s[i]!=”\0”;i++) • { if(s[i]==’x’) c++; • s2[i]=s[i]; • } • s2[i]=’\0’; • } • for(i=0;i<3;i++) • { if(A[i]>10) c++; } • s+=A[i]; • i=0; • if(!(i<3)) break; • if(A[i]>10) c++; • s+=A[i]; • i++; • if(!(i<3)) break; • s+A[i]; • i++; • if(!(i<3)) break; • s+A[i]; • i++;

  36. 33 • i=0; • if(i<3) continue else break; • if(a[i]>10) c++; • s+=A[i]; • i++; • if(i<3) coutinue else break; • if(A[i]>10) c++; • i++; • : • : • : • S+=A[i]; • for(i=0;A[i]==1;i++) • if(A[i]==0) c++; • s+=A[i];

  37. 34 • (1) while-loop • i=0 • while(A[i]!=-1) • { if(A[i]==1) c++; • i++; • } • s+=A[i]; • (2) non-loop • i=0; • if(A[i]!=-1) continue else break; • if(A[i]==0) c++; • i++; • : • s+=A[i]; • for(i=0;A[i]!=0;i++); //;空迴圈 • { • s+=A[i]; • c++; • }

  38. 35 • for(i=0;j=10;i<100&&A[i]!=-1;i++) • { • A[i]=B[j]; • i++; • j++; • } • i=0; • j=10; • if(i<100&&A[i]!=-1) coutinue else break; i++; • A[i]=B[j]; • i++; • j++; • if(i<100&&A[i]!=-1) coutinue else break; i++; • A[i]=B[j]; • i++; • j++;

  39. 36 輸入10個字串,求其中之最大者 • include<studio.h> • main() • { char large str[80],x[80]; • scanf(“%s”,x); /*輸入第 個字串*/ • strcpy(largester ,x); /*把字串交給largester*/ • for(i=0;i<10;i++) • { scanf(“%s”,x); • if(strcmp(x,largester)>0); • strcpy(largester,x); • } • printf(“%s”,largester); • } • strcmp(s1,s2) • 如果s1=s2,return 0 • s1>s2,return 大於0的值 正數 • s1<s2,return 小於0的值 負數

  40. 37 輸入10個整數,求其中之最大者 • main() • { int large=-32768,x; • for(i=0;i<10;i++) • { scanf(“%”,&x); • if(x>large) large=x; • } • printf(“%d”,large); } 輸入一個字串,將其字母倒置後即出 • { char s1[80],s2[80]; • scanf(“%s”,s1); • n=strlen(s1); i=n-1; • for (k=0;k<n;k++) • { s2[k]=s1[i-k]; } • s2[n]=0; • printf(“%s”,s2); • }

  41. 38 • 一、在檔案in.dat內放若干個字串,寫一程式讀入這些字串印出之 • 二、找出字串中之最大者,印出之 • #include<stdio.h> • main() • { char str[80]; a[80]; • FILE *fp; • int n; • clrscr(); • if(NULL==(fp=fopen(“in.dat”,”r”))) • { printf(“open errord\n”); exit(2); } • while(1) • { n=fscanf(fp,”%s”,str); • if (n!=1) break; • printf(“%s\n”,str); • if(strcmp(str,a)>0){ strcpy(a,str); } • } • printf(“%s\n”,a); • getch(); • }

  42. 39 • if(NULL==(fp=fopen(“in.dat”, “r”))) • { printf(“open error”); exit(2);} fopen(…) 如果開檔不成功,則送NULL,放入fp內 故上述 if(…)使得OPEN失效, 執行{printf(“open error”); exit(2);} exit(n) 停止程式,並傳n到O.S.

  43. 40 POINTER~指標 記憶體有兩個要素 (1)地址(符號) (2)值 1. int x=3,*y,*z; 2. y=&x; /*y內是36*/ 3. Printf(“%d %d\n”,x,*y); /*執行結果 3 3*/ 4. z=y; 5. printf(“%d %d %d”,x,*y,*z); /*執行結果 3 3 3*/

  44. 41 POINTER~指標 (1)宣告一個指標p:int *p; (2)讓指標p指向i :int *p, i ; ….p=&i; (3)由p拿出所指出物件a值:y-*p; /*y內為38*/ • int i=15,y=18,*p; • p=&i; • printf(“%d”,*p,p); • y=*p; • printf(“%d”,y); • (*p)++; • printf(“%d”,i);

  45. 42 副程式(function,函式) • main() • { float x; • x=sart(3.8); //caller:呼叫者 • } • Float sart (float x)//callee:被呼叫者,參數x應視為local variable,區域變數 • { • return 2*3.14*x; • }

  46. 43 函式 int max(int a,int b)中,求a,b之較大者輸出之 • int max(int a,int b) • { • if (a>b) return a; • else return b; • } 寫一個函式用三個實數參數a,b,c,送回這三數值平均值 • main() • float avg(float a, float b, float c) • { • return (a+b+c)/3; • } { double s; s=(a+b+c)/3; return s; }

  47. 44 參數為整數陣列A ,大小為n,送回最大數 • int findmax(int A[],int n) • { • int s; • s=A[0]; • for(i=1;i<n;i++) • if(A[i]>s) s=A[i]; • return s; • } (1)先找到函式定義 (2)把參數的值一個一個按位置放入引數內 (3)引數視為區域變數 (4)執行函數的程式

  48. 45 求x陣列之最大值 • main() • { • int x[80]; max; • max=findmax(x,80); • printf(“最大數是”,max); • } 有兩個整數陣列x[30],y[20]; 求x,y最大值 • { • int x[30],y[20] • print f(“%d%d”,findmax(x,30),findmax(y,20)); • }

  49. 46 • pointer:指標 • 1.宣告一個指標:int *p; • 2.讓指標 p 指向i:int *p;->p=&i ; • 3.由 p 拿出所指物件的值:y=*p; //y內為38 • ex1: main( ) • { int i=15,j=18, *p; • p=&i; • printf(“%d”,*p); • j=*p; • printf(“%d”,j); • (*p)++; • } printf(“%d”,j); • ex2:int Add(int A[],int length) • { int *p,i,s; • p=&A[0]; • s=0; • for(i=0;i<length;i++) • { s=s+(*p); • p++;} • return s; • }

  50. 47 • 設一個檔案a.dat,內有若干實數,最後一個數目為-999 • 求 (1) 陣列和 (2) 陣列中有多少個0 (3) 陣列中之最大數 • main() • { FILE *fpin; double a[80],*p; • int i,n,s,c=0;double x=0; • if(NULL==(fpin=fopen(“a.dat”, “r”))) • { printf(“open error”); exit(2); } • p=&a[0]; • s=*p; • for(i=0;|;i++) • { fscanf(fpin, “%f”,p); • x=x+*p; • if(*p==-999.0) break; • if(*p==0.0) c++; • if(i==0) s=*p; • if(*p>s) s=*p; • p++; • } • printf(“%f\n %d\n %f” ,x ,c ,s ); • }

More Related