質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1891閲覧

皆様のお答えを聞かせてください。打ちこんだ整数を逆に並べて出力する

reotantan

総合スコア295

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/08/24 11:07

編集2015/08/24 11:51

このコードはマイナスの値を打つと、アラームが鳴り整数値を打つように
指示します。そして整数値が打ちこまれると、それを10で割り余りを出す、10で割るという繰り返しで引っくり返した数字を出力する事ができます。
しかし、個人的にはこの方法があまり好きではありません、
もっと効率的で短くこの結果を出す事ができますか?
もしくはこのコードとは考え方が異なる答えも知りたいです。
(柔軟にコードを考えたいからです。)
皆様のお答えを聞かせてください。
'#include<stdio.h>
int main(void){
int num;
do{
printf("dont type negative" );scanf("%d",&num );
if(num<0) puts("\aDont put negative ");

}while (num<0);

printf("read reversly");
do{
printf("%d",num%10 );
num=num/10;
}
while (num>0);
puts("result");
return 0;
}
'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuwow

2015/08/24 11:25

コードはMarkdown記法の```でシンタックスハイライトしていただけると助かります。
guest

回答2

0

既に解決済みですが・・・

入力された整数を逆順に「表示」することだけが目的ならば、わざわざ「10で割り余りを出す」必要はないのでは?と考えます。
そのように割り切れば、入力された整数を「文字列」とみなして単純に逆順に表示するだけで良いと思います。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int main(void) { 6 int num, n, i; 7 char s1[11] = {'\0'}; 8 char s2[11] = {'\0'}; 9 do { 10 printf("Don't type negative : " ); 11 scanf("%d",&num ); 12 if (num<0) printf("\a"); 13 } while (num<0); 14 15 sprintf(s1, "%d", num); 16 n = strlen(s1); 17 for (i=0; i<n; i++) { 18 s2[i] = s1[n-i-1]; 19 } 20 21 printf("input : %s\n", s1); 22 printf("reverse : %s\n", s2); 23 24 return 0; 25}

それと、入力されるのが「整数」という制限があるのであれば、0から始まるケースは考慮不要かと思います。

$ ./a.out Don't type negative : 01234 input : 1234 reverse : 4321 $

投稿2015/08/24 17:10

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

反転部分だけですが、こんなのはどうでしょう?

C

1~/test >./a.out 212345 354321 4~/test >cat tst15.c 5#include <stdio.h> 6 7int main() 8{ 9 int num= 0, ans= 0; 10 char buf[256]; 11 // 12 fgets( buf, sizeof buf, stdin); 13 sscanf( buf,"%d", &num); 14 // 15 do{ 16 ans = ans * 10 + num % 10; 17 }while( num /= 10 ); 18 // 19 printf( "%d\n", ans); 20 return 0; 21} 22 23~/test >

ただこれだと、先頭が0の場合反転されません。文字列で処理する方法も考えたほうがいいのかも?
~/test >./a.out
0123456
654321
~/test >
題意とは外れているかもしれませんが・・・

投稿2015/08/24 11:50

編集2015/08/24 12:16
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/24 12:53

こういう考えもありますね、参考にさせていただきます。 ありがとうございました!
cateye

2015/08/24 13:29

fgets()→sscanf()の流れはscanf()での問題(入力バッファに'\n'が残る)の回避対策です。今回のような1回だけの入力なら大丈夫ですが、scanf()が複数ある場合など注意が必要です。あと、printf()はかなり重たい処理なので、出来ればループの中では使わないほうがいいです。(デバッグ以外)数値→数字変換に固定するなら自作したほうがはるかに(7~10倍程度)早くなります。
reotantan

2015/08/24 13:46

printfが重いという事はしりませんでした、prinfの代わりにはputsなんかを使えばいいでしょうか?
cateye

2015/08/24 23:58

printf()は数値以外にもいろいろな変換を、パラメータに従って行う必要があるため処理が複雑になっています。その為、整数値→文字列変換などは自作してputs()などで出力したほうが早くなります。・・・あと、ちょっと思ったのですが、入力した文字列を反転してから数値に変換すれば、先頭の0も正常に処理されます。(int,longの範囲内が前提です)。また、文字列だけを反転したいのなら確保した文字列のバッファ以内なら文字列長には関係なく反転できますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問