たびたびすみません質問です
たびたびすみません質問です
[問題]
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
この最後の課題なんですけど・・・①の部分からよくわかりません>_< 何か回答ではなくヒント見たいものがあれば教えて頂きたいんですが・・・①からつなづいてるので・・全然前に進めないので^^; こんな質問ですみません。
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
この最後の課題なんですけど・・・①の部分からよくわかりません>_< 何か回答ではなくヒント見たいものがあれば教えて頂きたいんですが・・・①からつなづいてるので・・全然前に進めないので^^; こんな質問ですみません。
Re:たびたびすみません質問です
+------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |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:たびたびすみません質問です
まったくです>_< 今は①だけを考えてるんですが・・・今日までにしろと言われているので。ポインタを使うようなのですが、atoi()とか試してるんですが、何をどうすればいいのかわからないです・・・。
Re:たびたびすみません質問です
プログラムを作るのですか?
考え方がわからないのかと思いました。
どうやって作ろうとしているのかわからないので、
今できている分だけでも載せてもらえますか?
未完でかまいません。
考え方がわからないのかと思いました。
どうやって作ろうとしているのかわからないので、
今できている分だけでも載せてもらえますか?
未完でかまいません。
Re:たびたびすみません質問です
#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;
}
これだけしか書いてないんです>_< する事はわかるのですが、プログラム化できないですね。ここからどうするのかかなり悩んでます・・。
#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;
}
これだけしか書いてないんです>_< する事はわかるのですが、プログラム化できないですね。ここからどうするのかかなり悩んでます・・。
Re:たびたびすみません質問です
>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"};
このようにしてみてはいかがでしょう。
このデータを格納する領域を考えるにあたりいくつか方法があると思いますが、
boxNOを配列の要素数のインデックスとして扱うのは良いと思いますが、
データ部が今のももたさんのやり方だと、後々の処理でかなり面倒になると思います。
char x[15][3]={"2","1","1","4","7","5","2","12","5","19","1","0","S","M","L"};
このようにしてみてはいかがでしょう。
Re:たびたびすみません質問です
ももたさんは、配列の要素のインデックスをキーにデータを扱いたいのですよね?
2次元配列のほうが、使い勝手が良くないですか?
1次元配列だと、簡単にアクセスできないですよね?
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); }
Re:たびたびすみません質問です
こんな感じでしょうか?
#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:たびたびすみません質問です
keichanさん! 上のソースをもう少し初心者向けに書いて頂けないでしょうか^^;やっている事はわかるのですが、書き方が難しくて>_<
それと、質問をしたのですが、charでやってポインタを使えばすぐにできるといわれたのですが・・さっぱりわからず、参考書片手にしているんですが、まだ①からすすめないです。・・
それと、質問をしたのですが、charでやってポインタを使えばすぐにできるといわれたのですが・・さっぱりわからず、参考書片手にしているんですが、まだ①からすすめないです。・・
Re:たびたびすみません質問です
>charでやってポインタを使えばすぐにできる
このやり方ではないかもしれませんが、
>xという領域にboxNO3のデータ値+boxNo7のデータ値を代入する。
>x=1+2
>x=3
>この計算で求められたboxNOのデータ値を5とする。
をプログラムにするとこんな感じです。
このやり方ではないかもしれませんが、
>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:たびたびすみません質問です
yukiさん! やはりatoi使うんですね!書かれておわれるソースの意味はわかります! この問題すごく難しいような気がして・・さっきから社内でため息連発です・・・
Re:たびたびすみません質問です
>やはりatoi使うんですね!
atoiを使いたそうにしていたので、こうしてみました。
keichanさんのようにintの配列でやるのでしたら、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:たびたびすみません質問です
条件②の部分なのですが、どう考えればboxNO.Xのデータ値(=5)の次に大きなデータを見つける事ができるのでしょうか?次に大きなデータの部分で少し困ってます。
Re:たびたびすみません質問です
int data[/url] = { 1, 3, 5, 7, 9 }
というデータがあったとき、1番大きいデータを取得する方法を考えてみてください。
それができたら、2番目に大きいデータを取得する方法を考えてみてください。
というデータがあったとき、1番大きいデータを取得する方法を考えてみてください。
それができたら、2番目に大きいデータを取得する方法を考えてみてください。
Re:たびたびすみません質問です
色々考えてるんですが・・・さっぱりできないです。
for(i=0; i<12; i++){
if(y[x-1]<y){
printf("%s ", y);
}
}
これで、データ5より大きい値を表示しようと思ったのですが・・・
for(i=0; i<12; i++){
if(y[x-1]<y){
printf("%s ", y);
}
}
これで、データ5より大きい値を表示しようと思ったのですが・・・
Re:たびたびすみません質問です
>if(y[x-1]<y){
yは2次元配列のものを使用していますか?
2次元配列内にデータは文字列として格納されていますよね。
文字列の"1"と数値の1は異なります。
yは2次元配列のものを使用していますか?
2次元配列内にデータは文字列として格納されていますよね。
文字列の"1"と数値の1は異なります。
Re:たびたびすみません質問です
はい・・・わかるのですが・・・。2次元配列を使ってます。 よくわからなくなってきました。
やってる事はわかるんですが、それをソースでは書けないですね。。。
やってる事はわかるんですが、それをソースでは書けないですね。。。
Re:たびたびすみません質問です
横槍失礼します。
一番大きなデータを探すところですよね?
一番大きなデータを探すには
変数 最大値 を最初に用意します。
「最大値」に最初の値ををセットします。
次の値が現在の最大値より大きければ、その値を最大値とします。
最大値より調べている値が小さければ何もしません。
こうして最後まで調べていけば、最大値が本当の意味での最大値となります。
この要領で行けば2つ目も可能ですが、めんどくさかったらソートプログラムをどこかからとってきて、
代入してしまうのも手です。
そうすれば最大値も2番目の最大値も特に考えることなく見つけられるでしょう。
一番大きなデータを探すところですよね?
一番大きなデータを探すには
変数 最大値 を最初に用意します。
「最大値」に最初の値ををセットします。
次の値が現在の最大値より大きければ、その値を最大値とします。
最大値より調べている値が小さければ何もしません。
こうして最後まで調べていけば、最大値が本当の意味での最大値となります。
この要領で行けば2つ目も可能ですが、めんどくさかったらソートプログラムをどこかからとってきて、
代入してしまうのも手です。
そうすれば最大値も2番目の最大値も特に考えることなく見つけられるでしょう。
Re:たびたびすみません質問です
ちょっとドツボにはまりかけてしまっているようですので、答えと照らし合わせながら見てください。
まずは、数値が入っているとして考えます。
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];
これをループで書くと、
こんな感じでしょうか。
難しくないでしょう?
「あ~難しそうだ」と思うと本当にわからなくなってきます。
「わかるところから少しずつ」考えると案外わかってきます。
上記コードでそれがつかんでいただけるといいのですが・・。
数値として比較するにはatoiで数値にする必要がありますのでそこから拡張してください。
まずは、数値が入っているとして考えます。
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:たびたびすみません質問です
えぇと、もうネットにつながらない家に帰らなければならないので(_ _||)
手身近でホントすみません。
②においてポインタを使用しないといけないのでしょうか?
配列の調査の仕方は、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]のアドレスになっていますね?
なにがなんだかわからない!
と思ってしまった時は入門書の最初からわからない部分の内容に読み落とさないようじっくり読んでみるのがいいと思います。
手身近でホントすみません。
②においてポインタを使用しないといけないのでしょうか?
配列の調査の仕方は、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]のアドレスになっていますね?
なにがなんだかわからない!
と思ってしまった時は入門書の最初からわからない部分の内容に読み落とさないようじっくり読んでみるのがいいと思います。