goo blog サービス終了のお知らせ 

真・女神転生imagine-JZ13(バックアップ)

Broachで投稿していた記事のバックアップです。

金曜日のワ・タ・シ☆

2010-07-25 02:24:37 | C言語教室での出来事
20日までは「課題1から13までやってください」だったんです。
それが、21日から「みなさん13まではできましたね。では次は40まで…」
っておい!いきなり40かwww
しかも21日の丸一日使って14から40までの解説を一気にw
覚えられるかっちゅーねんwww

22日半日かかって14を作りました。(前半は説明をもう一度聞いていた)
で先日の23日。15を作るのにホントに丸一日かかったよw

そしてこれがモンダイの課題15。

------------------------------------
C課題15:制御構造
10個のアレーに下記のようにランダムに数
値が入っている。それを昇順に並べ変えるプ
ログラムの作成。また、ソート前のアレーとソー
ト後のアレーの内容を表示すること。
array[]={3,2,5,6,1,3,2,7,0,4}
-----------------------------------

めさ悩みました。
このへんから「ユーザー関数」が入ってくるのですが、
まずその「ユーザー関数」という存在を知りませんからね。
ちまちまちまちまmainの中で
「1個目と2個目を比較して、小さいほうを1個目の所に入れ替えれば…」
と作っていたら、ものすごゴチャゴチャしてきてワケ判らないことにw
ループを最低3つ作らなきゃいけないんですよね。
書いてる途中から
「ここのループがここに戻って、この処理が終わったらここに…戻るんだよね???」
と自分でも混乱して、どうしたらいいか判らなくなってきました。
ゴチャゴチャしすぎてて、動作と動作がうまくつながらず、暴走の嵐でw
で、考える。
「これってサブルーチン化できないのかな…?」
実はサブルーチン化、これが「ユーザー関数」です。
で、そこまでは考えついたものの、具体的にどうしたらいいかが判らないw
煮詰まって煙草休憩にw(勝手に出て行っていいんだ♪)

そこにはちょうどサボ…いや、煙草休憩していた喫煙者1/2が。
「どこまでできました?」と話題を振ってくれたので、「15で悩んでる」と言ったら
「ああ、それ僕、参考書丸写しで作りましたよwww」と。

教科書として使っている本のほかに、教室の本棚にいくつか参考書があり、
「判らない人は勝手にそれを見て調べてください」と言われるので利用してます。
で、ページを教えてもらって、同じく丸写ししましたw

int sort(int a[ ], int n)
 /* a=入力文字列*/
 /* n=データの個数*/

{
int min;
 /*最小値*/
int i,j;
 /*カウンタ用の変数*/
int min_no;
 /*最小値が格納されている要素番号*/

for (i=0; i<n-1;i++){
min_no=i;
 /*min_noを初期化*/
min=a[min_no];
 /*minを初期化*/

 /*最小データを探す*/

 for (j=i+1; j<n; j++){
  if(a[j]<min){
   min_no=j;
 /*最小データを入れ替える*/
   min=a[j];
  }
 }


 /*先頭のデータと最小のデータを交換する*/
 a[min_no]=a[i];
 a[i]=min;
 }
return (0);
}
(コメント欄まですべて丸写しw)

で。
写したはいいが、まったく意味が判らないw
その本の解説部分を必死で読むこと数時間。
昼休憩をはさんで、本の解説は理解したが、
このプログラムの何がどう「ソート」になるのか理解する為、
「aに具体的な数字を入れてどう動くか」を紙に書くw
「おけ!把握した!」と思った時にはすでに午後3時だったぜ♪
(途中何度か寝てたのはナイショだ)

そして、上記をプログラムに追加して、テスト。
…まったく動かない…^^;
なにしろ参考書に書いてあったのは上記のプログラムのみ。
これをどうやってmainの中に組み込むか、まで書いてないんだよねw
ここからまた四苦八苦。

学校は16時30分まで。
16時20分頃まであーでもないこーでもない、とやってたんですが、
見かねた隣の席の人が「どうしたの?」と声をかけてくれました。
で。

「あ、呼び出し方が間違ってるだけですよ。
ここの変数をこうして…こうして…」と直してくれたら
まともに動くようになったぉ♪ビバ隣の人♪

完成品はこちら。
/*============================*
課題名:C課題15:制御構造

引数: なし
戻り値: なし
*============================*/

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define OK 0
#define NG 1

/*==============*
*      ソート      *
*==============*/


上記関数部分貼り付け

/*==============*
*    メイン処理    *
*==============*/


int main(void)
{
int i;
int array[] = {3,2,5,6,1,3,2,7,0,4};
int n=10;


printf("ソート前=");
for(i=0; i<=9 ; i++)
 /*i番地のカウンタ。iが9になるまで繰り返す*/
printf("%d",array[i]);
 /*array[0]から[9]までの数値を連続表示*/
printf("10");
 /*改行のみ*/

/*ソート*/

sort(array, n);
 /*sort=上でつけた関数名。変数aに上記arrayの中身を代入、nに上記回数を代入*/

/*ソート終わり*/

{
printf("ソート後=");
for(i=0; i<=9; i++)
printf("%d",array[i]);
printf("10");
}
return(OK);
}


結果はこんなふうに表示されます。(点線なしね)
-------------------------------------
ソート前=3256132704
ソート後=0122334567
続行するには何かキーを押してください
-------------------------------------

ソート前の内容を表示後、関数を呼び出して演算したあと結果を表示、なだけですね。
arrayの中身を「キーボードから入力しろ」とか言われたらお手上げだが、これはとりあえず完成w

1課題1日使ってたら、課題40まで終わるのはいつになることやらw
…くそう。ここに貼り付けるとタブが表示できないからすごく見にくいw