830 likes | 959 Views
程式設計. 蔡雪紅老師. 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 個整數,求其和
E N D
程式設計 蔡雪紅老師
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++; }
程式語言為何需要陣列? • 有多量的資料需要輸入到記憶體 • 而這些資料的型態都相同 • 且資料處理的技巧能用比較簡單的算式表達
依結構分為 • ㄧ維陣列 • 二維陣列 • 多維陣列
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後列入最後可執行之條件
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 }
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的型態
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++; • }
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; • }
寫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; • }
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; • }
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;} • }
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 • }
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 • }
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);
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
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);
15 有一個100個字元的陣列,以0為界,求0的位置(一定有0) • char A[100]; • for(i=0;A[i]!=0;i++); • if(A[i]==0) break;
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); • }
17 二維陣列基本樣式 • for(i=0;i<row;i++) • for(j=0;j<col;j++) • { • …A[i][j] • 掃描 • }
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]; }
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;}
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的值
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); • }
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); • }
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); • }
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); • }
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;
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); • };
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); • }
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; • }
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--; • } • }
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); • }
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); • }
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++;
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];
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++; • }
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++;
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的值 負數
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); • }
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(); • }
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.
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*/
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);
42 副程式(function,函式) • main() • { float x; • x=sart(3.8); //caller:呼叫者 • } • Float sart (float x)//callee:被呼叫者,參數x應視為local variable,區域變數 • { • return 2*3.14*x; • }
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; }
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)執行函數的程式
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)); • }
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; • }
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 ); • }