こんにちは
現在学校でC言語の初歩を習っているのですが、いきなり挫折しています。
先日学校で
ファイル名…prime
引数   …int
戻り値  …int
内容   …引数に一番近い素数をかえす
といったプログラムをかけと言われたのですが、
書き方が全く分からない上に、たとえ先生に聞いたとしても難しく説明されてよくわかりません。
自分なりに調べてみたのですがそれでもわかりません。
次の授業(明日27日)で発表しなくてはいけないのでできるだけ更に焦っています;
どなたか詳しく教えていただけないでしょうか。

A 回答 (7件)

さらに変更。



int near_prime(int n)
{
int p1 = n + !(n & 1), p2 = n - !(n & 1);

if(n <= 2) return 2;
while(!is_prime(p2)){
if(is_prime(p1)) return p1;
p1 += 2;
p2 -= 2;
}
return p2;
}
    • good
    • 0

 変更


int near_prime(int n)
{
int p1 = n + !(n & 1), p2 = n - !(n & 1);

if(n <= 2) return 2;
while(!is_prime(p1)) p1 += 2;
while(!is_prime(p2)) p2 -= 2;
if(p1 / 2 + p2 / 2 + 1 >= n) return p2;
return p1;
}
    • good
    • 0

#include <stdio.h>



int is_prime(int n)
{
int i;

if(!(n & 1)) return 0;
for(i = 3; i * i <= n; i += 2){
if(!(n % i)) return 0;
}
return 1;
}

int near_prime(int n)
{
int p1 = n, p2 = n;

if(n <= 2) return 2;

while(!is_prime(p1)) ++ p1;
while(!is_prime(p2)) -- p2;
if(p1 / 2 + p2 / 2 + 1 >= n) return p2;
return p1;
}

int main(void)
{
int n;

scanf("%d", &n);
printf("%d %d\n", n, near_prime(n));
return 0;
}
    • good
    • 1

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


//
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>

// こういう問題の場合
// 問題を分けて考える(分割統治という)が有効です
//
// ある自然数Nが与えられ、
// Nは素数であるか否か判定せよ
// というのは簡単な問題です
// (1とその数以外で割ってみれば良い)
//
// ある数Nに一番近い素数というのが少し難しいです
//
// そこで場合分けをしましょう
// A) Nが素数の場合
// Nそのものが解になります
// B) Nが素数でない場合
// 解の候補は2つあります
// 一つ目はNより小さい数で最大の素数
// これをM1とします
// 他の一つはNより大きくて最小の素数
// これをM2とします
// M1とM2のうち、Nに近いほうが解となります
//
// ここでさらに"近い"ということの意味も考える
// 必要があります
// 近いということは”距離が短い"ということです
// 距離を測るには差を求めれば良いですね
// M1 < N < M2なので
// N - M1 が M2 - Nより小さければM1が近い
// N - M1 が M2 - Nより大きければM2が近い
// ことになります
//
// では,等しい場合はどうなるでしょう
// 問題文からは読み取れません
// 私は数学者でないのでわかりませんが
// もしかしたら、このようなケースはあり得ない
// ことが証明されているのかも知れません
//
// しかし、わかりませんので
// 同じ距離の場合は小さい方(M1)を返すことに
// します

// 与えられた数が素数であるかどうかを調べる関数です
// 素数であれば1、そうでなければ0を戻します
static int IsPrime(int n)
{
int i;

// 1は素数ではありません
// ここでは自然数しか扱わないので0以下の整数が
// 与えられることはあり得ないのですが
// 安全のため1か?ではなく1以下か?で判定します
if (n <= 1)
return 0; // 素数でないので0を返します

// 2は素数です
if (n <= 2)
return 1;

// 3以上の場合です
// 3は素数であるとわかりきっているので
// 計算するまでもないのですが
// 無限にifで分岐するわけにもいきませんから
// ここからは計算することにします

// 全ての自然数は1とその数自身で割り切れることは
// 自明です
// よって2とその数(n - 1)以下で割り切れるものが
// あれば素数といえます

for (i = 2; i < n; ++i)
{
if (n % i == 0)
{
// 2以上n-1以下の自然数iで割り切れました
// 素数ではありません
return 0;
}
}

// 2以上n-1以下の自然数で割り切れるものはありませんでした
// つまり1とnでしか割り切れません
// 素数です
return 1;
}

// m1, m2の内nに近い方を返します
// 等距離の場合は小さい方とします
static int GetNearInt(int m1, int m2, int n)
{
int d1, d2;
// m1, m2, nの並び順に依存すると使いにくい関数と
// なってしまいます
// それを避けるため絶対値で比較します
d1 = abs(m1 - n);
d2 = abs(m2 - n);
if (d1 == d2)
{
// 等距離の場合です
// 小さい方を返します
return m1 < m2 ? m1 : m2;
}
else
{
// 距離が小さい方を返します
// d1がm1とnの距離
// d2がm2とnの距離です
return d1 < d2 ? m1 : m2;
}
}

// 与えられた数未満で最大の素数を返します
static int GetMaxPrime(int upperLimit)
{
int i;
// 上限から減少し、素数を見つけます
// 最小の素数は2なので、2以下を調べる必要はありません
for (i = upperLimit; i >= 3; i--)
{
if (IsPrime(i))
{
// 素数を見つけました
return i;
}
}

// 与えられた範囲で3以上の素数はありません
// 最大の素数は2に決定です
return 2;
}

// 与えられた数より大きくて最小の素数を返します
// 最大の整数まで調べて見つからない場合は-1として
// エラーを知らせます
static int GetMinPrime(int LowerLimit)
{
int i;
// 下限から上昇し、素数を見つけます
// 最大の整数で打ち切ります
for (i = LowerLimit; i < INT_MAX; i++)
{
if (IsPrime(i))
{
// 素数を見つけました
return i;
}
}

// 最大の整数値未満では素数がありませんでした
// 最大の整数が素数ならその値を返します
if (!IsPrime(INT_MAX))
return -1;
else
return INT_MAX;
}


// 引数に一番近い素数をかえす関数です
static int GetNearPrime(int n)
{
int m1, m2;

// nが1なら一番近い素数は2です
if (n <= 1)
return 2;

// nが素数ならそのまま返します
if (IsPrime(n))
return n;

// n未満の最大の素数を求めます
m1 = GetMaxPrime(n);

// nより大きくて最小の素数を求めます
// 求められない可能性もあります
m2 = GetMinPrime(n);

if (m2 < 0)
{
// nより大きい素数は見つかりませんでした
// (計算限界に達したため)
// 仕方ないのでn未満の最大の素数を
// 最も近い素数に決定します
return m1;
}
else
{
// n未満の最大の素数及び
// nより大きい最小の素数の両者が見つかりました
// 距離の近い方が
// 最も近い素数です
return GetNearInt(m1, m2, n);

}
}


// 引数に一番近い素数をかえす
int main(int argc, char* argv[])
{
int n;

// 引数は"プログラム名", "整数"の2個でなければ
// なりません
if (argc < 2)
{
printf("usage : prime [Number]\n");
return -1;// エラーとします
}

// 引数はargv[]で渡されます
// argv[0] : プログラム名(prime)
// argv[1] : 整数(を表す文字列)
// 入力ミスでargv[1]に整数以外が渡される可能性も
// あります

// 文字列を整数に変換します
// いろんな方法がありますが
// scanf()が最も汎用性があります
// atoi()でも実装できます
// ただし、atoi()は変換できない場合は0を戻します
// 0を正しく変換できた場合も同じ0で区別できない
// 弱点があります
// その分速いです
// 今回は0がエラーなのでatoiを採用します
// 0も正しいデータとして扱いたい場合
// atoi()は使えないのでscanf()を用います
n = atoi(argv[1]);
if (n <= 0)
{
printf("usage : prime [Number]\n");
printf("Numberは自然数でなければなりません。\n");
return -1;
}

n = GetNearPrime(n);
printf("最も近い素数は %d です。\n", n);

return n;
}
    • good
    • 0

>たとえ先生に聞いたとしても難しく説明されてよくわかりません。


で、難しく説明されて、あなたはどうしたのでしょうか?
わかったふうな顔をして、そのまま帰ってきたのでしょうか?

わからないなら、わからないと言わないと、先生も立場がないです。
わからないと言ってくれれば、どこからわからないのかを探りながら教えることもできます。

>大まかに言ってしまえば先ほどのすべてに該当します。
ということは、Hellow Worldすらわからないのでしょうか。
その段階では明日までに素数を返す関数を書くのは非常に難しいと思われます。
ただの課題ならまだしも、発表ということは、その場で突っ込みをうける可能性が大でしょう。そうなると、人の回答の丸写しではより大きな恥をかくのが目に見えてます。

もう夕方ですが、もう一度先生に相談することをおすすめします。

これが、あと一週間、いや3日もあるんだったら、こんな掲示板でもなんとかなるかもしれませんが、明日までというのでは無理ですねぇ。
    • good
    • 0

こんにちは。



 下記サイトをご参照下さい。
  http://www.sgnet.co.jp/c/8-1.htm
  C言語の関数の作り方を順を追って書いてあります。
  1.mainで書いて見る。(p1前半)
  2.関数にする。(p1後半)
  3.関数から戻り値を受け取れるようにする。(p3)

では。
    • good
    • 0

答えを丸ごと書いたら「課題」の勉強にはならないので。



>書き方が全く分からない上に、
・関数の定義がわからない
・素数を求める方法がわからない
・それ以前にC言語そのものがわからない
のいずれでしょうか?

>たとえ先生に聞いたとしても難しく説明されてよくわかりません。
というのは質問の仕方に問題があると思います。
「何がどうわからないのか」をきちんと説明できていますか?
この質問文からは上記のいずれとも取れますよ。
質問者さんが「わからない」のはどの部分ですか?

この回答への補足

いろいろと不備があって申し訳ありません。
大まかに言ってしまえば先ほどのすべてに該当します。
まず何をして、次にこれをして、という流れもわからない上に、
仮に完成したプログラムを見せられて、ここでこれがこうなっているからこういった結果になる、という説明もできません。
これが現状なのですが…

補足日時:2009/05/26 16:03
    • good
    • 0

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

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

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

QJavascriptからJSPファイル(~.jsp)を起動する時、引数

JavascriptからJSPファイル(~.jsp)を起動する時、引数を渡したい。また、jspファイル終了後、jspからのリターン値(もくしは引数)をjavascriptで参照したい。
 ※要するに javasript → jsp 起動
 起動jspファイル終了時、javascript側でjspファイルの処理結果を判定したい。

どうすれば良いですか?

Aベストアンサー

要するに、JAVSCRIPTを使って、サーバーサイドのJSPとAJAX(非同期通信)
するという意味ですかねえ?
 それなら、PHPやCGIの場合とあまりちがわないと思うんですが...
あまりくわしくないですが、
HTML(JAVASCRIPT)側からPOST、GET要求したデーターは、
JSP側は
 「request.getParameter(java.lang.String name)」
で受け取れます。
逆にheader指定は、
<%@ page contentType="text/html; charset=utf-8" %>
で、出力は
<% out.print(hoge); %>とか<%= hoge %>
みたいに、ASPやPHPとかまあ、みんな同じようなもんですね。
ヒアドキュメントもあるのかな。

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()等の標準関数についてのプロトタイプ宣言なども書かれています。

QhtmlまたはJavascriptからファイルを引数つきで起動する。

htmlまたはJavascriptからファイルを引数つきで起動する。

マクロ(macro.xls)に引数(csvファイル名)を渡して起動させたいため、
vbsを作成してマクロを引数つきで実行するようにしました。

コマンドからは
>test.vbs /FILE:macro.xls /P:aaa.csv

でマクロを実行することができたのですが、

HTMLにリンクを張り、リンクをクリックすることで
vbsを引数つきで実行するにはどうすればよいでしょうか?
(Javascriptを経由しても構いません)

Aベストアンサー

当然、Windows IE限定のお話ですよね。

どおしてもHTMLでやりたいなら、test.vbsなんて余計な物を作らずに、
直接javascript(MsのJscript)のActiveXオブジェクトを使って、
直接ExcelApplicationオブジェクトを作って、Excelオブジェクト
のクラスメソッドを使って、ファイルの読み込み、マクロの実行を
すればよいんじゃないかと、Excelオブジェクトをシームレスで動かせば、
Excelを見せなくして、マクロ実行だけこっそりさせる事も出来ます。

※だから、セキュリティ制限が厳しいのです。IEで、信頼済みサイトに登録する
必要があります。


<body>
----------
<p>
<a name="button_no_kawari" onclick="Excel_open('xxx.xls');return false;">
エクセルを実行</a>
</p>
----------
<script type="text/javascript">
<!--
 function Excel_open(pgm_name){
  var pgm_path = "c:/プログラム/";
  var file_name = pgm_path + pgm_name;
  var Excel = new ActiveXObject("Excel.Application");
  Excel.Visible = true;
  Excel.Workbooks.Open(file_name,0,"true"); 
  Excel.Workbooks(pgm_name).Sheets("Menu").Activate;
 //他にもいろいろExcelを操作出来る
  Excel.Application.Run("main"); //<=マクロ"main"実行
  Excel = "";
 }
// -->
</script>
</body>

当然、Windows IE限定のお話ですよね。

どおしてもHTMLでやりたいなら、test.vbsなんて余計な物を作らずに、
直接javascript(MsのJscript)のActiveXオブジェクトを使って、
直接ExcelApplicationオブジェクトを作って、Excelオブジェクト
のクラスメソッドを使って、ファイルの読み込み、マクロの実行を
すればよいんじゃないかと、Excelオブジェクトをシームレスで動かせば、
Excelを見せなくして、マクロ実行だけこっそりさせる事も出来ます。

※だから、セキュリティ制限が厳しいのです。IEで、信頼済みサイト...続きを読む

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を置き換...続きを読む

QJavaScriptの関数の引数省略について

JavaScriptの関数で、下記のような引数の省略はできるでしょうか?

【例】

function hoge(aaa, bbb){}

hoge(,"できるかな");←このような引数の省略はできるでしょうか?

--------------------

しらべてみると、引数が2つあった場合、後方の引数の省略はできることがわかりました。

【例】
hoge("できるかな");←この場合できます。


しかし、引数が2つあった場合、前方の引数省略の例は見つけることができませんでした。
前方の引数を省略することはできるのでしょうか?
よろしくお願いします。

Aベストアンサー

>hoge(,"できるかな");

そういう引数の省略をする言語もありますが、javascriptでは
文法上間違っているのでエラーで処理されます

どうしてもやりたいならnullでも与えてあげてください
(まぁ省略になっていないですが・・・)

hoge(null,"できるかな");

あとは姑息に無理やり配列で渡すなどすれば似たようなことは
できないことはないですが、あまりお勧めはできません。

<script>
function func(){
var a=arguments[0][0];
var b=arguments[0][1];
document.write("1st:"+a+"<br>");
document.write("2nd:"+b+"<br>");
}
func(["hoge","fuga"]);
func([,"piyo"]);
</script>

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からプログラムが動き...続きを読む

Qjavascriptに引数を渡す方法について

お世話になります、
javascriptに下記のように引数を渡して
表示したいのですがうまくいきません。
<script language="javascript">
function dispData(msg)
{
document.write(msg);
}
</script>

$a = "hoge";
echo "<a href='#' onclick='javascript:dispData($a)'>" . $a . "</a><br>";
とすると動作してくれません。
$aをシングルコートで囲っても同じです。
$a = "/hoge/";をやると/hoge/を表示されます。
コーディングの方法を教えて頂きたいのですが。
dispData()に引数を渡して処理を行いたいもので。
よろしくお願い致します。

Aベストアンサー

document.writeする意味がわかりませんが・・・
きちんとクォーテーションをつけてやればわたりませんんか?

<script language="javascript">
function dispData(msg){
alert(msg);
}
</script>
<?
$a = "hoge";
echo "<a href='#' onclick='javascript:dispData(\"$a\")'>" . $a . "</a><br>";
?>

Q引き数がポインタでない関数の戻り値はなぜint型なのか?

最近、疑問に思っていることがあって質問したいんですが、一般的にc言語
で使われる関数っていうのは、引き数としてポインタをとる関数以外は全て
戻り値はint型なのですがこれはなぜでしょう。私自身の結論としては、も
し関数の戻り値がchar型だとしたらchar型で表せる範囲の値は全てasciiコー
ドとして使われているので、もしエラーがあって戻り値としてEOF(-1)を返す
際に1byteでは同じビット配列になる255が既に使われていてEOFとして-1を定
義できないために、-1と255が同じビット配列ではない1byte以上のデータ型
つまりint型(たぶん、int型がコンピュータが一番効率良く処理できるデータ型なのでたぶんint型を使ったと思いますが)を使ったのではないかと言う
結論に達したのですがこれは正しいのでしょうか。どなたか御教授お願い致
します。

Aベストアンサー

「一般的」とあるのは、「標準ライブラリが大体そうなっているから」と
いうことですよね。

今の C というのは ANSI というところで定められた規格に則っているもの
がほとんどなんですが、その規格以前から C はありました。そのときには
void という型が無かったので、特に関数の戻り値が必要ではない関数でも
何か戻り値を指定する必要がありました。なので、

> int型がコンピュータが一番効率良く処理できるデータ型なので

という判断は、ある意味正しいです。

また、char型云々の話は、fgetc() の戻り値が int である理由として
良く言われることです。

ただ、「一般的に」の範囲次第なのですが、そうではない関数も
標準としてあります。例えば、メモリの動的割り当てを扱う malloc() は
void* ですし、それで獲得したメモリの開放を行う free() は void です。

また、成功した/しないだけが分かれば十分な関数では、いわゆる「論理型」
と呼ばれる型で十分なのですが、ちょっと前の C の規格では、その型が無い
ので、効率よく扱える int を戻り値にしている、ということもあります。

ぐだぐだ書きましたが、int が整数を効率的に扱える型だから、という
考え方は概ねあっています。

「一般的」とあるのは、「標準ライブラリが大体そうなっているから」と
いうことですよね。

今の C というのは ANSI というところで定められた規格に則っているもの
がほとんどなんですが、その規格以前から C はありました。そのときには
void という型が無かったので、特に関数の戻り値が必要ではない関数でも
何か戻り値を指定する必要がありました。なので、

> int型がコンピュータが一番効率良く処理できるデータ型なので

という判断は、ある意味正しいです。

また、char型云々の話は、fgetc...続きを読む

Qjavascript外部読み込みの際の引数

教えてください。

HTML内で以下のように ?ver=12 と引数付きでjavascriptを読み込みます。
<script type="text/javascript" src="hoge.js?ver=12"></script>


このver=12をhoge.js内で利用するにはどうやって取得したらよいでしょうか?



※画像等のキャッシュの制御のためにバージョンナンバーをつけて管理します。

Aベストアンサー

一例です。

(function(){
var sc = document.getElementsByTagName("script");
var ver = sc[sc.length-1].src.match(/\?ver=(\d+)$/);
if(ver) ver = ver[1];
alert(ver);
})();

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。


人気Q&Aランキング