ぼるじょあがC/C++の宿題を片づけますYO! 18代目

このエントリーをはてなブックマークに追加
942掛下:04/01/08 17:56
ふむ。
>>940
とりあえず1だけ。

#include <algorithm>
#include <iterator>
#include <functional>

template <typename Bi, typename Cmp>
void select_sort(Bi first, Bi last, Cmp cmp)
{
    for(; first != last; ++first) /* 1 */
    {
        Bi min = first; /* 1-1 */
        Bi cur = first;
        for(++cur; cur != last; ++cur) /* 1-2 */
            if(cmp(*cur, *min))
                std::swap(cur, min); /* 1-2-1 */
        std::iter_swap(min, first); /* 1-3 */
    }
}

template <typename Bi>
void select_sort(Bi first, Bi last)
{
    return select_sort(first, last, std::less<std::iterator_traits<Bi>::value_type>());
}
944デフォルトの名無しさん:04/01/08 19:00
よろしくお願いします!
キーボードから自然数 n を読み込んで、 '*' を用いて
高さが 2n-1 のダイヤモンドを実行例のように表示しなさい。

実行例

$ ./a.out
1
*
$ ./a.out
3
*
***
*****
***
*
$ ./a.out
5
*
***
*****
*******
*********
*******
*****
***
*
945944:04/01/08 19:03
すいません。上で実行図が三角形になってますが
ダイヤモンドです!
お願いします
>>944
#include <stdio.h>

void putcn(char c,int n) {
while(n-- > 0) putchar(c);
}

void print_diamond(int n) {
int i,spc,height = 2*n-1;
for(i=1;i<=height;i++) {
spc = n - i; if(spc<0) spc = -spc;
putcn(' ',spc);
putcn('*',height - spc*2);
putchar('\n');
}
}

int main() {
int n;
scanf("%d",&n);
print_diamond(n);
return 0;
}
948デフォルトの名無しさん:04/01/08 19:56
すいません>>795ので質問したものです。
>>802の解答をいただいた方のプログラムを実行したところ。下記のように
7のtansakuをすると5番目と表示、5のtansakuをすると0番目と表示されて
しまいます。教わっていただいて大変恐縮ですがどこをなおせばよいのか
わかりません。どこをなおせばよいかわかる方おしえてください
% tansaku
5
3
10
8
15
7
20
1
14
28

tansaku key−> 7
7 −−> 5番目× 7−−>6番目○
%

>>948
だから、わざわざ>>798で、添字は1ベースなのか、と訊いてたのにな。
添字はCでは0から始まるので、その出力は(添字を出力しろという問題に対して)
正しい。

>>802の出力部分のコメントに書いてあるけど、単純に1を足せ。
どこかに双方向リストの典型的な例みたいなものありませんか?
>>950
次スレよろ〜
953デフォルトの名無しさん:04/01/08 21:08
@n個の整数a1,a2,・・・aNを入力の引数として、小さい順(昇順)に並べて結果を
戻す外部サブルーチンsort(a)を作成する。nは個数、aは整数が入ってる配列である
だだしアルゴリズムは選択法を使う。
Aキーボードからデータを入力しそのデータが偶数か奇数かを判別して、奇数なら奇数
偶数なら偶数と出力するプログラムを作りなさいまた0が入力されたら終了するようにしなさい。
出来ればこの行で何をしているという説明があれば幸いです。
よろしくお願いします
954950:04/01/08 21:27
立てれなかったので↓の人おねがいしまつ
955デフォルトの名無しさん:04/01/08 21:32
よし!
956デフォルトの名無しさん:04/01/08 21:34
またぼるじょあでいいの?
>>953
/* 過剰説明付き選択ソート */
void selectsort(int a[],int n) { /* 引数aは並び替える配列 nは配列長 */
int i,j,key,min; /* 整数型変数i,j,key,minを宣言する */
for(i = 0;i < n - 1;i++) { /* 要素を順に着目していく */
min = a[i]; /* とりあえず着目している要素を最小値とする */
key = i; /* 最小値の要素の添字 */
for(j = i + 1;j < n;j++) /* 着目する要素より後の要素について */
if(a[j] < min) { min = a[j]; key = j; } /* より小さい値があれば最小値を更新 */
a[key] = a[i]; /* 着目する要素の値を最小値のある要素に入れ */
a[i] = min; /* 着目する要素の値は最小値とする(つまり、交換する) */
}
}
/* 過剰説明付き奇偶判定 */
#include <stdio.h> /* 標準入出力ライブラリ用ヘッダを読み込む */

int main() { /* main関数 */
int i; /* 整数型変数iを宣言する */
while(1) { /* 条件が真の間繰り返す。条件が1なので、無限に繰り返す */
printf("数字を入力してください\n"); /* メッセージを表示 */
scanf("%d",&i); /* 変数iに標準入力からの入力を数値に変換して代入する */
if( i % 2 == 0) /* iの値を2で割ったときの剰余が 0 なら */
printf("%dは偶数\n",i); /* iの値は偶数であると表示し、*/
else /* そうでなければ */
printf("%dは奇数\n",i); /* iの値が奇数であると表示する */
if(i == 0) break; /* iの値が0と等しければ、while文から脱出する */
}
return 0; /* main関数から戻る */
}

・・・コメントの方が数倍時間がかかったので、
以後、ソースから処理内容を読みとれるよう努力してください。
>>957
ワロタ 逆に分かりにくいw
「ぼるじょあ」やめないか?
960953:04/01/08 22:03
ありがとうございました。これはCでいいんですよね?
このスレでぼるじょあの回答はこれだけ。
>>450
>>932
>>960
FORTRANとかCOBOLとかPascalとかJavaとかに見えるとしたら、
病院に行った方がよい。

ざっと見てみると、何も書いてなけりゃ、当たり前だが、Cで書いてるな。
963デフォルトの名無しさん:04/01/08 22:25
コンパイルをすると
964963:04/01/08 22:29
すいませんミスりました

コンパイルをすると
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 124: 依存関係にある型限定子 'Zahyou' に 'value_type' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 125: 依存関係にある型限定子 'Zahyou' に 'difference_type' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 126: 依存関係にある型限定子 'Zahyou' に 'pointer' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 127: 依存関係にある型限定子 'Zahyou' に 'reference' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 128: 依存関係にある型限定子 'Zahyou' に 'iterator_category' という名前のメンバー型がない(関数 main() )
*** 5 errors in Compile ***
となってしまいます。Zahyouは構造体です。
依存関係にある型限定子の意味がわからず、なぜこのようなエラーがでてしまうのでしょうか
教えてください。

965デフォルトの名無しさん:04/01/08 22:31
966デフォルトの名無しさん:04/01/08 22:38
お願いします.c言語です。

標準入力から1〜26までの数字をひとつ読み込む。 その後英文を読み込み、
読み込んだ数字をシーザー暗号の鍵として 英文を暗号化し、
出力するプログラム
を作成しなさい。

シーザー暗号とは、数字を鍵としてアルファベットをずらす
することで暗号化を行なう暗号で、古代ローマの
ジュリアス・シーザー が考案したといわれてい
る。
例えば鍵が"1"なら、 "A"->"B", "B"->"C",..."Z"->"A",
"a"->"b", "b"->"c",..."z"->"a" となる。鍵が"2"なら、
"A"->"C", "B"->"D",... となる。
>>964
なぜソースを書かないのか?
ってか宿題スレには適当でない予感。
968963:04/01/08 22:42
PC初心者板で聞いて見ます。
すいませんスレ違いでしたTT
>>968
なんでそんなに板違いが好きなの?
>>963
おそらく些細なミスだと思うんだが・・・
>>966
#include <stdio.h>
#include <ctype.h>

void caesar_angou(FILE *fin, int key, FILE *fout);

int main(void)
{
int key;
if (scanf("%d", &key) != 1) {
exit(2); /* 最初にキーが無い */
}
caesar_angou(stdin, key, stdout);
return 0;
}

/* シーザー暗号 */
void caesar_angou(FILE *fin, int key, FILE *fout)
{
int c;
while ((c = fgetc(fin)) != EOF) {
if (isupper(c)) {
c = (c - 'A' + key) % 26 + 'A';
} else if (islower(c)) {
c = (c - 'a' + key) % 26 + 'a';
}
fputc(c, fout);
}
}
次の公式(フェアフィールドの式)を関数numberOfDaysを使わないで
作成する。 紀元1年1月1日からy年m月d日までの日数 1月、2月は前の年の13月、
14月と見なす。

dd=365*y+[y/4]-[y/100]+[y/400]+[{306*(m+1)}/10]+d-428

計算[ ]はガウス記号(小数以下切捨て>



よろしくお願いします。
int y = 2003,m=1,d=8,dd;

if(m <=2) { y--; m += 12; }

dd = 365*y+y/4-y/100+y/400+306*(m+1)/10+d-428;

こんなんか?
ぼるじょあスレは嫌いなんで、次スレは別の名前にして欲しかった。
long days(int y, int m, int d)
{
if (m < 2) {
m += 12;
y--;
}
return 365L*y+y/4-y/100+y/400+306*(m+1)/10+d-428;
}
あ、先こされた(^^;;
>>973
>>974
ありがとうございます!
976デフォルトの名無しさん:04/01/09 18:11
Cってか数学のこんな質問でも良いのですか?

モンテカルロ法を使って半径1のD次元球の体積Vを求めるプログラムを作ること。
授業で説明した円(2次元球)の面積(円周率)を求めるプログラムを参考にして下さい。

プログラムの仕様は以下のようなものであること。
乱数を生成する関数は自ら作成するか、言語に標準で用意されているも のを利用すること。
次元の数D、点の数N、乱数の種SEEDは標準入力(キーボード)またはGUIで入力できるこ と。
求めた体積Vの値を出力すること。
作ったプログラムを使用して、Dが2、3、5、10のそれぞれの場合について体積V が点の数Nの増加とともに一定の値に近づいていく様子を数値とグラフを用いて確かめること。
>>976
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define rnd() (1.0 / ((RAND_MAX + 1.0)) * rand())

double MonteCarlo(unsigned int dimension,unsigned long n) {
unsigned long i,j,hit=0;
double random,work;

for(i=0;i<n;i++) {
work=0;
for(j=0;j<dimension;j++) {
random = rnd();
work += random * random;
}
if (work < 1.0) hit++;
}
return pow(2,dimension) * ((double)hit / n);
}

int main() {
unsigned int d,seed;
unsigned long n;
printf("input >dimension number seed\n>");
scanf("%u%lu%u",&d,&n,&seed);
srand(seed);
printf("\nV=%f\n",MonteCarlo(d,n));
return 0;
}
/* エラー、乱数の質については考慮していない */
MT法を使えばもあべたですか?
>>978
モンテカルロ法においては。
980カオル:04/01/13 19:37
C教えてください!1ケ月のバイト代計算プログラムの作成
1日8〜24時までバイトができると仮定し、何月かを入力後、各日のバイト開始時間およびバイト時間を入力し、1ケ月のバイト代を計算するプログラムを作成すること
(休憩時間は考えない)
ただし、8〜18時までは時給750円、22時までは800円、24時までは935円とする。また、1年において、1月、3月、5月、7月、8月、10月、12月は
31日、4月、6月、9月、11月は30日、2月は28日とする。
981カオル:04/01/13 19:38
C教えてください!1ケ月のバイト代計算プログラムの作成
1日8〜24時までバイトができると仮定し、何月かを入力後、各日のバイト開始時間およびバイト時間を入力し、1ケ月のバイト代を計算するプログラムを作成すること
(休憩時間は考えない)
ただし、8〜18時までは時給750円、22時までは800円、24時までは935円とする。また、1年において、1月、3月、5月、7月、8月、10月、12月は
31日、4月、6月、9月、11月は30日、2月は28日とする。
982デフォルトの名無しさん:04/01/13 19:40
>>980
知らん
983デフォルトの名無しさん:04/01/13 19:41
>>981
知らん
984デフォルトの名無しさん:04/01/13 19:45
C教えてください。学生10人の国語、数学、英語のデータをあらかじめ用意し、学生それぞれに国語、数学、英語の点数を表示し、さらに合計点および平均点(整数値)を表示し、また、各教科の平均点(整数値)および最高点を表示するプログラム
二次元配列を使用すること
   国語  数学  英語
1: 56  71  67
2: 84  91  62
3: 71  86  67
4: 92  94  84
5: 71  90  96
6: 66  54  78
7: 70  79  78
8: 62  55  62
9:100  51  62
10: 81  61  89
985デフォルトの名無しさん:04/01/13 19:47
Cお願いします。キーボードから10個の値(正の整数)を入力し、その合計を求め、表示するプログラム ただし合計を求める方法には、次のような条件がある。
・奇数はそのままの値を足す
・偶数は2で割った値を足す
10個の値を入力するためにはfor関数をしようする
986デフォルトの名無しさん:04/01/13 19:57
>>982-983
素人の出る幕じゃない
#include<stdio.h>
int numberOfDays(int, int, int);
main(void){
int y, m, d, yy, mm, dd, days;

printf("存在しない日付は入力しないで下さい。\n");
printf("正しくない答えが出力されます。\n");
printf("生年月日を入力してください。\n西暦何年(1900年以降)?\n");
scanf("%d", &y);
printf("何月?\n"); scanf("%d", &m);
printf("何日?\n"); scanf("%d", &d);
printf("存在しない日付は入力しないで下さい。\n");
printf("正しくない答えが出力されます。\n");
printf("現年月日を入力してください。\n西暦何年(1900年以降)?\n");
scanf("%d", &yy);
printf("何月?\n"); scanf("%d", &mm);
printf("何日?\n"); scanf("%d", &dd);
days = numberOfDays(yy, mm, dd) - numberOfDays(y, m, d);
printf("生まれてから今日で%d日目です。\n", days);
}
int numberOfDays(int y, int m, int d)
{int dd;
if ( m == 1 || m == 2){
m = m+12;
y--;}
dd = 365*y+y/4-y/100+y/400+306*(m+1)/10+d-428;
return(dd);}

これを参考にして紀元1年1月1日からy年m月d日までの日数を求めよ。
ただし関数numberOfDaysを使わないで作成する。
お願いします。
>>987
int days(int y, int m, int d)

if ( m == 1 || m == 2){ m = m+12; y--;}
return 365*y+y/4-y/100+y/400+306*(m+1)/10+d-428;
}
>>985
#include <stdio.h>
int main(void)
{
int data, sum = 0, i;
for (i = 0; i < 10; i++){
printf("%d個目のデータを入力して下さい:", i + 1);
scanf("%d", &data);
if ((data & 2) == 0)
sum += data / 2;
else
sum += data;
}
printf("合計は%dです。\n", sum);
return 0;
}
990デフォルトの名無しさん:04/01/13 21:12
ある集団の試験の結果を配列に入力した後,以下を出力するプログラムを作成せよ.
 平均点と標準偏差
 各個人の得点とその偏差値得点
ただし,負の数値を入力したときに実行を終了するものとせよ.
データ x に対する偏差値得点(deviation score)
 y は平均をμ,標準偏差をσとしたとき以下で計算できる
 y = 50 + 10(x – μ)/σ
得点は,予め20個程度のデータが入っているファイル
(たとえばinput.txt)を作成して,キーボードの入力の代わりとせよ

が根本的にわからず困ってます。助けてください・・・。
991デフォルトの名無しさん
助かります。有難うございます。やってみます。