C言語の問題集の回答がないので困っているので誰か教えてください。
私はまだ始めたばかりなので手におえません。
今私が理解しているif文、switch文、for文、while文、do-while文、配列、を
使用してでお願いします。

以下のプログラムに付け足しをしてバブルソートのプログラムを完成させなさい。
バブルソート前とバブルソート後のそれぞれの並びを表示すること。

#include<stdio.h>
#define No 11

main(){
int a[No]={2,7,5,1,7,1,8,3,6,4,9};
int i,j,temp;


実行結果例
before
2 7 5 1 7 1 8 3 6 4 9

after
large >>>>>>>>>>> small
9 8 7 7 6 5 4 3 2 1 1

このQ&Aに関連する最新のQ&A

A 回答 (6件)

#include<stdio.h>


#define No 11

main(){
int a[No]={2,7,5,1,7,1,8,3,6,4,9};
int i,j,temp;


//初期値設定

i = 0;
j = 0;
temp = 0;

//実行前表示

printf("before\n");
for(i = 0; i < No; i++ ){
printf("%d ",a[i]);
}

//ここからバブルソート

for(i = 0 ; i < No ; i++ ){
for(j = 0 ; j < No - i ; j++ ){
if(a[ j ] < a[j + 1]){
temp = a[ j ];
a[ j ] = a[ j+1 ];
a[ j+1 ] = temp;
}
}
}

//実行後表示
printf("after\n");
for(i = 0; i < No; i++ ){
printf("%d ",a[i]);
}

分かりやすいように作りました。たぶんこれで実行しても、上手くいくはずです。
    • good
    • 0

// sort.cpp : コンソール アプリケーションのエントリ ポイントを定義します。


//
#include "stdio.h"

#define No 11


int main(int argc, char* argv[])
{
int a[No]={2,7,5,1,7,1,8,3,6,4,9};
int i,j,temp;

printf ("before\n");
for (i = 0; i < No; ++i)
{
printf("%d", a[i]);
}
printf ("\n");

for (i = 0; i < No; ++i)
{
for (j = 1; j < No - i; ++j)
{
if (a[j] > a[j - 1])
{
temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
}
}

}

printf ("after\nlarge >>>>>>>>>>> small\n");
for (i = 0; i < No; ++i)
{
printf("%d", a[i]);
}


return 0;
}
    • good
    • 0

はじめまして。


質問者様の質問内容を判断しまして、質問の回答ではありませんが、
今後の学習の為にアドバイスをさせてください。
どの言語の学習にもいえることですが、プログラミングそのものの
経験が浅いうちは、できれば、ネットでもよいのですが、回答付きの参考書を購入して勉強してください。今の状況ですと、たとえ、回答を
提示しても、質問者様の血肉にはならないと思います。と言いますのは、提示した回答の中でなにが自分にとって覚えなくてはならない
重要な部分なのかが判断できないと思うからです。そして、たとえ
自分で解かずに他力でその質問の解答がわかったとしても、ちょっと条件を変えた問題にこたえられなくなる可能性が大です。
問題集の問題や、今後勉強するであろうデータ構造
、オブジェクト指向言語ならばデザインパターンなどは、その参考書のサンプルを見なければ、全然手もつけられないうちは、まだまだ基礎事項の理解が不十分であると自覚すべきです。ですので、その問題を解くために必要な基礎事項の考え方を徹底的に学習して理解することに努め、問題を解くための最低限の条件が与えられたならば、その条件だけであとは解答方法は自分で考えて苦労して
なんとか解答してみる。あとは自分で導いた解答と参考書のサンプルとの比較をしてみるとよいでしょう。すると自分でも気付かなかった部分が実は重要なところなのだとわかりだすはずです。あくまでも参考書のサンプルは答え合わせのためだけに参照するくらいにしておいた方がよいと思います。では頑張ってください。
    • good
    • 0

質問のタイトルを毎回変えましょう。


全部同じタイトルでは、どれがどの質問かわかりません。
C/C++カテゴリで全く同じ、もしくは少ししか違わないタイトルが並んでいると、重複投稿(これは規約違反に当たります)にしか見えません。

そして、実際にそれぞれの質問における最大の問題点は共通しています。
「解答のない問題集」で学習していることです。
そもそも、問題における解答を推測することはできますが、正解となる解答そのものを示すことはできません。
なぜなら、問題集全体を通して何らかの前提条件(intは16bit幅。規格としてはANSI以前,C90,C99、特定の処理系などの条件)が提示されることもありますので、必ずしも正答にならないのです。
また、問題文の意図が不明瞭な場合や、直前の問題からの文脈などによって条件が変わることもあります。
そして、あなたが実際に示されたとおり学習していない内容は使えないと考えるべきです。しかし、それは本人と問題集にしかわかりません。
今回の質問であれば画面への出力が必要ですが、C標準関数のうちどの方法での画面出力を学習したのかわかりません。
結局、問題集自身の「解答例」がないとならないのです。

そしてなによりも、大変お困りで回答を急がれているようですが、そうであれば解答付きの問題集が一番です。
時間と手間のかかる手段で正当なのかわからない解答例を得るよりも、素早く確実な解答を得るべきです。
    • good
    • 0

どうぞ参考URLにてバブルソートのソースがあります。


そちらのソースを参考にすればすぐに完成するかと・・・。

ただNo.1の方が言われてるように勉強を始めたばかりの者が
解説・回答なしの問題集を買うべきではないです。
身にならないし読むだけ意味がない。(^-^;)

参考URL:http://www1.cts.ne.jp/~clab/hsample/Sort/Sort1.h …
    • good
    • 0

その問題に答える事はそれほど難しくありませんが、


それより回答例なしの役にも立たない問題集など捨てて、回答付の問題集か参考書を買う事をお勧めします。
問題一つ一つにいちいち質問するつもりでもないすよね?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「本人日文不佳,哪位高手好心翻」の意味を教えてください

私は、ある小説についての感想をブログに書いているのですが、ふと、ブログのURLで検索をかけてみたところ、中国のサイトで、私の感想が原文のまま引用されていました。
その原文の下に「本人日文不佳,哪位高手好心翻」という文字とともに、私の文章を翻訳したものが載せられていました。

中国語についてはまったくの無知なので、「本人日文不佳,哪位高手好心翻」という一文の意味が気になってしまいしようがありません。
どなたか、教えてくださいますでしょうか。
よろしくお願いします。

Aベストアンサー

こんにちわ(/は)。

>「本人日文不佳,哪位高手好心翻」。
え~と、この文章の一文字が文字化けしているので推測して補完しました。多分合っているはずです。句読点も間違いなので正しておきました。
礼節が備わっていて丁寧に人にお願いをするときの文章ですね。

まず意訳です。
(私自身は日本語があまり上手ではないので、どなたか(日本語が)うまいかたでご親切なかたがいましたら翻訳してください)。
本人:(名詞)。私自身。
日文:(名詞)。日本語。
不:(副詞)。直後にくっついた形容詞などを否定する語。英語の”no”と同義。~ではない。
佳:(形容詞)。美しい。良い。うまい。上手。
哪位:どなたか。(”誰か”の丁寧語)。
高手:じょうずなかた。うまいかた。(硬い言葉で言うと”名手”)。
好心(的人):(名詞)。善意。親切な心。(掲題の文章では”的人”が省略されています)。→ 親切なおかた。
翻:(動詞)。翻訳。訳す。

簡潔に書くと;
(私は日本語がへたなので、どなたかうまい人で親切なかたがいたら訳してくださいな)。

安心してくださいな(^^♪。

こんにちわ(/は)。

>「本人日文不佳,哪位高手好心翻」。
え~と、この文章の一文字が文字化けしているので推測して補完しました。多分合っているはずです。句読点も間違いなので正しておきました。
礼節が備わっていて丁寧に人にお願いをするときの文章ですね。

まず意訳です。
(私自身は日本語があまり上手ではないので、どなたか(日本語が)うまいかたでご親切なかたがいましたら翻訳してください)。
本人:(名詞)。私自身。
日文:(名詞)。日本語。
不:(副詞)。直後にくっついた形容...続きを読む

Qint main の前のint add(int a,int b) ってなんですか?

int main の前のint add(int a,int b)
ってなんですか?

Aベストアンサー

関数のプロトタイプ宣言です。

賢いコンパイラだと後ろに書いてある実体を見て関数値や引数の型を読み取ってくれたりしますが、コンパイラによっては先に(つまりソースコードのより上の行に)型を宣言しておかないと正しく値の引き渡しができないものもあります。そういったトラブルを避けるために、add()という関数を使う箇所よりも上に、その返り値や引数の型を宣言しておくのです。

ちなみに、#include <stdio.h>というインクルードがありますが、このstdio.hファイルの中には、main()内で利用しているprintf()等の標準関数についてのプロトタイプ宣言なども書かれています。

Q小椋佳さんが好きな方、他にどの方が好きですか?

父の日のプレゼントにCDを贈る予定です。
父は小椋佳さんが好きで全てのCDを持っています。
そんな父にプレゼントをと考えても、仕事柄CDくらいしか思い付きません。
父は他に趣味はありません。ですので、小椋佳さんに似た系統の音楽CDを贈ろうと思います。
小椋佳さんが好きな方、他にどなたの音楽がお好きですか?
おすすめを教えてください。
よろしくお願いします。

Aベストアンサー

「チューリップ」はどうでしょう?
http://www.amazon.co.jp/Tulip%E3%81%8A%E3%81%84%E3%81%97%E3%81%84%E6%9B%B2%E3%81%99%E3%81%B9%E3%81%A6-1972-2006-%E7%89%B9%E5%85%B8DVD%E3%83%91%E3%83%83%E3%82%AF-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%83%E3%83%97/dp/B000HIVSN8/ref=sr_1_1/503-0106956-7093562?ie=UTF8&s=music&qid=1180155470&sr=1-1
お父様の年齢がわかるとなお絞れると思うのですが、40代以上の方だったらきっと青春時代が蘇ってくると思いますよ。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

Q名前の佳の説明の仕方

こんにちは
女の子で○佳という命名をしましたが、「佳」の例えとして、三田佳子のよしとか、にんべんに土二つという言い方しか思い浮かびません。いまいちな説明だと思っているのですが、もっとピンと来る例えはありませんか?
よろしくお願いします。

Aベストアンサー

>名前の佳の説明の仕方

     
         ↓
相手の方の年齢や趣味趣向を考えて、適切な説明パターンを選んでみます。


◇比較的、年配の、本や漢字に慣れ親しんでる方:「カ」「よし」と読む、佳日とか佳作、佳子の<佳>


◇プロ野球が好きな方:谷佳亮【オリックスからジャイアンツへ、ヤワラちゃんの旦那さん】の<佳>
昔、阪神に居たキャッチャーの辻佳彦さんの<佳>


◇皇室関係に関心が高い方:秋篠宮家の次女である佳子さまの<佳>


でも、やっぱり一番分かり易いのは→にんべんに土二つという言い方orカタカナのイを左にに漢字の土を上下に重ねた圭を右にした<佳>。

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Q♪ 小椋 佳さんの曲で、お気に入りは何ですか・・・・・。

♪ 小椋 佳さんの曲で、お気に入りは何ですか・・・・・。

皆さんこんにちは! 今回は 小椋 佳さんです。
色んなヒット曲があります。
あの曲かな、この曲かなって思いだしてくださいね。

では、お答えお待ちしています。よろしくお願いします。

Aベストアンサー

 またまた心待ちにしていたご質問です
 「お気に入りの曲」の「ご質問シリーズ」で、小椋佳さんがいつ登場するのか、注目していました。
 小椋佳さんといえば「私の音楽に対する考え方を変えさせたシンガーの1人」と言っても過言ではないからです。
 私が初めて小椋さんの歌を知ったのは、1976年の、NHKホールでのファーストコンサートの頃。
 たまたま高校の文化祭で、この模様を収録したライヴ盤(当時は当然LPレコード)が演奏され、当時の日本の音楽シーン。今風の言い方ならJ-POPでしょうか、は、ピンク・レディーを初めとして、低年齢層ばかりターゲットにしていた感じで、「もう洋楽しか聴くまい」と思っていたところへ、小椋さんの歌と出逢い、これは、これまでの邦楽とは全然違う、邦楽でも、まだこんな素晴らしい歌、素晴らしいアーティストがいたのだ。と、邦楽を見直すきっかけとなりました。
 さて、好きな曲ですが、これもいい曲ぞろいで、回答に迷うところですが、特に印象に残っているのが、先のコンサートでの曲です。
 具体的な曲名をあげると
1、さらば青春
 これは、小椋さんの原点の曲、オリジナルはもう39年前のリリースです。
 その後、多くのヴァージョンでリリースされましたが、一番気に入っているのは、やはりこのライヴでのヴァージョンです。
2、時
 これも、先のコンサートで歌われた曲。小椋さんは、歌詞を大切にされる方のため、作詞はご自身で、作曲は他人という楽曲は少なくないのですが、これは小椋さんとしては珍しく、作詞は塚原将さん、作曲のみ小椋さんです。しかし、そんなことを感じさせない、いい歌です。
3、スタンド・スティル
 これは作詞のみ小椋さん、作曲は、小椋さん、井上陽水さんなどの多くの曲のアレンジを手がけられた星 勝さん。コンサートでは、小椋さん、星さんのデュエットで披露されました。
 小椋さんが、海外へ避暑に行かれた友人の家の留守番を任されたときに書かれた歌らしく、歌詞の中に熱帯魚が登場しますが、実はその友人も熱帯魚を飼われていて、それの面倒も見なければならなくなり、
ある日、エアポンプが故障して、水を変えたりあの手この手を尽くしても、熱帯魚が元気にならず、ついに友人に国際電話をかけたところ、時差を考えなかったため、相手国は深夜だったというエピソードがあったそうです。
 以上が、ファーストコンサートから3曲選びましたが、もう少し最近の曲では、小椋さんとしては珍しい、外国曲のカヴァーである「流されはしなかった」(オリジナルは、「オール・バイ・マイセルフ」「恋にノー・タッチ」などのヒットで知られるエリック・カルメンの「雄々しい翼」)子供ミュージカル「アルゴ」の曲で、住宅会社のCMにも使用された「夢積み上げて」も、好きな曲です。
 小椋さんといえば、まさに好感度No.1、若い方からご年配の方まで、幅広く支持されていて、私は、小椋さんのような方こそ、本当の意味での「国民的アイドル」というにふさわしいと思います。
 参考URLのDVD-BOXを買いたいところですが、つい先日「AKB48代々木ライヴ」のDVD-BOXを買ったばかりで、金欠状態のため、もう少し待たねばなりません。

参考URL:http://www.nhk-ep.com/shop/commodity_param/ctc/+/shc/0/cmc/13651A1/?link_id=btn08

 またまた心待ちにしていたご質問です
 「お気に入りの曲」の「ご質問シリーズ」で、小椋佳さんがいつ登場するのか、注目していました。
 小椋佳さんといえば「私の音楽に対する考え方を変えさせたシンガーの1人」と言っても過言ではないからです。
 私が初めて小椋さんの歌を知ったのは、1976年の、NHKホールでのファーストコンサートの頃。
 たまたま高校の文化祭で、この模様を収録したライヴ盤(当時は当然LPレコード)が演奏され、当時の日本の音楽シーン。今風の言い方ならJ-POPでしょ...続きを読む

Qint rev_int(int num)文  関数の入門

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転した値を返す*/

intrev_int(int num)
{


inttmp = 0;

if(num> 0){
do{
tmp = tmp * 10 + num % 10;
num /= 10;
}while (num > 0);

}

return (tmp);

}

int main(void)
{

int nx = scan_uint();

printf("反転した値は%dです。\n", rev_int(nx));

return 0;

}

教えてください!参考書に書いてあることをまとめて
プログラムを読んでるのですが、わからない部分があります。
(1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは
読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。

(2)int scan_uint(void)の文は理解できました。私なりに解釈したのは
ここでは正の数を入力しないと次に進まないことと
負の数を入力した場合、負の数を入力しないでくださいと注意がずっと
でるという文です。
質問ですが、このあとint rev_int(int num)文に移ると思うのですが
ここの int tmp = 0; これはこのint rev_int(int num)文のみの
tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で
出てきたtmpとは別個と解釈しました。

そうなると、int rev_int(int num)文を読んでみると

tmpの箱を作成。そこは0を代入。
if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??)

do文は
tmp = tmp*10 + num %10
num /=10
wile(num>0)

これを見る限り、numという箱が見えません。全体を見渡しても
どこかでnumに値が代入されたのち、このint rev_int(int num)
という文を読みこんでいき if num>0のときと宣言されていますが
もっと前の段階でnumの値が入力されていない限り
このif文は適用されないと思ったのですが、プログラムは動いてます

三つ目の質問です
tmp = tmp *10 + num % 10
num /=10 の部分がわかりませんでした。
tmpはまず、int scan_uint(void)で作成したtmpと
int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが
正しいのであれば
tmpの値はここでは初のはずです。
一体いつ値を入力したのでしょうか?
もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが
どうしてtmpを10かけるのですか?123450になり、
そのあとnumの値が此処でもまだ不明なのですがnum/10したものと
足すみたいですが、わかりませんでした。。。

まとめると、tmp = tmp*10+num%10がわかりません。
また、numとは何かわかりません、値もどの値がどこで代入されていて
while(num>0)が引っかかるのか不明です。
tmpはint scan_uint文内で入力した値(scanfの部分で)
12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか?
参考書はなぜ別個と書いてるのかわかりません。

ごめんなさい>_< とても長くなりました。
どなたか解る方、教えてください、よろしくおねがいします。

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転...続きを読む

Aベストアンサー

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き始めます。

main関数で

int nx = scan_uint();
printf("反転した値は%dです。\n", rev_int(nx));

と、それぞれの関数を呼んでいるので、実際の動作を実行順に羅列すると
1.必ずmainの先頭からプログラム開始。
2.mainからscan_uintが呼ばれる。
3.呼ばれたscan_uintが処理を行う(内容は理解しているようなので省略)
4.scan_uintからmainに帰ってくる。その時の戻り値がnxに入る。
5.printfの引数にrev_int(nx)があるので、nxを引数にしてrev_intを呼ぶ。
6.呼ばれたrev_intは、nxの値をnumとして受け取る。
7.rev_intは受け取ったnum(mainのnxと同じ値)を元に処理を行う。
8.rev_intはtmpに作った値を戻り値として関数を終わる。
9.rev_intからmainに帰ってくる。その時の戻り値がprintfの引数になる。
10.mainからprintfが呼ばれる。
11.呼ばれたprintfは何かを画面に表示し、関数を終わる。
12.printfからmainに帰ってくる。printfの戻り値は受け取ってないので捨てられる。
13.mainがreturn 0;で関数を終わらせ、プログラムが終了する。
となります。

>これを見る限り、numという箱が見えません。全体を見渡しても
上記の6.で「引数の実体として、mainから渡してもらってる」でしょう?

それが判らなかったのは「プログラムはmainの先頭から実行する」と言うのを理解できていないからです。

(3)
>tmp = tmp *10 + num % 10
>num /=10 の部分がわかりませんでした。
>どうしてtmpを10かけるのですか?123450になり、
123450にはなりません。

rev_intに入ってきたら
int tmp = 0;
ってやってるので、tmpは「最初は0」です。別の場所(scan_uintなど)にあるtmpは「同姓同名の赤の他人」なので忘れましょう。

scan_uintで「12345」を入力すると、12345がmainのnxに返って来て(nxが12345になって)、そのnxの値である12345がrev_intに渡され、rev_intは12345をnumに受け取ります。

つまり「最初は、numは12345、tmpは0になっている」のです。

そして、numが0かどうか調べます。

numが0でない(12345になっている)ので、次に
tmp = tmp *10 + num % 10;
を実行します。

tmp(中身が0)を10倍した値と、numを10で割った余りを足し、tmpに戻しています。

つまり0を10倍した0に、12345を10で割った余り5を足し、足した結果5をtmpに戻します。なのでtmpは5になります。

次に
num /=10;
を実行します。

これは「numを10で割って、numに戻す」です。
num = num / 10;
と同じです。

numは12345なので、10で割った商1234がnumの新しい値になります。

なお、Cでは、整数の割り算の答えは「商」だけです。小数点以下はありません。例えば、1を10で割ると0になります。

次は、while文で「numが0より大きいなら繰り返し」です。

numが0より大きい(1234になっている)ので繰り返すことになり、また
tmp = tmp *10 + num % 10;
を実行します。

tmpは5になっているので10倍して50、それにnum(1234)を10で割った余り4を足し、足した54をtmpに戻します。

次に
num /=10;
を実行します。

numは1234なので、10で割った商123がnumの新しい値になります。

これを「numが0より大きい間、繰り返し」すると

tmp=0、num=12345

tmp=5、num=1234

tmp=54、num=123

tmp=543、num=12

tmp=5432、num=1

tmp=54321、num=0

となり、numが0になって繰り返すのをやめた時、tmpは54321になっています。

そして、最後に
return tmp;
として、54321をmainに返します。

mainに帰って来ると、前述の9.~11.の処理で
反転した値は54321です。
と表示されます。

>参考書はなぜ別個と書いてるのかわかりません。

「別の場所にある、同じ名前の変数は、同姓同名の赤の他人」なので「別個」です。

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き...続きを読む

QJR玉造温泉駅から佳翠苑皆美への行き方

佳翠苑皆美に宿泊予定です。
JR玉造温泉駅から車で5分だそうですが、
その他にバス等はないのでしょうか?
バスがあれば、縁結びパーフェクトチケットが使えるのではと思います。
佳翠苑皆美のサイトにも詳しいことが載っておらず、
どなたかお教えいただければありがたいです。
どうぞよろしくお願い申し上げます。

Aベストアンサー

玉造温泉駅入口から玉造温泉には一畑バスが運行されています。
 http://www.ichibata.co.jp/bus/rosen/matsue/4/

Qfor文を別のint内で定義し、初めのint文内で呼び出す??? 何という名のプログラム名?ですか???

毎度毎度忙しい中失礼します。現在<私のプログラム>を基に<参照プログラム>のようにプログラムを作り変えようとしていますが、正直お手上げ状態です。

どうしても<参照プログラム>に基づいてプログラムを組まなければならないのです。

どこがお手上げ状態かといえば、<参照プログラム>を参考にすると、int multInts(int x, int y)内の条件の組み方が<私のプログラム>内でどのようにして組めばいいのかが全くもって分かりません。かなり考えても分からないレベルです・・・私にとっては。
int multInts(int x, int y)の定義の仕方を真似て<私のプログラム>でも真似てみるのですが・・・出来ないのです。何をどう直せば良いのでしょうか???初期化でtra=0;とすると、表示は"0"になったりするし・・・。簡単かと思われるかもしれませんが・・・私にとってはかなり難しいのです。
”丸投げ”みたいな感じで恥ずかしいのですが、どうかアドバイスだけでも下さい。お願いします。

出力結果
1.5桁数字入力:"12345"と入力 (これは出来ます)
2.偶数桁のみ抽出して2倍にする→"14385" (最不明部: <参照プログラム>内のmultInts内の条件を<私のプログラム>内でどのようにして組むのかが分かりません)
3.各桁の数値を足し合わせる→1+4+3+8+5=21(不明部: 2.が出来ないので出来ません)
4.その数値が”妥当”か”不当”かをDOS?画面に表示(不明部:2.と3.が出来ないので出来ません)

<私のプログラム>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int num,tra;
int inpt=5;
int inptnum;
int sum=0;
//#define 0

printf("5桁入力; ");
scanf("%d", &num);

if (num==0){
printf("その値は0です。 \n");
}

else{

for(inpt ; inpt >=1 ; inpt--)

{
if(inpt%2 == 0) {
inptnum = pow(10,inpt-1);
tra = (num/inptnum)%10;
//printf("%d",tra*2);
tra=(tra*2)/10+(tra*2)%10;
printf("%d",tra);
}

else{
inptnum = pow(10,inpt-1);
tra = (num/inptnum)%10;
printf("%d",tra);
}

sum += tra;

}
printf("\n %d\n",sum);

sum= sum%10;
if(sum==0)
{
printf("妥当な数値です。\n");
}
else
{
printf("不当な数値です。\n");
}
}
system("pause");

return 0;
}

<参照プログラム>
#include <stdio.h>
#include <stdlib.h>

int main(){
int multInts(int x, int y);
int num1,num2,answer;
printf("間にスペース設けて2つの値入力: ");
scanf("%d%d", &num1, &num2);

answer = multInts( num1, num2);
printf("%d * %d=%d\n", num1, num2, answer);
system("pause");
return 0;
}
int multInts(int x, int y)
{
int result = 0;
int i;
for (i=1 ;i<=y ;i++)
{
result=result + x;
}
return result;
}

毎度毎度忙しい中失礼します。現在<私のプログラム>を基に<参照プログラム>のようにプログラムを作り変えようとしていますが、正直お手上げ状態です。

どうしても<参照プログラム>に基づいてプログラムを組まなければならないのです。

どこがお手上げ状態かといえば、<参照プログラム>を参考にすると、int multInts(int x, int y)内の条件の組み方が<私のプログラム>内でどのようにして組めばいいのかが全くもって分かりません。かなり考えても分からないレベルです・・・私にとっては。
int mul...続きを読む

Aベストアンサー

理屈だけ書いておくね

○入力された物は「数値」
○これを「桁毎にバラす」という方法が必要
 ◆演算によって1桁ずつ取り出す
 ◆そもそも入力を文字列にしてしまって後で数値に戻す
 のどちらかの方法が考えられる

いずれにしても「配列」という概念が必要になるかもしれないね


人気Q&Aランキング