C言語-簡単なバブルソートで成績順位を出す
バブルソートの例題です。そんなに大したことはしていません。
コード
#include <stdio.h> #define num 5 int main(void) { int i,j; int seiseki[2][num];//出席番号と成績 int tmp; printf("5名の成績を入力してください\n"); for(i=0; i<num; i++){ printf("%d番目の人の成績: ",i+1); scanf("%d",&seiseki[0][i]); seiseki[1][i] = i+1; } j = num -1; while(j>0) { for(i=0;i<j;i++) { if(seiseki[0][i] > seiseki[0][i+1]) { // 隣の数値と比較して大きければ入れ替える tmp = seiseki[0][i]; seiseki[0][i] = seiseki[0][i+1]; seiseki[0][i+1] = tmp; tmp = seiseki[1][i]; seiseki[1][i] = seiseki[1][i+1]; seiseki[1][i+1] = tmp; } } j--; } printf("----成績発表----\n"); for(i=0;i<num;i++) { printf("出席番号「%d」の人の成績は%2dです\n" ,seiseki[1][i],seiseki[0][i]); } return 0; }
実行結果
./bubble-sort 5名の成績を入力してください 1番目の人の成績: 156 2番目の人の成績: 5117 3番目の人の成績: 214 4番目の人の成績: 2724 5番目の人の成績: 499 ----成績発表---- 出席番号「1」の人の成績は156です 出席番号「3」の人の成績は214です 出席番号「5」の人の成績は499です 出席番号「4」の人の成績は2724です 出席番号「2」の人の成績は5117です
単純ですね
C言語-10進法を16進法に変換する
比較的よく見るタイプの問題
書き方は人それぞれなんですが今回はオーソドックスなやり方です。
コード
#include <stdio.h> int main(void) { int i=0,j=0; int num; char henkan[16] = "0123456789ABCDEF"; char answer[10]; printf("整数を入れてください:"); scanf("%d",&num); while(num > 0) { // 入力した数値を16で割り、その余りと商をだす j = num % 16; num = num / 16; answer[i] = henkan[j]; i++; } i--; printf("この整数を16進法に変換すると"); for(j=i; j>=0; j--) { printf("%c",answer[j]); } printf("\n"); return 0; }
ちょっと解説します.
といっても10進法を16進法に置き換える手計算を地道にやっているだけです.
10進数から16進数に変換する|基数変換|基本情報技術者講座
実行結果
整数を入れてください:123456789 この整数を16進法に変換すると75BCD15
C言語-文字列の長さを返す自作関数my_strlen
ようは車輪の再発明です。
文字列をいれてその長さを出す関数をポインタで作ります。動的にメモリを割り当てるため、malloc関数を使っています。おそらくもっと効率のいい方法があるのでしょうが、いまはこれで済ませましょう。
コード
#include <stdio.h> #include <stdlib.h> int my_strlen(char *s); int main(void) { char* str; str = (char *)malloc(sizeof(char)*100); //char *型でメモリを確保する printf("文字列を入力してください: ");scanf("%s",str); printf("この文字列の長さは%dです\n",my_strlen(str) ); return 0; } int my_strlen(char *s) { int count=0; while( *s++ != '\0') count++; return count; }
ちょっと解説。
while( *s++ != '\0') count++;
ポインタでNULL判定したのちに後置インクリメントをして次のアドレスを指定しています。(表現これであっているかな
実行結果
./my_strlen
文字列を入力してください: odd-eyes-pendulum-dragon
この文字列の長さは24です
C言語-決まった文字数を打ち込むと、その偶数番目のアルファベットだけを出力する
決まった文字数ぶんだけ入力すると、その偶数番目の文字だけを返すプログラム
配列を使いたくなるが、ここは誰もが苦手にするポインターを使う。まずポインタを宣言し、それに10文字格納。そして先頭アドレスから数えて偶数番目の要素を取り出すようにする。
コード
#include <stdio.h> int main(void) { char *even; //ポインター宣言 int i; printf("10文字の英字を入力してください\n"); scanf("%s",even); for(i=1;i<=10;i+=2) { //偶数番目だけを指定する printf("%c ", *(even+i)); //先頭アドレスから数えて偶数番目だけを出力 } return 0; }
こんな感じになった
$ gcc pointer-even-string.c -o pointer-even-string $ ./pointer-even-string 10文字の英字を入力してください iwateken w t k n
今度は文字数を指定しない方法を試したい
C言語-科目ごとに得点を入力するとそれに応じた成績を返すプログラム
科目ごとの得点を入力すると、それに応じて「A〜D」およびマイナスの成績を返すプログラム。
今回は自作のrank関数をつくり、それによって成績を出力するようにしたい。ただし、rank関数自体は以下のように定めよう。
- rank関数をプロトタイプ宣言する
- rank関数は成績だけを返すようにする
また、成績は以下のような区分にした。
得点範囲 | 成績 |
---|---|
0未満 | - |
0以上50点未満 | E |
50以上60未満 | D |
60以上70未満 | C |
70以上80未満 | B |
80以上 | A |
コード
//成績を入力するとランクを出す関数 #include <stdio.h> //プロトタイプ宣言 int rank(int seiseki); //main関数 int main(void) { int eng,math,sci; // 科目ごとの得点 配列でも可 printf("英語,数学,物理の得点をカンマ区切りで入力してください\n"); scanf("%d,%d,%d",&eng,&math,&sci); //科目ごとの得点からそれに応じたランクを出力する printf("英語の得点は%d、成績は%cです\n",eng,rank(eng)); printf("数学の得点は%d、成績は%cです\n",math,rank(math)); printf("物理の得点は%d、成績は%cです\n",sci,rank(sci)); return 0; } // 得点からそれに応じたランキングを返すrank関数 int rank(int seiseki) { //引数を受け取る char hyoka; //char型 if(seiseki < 0) //0未満 hyoka = '-'; else if(seiseki < 50) hyoka = 'E'; else if(seiseki < 60) ///50以上60点未満 hyoka = 'D'; else if(seiseki < 70) //60以上70未満 hyoka = 'C'; else if(seiseki < 80) //70以上80未満 hyoka = 'B'; else if(80 <= seiseki) //80以上 hyoka = 'A'; else ; return hyoka; //受け取った引数からランキングを返す }
rank関数自体には出力するものはなく、あくまでもmain関数によって出力されている。これによって関数の再利用がしやすくなる。たとえば、別の場所でこのランキングを使って判定したい時に、このrank関数を活用できる。
こんな感じになる
$gcc seiseki-rank.c -o seiseki-rank $ ./seiseki-rank 英語,数学,物理の得点をカンマ区切りで入力してください 50,-2,89 英語の得点は50、成績はDです 数学の得点は-2、成績は-です 物理の得点は89、成績はAです