ページ 1 / 1
数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 16:00
by ku11m
数字を入力させて、それを反転させるプログラムを書きました
しかし、if以降からうまく処理してくれてないようです
どこがダメなのでしょうか??
コード:
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#define NUMBER 1 // the number of students
int main(void){
int i;
int tensu[NUMBER];
printf("点数を入力してください\n");
for(i=0;i<NUMBER;i++){
printf("tensu[%d]:",i);
scanf("%d",&tensu[i]);
}
if(NUMBER%2==0){ //NUMBER is not odd
for(i=0;i<NUMBER/2;i++){
int temp[NUMBER];
temp[i] = tensu[i];
tensu[i] = tensu[NUMBER-i-1];
tensu[NUMBER-i-1] = temp[i];
}
}else{
for(i=0;i<(NUMBER-1)/2;i++){
int temp[NUMBER];
temp[i] = tensu[i];
tensu[i] = tensu[NUMBER-i-1];
tensu[NUMBER-i-1] = temp[i];
}
}
for(i=0;i<NUMBER;i++){
printf("tensu[%d]:%d\n",i,tensu[i]);
}
return 0;
}
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 16:21
by Aozora0630
数字を反転って12=21ってことですよね?
単にchar型配列を反転させれば良いだけでは?
訂正:scanfで&が突いてなかったのを修正。
コード:
char input[50],result[50];
scanf("%s",&input);
int loop_len = 0;//ループの回数
for(int i=strlen(input);i>=0;i--){//最後の文字から順にresultに追加
result[loop_len] = input[i];
loop_len++;
}
printf("%sの反転結果は%sです。",input,result);
すみません、動作確認はしてません。
コンパイルや実行でエラーがあったら言ってください。
というか配列の反転って配列操作関数に在った気がしますが・・・。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 17:44
by ku11m
すみません言葉足らずでした
入力された数を逆の順に出力できるようにしたいです
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 19:59
by Rittai_3D
別にchar型の配列を使用しなくても可能です。
入力された数字を反転する処理を手で行うとき、どうしますか?
オフトピック
Aozora0630 さんが書きました:
訂正:scanfで&が突いてなかったのを修正。
コード:
char input[50],result[50];
scanf("%s",&input);
int loop_len = 0;//ループの回数
for(int i=strlen(input);i>=0;i--){//最後の文字から順にresultに追加
result[loop_len] = input[i];
loop_len++;
}
printf("%sの反転結果は%sです。",input,result);
配列を引数に渡すのにアンパサンドは必要いりません。
コード:
char charArr[50];
scanf( "%s", charArr );
ideoneでコンパイルが通りました。
それより、このコードはバッファオーバーランの発生の危険があります。
► スポイラーを表示
コード:
char charArr[ 50 ];
scanf( "%50s", charArr );
spoilタグで囲ったコードを以下のように訂正します。これではサイズ指定の意味がないので。
コード:
char charArr[ 50 + 1 ];
scanf( "%50s", charArr );
のようにバッファサイズ指定した方がよいかと。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 20:34
by みけCAT
オフトピック
Rittai_3D さんが書きました:配列を引数に渡すのにアンパサンドは必要いりません。
コード:
char charArr[50];
scanf( "%s", charArr );
ideoneでコンパイルが通りました。
今回はアンパサンドを付けない方が適切ですが、コンパイルが通っても正しいとは限りません。
例えば、この間違ったコード
コード:
#include <stdio.h>
int main(void) {
int a;
scanf("%d", a);
printf("%d\n", a);
return 0;
}
も
ideoneでコンパイルが通ります。
wandboxのgccで、Warningsを有効にしてコンパイルするとよいでしょう。
Rittai_3D さんが書きました:それより、このコードはバッファオーバーランの発生の危険があります。
コード:
char charArr[ 50 ];
scanf( "%50s", charArr );
のようにバッファサイズ指定した方がよいかと。
長さの指定をバッファサイズと同じにしてしまうと、バッファオーバーランを防げません。
例えば、
コード:
#include <stdio.h>
int main(void) {
int a;
char b[4];
int c;
scanf("%x%x", &a, &c);
scanf("%4s", b);
printf("%x %s %x\n", a, b, c);
return 0;
}
というコードを
ideoneで実行すると、Runtime Errorになってしまいました。
長さ指定をバッファサイズ-1にすると、リスクが下がると思います。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 21:03
by Rittai_3D
みけCAT さんが書きました:オフトピック
Rittai_3D さんが書きました:それより、このコードはバッファオーバーランの発生の危険があります。
コード:
char charArr[ 50 ];
scanf( "%50s", charArr );
のようにバッファサイズ指定した方がよいかと。
長さの指定をバッファサイズと同じにしてしまうと、バッファオーバーランを防げません。
例えば、
コード:
#include <stdio.h>
int main(void) {
int a;
char b[4];
int c;
scanf("%x%x", &a, &c);
scanf("%4s", b);
printf("%x %s %x\n", a, b, c);
return 0;
}
というコードを
ideoneで実行すると、Runtime Errorになってしまいました。
長さ指定をバッファサイズ-1にすると、リスクが下がると思います。
オフトピック
あ、要素数を+1するのを忘れていました・・・。訂正します。
みけCAT さんが書きました:Rittai_3D さんが書きました:配列を引数に渡すのにアンパサンドは必要いりません。
コード:
char charArr[50];
scanf( "%s", charArr );
ideoneでコンパイルが通りました。
今回はアンパサンドを付けない方が適切ですが、コンパイルが通っても正しいとは限りません。
例えば、この間違ったコード
コード:
#include <stdio.h>
int main(void) {
int a;
scanf("%d", a);
printf("%d\n", a);
return 0;
}
も
ideoneでコンパイルが通ります。
wandboxのgccで、Warningsを有効にしてコンパイルするとよいでしょう。
Rittai_3D さんが書きました:
配列を引数に渡すのにアンパサンドは必要いりません。
と書いていますので、
コード:
int a;
scanf( "%d", a );
と意味が違います。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:07
by みけCAT
オフトピック
Rittai_3D さんが書きました:Rittai_3D さんが書きました:
配列を引数に渡すのにアンパサンドは必要いりません。
と書いていますので、
コード:
int a;
scanf( "%d", a );
と意味が違います。
意味が違っても、scanfに渡す型が不適切でもコンパイルが通り、
そのためコンパイルが通ったからといってもそれはscanfに渡す型が適切であるという証拠にならないことには変わりありません。

- チャットでの回答内容
- imifumei_20150527.png (7.51 KiB) 閲覧数: 15904 回
(2015年5月27日のチャットより引用)
ということは、配列を渡せば納得していただけますでしょうか?
コード:
#include <stdio.h>
int main(void) {
char a[1];
scanf("%lf", a);
printf("%d\n", (int)a);
return 0;
}
https://ideone.com/jrmc27 ←コンパイルは通ります
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:11
by Aozora0630
なんか私のコードへの駄目だしに・・・。い、いやーコンソールアプリケーションとか作らないからさー・・・。
他の皆さん、ご教授ありがとう御座います。ku11mさん、間違ったコードをすみません。
ku11m さんが書きました:すみません言葉足らずでした
入力された数を逆の順に出力できるようにしたいです
あ、そういうことでしたか。
でもそれでも配列を反転させれば良いだけですよね?
例えば
>1
>5
>6
を入力して{1,5,6}になってそれを{6,5,1}にするってことですよね?
コード:
int array(int *in,int *ret_val){
for(int i=0;i<10;i++){
ret_val[i] = in[9-i];
}
return 1;
}
配列反転関数です。
絶対間違ってます。うん。絶対間違ってます。(逃げた)
因みに配列のサイズが10だと仮定しています。違う場合は自分で変えてください。
それと、引数は
inが元でret_valが結果です。
ゼーッタイ間違ってるからね?
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:16
by みけCAT
Aozora0630 さんが書きました:ku11m さんが書きました:すみません言葉足らずでした
入力された数を逆の順に出力できるようにしたいです
あ、そういうことでしたか。
でもそれでも配列を反転させれば良いだけですよね?
出力できるようにするだけなら、配列を反転させる必要はありません。
素直に入力された数を逆の順に出力すればいいだけです。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:18
by Aozora0630
あ、そういえばそうですね。
反対にループさせれば良いだけか・・・。
でもまあ、↑の方法知ってたら便利だからね・・・ウン。
コード:
for(int i=9;i>=0;i++){
printf("%i\n",in[i]);
}
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:27
by みけCAT
そもそも、
ku11m さんが書きました:しかし、if以降からうまく処理してくれてないようです
どこがダメなのでしょうか??
と書いてあるのにもかかわらず、「入力した数値を入力の逆順で表示する」という動作は正しくできていそうなので、
仕様の解釈が間違っているかもしれません。
NUMBERが奇数のケース
NUMBERが偶数のケース
ku11m さんが書きました:入力された数を逆の順に出力できるようにしたいです
の意味をもう一度考えるべきです。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:28
by みけCAT
Aozora0630 さんが書きました:コード:
for(int i=9;i>=0;i++){
printf("%i\n",in[i]);
}
アクセス違反を起こしそうですね。これはネタコードですよね?
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:32
by みけCAT
Aozora0630 さんが書きました:コード:
char input[50],result[50];
scanf("%s",&input);
int loop_len = 0;//ループの回数
for(int i=strlen(input);i>=0;i--){//最後の文字から順にresultに追加
result[loop_len] = input[i];
loop_len++;
}
printf("%sの反転結果は%sです。",input,result);
すみません、動作確認はしてません。
コンパイルや実行でエラーがあったら言ってください。
とりあえずmain関数が無いので、補いました。
コード:
#include <stdio.h>
#include <string.h>
int main(void) {
char input[50],result[50];
scanf("%s",&input);
int loop_len = 0;//ループの回数
for(int i=strlen(input);i>=0;i--){//最後の文字から順にresultに追加
result[loop_len] = input[i];
loop_len++;
}
printf("%sの反転結果は%sです。",input,result);
return 0;
}
「12」を入力すると、
「12の反転結果はです。」と表示されました。
'\0'の位置は反転させず、最後に置いたままにしなくてはいけません。もちろん外してもいけません。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月27日(水) 22:35
by みけCAT
ku11m さんが書きました:数字を入力させて、それを反転させるプログラムを書きました
しかし、if以降からうまく処理してくれてないようです
どのような入力を与えたとき、どのような結果を期待しているのに、どうなってしまうのか、を具体的に教えていただけるとありがたいです。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 00:28
by box
だれからも言及がないように見受けられますが、そもそも
ku11m さんが書きました:
コード:
#define NUMBER 1 // the number of students
int tensu[NUMBER];
1人分しか点数を入れる箱がないのは想定通りなのでしょうか?>質問者さん
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 18:47
by Aozora0630
みけCAT さんが書きました:Aozora0630 さんが書きました:コード:
for(int i=9;i>=0;i++){
printf("%i\n",in[i]);
}
アクセス違反を起こしそうですね。これはネタコードですよね?
ははは・・・。ははは・・・。真っ白に燃え尽きたさ・・・。
死にたい。全くネタコードを作ってるつもりは無いのに・・・。
改訂:++じゃなくて--ね。
コード:
for(int i=9;i>=0;i--){
printf("%i\n",in[i]);
}
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 18:50
by Aozora0630
みけCAT さんが書きました:
「12」を入力すると、
「12の反転結果はです。」と表示されました。
'\0'の位置は反転させず、最後に置いたままにしなくてはいけません。もちろん外してもいけません。
此方もか・・・。
コード:
[code=c]#include <stdio.h>
#include <string.h>
int main(void) {
char input[50],result[50];
scanf("%s",input);
int loop_len = 0;//ループの回数
for(int i=strlen(input);i>=0;i--){//最後の文字から順にresultに追加
if(input[i]==0)continue;
result[loop_len] = input[i];
loop_len++;
}
result[loop_len+1] = 0;
printf("%sの反転結果は%sです。",input,result);
return 0;
}
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 20:06
by Rittai_3D
単純に
入力された桁数を求める
(計算結果用の変数を用意する)
一の位の数字を10^(桁数-1)して計算結果に足していく
十の位の数字を10^(桁数-1-1)して計算結果に足していく
・・・
のように桁数だけ繰り返していく
とすれば出来ます。
わざわざchar型配列を用意する必要はありません。
たとえば、123は123 = 10^2*1+10^1*2+10^0*3 と分解できますよね。
それを反転した数字 321 = 10^2*3+10^1*2+10^0*1 と分解できますよね。
具体的な数を用意して、上の手順に当てはめてみて考えてみて下さい。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 20:38
by みけCAT
Aozora0630 さんが書きました:此方もか・・・。
コード:
[code=c]#include <stdio.h>
#include <string.h>
int main(void) {
char input[50],result[50];
scanf("%s",input);
int loop_len = 0;//ループの回数
for(int i=strlen(input);i>=0;i--){//最後の文字から順にresultに追加
if(input[i]==0)continue;
result[loop_len] = input[i];
loop_len++;
}
result[loop_len+1] = 0;
printf("%sの反転結果は%sです。",input,result);
return 0;
}
14行目の+1は蛇足です。(もちろん先頭の
コード:
も蛇足です)
[url=https://ideone.com/OS8VBF]先頭の[code=c]を外し、C99としてideoneで実行[/url]したところ、なぜか出力が何も表示されないことがありました。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 20:43
by みけCAT
Rittai_3D さんが書きました:単純に
入力された桁数を求める
(計算結果用の変数を用意する)
一の位の数字を10^(桁数-1)して計算結果に足していく
十の位の数字を10^(桁数-1-1)して計算結果に足していく
・・・
のように桁数だけ繰り返していく
とすれば出来ます。
わざわざchar型配列を用意する必要はありません。
たとえば、123は123 = 10^2*1+10^1*2+10^0*3 と分解できますよね。
それを反転した数字 321 = 10^2*3+10^1*2+10^0*1 と分解できますよね。
具体的な数を用意して、上の手順に当てはめてみて考えてみて下さい。
仮に「入力された数値の桁を反転したものを出力する」という仕様である場合、
例えば入力「100」に対する出力は「1」が正解なのか、それとも「001」が正解なのかを考えるべきです。
どちらにしろ、出力するだけならchar型配列も計算結果用の変数も必要なく、
単に1桁づつ順番に出力するだけでよいはずです。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 23:16
by ku11m
返信が遅れてすみません
NUMBERを最初10にしてたのですが、上手くいかなかったので1でやってみようとしたものを、そのまま載せてしまっただけです
例えばNUMBERを3とし、
2
3
9
と入力した場合、
9
3
2
と表示できるようにしたいです
これはある入門書の演習問題で、配列に入力された数を入力された逆の順に同じ配列に代入するようなプログラムをしたいのです
確かに逆の順に入力させるのであれば、逆の順に出力すればいいのですが、今回はそれが目的はないです
説明が下手なので、何かわからない点があれば言ってください
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 23:21
by みけCAT
ku11m さんが書きました:例えばNUMBERを3とし、
2
3
9
と入力した場合、
9
3
2
と表示できるようにしたいです
- 10行目を削除
- 12行目を削除
- 34行目をprintf("%d\n",tensu);に変更
これで指定された出力になるはずです。
https://ideone.com/MpvgOb
http://melpon.org/wandbox/permlink/Qn2pQZI41L7wAb6t
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月28日(木) 23:22
by みけCAT
ちなみに、tempをNUMBER要素確保するのは無駄で、普通にint型で宣言すればいいと思います。
Re: 数字を入力させて、それを反転させるプログラムについて
Posted: 2015年5月29日(金) 09:13
by ku11m
皆様ありがとうございました
PCの不調でうまくいかなかったみたいです
ご迷惑をおかけしました
これからもお世話になると思いますが、その時はよろしくお願いします