たびたびすみません質問です

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

たびたびすみません質問です

#1

投稿記事 by ももた » 18年前

[問題]
boxNO. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
データ 2 1 1 4 7 5 2 12 5 19 1 0 S M L

①x=boxNO3のデータ値+boxNo7のデータ値とする。
boxNO.Xにデータ[5]をセットする。

②NにboxNO.Xのデータ値の次に大きなデータをboxNO.1~12の中から検索してセットする。
NはboxNO.8のデータ値が示すboxNO.にセットする。

③boxNO.3のデータ値と同じデータを持つboxNO.の加算をしてその値をboxNO.2にセットする

④boxNO.2のデータ値が示すboxNO.のデータを画面表示し、任意のデータを1バイト入力して、同じboxNO.にセットする。

⑤入力したデータがL~Pの文字データなら、⑦へジャンプする。
その他なら⑥へ

⑥boxNO.1のデータ値に1を加算し、その値のboxNO.のデータ値を画面に表示する。⑨へジャンプする。

⑦入力データがLならboxNO.1~12までのデータ値を別のワークエリアに移し、boxNO.1~12までのデータ値を昇順にソートし画面にboxNO.1~12の表示と、ワークエリアの表示をする。

⑧昇順表示とワークエリアのデータ値が同じboxNOで且つデータも同じなら、boxNO.とデータを画面表示する

⑨END

この最後の課題なんですけど・・・①の部分からよくわかりません>_< 何か回答ではなくヒント見たいものがあれば教えて頂きたいんですが・・・①からつなづいてるので・・全然前に進めないので^^; こんな質問ですみません。

Yuki

Re:たびたびすみません質問です

#2

投稿記事 by Yuki » 18年前

+------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|boxNO.| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15| 
+------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|データ| 2| 1| 1| 4| 7| 5| 2|12| 5|19| 1| 0| S| M| L| 
+------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
>①x=boxNO3のデータ値+boxNo7のデータ値とする。
>boxNO.Xにデータ[5]をセットする。

課題の意図がよくわからないので、想像でしか答えられないのですが、
xという領域にboxNO3のデータ値+boxNo7のデータ値を代入する。
x=1+2
x=3
この計算で求められたboxNOのデータ値を5とする。
+------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|boxNO.| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15| 
+------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|データ| 2| 1| 5| 4| 7| 5| 2|12| 5|19| 1| 0| S| M| L| 
+------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
といった感じでしょうか。

ももた

Re:たびたびすみません質問です

#3

投稿記事 by ももた » 18年前

そうです^^; そういう意味です。

Yuki

Re:たびたびすみません質問です

#4

投稿記事 by Yuki » 18年前

とりあえず、前に進めそうですか?

ももた

Re:たびたびすみません質問です

#5

投稿記事 by ももた » 18年前

まったくです>_< 今は①だけを考えてるんですが・・・今日までにしろと言われているので。ポインタを使うようなのですが、atoi()とか試してるんですが、何をどうすればいいのかわからないです・・・。

Yuki

Re:たびたびすみません質問です

#6

投稿記事 by Yuki » 18年前

プログラムを作るのですか?
考え方がわからないのかと思いました。

どうやって作ろうとしているのかわからないので、
今できている分だけでも載せてもらえますか?
未完でかまいません。

ももた

Re:たびたびすみません質問です

#7

投稿記事 by ももた » 18年前

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

int main(void)
{
char x[/url]={"2 1 1 4 7 5 2 12 5 19 1 0 S M L"};



return 0;
}
これだけしか書いてないんです>_< する事はわかるのですが、プログラム化できないですね。ここからどうするのかかなり悩んでます・・。

Yuki

Re:たびたびすみません質問です

#8

投稿記事 by Yuki » 18年前

>char x[/url]={"2 1 1 4 7 5 2 12 5 19 1 0 S M L"};

このデータを格納する領域を考えるにあたりいくつか方法があると思いますが、
boxNOを配列の要素数のインデックスとして扱うのは良いと思いますが、
データ部が今のももたさんのやり方だと、後々の処理でかなり面倒になると思います。

char x[15][3]={"2","1","1","4","7","5","2","12","5","19","1","0","S","M","L"};

このようにしてみてはいかがでしょう。

ももた

Re:たびたびすみません質問です

#9

投稿記事 by ももた » 18年前

2次配列にするんですね・・。すみません。2次限配列にするメリットは何なんでしょうか? 次はどういう風になるのかも少しわからない状態です・・・。

Yuki

Re:たびたびすみません質問です

#10

投稿記事 by Yuki » 18年前

ももたさんは、配列の要素のインデックスをキーにデータを扱いたいのですよね?
2次元配列のほうが、使い勝手が良くないですか?

1次元配列だと、簡単にアクセスできないですよね?
char x[/url]={"2 1 1 4 7 5 2 12 5 19 1 0 S M L"}; 
for( i = 0; i < 15; i++ ){
	printf( "%s\", x[i*2]);
}
2次元配列だと、簡単にアクセスできます。
char y[15][3]={"2","1","1","4","7","5","2","12","5","19","1","0","S","M","L"}; 
for( i = 0; i < 15; i++ ){
	printf( "%s\", y);
}

keichan

Re:たびたびすみません質問です

#11

投稿記事 by keichan » 18年前

こんな感じでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <malloc.h>
#include <memory.h>

#define	ARRAY_SIZE(x)	(sizeof(x)/sizeof(x[0]))

/**
 *	昇順ソート比較用関数
 */
int compare_greater_than(const void* in_rhs, const void* in_lhs)
{
	int rhs = *((const int*)in_rhs);
	int lhs = *((const int*)in_lhs);

	if( rhs < lhs ) {
		return -1;
	} else if( rhs > lhs ) {
		return 1;
	}
	return 0;
}

/**
 *	説明:in_value よりも次に大きなデータを in_box_data の 0~11 要素から検索してその値を返す
 */
int search_larger(const int in_box_data[/url], const int in_value)
{
	int buffer = INT_MAX;
	for( int i=0; i<12; ++i ) {
		if( in_box_data > in_value && buffer > in_box_data ) {
			buffer = in_box_data;
		}
	}
	return buffer;
}

/**
 *	説明:in_value と同じ値を in_box_data から探し出し、同じ値のインデックス合計を返す
 *    但し、 in_ignore_index はインデックス合計には含めない
 */
int search_same_value(const int in_box_data[/url], const int in_data_size, const int in_value, const int in_ignore_index)
{
	int total_index = 0;
	for( int i=0; i<in_data_size; ++i ) {
		if( i == in_ignore_index ) {
			continue;
		}
		if( in_box_data == in_value ) {
			total_index += i;
		}
	}
	return total_index;
}


/**
 *	説明:メインエントリ
 */
int main()
{
	int box_data[/url] = {2, 1, 1, 4, 7, 5, 2, 12, 5, 19, 1, 0, 'S', 'M', 'L'};
	/// ①
	int x = box_data[3-1] + box_data[7-1];
	box_data[x] = box_data[5-1];
	/// ②
	int N = search_larger(box_data, box_data[x]);
	box_data[box_data[8-1]] = N;
	/// ③
	box_data[2-1] = search_same_value(box_data, ARRAY_SIZE(box_data), box_data[2], 2);
	/// ④
	printf("boxNO.2 : %d\n", box_data[box_data[2-1]]);
	printf("please input any data : ");
	char input_data = 0;
	scanf("%c", &input_data);
	box_data[box_data[2-1]] = input_data;
	/// ⑤
	if( 'L' <= input_data && input_data <= 'P' ) {
		/// ⑦
		if( input_data == 'L' ) {
			int* work_area = (int*)malloc(ARRAY_SIZE(box_data)*sizeof(int));
			memcpy(work_area, box_data, ARRAY_SIZE(box_data)*sizeof(int));
			qsort(box_data, ARRAY_SIZE(box_data), sizeof(int), compare_greater_than);
			for( int i=0; i<ARRAY_SIZE(box_data); ++i ) {
				printf("boxNo.%02d : %d\n", i, box_data);
			}
			/// ⑧ 仕様が不明なので分かりません。
			if( memcmp(box_data, work_area, ARRAY_SIZE(box_data)*sizeof(int)) == 0 ) {
			}
			free(work_area);
		}
	} else {
		/// ⑥
		++box_data[1-1];
		printf("boxNo.%d's value : %d\n", box_data[1-1], box_data[box_data[1-1]]);
	}
	/// ⑨
	printf("END\n");
	return 0;
}

ももた

Re:たびたびすみません質問です

#12

投稿記事 by ももた » 18年前

keichanさん! 上のソースをもう少し初心者向けに書いて頂けないでしょうか^^;やっている事はわかるのですが、書き方が難しくて>_<

それと、質問をしたのですが、charでやってポインタを使えばすぐにできるといわれたのですが・・さっぱりわからず、参考書片手にしているんですが、まだ①からすすめないです。・・

Yuki

Re:たびたびすみません質問です

#13

投稿記事 by Yuki » 18年前

>charでやってポインタを使えばすぐにできる

このやり方ではないかもしれませんが、

>xという領域にboxNO3のデータ値+boxNo7のデータ値を代入する。
>x=1+2
>x=3
>この計算で求められたboxNOのデータ値を5とする。

をプログラムにするとこんな感じです。
char y[15][3]={"2","1","1","4","7","5","2","12","5","19","1","0","S","M","L"}; 
int x;
int i;

printf( "①処理前\n" );
for( i = 0; i < 15; i++ ){
	printf( "boxNO:%d データ:%s\n", i+1, y);
}

x = atoi(y[3-1]) + atoi(y[7-1]);
sprintf( y[x-1], "5" );

printf( "①処理後\n" );
for( i = 0; i < 15; i++ ){
	printf( "boxNO:%d データ:%s\n", i+1, y);
}

ももた

Re:たびたびすみません質問です

#14

投稿記事 by ももた » 18年前

yukiさん! やはりatoi使うんですね!書かれておわれるソースの意味はわかります! この問題すごく難しいような気がして・・さっきから社内でため息連発です・・・

Yuki

Re:たびたびすみません質問です

#15

投稿記事 by Yuki » 18年前

>やはりatoi使うんですね!

atoiを使いたそうにしていたので、こうしてみました。

keichanさんのようにintの配列でやるのでしたら、atoiは使わなくてもできます。
int box_data[/url] = {2, 1, 1, 4, 7, 5, 2, 12, 5, 19, 1, 0, 'S', 'M', 'L'};
int x = box_data[3-1] + box_data[7-1];
box_data[x] = 5;
>この問題すごく難しいような気がして・・

難しく考えようとすると、どツボにはまってどんどん難しくなってしまいます。
自分はこのやり方ならできるなというところまで、落とし込んで考えてみてください。

ももた

Re:たびたびすみません質問です

#16

投稿記事 by ももた » 18年前

少し考えてみます!またわからない部分があれば質問させて頂きます!

ももた

Re:たびたびすみません質問です

#17

投稿記事 by ももた » 18年前

条件②の部分なのですが、どう考えればboxNO.Xのデータ値(=5)の次に大きなデータを見つける事ができるのでしょうか?次に大きなデータの部分で少し困ってます。

Yuki

Re:たびたびすみません質問です

#18

投稿記事 by Yuki » 18年前

int data[/url] = { 1, 3, 5, 7, 9 }

というデータがあったとき、1番大きいデータを取得する方法を考えてみてください。

それができたら、2番目に大きいデータを取得する方法を考えてみてください。

keichan

Re:たびたびすみません質問です

#19

投稿記事 by keichan » 18年前

2007/02/27(火) 13:35 で投稿した、search_larger関数も参考になるかと思います。

ももた

Re:たびたびすみません質問です

#20

投稿記事 by ももた » 18年前

②番目難しいですね・・・>_< なかなか解くカギがみつからないですね。

Yuki

Re:たびたびすみません質問です

#21

投稿記事 by Yuki » 18年前

処理の流れはどのように考えていますか?

まずフローを考えてみると良いですよ。

ももた

Re:たびたびすみません質問です

#22

投稿記事 by ももた » 18年前

色々考えてるんですが・・・さっぱりできないです。
for(i=0; i<12; i++){
if(y[x-1]<y){
printf("%s ", y);
}
}
これで、データ5より大きい値を表示しようと思ったのですが・・・

Yuki

Re:たびたびすみません質問です

#23

投稿記事 by Yuki » 18年前

>if(y[x-1]<y){

yは2次元配列のものを使用していますか?
2次元配列内にデータは文字列として格納されていますよね。

文字列の"1"と数値の1は異なります。

ももた

Re:たびたびすみません質問です

#24

投稿記事 by ももた » 18年前

はい・・・わかるのですが・・・。2次元配列を使ってます。 よくわからなくなってきました。
やってる事はわかるんですが、それをソースでは書けないですね。。。

Yuki

Re:たびたびすみません質問です

#25

投稿記事 by Yuki » 18年前

まずは、数値として比較してみてはいかがでしょう。

管理人

Re:たびたびすみません質問です

#26

投稿記事 by 管理人 » 18年前

横槍失礼します。
一番大きなデータを探すところですよね?
一番大きなデータを探すには

変数 最大値 を最初に用意します。
「最大値」に最初の値ををセットします。
次の値が現在の最大値より大きければ、その値を最大値とします。
最大値より調べている値が小さければ何もしません。
こうして最後まで調べていけば、最大値が本当の意味での最大値となります。

この要領で行けば2つ目も可能ですが、めんどくさかったらソートプログラムをどこかからとってきて、
代入してしまうのも手です。
そうすれば最大値も2番目の最大値も特に考えることなく見つけられるでしょう。

管理人

Re:たびたびすみません質問です

#27

投稿記事 by 管理人 » 18年前

ちょっとドツボにはまりかけてしまっているようですので、答えと照らし合わせながら見てください。

まずは、数値が入っているとして考えます。

int a[4]={3,2,9,6};

>変数 最大値 を最初に用意します。

int max;

>「最大値」に最初の値ををセットします。

max = a[0];

>次の値が現在の最大値より大きければ、その値を最大値とします。

if(a[1]>max)
  max=a[1];

>こうして最後まで調べていけば、最大値が本当の意味での最大値となります。

if(a[2]>max)
  max=a[2];
if(a[3]>max)
  max=a[3];

これをループで書くと、
for(i=0;i<4;i++)
    if(a>max)
        max=a;

こんな感じでしょうか。

難しくないでしょう?
「あ~難しそうだ」と思うと本当にわからなくなってきます。
「わかるところから少しずつ」考えると案外わかってきます。
上記コードでそれがつかんでいただけるといいのですが・・。


数値として比較するにはatoiで数値にする必要がありますのでそこから拡張してください。

ももた

Re:たびたびすみません質問です

#28

投稿記事 by ももた » 18年前

何度もすみません。なんか、ポインタを使えとさいさん言われるのですが、何がなんだかわかりません。また最初から考えています>_<

管理人

Re:たびたびすみません質問です

#29

投稿記事 by 管理人 » 18年前

えぇと、もうネットにつながらない家に帰らなければならないので(_ _||)
手身近でホントすみません。


②においてポインタを使用しないといけないのでしょうか?
配列の調査の仕方は、2通りあります。

a
と書けばどこのアドレスをさすか、わかりますか?
a[0]
のアドレスです。

aのアドレスの1つ先はどこのアドレスをさすかわかりますか?
a[1]
のアドレスです。

これはchar型が1バイトであるために、こうなっています。
int型は4バイトなので、1まとまりが4つの領域を使用するため、アドレスは4つ先ということになりますので
混合されませんよう。

また、配列は連続で領域が確保されます。
2次元配列であってもそうです。

char a[5];

と宣言すると、aの先頭アドレスが1000だったとした時、

&a[0] は 1000
&a[1] は 1001
&a[2] は 1002
&a[3] は 1003
&a[4] は 1004

となります。

char a[2][5];

と宣言すると

&a[0][0] は 1000
&a[0][1] は 1001
&a[0][2] は 1002
&a[0][3] は 1003
&a[0][4] は 1004
&a[1][0] は 1005
&a[1][1] は 1006
&a[1][2] は 1007
&a[1][3] は 1008
&a[1][4] は 1009

となります。ですので、[0][0]の次に[1][0]のアドレスをさそうとしたら、
宣言で使った

char a[y][x];

のx分だけ、たしてやればいいことになります。わかりますか?xは5ですから、
1000+5で1005が[1][0]のアドレスになっていますね?

なにがなんだかわからない!
と思ってしまった時は入門書の最初からわからない部分の内容に読み落とさないようじっくり読んでみるのがいいと思います。

閉鎖

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