1. 程式人生 > >小學生都看得懂的C語言入門(2): 判別 循環的一些應用實例

小學生都看得懂的C語言入門(2): 判別 循環的一些應用實例

The 小學 邏輯 true bing nsh 除法 如何 地方

1.bool 類型

定義bool類型之前需要導入#include <stdbool.h>

#include <stdio.h>
#include <stdbool.h> 
int main()
{
    bool b=6>5;
    bool t=true;
    printf("%d\n",b); //仍然是整數形式輸出 得到1
return 0;
}

2.邏輯運算
非! 或|| 和&& x>4 && x<6 !age<20 永遠成立,!age=0或1 優先級順序 ! && ||

賦值運算等級最低
// 短路 邏輯運算時從左向右的,左邊已經可以覺得結果了,右邊就不做了
//條件運算符 m<n? x:a+5 表示m<n 則 取x, 否則為a+5 ,這種表達式少用,會搞錯 !!
//逗號 等級最低的

#include <stdio.h>
#include <stdbool.h> 
int main()
{
 int i=3+4, 5+6; //出錯了 為什麽
 printf("%d\n",i);  //7
 int j=(3+4,5+6); //  正確 
 printf("%d\n",j);  //11
return 0;
}

逗號什麽用? 主要在for 中使用,可以放多個計算. for(i=0,j=10;i<j:i++,j--)...

3.分段函數

#include <stdio.h>
int main()
{
 int x=10;
 int f=0;
 if
(x<0){ f=-1; } else if(x==0){ f=0; } else{ f=2*x; }
printf("%d\n",f); //20
return 0; }

if else 後面只有一個執行語句的話,可以不加{}

#include <stdio.h>
int main()
{
 int x=10;
 int f=0;
 if (x<0)
     f=-1;
 else if(x==0)
     f=0;
 else
     f=2*x;
 printf("%d\n",f);  //20 
return 0;
}

4.switch

為什麽已經有了if 還需要用switch?

#include <stdio.h>
int main()
{
 int type;
 scanf("%d",&type);
 
 if (type==1)
 printf("nihao");
 else if(type==2)
 printf("zaoshanghao");
  else if(type==3)
 printf("wanshanghao") ;
 else
 printf("no") ;
 
 // 上述當type=4 需要一個一個判別過來,不太好 ,因此引入switch 
return 0;
}

用switch() {case 1:...; break; case 2:... ;break;...default:...;break;}

#include <stdio.h>
int main()
{
 int type;
 scanf("%d",&type);
 switch(type){
     case 10:    //tpye=10 就直接做這個, 
          printf("nihao");
          break; //一定要有break, 阻止語句往下執行 
     case 20:
         printf("zaoshanghao");
          break;
     case 30: //tpye=30 就直接做這個,不用判別前面兩種了 
         printf("wanshanghao");
          break;
     default:
         printf("no");
return 0;
}

註意: switch 只能用整數型, type不能是double!

#include <stdio.h>
int main()
{
//成績轉化
 int grade;
scanf("%d",&grade) ;
grade/=10;
switch(grade){
    case 10:
    case 9:
        printf("A\n");
        break;
    case 8:
        printf("B\n");
        break;
    case 7:
        printf("C\n");
        break;
    case 6:
        printf("D\n");
        break;
    default:
        printf("F\n");
        break;        
}
return 0;
}

5.簡單小例子

#include <stdio.h>
int main()
{
// 計算log2的整數部分
int x;
int ret=0;
scanf("%d",&x);
int t=x;
while(x>1){
    x/=2;
    ret++;
}
printf("log2 of %d is %d\n",t,ret);
return 0;
}

12

log2 of 12 is 3

求平均數,輸入數字, 以-1 結束,求出-1之前的平均數

#include <stdio.h>
int main()
{
int num;
int sum=0;
int count=0;

scanf("%d",&num);

while(num!=-1){
    sum+=num;
    count++;
    scanf("%d",&num);
} 

printf("%f\n",1.0*sum/count); 
return 0; 
}

猜數字遊戲 (1-100) 過程中需要提示:大了 小了,記錄猜數字次數.

#include <stdio.h>
#include <stdlib.h>    //rand 可以用了 
#include <time.h>  
int main()
{

srand(time(0));  //讓隨機數能夠像隨機數一樣 
int num=rand()%100+1; //產生一個1-100之間的隨機數 
int a=0;
int count=0; //猜數次數 
printf("我已經想好了一個1到100內的數\n");

do{
 printf("please guess a number:\n"); 
 scanf("%d",&a);
 count++; //無論對錯都算一次 
 if (a>num)
     printf("大了"); 
 else if (a<num)
 printf ("小了");
}while(a!=num);

printf("bingo!,你用了%d次就成功了\n",count); 
return 0; 
}

數字逆序輸出 ,整數x逆序 作用x%10 得到個位數 x/10 去掉個位數,

#include <stdio.h>
int main()
{
int x=500;
int t=x;
int num;
int ret=0;
while(x>0){
    num=x%10;
    ret=ret*10+num;
    x/=10;
} 
printf("the reverse of %d is %d\n",t,ret); 
return 0; 
}

the reverse of 500 is 5 , 沒有得到005 有缺陷!

註意:容易出錯的地方, if後面沒有加{} 如果執行語句只有一句,可以不加,有多句一定要{} .


if() 後面不用加; 否則if 直接結束了,執行後面語句

#include <stdio.h>
int main()
{
int age=50;
if (age>60);  //加了;
{
    printf("can be treat carefully");
 } 
return 0; 
}

得到:

can be treat carefully 這個結果就是 if 在不執行設麽就直接結束了,進入printf 語句

好的風格的代碼.

#include <stdio.h>
int main()
{
int x=10; 
int f=0;
if (x<0)
{
    f=-1;
 } 
else if (x==0)
{
    f=0;
}
else
{
    f=2*x;
}
return 0; 
}

上述優點在於如要註釋幾行不會影響其他行. 特別是{ }最會受註釋行的影響.

//判斷素數

#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
int i;
int isprime=1;
for(i=2;i<x;i++)
{
    if(x%i==0)
    {
        isprime=0;
        // break;  break也可以放在外面 
    } break;
 }
if(isprime==0)
printf("不是素數");
else
printf("是素數"); 
return 0; 
}

13

是素數

//輸出30以內的素數 雙重循環

#include <stdio.h>
int main()
{
int x;
for(x=2;x<30;x++)
{
    int i;
    int isprime=1;
    for(i=2;i<x;i++)
    {
        if(x%i==0)
        {
            isprime=0;
        } break;
     }
    if(isprime==1)
    printf("%d ",x);
 }
return 0; 
}

2 3 5 7 9 11 13 15 17 19 21 23 25 27 29

// 輸出前20個素數

#include <stdio.h>
int main()
{
int x=2;
int cnt=0;
while(cnt<20)
{
    int i;
    int isprime=1;
    for(i=2;i<x;i++) //x還是會輸出2的 
    {
        if(x%i==0)
        {
            isprime=0;
        } break;
     }
    if(isprime==1)
    {
    printf("%d ",x);
    cnt++;
    }
    x++;
 }
return 0; 
}

2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39

//另一種方法, 不用while, 用for

#include <stdio.h>
int main()
{
int x;
int cnt=0;
for(x=2;cnt<20;x++)
{
    int i;
    int isprime=1;
    for(i=2;i<x;i++) //x還是會輸出2的, 但是只有一次循環 
    {
        if(x%i==0)
        {
            isprime=0;
        } break;
     }
    if(isprime==1)
    {
    printf("%d ",x);
    cnt++;
    }
 } 
return 0; 
}

//湊硬幣 1 2 5元 湊成100元以下的金額 (輸出第一個符合條件的即可) 三重循環

#include <stdio.h>
int main()
{
 int x;
 int one ,two,five;
 int exit=0; 
 scanf("%d",&x);
 for (one=1;one<x;one++){
     for (two=1;two<x/2;two++){
         for(five=1;five<x/5;five++){
             if(one+2*two+five*5==x){
                 printf("用%d個一元 %d個兩元 %d個五元得到%d元\n",
                 one,two,five,x);
                 exit=1; 
                 break; //只能結束當前循環,如何跳出三個循環 ?增加exit變量  接力break 
             }
         }
         if (exit==1)break;
     }
      if (exit==1)break;
 } 
}

23
用1個一元 6個兩元 2個五元得到23元

//上述稱為接力break, 還有一種方法 用goto, 可以免去寫很多個break

#include <stdio.h>
int main()
{
int x;
int one,two,five;

 scanf("%d",&x);
 for (one=1;one<x;one++)
{
     for (two=1;two<x/2;two++)
    {
         for(five=1;five<x/5;five++){
             if(one+2*two+five*5==x){
            goto out; //後面定out的位置 
            }
           }
    }
    
} 
out:
     printf("用%d個一元%d個兩元 %d個五元得到%d元\n",one,two,five,x);
}

12

用1個一元3個兩元 1個五元得到12元

//求和 1+1/2+1/3+1/4...+1/n

#include <stdio.h>
int main()
{
int n;
int i;
double sum=0.0;
 scanf("%d",&n);
 for(i=1;i<=n;i++){
     sum+=1.0/i;
 } 
  printf("f(%d)=%f\n",n,sum) ;
}

10

f(10)=2.928968

//求和 1-1/2+1/3-1/4...+(-1)^(n-1)*1/n, 增加sign符號

#include <stdio.h>
int main()
{
int n;
int i;
int sign=1; 
double sum=0.0;
 scanf("%d",&n);
 for(i=1;i<=n;i++){
     sum+=sign*1.0/i;
     sign=-sign;
 } 
  printf("f(%d)=%f\n",n,sum) ;  
}

4

f(4)=0.583333

//求兩個數的最大公約數

方法1: 先找到兩數的較小者min , 循環 i=1:min找公因子, 循環結束得到的就是最後一個(最大公因數)

#include <stdio.h>
int main()
{
 int a,b;
 int min ;
 scanf("%d %d",&a,&b);
 if (a<b){
     min=a;
 } else{
     min=b;
 }
  int ret=0;
  int i;
  for(i=1;i<min;i++){
      if (a%i==0 && b%i==0){
      ret=i; 
      } 
  }
  printf("%d and %d 的最大公約數是%d",a,b,ret);
}

10 25

10 and 25 的最大公約數是5

//方法2: 輾轉相除法 a=12, b=18 ,t記錄a%b 然後a=b, b=t, 繼續做下去

思路:

// a b t
//12 18 12
//18 12 6
//12 6 0
//6 0 b是0的時候結束, 此時a是最小公約數

#include <stdio.h>
int main()
{
int a,b;
int t;
scanf("%d %d",&a,&b) ;
while(b!=0){
    t=a%b;
    a=b;
    b=t;
} 
printf("gcd=%d\n",a); 
}

//正序分解整數 12345 輸出 1 2 3 4 5

//先回顧逆序輸出... x%10 得到最後一個數字. x/10去掉最後一個數

#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
//x=12345;
do{
    int d=x%10; //得到個數數字 
    printf("%d ",d);
    x/=10; 
}  while(x>0);
}

1200

0 0 2 1

// 正序可以通過逆序兩次得到

#include <stdio.h>
int main()
{
int x;
int t=0; 
scanf("%d",&x);
//x=12345;
do{
    int d=x%10; //得到個數數字 
    t=t*10+d; 
    x/=10; 
}  while(x>0); 
 printf("t=%d\n",t); 
 x=t;
do{
    int d=x%10; //得到個數數字 
    printf("%d ",d);
    x/=10; 
}  while(x>0);
}

1329

t=9231
1 3 2 9

但是輸入600 得到的 t=6 最後結果也是6 不是 006,修改思路如下

// 思路 : x=1234
//1234/1000 1 ..
//1234%1000 234
//1000/10 100


//234/100 2. ..
//234%100 34
//100/10 10


//34/10 3. ..
//34%10 4
//10/10 1


//4/1 4 ...
//4%1 0
//1/10 0

#include <stdio.h>
#include<math.h> 
int main()
{
int x;
scanf("%d",&x);
int t=x; 
int cnt=0;  //計算位數
 do{
     x/=10;
     cnt++;
 } while(x>0);
 printf("%d\n",cnt);
 int m=pow(10,cnt-1);// pow沒有定義??  增加#include<math.h>
 printf("%d\n",m);
 x=t;
 do{
     int d=x/m;
     printf("%d ",d);
     x%=m;
     m/=10;
 }while(m>0);
}

123

3
100
1 2 3

上述沒必要用pow求

#include <stdio.h>
#include<math.h> 
int main()
{
int x; 
scanf("%d",&x);
int m=1; 
int t=x;
 while(x>9){
     x/=10;
     m*=10;
 } 
 
x=t; 
 do{
     int d=x/m;
     printf("%d ",d);
     x%=m;
     m/=10;
 }while(m>0);
}

小學生都看得懂的C語言入門(2): 判別 循環的一些應用實例