Cの練習2

パスカルの三角形

forの二重ループの内側の条件分岐はswitchで記述したかったけど、caseの後ろに続く値は定数しか使えないのでif文で代用した。 多重配列は要素数が異なる配列を宣言するのが一応できるけど難しそうなのでやめた。for文で配列の要素を取り出すのもインデックスの値を定義してやらないといけない。

#include <stdio.h>
#include <string.h>

void line(int);

int main() {
    int row;//この行まで表示
    scanf("%d", &row);
    if (row <= 0) {main();}
    line(row);
    return 0;
}

void line(int row) {
    int triangle[row][row];
    memset(triangle, 0, sizeof(triangle)); //二重配列を0で初期化
    for (int i = 0; !(i+1 > row); i++) { //i:三角形の縦方向
        for (int j = 0; !(j+1 > row); j++) { //j:三角形の横方向
            if (j == 0 || j == i) { //左端か右端
                triangle[i][j] = 1;
            }
            else if (j > i) { //三角形の外側(いらない部分)
                break;
            }
            else {
                triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
            }
        }
    }
    for (int r = 0; !(r >= row); r++) {
        for (int l = 0; l <= r; l++) {
            printf("%d, ", triangle[r][l]);
        }
        printf("\n");
    }
}
バブルソート

Cのポインタはある値が格納されているメモリ上のアドレスを指し示すもの、ということはわかったがコンパイラに怒られながらじゃないと作れない。 Rustの所有権の概念とかのほうがよっぽどすんなりと受け入れられた。

#include <stdio.h>

int *bubble_sort(int *, int);
int swap(int *, int, int);


int main() {
    int ls[] = {4, 6, 2, 3, 5, 1, 3};
    int length = sizeof(ls)/sizeof(int); //配列の長さ
    int *result = bubble_sort(ls, length); //配列の長さは配列のポインタから取り出せない
    for (int i = 0; i != length; i++) {
        printf("%d", result[i]);
    }
    return 0;
}

int *bubble_sort(int *ls, int length) {
    while (length != 1) {
        for (int i = 0; i != length; i++) {
            if (ls[i] > ls[i+1] && i+1 != length) {
                *ls = swap(ls, i, i+1);
            }
        }
        length--;
    }
    return ls;
}

int swap(int *arr, int left, int right) {
    //left, rightはインデックスの数値;
    int tmp = arr[left];
    arr[left] = arr[right];
    arr[right] = tmp;
    return *arr;
}