数字を入力させて、それを反転させるプログラムについて

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

数字を入力させて、それを反転させるプログラムについて

#1

投稿記事 by ku11m » 9年前

数字を入力させて、それを反転させるプログラムを書きました
しかし、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;
}

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#2

投稿記事 by Aozora0630 » 9年前

数字を反転って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);
すみません、動作確認はしてません。
コンパイルや実行でエラーがあったら言ってください。

というか配列の反転って配列操作関数に在った気がしますが・・・。

ku11m

Re: 数字を入力させて、それを反転させるプログラムについて

#3

投稿記事 by ku11m » 9年前

すみません言葉足らずでした
入力された数を逆の順に出力できるようにしたいです

Rittai_3D
記事: 525
登録日時: 11年前

Re: 数字を入力させて、それを反転させるプログラムについて

#4

投稿記事 by Rittai_3D » 9年前

別に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でコンパイルが通りました。
それより、このコードはバッファオーバーランの発生の危険があります。
► スポイラーを表示
spoilタグで囲ったコードを以下のように訂正します。これではサイズ指定の意味がないので。

コード:

char charArr[ 50 + 1 ];
scanf( "%50s", charArr );
のようにバッファサイズ指定した方がよいかと。
最後に編集したユーザー Rittai_3D on 2015年5月27日(水) 21:09 [ 編集 1 回目 ]
初心者です

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#5

投稿記事 by みけCAT » 9年前

オフトピック
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にすると、リスクが下がると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Rittai_3D
記事: 525
登録日時: 11年前

Re: 数字を入力させて、それを反転させるプログラムについて

#6

投稿記事 by Rittai_3D » 9年前

みけ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 );
と意味が違います。
初心者です

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#7

投稿記事 by みけCAT » 9年前

オフトピック
Rittai_3D さんが書きました:
Rittai_3D さんが書きました: 配列を引数に渡すのにアンパサンドは必要いりません。
と書いていますので、

コード:

int a;
scanf( "%d", a );
と意味が違います。
意味が違っても、scanfに渡す型が不適切でもコンパイルが通り、
そのためコンパイルが通ったからといってもそれはscanfに渡す型が適切であるという証拠にならないことには変わりありません。
imifumei_20150527.png
チャットでの回答内容
imifumei_20150527.png (7.51 KiB) 閲覧数: 13171 回
(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 ←コンパイルは通ります
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#8

投稿記事 by Aozora0630 » 9年前

なんか私のコードへの駄目だしに・・・。い、いやーコンソールアプリケーションとか作らないからさー・・・。
他の皆さん、ご教授ありがとう御座います。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が結果です。

ゼーッタイ間違ってるからね?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#9

投稿記事 by みけCAT » 9年前

Aozora0630 さんが書きました:
ku11m さんが書きました:すみません言葉足らずでした
入力された数を逆の順に出力できるようにしたいです
あ、そういうことでしたか。
でもそれでも配列を反転させれば良いだけですよね?
出力できるようにするだけなら、配列を反転させる必要はありません。
素直に入力された数を逆の順に出力すればいいだけです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#10

投稿記事 by Aozora0630 » 9年前

あ、そういえばそうですね。

反対にループさせれば良いだけか・・・。

でもまあ、↑の方法知ってたら便利だからね・・・ウン。

コード:

for(int i=9;i>=0;i++){
printf("%i\n",in[i]);
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#11

投稿記事 by みけCAT » 9年前

そもそも、
ku11m さんが書きました:しかし、if以降からうまく処理してくれてないようです
どこがダメなのでしょうか??
と書いてあるのにもかかわらず、「入力した数値を入力の逆順で表示する」という動作は正しくできていそうなので、
仕様の解釈が間違っているかもしれません。
NUMBERが奇数のケース
NUMBERが偶数のケース
ku11m さんが書きました:入力された数を逆の順に出力できるようにしたいです
の意味をもう一度考えるべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#12

投稿記事 by みけCAT » 9年前

Aozora0630 さんが書きました:

コード:

for(int i=9;i>=0;i++){
printf("%i\n",in[i]);
}
アクセス違反を起こしそうですね。これはネタコードですよね?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#13

投稿記事 by みけCAT » 9年前

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'の位置は反転させず、最後に置いたままにしなくてはいけません。もちろん外してもいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#14

投稿記事 by みけCAT » 9年前

ku11m さんが書きました:数字を入力させて、それを反転させるプログラムを書きました
しかし、if以降からうまく処理してくれてないようです
どのような入力を与えたとき、どのような結果を期待しているのに、どうなってしまうのか、を具体的に教えていただけるとありがたいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 13年前

Re: 数字を入力させて、それを反転させるプログラムについて

#15

投稿記事 by box » 9年前

だれからも言及がないように見受けられますが、そもそも
ku11m さんが書きました:

コード:

#define NUMBER 1 // the number of students
	int tensu[NUMBER];
1人分しか点数を入れる箱がないのは想定通りなのでしょうか?>質問者さん
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#16

投稿記事 by Aozora0630 » 9年前

みけ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]);
}

Aozora0630
記事: 85
登録日時: 9年前
住所: 日本
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#17

投稿記事 by Aozora0630 » 9年前

みけ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;
}

Rittai_3D
記事: 525
登録日時: 11年前

Re: 数字を入力させて、それを反転させるプログラムについて

#18

投稿記事 by Rittai_3D » 9年前

単純に

入力された桁数を求める
(計算結果用の変数を用意する)
一の位の数字を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 と分解できますよね。
具体的な数を用意して、上の手順に当てはめてみて考えてみて下さい。
初心者です

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#19

投稿記事 by みけCAT » 9年前

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]したところ、なぜか出力が何も表示されないことがありました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#20

投稿記事 by みけCAT » 9年前

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桁づつ順番に出力するだけでよいはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ku11m

Re: 数字を入力させて、それを反転させるプログラムについて

#21

投稿記事 by ku11m » 9年前

返信が遅れてすみません

NUMBERを最初10にしてたのですが、上手くいかなかったので1でやってみようとしたものを、そのまま載せてしまっただけです

例えばNUMBERを3とし、
2
3
9
と入力した場合、
9
3
2
と表示できるようにしたいです

これはある入門書の演習問題で、配列に入力された数を入力された逆の順に同じ配列に代入するようなプログラムをしたいのです
確かに逆の順に入力させるのであれば、逆の順に出力すればいいのですが、今回はそれが目的はないです

説明が下手なので、何かわからない点があれば言ってください

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#22

投稿記事 by みけCAT » 9年前

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
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 数字を入力させて、それを反転させるプログラムについて

#23

投稿記事 by みけCAT » 9年前

ちなみに、tempをNUMBER要素確保するのは無駄で、普通にint型で宣言すればいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ku11m

Re: 数字を入力させて、それを反転させるプログラムについて

#24

投稿記事 by ku11m » 9年前

皆様ありがとうございました

PCの不調でうまくいかなかったみたいです
ご迷惑をおかけしました

これからもお世話になると思いますが、その時はよろしくお願いします

閉鎖

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