もう限界・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
超初心者

もう限界・・・

#1

投稿記事 by 超初心者 » 17年前

学校の課題で、
ABCDE
BCDEA
CDEAB
DEABC
EABCD
ABCDE
という結果になるようなpgをmainでchange(上のように形式をととのえるところ)とdisp(結果を表示するところ)を呼んで、書けという課題を出されました。
自分は下のところまで書きましたがもう限界です。
#include <stdio.h>

//プロトタイプ宣言
void change(char str[/url]);
void disp(int flag);

//main文
int main(void)
{
char str[/url] = "ABCDE";
int flag = 1;

while(flag){
flag = change(str);
disp(flag);
}

return 0;
}
//並び替えを行うエリア
void change(char str[/url])
{


}
//結果を表示するエリア
void disp(int flag)
{

}

バグ

Re:もう限界・・・

#2

投稿記事 by バグ » 17年前

うーん、自分で書いたと言われても…私の目には穴埋め課題文そのまんまで、全く進んでいないように見えてしまうのですが…気のせいでしょうか?(^_^;)

それで、この課題の何が分かりませんか?それから学校では何を習っていて、何を習っていないかを教えてください。話はそれからだと思いますよ(^-^)

バグ

Re:もう限界・・・

#3

投稿記事 by バグ » 17年前

あ、それからもう一つ、disp関数の引数は何に使うのでしょうか?
こちらの解答もよろしくお願いします。

超初心者

Re:もう限界・・・

#4

投稿記事 by 超初心者 » 17年前

とりあえず、ifと関数とforは習いました。
mainにある配列ABCDEをchange関数で入れ替えるのがわかんないです。

超初心者

Re:もう限界・・・

#5

投稿記事 by 超初心者 » 17年前

問題を出されたときの状態です。
#include <stdio.h>

//main文
int main(void)
{
char str[/url] = "ABCDE";
int flag = 1;

while(flag){

}

return 0;
}
//並び替えを行うエリア
void change(char str[/url])
{


}
//結果を表示するエリア
void disp()
{

}

超初心者

Re:もう限界・・・

#6

投稿記事 by 超初心者 » 17年前

disp関数のflagは間違ってしまったものです。スミマセン

バグ

Re:もう限界・・・

#7

投稿記事 by バグ » 17年前

何度も申し訳ないんですけど…
1つ確認なのですが、disp関数の引数は何もなかったですか?
下記のようではなかったですか?
#include <stdio.h> 

//プロトタイプ宣言
void change(char str[/url]);
void disp(char str[/url]);

//main文 
int main(void) 
{ 
	char str[/url] = "ABCDE"; 
	int flag = 1; 

	while(flag){ 

	} 

	return 0; 
} 

//並び替えを行うエリア 
void change(char str[/url]) 
{ 


} 

//結果を表示するエリア 
void disp(char str[/url]) 
{ 

}

超初心者

Re:もう限界・・・

#8

投稿記事 by 超初心者 » 17年前

とりあえず、問題にはそこの引数は何も書いてませんでした。
引数が同じだから書かなかったのか?、違う引数だった?のかはわかりません。
とりあえず、引数をchar str[/url]にするとどういうふうになるんですか?
スミマセンが、教えていただけないでしょうか?

バグ

Re:もう限界・・・

#9

投稿記事 by バグ » 17年前

文字列はmain関数内で定義されていますよね?そういう事なので、基本的にはmain関数の中でしかこの文字列は使用できない訳です。
それでは、どうすれば他の関数で使用できるようになるかというと、change関数の引数のように教えてやる必要がある訳なんですね。
そういう訳で、disp関数に表示する文字列を教える必要はないのかな?と思った訳です。

とりあえず、文字列の入れ替えの考え方を書いておきますね。
文字列は下記のように格納されています。

str[0] = 'A'
str[1] = 'B'
str[2] = 'C'
str[3] = 'D'
str[4] = 'E'
str[5] = 'F'
str[6] = '\0' // 文字列の終端をあらわす文字です。

という事は、"ABCDEF"を"BCDEFA"にしたい場合は、何を入れ替えればいいでしょうか?

str[0] = str[1]
str[1] = str[2]
str[2] = str[3]
str[3] = str[4]
str[4] = str[5]
str[5] = str[0]
str[6] = str[6]

こういう事ですね?しかし、ここで問題が発生してしまいます。
最初の(str[0] = str[1])の時点で、str[0]の値がstr[1]の値に変わってしまう為、後の(str[5] = str[0])の式を実行しても、str[0]の値は保持されていませんので、str[5]の値は変換前のstr[1]の値になってしまいます。
具体的にどういう状態になるかというと…

str[0]('A') = str[1]('B') // str[0] = 'B' (この段階でstr[0]が'A'から'B'に変わってしまう)
str[1]('B') = str[2]('C') // str[1] = 'C'
str[2]('C') = str[3]('D') // str[2] = 'D'
str[3]('D') = str[4]('E') // str[3] = 'E'
str[4]('E') = str[5]('F') // str[4] = 'F'
str[5]('F') = str[0]('B') // str[5] = 'B'

こんなことになってしまいます。
そこで下記のように、str[0]の値をどこか別の場所で保持しておいて、上記の入れ替えが終了した段階でstr[5]に保持しておいた文字を代入してあげると見事に入れ替えが完成する訳です。

str[0]('A') = buf; // buf = 'A'
str[0]('A') = str[1]('B') // str[0] = 'B'
str[1]('B') = str[2]('C') // str[1] = 'C'
str[2]('C') = str[3]('D') // str[2] = 'D'
str[3]('D') = str[4]('E') // str[3] = 'E'
str[4]('E') = str[5]('F') // str[4] = 'F'
str[5]('F') = buf('A') // str[5] = 'A'

超初心者

Re:もう限界・・・

#10

投稿記事 by 超初心者 » 17年前

ありがとうございます。これで何とかがんばってみます

閉鎖

“C言語何でも質問掲示板” へ戻る