C/C++の宿題を片付けます 96代目
■ このスレッドは過去ログ倉庫に格納されています
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
【過去ログ検索】 http://chomework.sakura.ne.jp/
【wiki】 http://www23.atwiki.jp/homework/
【前スレ】
C/C++の宿題を片付けます 95代目
http://pc11.2ch.net/test/read.cgi/tech/1187944110/
0002デフォルトの名無しさん
2007/09/21(金) 09:06:170003 ◆YpQ/fINFLk
2007/09/21(金) 17:43:40[2] 問題文(含コード&リンク):
エラトステネスの篩の公式を用い、自然数nまでの素数を全て表示するさいに、1〜nまでに求めた素数を格納しておき、それを用いて素数か否かを判別せよ。
(20を素数か判別するときは、それまでに格納した2,3,5,7,11,13,17,19の√20以下の2,3で割る)
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0
[3.3] 言語: C++
[4] 期限: 9月25日まで
[5] その他の制限:素数に対する、習っていない特殊なincludeや関数は仕様しない
口頭で出された課題なので、問題文等分かりにくかったらすいません。
0004デフォルトの名無しさん
2007/09/21(金) 18:10:51�@エラトステネスのふるいを使って、nまでのすべての素数を表示する
�Anが素数かどうか判定する(ただしその際、�@で求めた素数リストを利用する)
ということか??
0005 ◆YpQ/fINFLk
2007/09/21(金) 19:15:36�@の表示するときの段階にも�Aを行うみたいな感じです。
素数リストを作る。
そのさい、次の数を判定するのに今まで求めた素数を使用する。
仮にnが100のときは
10の時点の判別には、今まで求めた(格納した) 2〜√10までの素数を用い、
100の時は、2〜√100までの素数を用いるということです。
まだ少し分かり辛いですが、よろしくお願いします。
0006デフォルトの名無しさん
2007/09/21(金) 19:41:39何を習っていて何を習っていないのかがわからん
0007 ◆YpQ/fINFLk
2007/09/21(金) 20:10:43includeに関しては、
#include <stdio.h>
#include <math.h>
使用するものは、この二つのみだと思います。
授業範囲は、配列程度までなのでデータを配列に格納しつつfor文やIf文で使って作れという課題だと思います。
0008デフォルトの名無しさん
2007/09/21(金) 20:19:04>>5 の例だと、n = 100 は 2 が素数だと分かった瞬間に
ふるい落とされるから、>>5 みたいな動作はしないよ?
そういう素数を逐次格納して試し割るアルゴリズムは
ふるい型のアルゴリズムとは呼ばない。
0009 ◆YpQ/fINFLk
2007/09/21(金) 20:41:03勉強不足、申し訳ありませんorz
素数関係もプログラムも初心者なもので、1〜√nがどうとか聞いてるうちに、勘違いしていたようです。
・「素数を逐次格納して試し割るアルゴリズム」
これが課題で、間違いないと思います。
分かりやすい説明ありがとうございます。
0010デフォルトの名無しさん
2007/09/21(金) 20:48:52#define n 100
int main() {
int primes[n+1], pnum = 0;
int i, x;
for (x = 2; x <= n; ++x) {
for (i = 0; i < pnum; ++i) {
if (x % primes[i] == 0) break;
}
if (i == pnum) primes[pnum++] = x;
}
for (i = 0; i < pnum; ++i) {
printf("%d\n", primes[i]);
}
}
0011 ◆YpQ/fINFLk
2007/09/21(金) 21:15:59ありがとうございました。
自宅にはC++がないので、明日にでも学校で試してみます。
0012デフォルトの名無しさん
2007/09/21(金) 21:47:02携帯しか持っていないってことなら仕方ないが
0013デフォルトの名無しさん
2007/09/21(金) 21:49:550014デフォルトの名無しさん
2007/09/22(土) 00:01:000015デフォルトの名無しさん
2007/09/22(土) 00:55:08#include <stdio.h>
#define N 100
int main(void)
{
int prime[N], i, j, cnt = 0;
prime[cnt++] = 2;
for(i=3; i<=N; i++) {
int flag = 0;
for(j=0; prime[j]*prime[j]<=i; j++) {
if(i%prime[j]==0) {
flag = 1;
break;
}
}
if(flag==0) prime[cnt++] = i;
}
for(i=0; i<cnt; i++) printf("%d ", prime[i]);
return 0;
}
0016デフォルトの名無しさん
2007/09/22(土) 03:44:00[1] 授業単元: プログラミング(2)
[2] 問題文(含コード&リンク):
「電卓」をC言語で作成せよ。
ただし、1語のレジスタ、1語のメモリを持つように作成し、
以下の条件を満たすようにする。
(1) n+m=,n-m=,n*m=,n/m=と入力することで四則演算ができる。
(2) M+,M-と入力することで演算結果をメモリに加減算する。
(3) MRと入力することでメモリの内容をレジスタに読み出す。
(4) RCの入力でレジスタのクリア、MCの入力でメモリのクリアをする。
(5) メモリ上の値との計算は MR+n=,MR*m=といったように入力することで可能にする。
(6) end: が入力されるまでプログラムは終了せず、
再度演算ができるように入力待ち状態にする。
(7) 連続した計算は左順に計算する仕様でよい。n-m/a=は(n-m)/aという計算順でよい。
(8) 数字、計算符号および(1)〜(7)までに設定した命令文字(end:など)以外が入力された場合、
「エラー」と出力し、再度演算が出来るようにエラー処理を入れる。
以上
[3] 環境
[3.1] OS: (Linux)
[3.2] コンパイラ名とバージョン: (gcc )
[3.3] 言語: (C)
[4] 期限: ([07年9月23日まで] )
[5] その他の制限:とくに制限はありません。
掛け、割りの計算順序を考えなくていいから簡単だと先生は言っていましたが、
その前にレジスタとメモリの概念が??です。
とにかく「一時的に値を保持する場所を作る」がポイントと聞きました。
みなさんこの問題についてどうぞよろしくお願いします。
0017デフォルトの名無しさん
2007/09/22(土) 04:11:07[2] 問題文(含コード&リンク):
ICU4Cを用いて、和暦変換する関数を作成せよ。
(例)
2007,9,1 → 平成19年9月1日
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: (gcc 3.4)
[3.3] 言語: C++
[4] 期限:[無期限]
[5] その他の制限: ないです。
0018デフォルトの名無しさん
2007/09/22(土) 07:10:29http://www.mozilla-japan.org/
シンプル プログミング ツール
http://proforceone.web.fc2.com/
素因数分解サンプルプログラム
Calculation processing にコピーして[RUN]
A=2*3*5*11*13*17*19;
x=A;write(" "+x+" ⇒");
for(i=2;x>=i;i++){if(0==x%i){k=0;
for(j=2;(i>=j)&&(1>=k);j++){
if(0==i%j){k++;}
} if(1==k){write(" "+i);}
}}
0019デフォルトの名無しさん
2007/09/22(土) 08:51:27// http://www.mozilla-japan.org/
// シンプル プログミング ツール
// http://proforceone.web.fc2.com/
// 素因数分解サンプルプログラム
// Calculation processing にコピーして[RUN]
MAX=1000;br();
for(x=2;MAX>=x;x++){write(" "+x+" ⇒");
for(i=2;x>=i;i++){if(0==x%i){k=0;
for(j=2;(i>=j)&&(1>=k);j++){
if(0==i%j){k++;}
} if(1==k){write(" "+i);}
}} br();
} br();
0020デフォルトの名無しさん
2007/09/22(土) 11:08:18[2] 問題文(含コード&リンク):四則(加減乗除)演算を関数としてもっているプログラム。
実数と整数の両方に対応し、式と結果を表示する。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:Borland C++ Compiler 5.5
[3.3] 言語:C言語
[4] 期限:2007/09/27(木)
[5] その他の制限:関数,scanfを使います。
よろしくお願いします。
0021デフォルトの名無しさん
2007/09/22(土) 13:45:45[2] 問題文(含コード&リンク):
3つ読み込み全て等しいか2つ等しいか全て異なるかを表示せよ。
[3] 環境
[3.1] OS: Win Bcc32 C
[4] 期限:[無期限]
[5] その他の制限: ないです。
0022デフォルトの名無しさん
2007/09/22(土) 13:47:090023デフォルトの名無しさん
2007/09/22(土) 13:49:290024デフォルトの名無しさん
2007/09/22(土) 13:51:07数字です
0025デフォルトの名無しさん
2007/09/22(土) 13:59:400026デフォルトの名無しさん
2007/09/22(土) 14:00:04int main(void)
{
int a, b, c;
char *p[] = {"全て異なる", "2つ等しい", "", "全て等しい"};
scanf("%d%d%d", &a, &b, &c);
printf("%s", p[(a==b) + (b==c) + (c==a)]);
return 0;
}
0027デフォルトの名無しさん
2007/09/22(土) 14:02:160028デフォルトの名無しさん
2007/09/22(土) 14:05:59int main(void)
{
int no1,no2,no3;
printf("A:"); scanf("%d",&no1);
printf("B:"); scanf("%d",&no2);
printf("C:"); scanf("%d",&no3);
if (no1==no2 && no2==no3)
printf("三つは同じです。");
else if (no1==no2 || no2==no3 || no1==no3)
printf("二つは同じです。");
else
printf("三つとも違います。");
return (0);
}
0029デフォルトの名無しさん
2007/09/22(土) 15:26:13[2] 問題文:
階上n!(nは0以上の整数)は、以下のように再帰的に定義されている。
n!=n*(n-1) , 0!=1
この式を参考に、再起呼び出し用いて0以上の整数nを受け取りn!を返す
関数int Factorial(int n)を作り、n!を求めるプログラムを作成せよ。
また、再帰の動作がわかる表示を行い
表示を用いて再帰関数の呼び出される順序を説明せよ。
[3] 環境
[3.1] OS:UNIX
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C言語
[4] 期限: 2007年9月24日
[5] その他の制限:特にないです
再帰の動作を表示させないものは書けるのですが
どうしても表示を用いて
再帰関数の呼び出される順序がうまくいきません。
どうがよろしくお願いします。
0030デフォルトの名無しさん
2007/09/22(土) 15:54:45> 再帰の動作を表示させないものは書けるのですが
見せて
0031デフォルトの名無しさん
2007/09/22(土) 16:26:00#include <stdio.h>
int indent;
int f( int in )
{
int i, ret;
indent++;
for( i = 0; i < indent; i++ )
printf( " " );
printf( "f( %d )\n", in );
if( in == 0 )
ret = 1;
else
ret = in * f( in - 1 );
for( i = 0; i < indent; i++ )
printf( " " );
printf( "return %d\n", ret );
indent--;
return ret;
}
int main( void )
{
int in = 9;
indent = 0;
printf( "%d! = %d\n", in, f( in ) );
return 0;
}
0032デフォルトの名無しさん
2007/09/22(土) 16:58:41[2] 問題文:
2つの整数を読み込んで、それらの値の差が10以下か11以上かを表示プログラムを作れ。ただし、論理OR演算子を使うこと。
[3] 環境
[3.1] OS:UNIX
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C言語
[4] 期限: 2007年9月24日
[5] その他の制限:特にないです
0033デフォルトの名無しさん
2007/09/22(土) 17:00:2910以下の場合「差は10以下」と表示し、11以上なら「差は11以上」と表示する。
0034デフォルトの名無しさん
2007/09/22(土) 17:04:51003532
2007/09/22(土) 17:05:05int main(void)
{
int no1,no2,sa;
printf("A:"); scanf("%d",&no1);
printf("B:"); scanf("%d",&no2);
if (no1>no2)
sa=no1-no2;
else
sa=no2-no1;
if (sa<=10)
printf("それらの差は10以下です。");
else
printf("それらの差は11以上です。");
return (0);
}
ここまでできたんですが、
>ただし、論理OR演算子を使うこと。
の論理OR演算子||をどこで使うのかが分かりません。
お願いします。
0036デフォルトの名無しさん
2007/09/22(土) 17:05:52教科書には、単に「差」と出ています。
0037デフォルトの名無しさん
2007/09/22(土) 17:10:14if(no1-no2<=10 || no2-no1<=10)
0038デフォルトの名無しさん
2007/09/22(土) 17:11:29int main(void)
{
int no1,no2,sa;
printf("A:"); scanf("%d",&no1);
printf("B:"); scanf("%d",&no2);
sa=no1-no2;
if (sa > 10 || sa < -10)
printf("それらの差は11以上です。");
else
printf("それらの差は10以下です。");
return (0);
}
0039デフォルトの名無しさん
2007/09/22(土) 17:12:07これ要らんだろ。
普通に前者から後者を引けば良い。
0040デフォルトの名無しさん
2007/09/22(土) 17:12:40面白すぎ
0041デフォルトの名無しさん
2007/09/22(土) 17:14:14オレだけど
0042デフォルトの名無しさん
2007/09/22(土) 17:14:18なにこれ?
0043デフォルトの名無しさん
2007/09/22(土) 17:14:40?
0044デフォルトの名無しさん
2007/09/22(土) 17:15:20sa = no1 - no2;
if( sa < -10 || 10 < sa ) puts("11以上");
else puts("10以下");
0045デフォルトの名無しさん
2007/09/22(土) 17:16:550046デフォルトの名無しさん
2007/09/22(土) 17:17:58>sa < -10
これどういう意味?
0047デフォルトの名無しさん
2007/09/22(土) 17:19:030048デフォルトの名無しさん
2007/09/22(土) 17:19:54じゃないの?
0049デフォルトの名無しさん
2007/09/22(土) 17:21:02中学生からやり直せ
0050デフォルトの名無しさん
2007/09/22(土) 17:21:53算数では引き算は必ずプラスの値なんだっけ?
0051デフォルトの名無しさん
2007/09/22(土) 17:23:48printf("それらの差は%dで10以下です。",sa);
else
printf("それらの差は%dで11以上です。",sa);
0052デフォルトの名無しさん
2007/09/22(土) 17:24:47sa>=-10
0053デフォルトの名無しさん
2007/09/22(土) 17:25:42-10 より saが小さい
よりと以上の違いが分からないなら数学止めた方が良いよ
0054デフォルトの名無しさん
2007/09/22(土) 17:25:480055デフォルトの名無しさん
2007/09/22(土) 17:25:52バカすぎ
0056デフォルトの名無しさん
2007/09/22(土) 17:27:32&&
0057デフォルトの名無しさん
2007/09/22(土) 17:28:08一応まともに答えてる38と44は除外してやれよw
0058デフォルトの名無しさん
2007/09/22(土) 17:28:330059デフォルトの名無しさん
2007/09/22(土) 17:32:43if (sa<=10 || 0)
でおk
0060デフォルトの名無しさん
2007/09/22(土) 17:33:25else
printf("それらの差は%dで11以上です。",sa);
の順でやって。
0061デフォルトの名無しさん
2007/09/22(土) 17:35:24-1と-4は、-1のほうが大きい。
0062デフォルトの名無しさん
2007/09/22(土) 17:37:02||を使えってのにその順番はないだろ
0063デフォルトの名無しさん
2007/09/22(土) 17:41:290064デフォルトの名無しさん
2007/09/22(土) 17:43:56差の値を表示しろなんて、元の問題文にも>>35にもないわけだが。
0065デフォルトの名無しさん
2007/09/22(土) 17:50:56int sa = no1 - no2;
if(sa==-10||sa==-9||sa==-8||sa==-7||sa==-6||sa==-5||sa==-4||sa==-3||sa==-2||sa==-1||sa==0
||sa==1||sa==2||sa==3||sa==4||sa==5||sa==6||sa==7||sa==8||sa==9||sa==10)
0066デフォルトの名無しさん
2007/09/22(土) 17:54:490067デフォルトの名無しさん
2007/09/22(土) 17:56:050068デフォルトの名無しさん
2007/09/22(土) 18:03:080069デフォルトの名無しさん
2007/09/22(土) 18:03:330070デフォルトの名無しさん
2007/09/22(土) 18:06:21せめて中学卒業してからおいで
007129
2007/09/22(土) 18:08:29>>30 >>31
返信が遅くなってすみません。
一応こんな感じで書いて動作はしました。
#include<stdio.h>
int Factorial(int n);
int main(void)
{
int n;
printf("自然数を入力して下さい:");
scanf("%d",&n);
printf("%dの階乗は,%dです。\n",n,Factorial(n));
return 0;
}
int Factorial(int n)
{
printf("関数Factorial(%d)にはいりました。\n",n);
if(n>0)
{
return n*Factorial(n-1);
}
else
{
return 1;
}
}
0072デフォルトの名無しさん
2007/09/22(土) 18:09:05良かったね。さようなら。
0073デフォルトの名無しさん
2007/09/22(土) 18:10:11それで十分な気もするが
0074デフォルトの名無しさん
2007/09/22(土) 18:16:05if (sa>=11 || sa<=-11)
これでOK
0075デフォルトの名無しさん
2007/09/22(土) 18:18:24printf("それらの差は%dで11以上です。",sa);
else
printf("それらの差は%dで10以下です。",sa);
0076デフォルトの名無しさん
2007/09/22(土) 18:21:56そんなにバカな答え書いてバカにされたのが悔しかったのか
0077デフォルトの名無しさん
2007/09/22(土) 18:23:14「それらの差」がマイナスの表示になってもいいの?
0078デフォルトの名無しさん
2007/09/22(土) 18:23:160079デフォルトの名無しさん
2007/09/22(土) 18:23:30008029
2007/09/22(土) 18:27:04これ以外に関数Factorial(n)から出ます:Factorial(n)=再帰の途中経過
見たいなのを表示しなければならないんですよ・・・
どこに入れたら表示させらるのか分からないので教えてもらえませんか?
よろしくお願いします
0081デフォルトの名無しさん
2007/09/22(土) 18:28:130082デフォルトの名無しさん
2007/09/22(土) 18:29:410083デフォルトの名無しさん
2007/09/22(土) 18:29:46int Factorial(int n)
{
int ret;
printf("関数Factorial(%d)にはいりました。\n",n);
ret = n > 0 ? Factorial(n-1) * n : 1;
printf("関数Factorial(%d)は%dを返して終了します\n",n, ret);
return ret;
}
こんな感じでどうよ?
■ このスレッドは過去ログ倉庫に格納されています