このくらいのことを理解していればGoogle Code Jam Japan 2011で200位以内に入ってコードジャムTシャツをもらうには十分だろうと思われる程度のC言語の知識まとめ
・sortが抜けていたので追加
・long longが抜けていたので追加
Google Code Jam Japan 2011公式サイト
オンライン予選:10 月 1 日 (土) 13:00〜19:00(この時間帯のどこかで問題を解けばよい)(予選開催中にも参加登録が可能)
オンライン決勝:10 月 8 日 (土) 13:00〜16:00
<※補足1>
(誤)この程度のC言語の知識をもっていればおそらく200位以内に入れる
(正)C言語を使って200位以内に入るには、このくらいのことを知っておけばたぶん知識は十分。(あとは思考力)
<※補足2>
・C以外のプログラミング言語など(無料で入手できるものに限る)で問題を解くことも可能。
・プログラムを使わず、人力で答えを出すことも可能。だれか、人力のみで予選を突破してみてくれませんか。
・ソースコードのひながた
//摂氏温度を華氏温度に変換する問題に対する回答プログラムの例 //(※注意)ケース番号の読み込みや出力の形式は、本番の形式と異なる可能性があります。問題文をよく読みましょう #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main(void){ int casenum; scanf("%d",&casenum); for(int casecnt=1;casecnt<=casenum;casecnt++){ double c,f; scanf("%lf",&c);//(1)入力を変数に読み込む f = 9.0 / 5.0 * c + 32.0;//(2)読み込んだ入力に対応する答えの数値を計算 printf("Case #%d: %.10f\n",casecnt,f);//(3)求めた答えを出力 } return 0; }
・変数の宣言、配列変数の宣言
int a,b,c; double x,y; long long n,m; int num[1000];//1次元配列(num[0]〜num[999]が使える) char field[100][100];//2次元配列(field[0][0]〜field[99][99]が使える)
・scanfとprintf(入力と出力)
int n; double d; long long a; char st[1000]; scanf("%d",&n);//int型の読み込み scanf("%lf",&d);//double型の読み込み scanf("%lld",&a);//long long型の読み込み scanf("%s",st);//文字列の読み込み(スペースまたは改行区切りでひとかたまりと認識される)(読み込む文字列の長さの最大値+1以上のサイズの配列を宣言しておくこと) printf("Hello World\n");//文字列の出力('\n'は改行記号) printf("%d",n);//int型変数の出力 printf("%lld",a);//long long型変数の出力 printf("%f",d);//double型変数の出力 printf("%.10f",d);//出力精度(小数点以下の桁数)を指定してdouble型変数を出力(指定した桁数の次の桁で四捨五入) printf("%s",st);//char型配列の中身を文字列として出力
・演算子
a + b;//和 a - b;//差 a * b;//積 a / b;//商 a % b;//剰余 a = 3 + 2;//代入
<使うかも?> ビット演算子
a & b;//and a | b;//or a ^ b;//xor ~ a;//not a << 1;//左シフト a >> 1;//右シフト
・if文と演算子2
if(a==0){ //aが0のとき } if(a==0){ //aが0のとき }else{ //それ以外 } if(a!=0)//aが0でないとき if(a<0)//aが0より小さいとき if(a<=0)//aが0以下のとき if(a>0)//aが0より大きいとき if(a>=0)//aが0以上のとき if(a==0 || a==1)//「aが0」または「aが1」のとき if(a==0 && b==0)//「aが0」かつ「bが0」のとき
・for文
for(int i=0;i<100;i++){ //iが0、iが1、……、iが99、とループ }
・while文
while(a>0){ //aが0より大きい間だけループ }
・break,continue
for(int i=0;i<10;i++){ if(i==3)continue; if(i==7)break; printf("%d\n",i);//最終的に表示されるのは0,1,2,4,5,6 }
・平方根
sqrt(2);//<math.h>をインクルードする必要あり
・関数
int plusone(int a){ return a + 1;//a+1を戻り値として返す } int main(void){ int n; scanf("%d",&n); printf("%d\n",plusone(n));//n+1の値を出力 return 0; }
<使うかも?> 参照(C++の機能)
void plusone(int &a){//引数に&をつけると参照渡しになる(関数内で値を変更すると、それが呼び出し元にも反映されるようになる) a = a + 1; } int main(void){ int n; scanf("%d",&n); plusone(n);//nの値が1増える printf("%d\n",n); return 0; }
・ローカル変数とグローバル変数
//(※注意)ローカル変数は、宣言したときの初期値が未定義 //グローバル変数の初期値は、指定しなければint,double,char型では0 //(※注意)ローカルでは、あまり大きすぎるサイズの配列を宣言することはできない int num;//グローバル変数(どの関数内でも使える) void func(void){ int x,y;//ローカル変数(func関数内でのみ使える) } int main(void){ int n;//ローカル変数(main関数内でのみ使える) }
・ソート(C++(STL)の機能)
//C言語ならqsort関数を使うが、C++(STL)のsortの方が簡単なのでそちらで #include<algorithm>//sort関数を使うのに必要。他にはmaxとかminとかuniqueとかが便利 #include<functional>//降順ソートにするのに必要 using namespace std; int main(void){ int num[10]={3,1,4,1,5,9,2,6,5,3}; sort(&num[0],&num[10]);//(ソート領域の先頭、ソート領域の末尾の1つ先)を指定する。昇順ソート sort(&num[0],&num[10],greater<int>());//降順ソート。< >の中には変数の型名を書く return 0; }
<※補足3>
以上の知識に、STLのmapを加えれば、「このくらいのことを理解していればGoogle Code Jam Japan 2011で1位をとって 256,000円 をもらうには十分だろうと思われる程度のC言語の知識まとめ」にしてもあまり問題はないかと思います。