C++程式設計教學(四)-運算式與運算子

在上次的迴圈中多次用到運算式與運算子,這次來看還有哪些常用的運算子吧!

> , < , <= , >= , == , !=
前面兩個大家應該很熟悉,就是大於小於,第三第四個可能沒看過,但很好理解,就是加了一個等於而已,然而最後兩個大家就不一定知道了,他們分別是數學的等於和不等於,因為=有指定的意思所以用 == 來表示一般的等於啦!

+ , – , * , / , % , ( )
加減就不用說了, */ 大家估計也知道是乘除吧 ( 應該吧 ) !那%呢?百分比?不,它是 mod( ),又稱取餘數。
ex :
20%3=2 // 20/3 … 2
( ) 與數學上的括號相似,比較特別的是不會有這種用法 { [ ( 1+2 ) – ( 2+4 ) ] * ( 7+2*4 ) } ,因為[ ] 適用在陣列 ( 以後會講 ) 的存取,{ } 則是用在標示述句的範圍。
ex :

    while(a>=4){
        a=b+1;
        b--;
    }

我習慣會在括號之間用空格區分 ex :

    ( (20* (5+3) )/2-1 )+10
另外還有一些特別的運算子提供名稱及範例以供參考
, 分隔符號                           | = 指定 ( 用於變數 )
ex :                                | ex :
    int a=1,b=0,c=5; //宣告變數      |     int a=b+2;
----------------------------------------------------------------------------
. 存取 ( 以後 struct 和 class 用的)   | >>,<< 輸入輸出
ex :                                 | ex : 
    struct posion{                   |    cout<<a;
        int x,y;                     |    cin>>a;
    };                               |    cout<<a<<"+"<<c<<"="<<c+a;
                                     |    cin>>a>>b;
    int main(){                                  
        posion pos; //宣告物件          
        pos.x=0;    //( 結構 )             
        pos.y=2;                                 
        return 0;
    }
----------------------------------------------------------------------------
+= , -= , *= , /= , %= 運算加指定  | << , >> 位元移動 ( 用於變數 )
ex :                              | ex :
    a+=b    //等同於 a=a+b         |    int a=1;   // 000000000001
    a*=a-b  //等同於 a=a*(a-b)     |    a<<10;     // 010000000000
                                  |    cout<<a;   //會顯示 1024
----------------------------------------------------------------------------
&& , || and 和 or                 | & , | 位元 and or ( 不常用 )
ex :                              |ex :
    int a=0,b=10;                 |    int a=13,b=10;
    a>=0 && b<=1000 //true        |    a&1 ;// true  
                                  |    b&1 ;// false 
----------------------------------------------------------------------------

以上就是常見的運算子,當然還有一些其他的,例如 ~ 位元補數運算,不過超級不常用所以就不介紹了。以下說明用途,像是 if for while都會用到。

#include<iostream>
#include<cmath>
using namespace std;

struct posion{
    double x,y;
}

int main(){
    double d;
    posion a,b;
    cin>>a.x>>a.y;
    cin>>b.x>>b.y;
    if(a.x>b.x){
        d+=(a.x-b.x)*(a.x-b.x);
    }else{
        d+=b.x-a.x*(b.x-a.x);
    }
    if(a.y>b.y){
        d+=(a.y-b.y)*(a.y-b.y);
    }else{
        d+=(a.y-b.y)*(a.y-b.y);
    }
    d=sqrt(d);
    cout<<d;
}

下回會介紹函式 ( function ) 與遞迴~

C++ APCS 實作題 2019/06/15 2 : 機器人走迷宮

有意點點類似 BFS ,不過一次只會有一個分支,以下是程式碼

#include<iostream>
#include<deque>

#define MAX 1000000
using namespace std;

struct step{
    long long x,y;
};

int main(){
    int n,m,min=MAX+1;
    cin>>n>>m;
    long long sum=0;
    step best;
    int mp[110][110]={MAX};
    
    for(int i=0;i<110;i++){
        for(int j=0;j<110;j++){
            mp[i][j]=MAX;
        }
    }
    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>mp[i][j];
            if(min>mp[i][j]){
                min=mp[i][j];
                best.x=j;best.y=i;sum=min;
            } 
        }
    }
    
    deque<step> st;
    st.push_front(best);
    const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
    
    while(!st.empty()){
        step now=st.back();
        st.pop_back();
        
        min=MAX;
        
        mp[now.y][now.x]=MAX;
        for(int i=0;i<4;i++){
            step next;
            next.x=now.x+dx[i];
            next.y=now.y+dy[i];
            if(mp[next.y][next.x]<min){
                min=mp[next.y][next.x];
                best.x=next.x;best.y=next.y;
            } 
        }
        if(min==MAX){
            continue;
        }else{
            sum+=mp[best.y][best.x];
            st.push_front(best);
        }
        
    }
    cout<<sum;
    return 0;
}

C++ 基礎題 B – Red And Black HDU – 1312

好像還是 BFS

#include<iostream>
#include<vector>
#include<string>
#include<deque>
using namespace std;

struct step{
    int x,y;
};

int main(){
    int n,m;
    while(cin>>m>>n){
        if(m==0) break;
        
        vector<string> mp;
        
        for(int i=0;i<n;i++){
            string s;
            cin>>s;
            mp.push_back(s);
        }
    
        deque<step> bfs;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]=='@'){
                    step s;
                    s.y=i;s.x=j;
                    bfs.push_front(s);
                    mp[i][j]='#';
                }
            }
        }
        
        int ct=1;
        int dx[10]={0,1,0,-1},dy[10]={1,0,-1,0};
        while(!bfs.empty()){
            step now=bfs.back();
            bfs.pop_back();
            for(int i=0;i<4;i++){
                step next;
                next.y=now.y+dy[i];
                next.x=now.x+dx[i];
                if(next.y<0 || next.x<0 || next.y>=n || next.x>=m){
                    continue;
                }
                if(mp[next.y][next.x]=='.'){
                    mp[next.y][next.x]='#';
                    bfs.push_front(next);
                    ct++;
                }
            }
        }
        cout<<ct<<"\n";
    }
    return 0;
}

出處:https://vjudge.net/contest/240104#problem/B