Struct


struct Student_PersonalData {
    char name[4];
    int age;
    char address[30];
} SP_Data;

來看一個簡單的例子

#include<bits/stdc++.h>
using namespace std;

struct Coordinate{
    int x,y;
};

int main(){

    Coordinate bat;
    Coordinate ball;

    cout << "請輸入球棒所在(X,Y)" << endl ;
    cin >> bat.x >> bat.y ;
    cout << "請輸入球所在(X,Y)" << endl ;
    cin >> ball.x >> ball.y ;
    cout << endl;

    cout << "球棒在(" << bat.x << ',' << bat.y << ")" << endl ;
    cout << "球在(" << ball.x << ',' << ball.y << ")" << endl ;
    cout << endl;

    return 0;
}

假如我們規定 x 座標是整數,y座標是小數呢

#include <bits/stdc++.h>
using namespace std;

typedef int x_cord;
typedef float y_cord;

struct Coordinate{
    x_cord x;
    y_cord y;
};

typedef Coordinate cord;


int main(){

    cord bat;
    Coordinate ball;

    cout << "請輸入球棒所在(X,Y)" << endl ;
    cin >> bat.x >> bat.y ;
    cout << "請輸入球所在(X,Y)" << endl ;
    cin >> ball.x >> ball.y ;
    cout << endl;

    cout << "球棒在(" << bat.x << ',' << bat.y << ")" << endl ;
    cout << "球在(" << ball.x << ',' << ball.y << ")" << endl ;
    cout << endl;

    return 0;
}

更進階一點,假如你是位老師,你有N個學生,這學期共考M次考試,你要怎麼把成績記錄下來?

#include <bits/stdc++.h>
using namespace std;

struct Student{
    int scores[10];
}student[505];

int N, M;


int main(){
    // N個學生,M次考試
    cin >> N >> M;
    for ( int i = 0 ; i < N ; i++ )
        for ( int j = 0 ; j < M ; j++ )
            cin >> student[i].scores[j];

    return 0;
}

都存下來了,那就排序一下,回顧一下上面提到的題目

輸入

4         <- 學生人數(列)
5         <- 考試次數(欄)
9 1 2 4 3 <- 第1位學生第一次考 9 分,第二次 1 分
4 5 6 3 2 <- 第2位學生的成績,以此類推
5 7 3 2 1
4 5 8 9 2

輸出

4 5 6 3 2 <- 第一次成績最小的最前面
4 5 8 9 2
5 7 3 2 1
9 1 2 4 3

如果學生第1次成績一樣,就比較第2次成績,以此類推

程式碼

#include <bits/stdc++.h>
using namespace std;

int N, M;
struct Student{
    int scores[205];
}student[10005];

bool isBigger( int i , int j ){
    for ( int k = 0 ; k < M ; k++ )
        if ( student[i].scores[k] != student[j].scores[k] )
            return student[i].scores[k] > student[j].scores[k];
    return false;
}

int main(){

    // N位學生,M次考試
    cin >> N >> M;

    // 輸入所有學生的成績
    for ( int i = 0 ; i < N ; i++ )
        for ( int j = 0 ; j < M ; j++ )
            cin >> student[i].scores[j];

    // selection sort
    for ( int i = 0 ; i < N ; i++ ){
        // 最小的那個數字的index存到minPtr裡面
        int minPtr = i;

        for ( int j = i+1 ; j < N ; j++ ){
            if ( isBigger( minPtr, j ) ){
                minPtr = j;
            } 
        }

        swap( student[i], student[minPtr] );
    }

    // 列出成績
    for ( int i = 0 ; i < N ; i++ ){
        for ( int j = 0 ; j < M ; j++ )
            cout << student[i].scores[j] << " ";
        cout << endl;
    }

    return 0;
}

更精簡版,不自己寫Selection Sort,用內建的sort來排序

#include <bits/stdc++.h>
using namespace std;

int N, M;
struct Student{
    int scores[205];
}student[10005];

bool isBigger( Student A , Student B ){
    for ( int k = 0 ; k < M ; k++ )
        if ( A.scores[k] != B.scores[k] )
            return A.scores[k] > B.scores[k];
    return false;
}


bool cmp( Student A, Student B ){
    return !isBigger( A , B );
}

int main(){

    // N位學生,M次考試
    cin >> N >> M;

    // 輸入所有學生的成績
    for ( int i = 0 ; i < N ; i++ )
        for ( int j = 0 ; j < M ; j++ )
            cin >> student[i].scores[j];

    sort( student, student+N , cmp );

    // 列出成績
    for ( int i = 0 ; i < N ; i++ ){
        for ( int j = 0 ; j < M ; j++ )
            cout << student[i].scores[j] << " ";
        cout << endl;
    }

    return 0;
}

results matching ""

    No results matching ""