トップページ⇒tech
1001コメント425KB

C/C++の宿題を片付けます 96代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG?2BP(12)
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。

【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。

【質問テンプレ】
[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:17
>>1 乙
0003 ◆YpQ/fINFLk 2007/09/21(金) 17:43:40
[1] 授業単元: 応用演習3
[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
>[5] その他の制限:素数に対する、習っていない特殊なincludeや関数は仕様しない
何を習っていて何を習っていないのかがわからん
0007 ◆YpQ/fINFLk 2007/09/21(金) 20:10:43
たびたび、すいません。
includeに関しては、
#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
>>8
勉強不足、申し訳ありませんorz

素数関係もプログラムも初心者なもので、1〜√nがどうとか聞いてるうちに、勘違いしていたようです。

・「素数を逐次格納して試し割るアルゴリズム」

これが課題で、間違いないと思います。
分かりやすい説明ありがとうございます。
0010デフォルトの名無しさん2007/09/21(金) 20:48:52
>>9
#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
>>10
ありがとうございました。
自宅にはC++がないので、明日にでも学校で試してみます。
0012デフォルトの名無しさん2007/09/21(金) 21:47:02
自宅でwebにアクセスできる環境があるならついでにC++ソースをコンパイルできるように環境を整えておけ
携帯しか持っていないってことなら仕方ないが
0013デフォルトの名無しさん2007/09/21(金) 21:49:55
てかC++というよりCだよな
0014デフォルトの名無しさん2007/09/22(土) 00:01:00
「C++がない」ってのはVC++のことを言っているんだと思うよ、たぶん。
0015デフォルトの名無しさん2007/09/22(土) 00:55:08
>>9
#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
[1] 授業単元:
[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:29
エラー デバッグ ブラウザ ツール
http://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
1] 授業単元:プログラミング技術
[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
[1] 授業単元:C
[2] 問題文(含コード&リンク):
3つ読み込み全て等しいか2つ等しいか全て異なるかを表示せよ。
[3] 環境
 [3.1] OS: Win Bcc32 C
[4] 期限:[無期限]
[5] その他の制限: ないです。
0022デフォルトの名無しさん2007/09/22(土) 13:47:09
何を3つ読み込むんだよ
0023デフォルトの名無しさん2007/09/22(土) 13:49:29
本
0024デフォルトの名無しさん2007/09/22(土) 13:51:07
>>22
数字です
0025デフォルトの名無しさん2007/09/22(土) 13:59:40
読み込み方は?
0026デフォルトの名無しさん2007/09/22(土) 14:00:04
#include <stdio.h>
int 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:16
なんじゃそりゃ
0028デフォルトの名無しさん2007/09/22(土) 14:05:59
#include <stdio.h>
int 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
1] 授業単元: データ構造
[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
>>29
> 再帰の動作を表示させないものは書けるのですが

見せて
0031デフォルトの名無しさん2007/09/22(土) 16:26:00
>>29 こんな感じか?
#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
[1] 授業単元: C
[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:29
>>32に追加。
10以下の場合「差は10以下」と表示し、11以上なら「差は11以上」と表示する。
0034デフォルトの名無しさん2007/09/22(土) 17:04:51
純水に差?それとも差の絶対値?
0035322007/09/22(土) 17:05:05
#include <stdio.h>
int 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
>>34
教科書には、単に「差」と出ています。
0037デフォルトの名無しさん2007/09/22(土) 17:10:14
こういうこと?
if(no1-no2<=10 || no2-no1<=10)
0038デフォルトの名無しさん2007/09/22(土) 17:11:29
#include <stdio.h>
int 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
>if (no1>no2)
これ要らんだろ。

普通に前者から後者を引けば良い。
0040デフォルトの名無しさん2007/09/22(土) 17:12:40
>>37
面白すぎ
0041デフォルトの名無しさん2007/09/22(土) 17:14:14
>>37 はダメだな
オレだけど
0042デフォルトの名無しさん2007/09/22(土) 17:14:18
>>37
なにこれ?
0043デフォルトの名無しさん2007/09/22(土) 17:14:40
>>37
?
0044デフォルトの名無しさん2007/09/22(土) 17:15:20
// こういうことだと思われ
sa = no1 - no2;
if( sa < -10 || 10 < sa ) puts("11以上");
else puts("10以下");
0045デフォルトの名無しさん2007/09/22(土) 17:16:55
暇人多くてワロタ
0046デフォルトの名無しさん2007/09/22(土) 17:17:58
>>38
>sa < -10
これどういう意味?
0047デフォルトの名無しさん2007/09/22(土) 17:19:03
-10よりsaが小さい場合1
0048デフォルトの名無しさん2007/09/22(土) 17:19:54
sa <= -10
じゃないの?
0049デフォルトの名無しさん2007/09/22(土) 17:21:02
>>48
中学生からやり直せ
0050デフォルトの名無しさん2007/09/22(土) 17:21:53
あれ、マイナス習うのって中学生だっけ?
算数では引き算は必ずプラスの値なんだっけ?
0051デフォルトの名無しさん2007/09/22(土) 17:23:48
if (sa<=10 || sa<=-10)
printf("それらの差は%dで10以下です。",sa);
else
printf("それらの差は%dで11以上です。",sa);
0052デフォルトの名無しさん2007/09/22(土) 17:24:47
>>51
sa>=-10
0053デフォルトの名無しさん2007/09/22(土) 17:25:42
>>48
-10 より saが小さい
よりと以上の違いが分からないなら数学止めた方が良いよ
0054デフォルトの名無しさん2007/09/22(土) 17:25:48
質問者と回答者のレベルがほとんど同じだな
0055デフォルトの名無しさん2007/09/22(土) 17:25:52
>>51-52
バカすぎ
0056デフォルトの名無しさん2007/09/22(土) 17:27:32
>>52
&&
0057デフォルトの名無しさん2007/09/22(土) 17:28:08
>>54
一応まともに答えてる38と44は除外してやれよw
0058デフォルトの名無しさん2007/09/22(土) 17:28:33
アホ回答してるの>>37だろ。
0059デフォルトの名無しさん2007/09/22(土) 17:32:43
>>35
if (sa<=10 || 0)
でおk
0060デフォルトの名無しさん2007/09/22(土) 17:33:25
printf("それらの差は%dで10以下です。",sa);
else
printf("それらの差は%dで11以上です。",sa);
の順でやって。
0061デフォルトの名無しさん2007/09/22(土) 17:35:24
-1,-2,-,3-,4
-1と-4は、-1のほうが大きい。
0062デフォルトの名無しさん2007/09/22(土) 17:37:02
>>60
||を使えってのにその順番はないだろ
0063デフォルトの名無しさん2007/09/22(土) 17:41:29
A&B = not(not A | not B)
0064デフォルトの名無しさん2007/09/22(土) 17:43:56
>>60
差の値を表示しろなんて、元の問題文にも>>35にもないわけだが。
0065デフォルトの名無しさん2007/09/22(土) 17:50:56
>>60
int 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:49
if((unsigned int)(sa+10) <= 20)
0067デフォルトの名無しさん2007/09/22(土) 17:56:05
どうでもいいけど、「それらの値の差」って言ったら一方の差の絶対値と解釈するよな
0068デフォルトの名無しさん2007/09/22(土) 18:03:08
絶対値って何?
0069デフォルトの名無しさん2007/09/22(土) 18:03:33
0からどれだけ離れているか。
0070デフォルトの名無しさん2007/09/22(土) 18:06:21
>>68
せめて中学卒業してからおいで
0071292007/09/22(土) 18:08:29
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
>>71
良かったね。さようなら。
0073デフォルトの名無しさん2007/09/22(土) 18:10:11
>>71
それで十分な気もするが
0074デフォルトの名無しさん2007/09/22(土) 18:16:05
>>35
if (sa>=11 || sa<=-11)


これでOK
0075デフォルトの名無しさん2007/09/22(土) 18:18:24
if (sa>=11 || sa<=-11)
printf("それらの差は%dで11以上です。",sa);
else
printf("それらの差は%dで10以下です。",sa);
0076デフォルトの名無しさん2007/09/22(土) 18:21:56
しつこいな
そんなにバカな答え書いてバカにされたのが悔しかったのか
0077デフォルトの名無しさん2007/09/22(土) 18:23:14
>>75
「それらの差」がマイナスの表示になってもいいの?
0078デフォルトの名無しさん2007/09/22(土) 18:23:16
絶対値?
0079デフォルトの名無しさん2007/09/22(土) 18:23:30
しつこさに思わず噴いた
0080292007/09/22(土) 18:27:04
71です。

これ以外に関数Factorial(n)から出ます:Factorial(n)=再帰の途中経過
見たいなのを表示しなければならないんですよ・・・

どこに入れたら表示させらるのか分からないので教えてもらえませんか?

よろしくお願いします
0081デフォルトの名無しさん2007/09/22(土) 18:28:13
しつこいぞ。スレ違い。
0082デフォルトの名無しさん2007/09/22(土) 18:29:41
どういう表示をさせたいの?
■ このスレッドは過去ログ倉庫に格納されています