C言語始めました

概要

C言語を始めたので記念にエントリー。ちなみに普段はLL言語ばかり書いていて、言語経験はVBA,Javaを学部1年で習ってから独学とかインターンとかバイトとかでJSP,Perl,PHP,Python,JS,ShellScript〜という軽い言語を好むようになっていったというよくある流れ。基本的にコンパイル言語はめんどくさくて、あまり気が進まないという男。C系の経験は、去年血迷って画像処理の研究をしようとOpenCVを勉強していた時期があったので、その時に少〜しの間C++を書いたことがある程度のレベル。


きっかけ

アリ本に紹介されていたプログラミングコンペのサイトAIZU ONLINE JUDGEに登録してみたら、サポートしている言語がC, C++, Javaのみでちょっと萎えたが、前々からCを始めよう始めようと思っていたので、ちょっと調べながらコーディングしてみた。(低レイヤー(リソースとか)を意識したコーディングができるとプログラマとしての幅が広がると信じているので低級言語と言われているCを勉強したかった。かといってアセンブラとかの低級すぎるところは、近寄りがたい。)


感想

書いていて思ったこと:
変数の宣言めんどくさい。コンパイルめんどくさい。C言語関連の情報が欲しくてググると、C++とかC#とかの情報が多くてとてもノイジーで情報収集が大変。(Google先生の使い方が悪いだけかもしれないが)
AIZU ONLINE JUDGEの判定が厳しすぎて通らない。出力データは合っているのにコードの判定が「Run time error」って怒られる。(開発環境がvisual studioではなく、Linux上のgcc(4.4.5)で開発しているせいなのかもしれない。)

また、関数で配列を返せないとかの言語仕様にはびっくり。いろいろと衝撃だった。俗にいうポインタという概念ってこれなのかな?って思いながらコーディングしてた。参照絡みのことの何かをポインタというっぽいが、はっきりとはわかっていない。
今後積んである入門書を気が向いたときに読みつつ、その辺を明らかにする予定。

でも、LL言語の手軽さって素晴らしい!と実感することができた。Cに関してはいろいろとストレスフルなので、のんびり学習する予定。
実はCの前にScalaを始めたいのが今の心境。


書いたコード晒してみる

標準入力〜配列格納〜ソート

問題 Volume 0-0001 List of Top 3 Hillsの回答。
標準入力から得た整数(改行区切り)を配列に入れて、バブルソートで降順にして上位3つの整数を出力するという単純な内容。だが、とても冗長な感じ。Pythonならもっと短くかけるな〜って思いながら書いてた。

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

#define N 10

void bubble_sort(int n, int array[]) {
        int i, j, temp;
        for(i=0; i<n-1; i++) {
                for(j=i+1; j<n; j++) {
                        if(array[i] < array[j]) {
                                // change
                                temp = array[i];
                                array[i] = array[j];
                                array[j] = temp;
                        }
                }
        }
}


void print_array(int index, int num, int array[]) {
        int i;
        for (i=index; i<index+num; i++) {
                printf("%d\n", array[i]);
        }
}


int main(void) {
        int i = 0;
        char * num;
        char buf[N];
        int input_data[N];
        while(fgets(buf, N, stdin) != NULL) {
                num = strtok(buf, "\n");
                input_data[i] = atoi(num);
                i++;
        }
        bubble_sort(N, input_data);
        print_array(0, 3, input_data);
        return 0;
}
九九の問題

一番最初の問題も晒しとく。何も面白い点はないと思うが...。

#include <stdio.h>
int main()
{
        int i,j;
        int max = 9;
        for(i = 1; i<=max; i++) {
                for(j = 1; j<=max; j++) {
                        printf("%dx%d=%d\n", i, j, i*j);
                }
        }
        return 0;
}