1 :
デフォルトの名無しさん :
2007/10/23(火) 23:48:35
2
3 :
1 :2007/10/23(火) 23:59:54
スレタイ間違えました…このスレッドは削除依頼出します
次99って覚えとけば問題ない スレ立てた人は特に覚えておいて、 次スレの時期になったら次は99であると声高に叫ぶんだ
5 :
1 :2007/10/24(水) 00:05:06
6 :
1=3 :2007/10/24(水) 00:23:03
皆様、削除依頼は出しませんので、お使いください
>>3 の書き込みは馬鹿の戯言と思い無視してください
スレタイに関しては生暖かくわらってくださいませ m(_ _)m
前スレ
>>980 エクセルとかワードで書いてzipでうpればよかったんじゃないか?
11 :
前スレの907 :2007/10/24(水) 01:09:04
>>前スレの919さん プログラムありがとうございました。 ですが実行してみたところ以下のようなエラーがでてしまいました。 1>Source1.obj : error LNK2019: 未解決の外部シンボル _dx が関数 _main で参照されました。 1>C:\Users\UCHIDA\Documents\Visual Studio 2005\Projects\a34\Debug\a34.exe : fatal error LNK1120: 外部参照 1 が未解決です 問題文は「オイラー法を用い、dy/dx=(3x-5y-4)/5 の常微分方程式を 解きなさい。また、その結果をExcelファイルに出力して グラフを作りなさい。諸条件は以下のようにする。 初期値 (x,y)=(0,0) 刻み幅 Δh=0.3 積分区間 [a,b]=[0,3] 」で #include<stdio.h> long double df(long double x,long double y) { return (3*x-5*y-4)/5; } int main(void) { long double x,y,delta; FILE *outfile; x = y = 0.0; delta = 0.3; outfile = fopen("data.csv","w"); fprintf(outfile,"%Lf,%Lf\n",x,y); do{ y += dx(x,y)*delta; x += delta; fprintf(outfile,"%Lf,%Lf\n",x,y); }while(x<1.0); fclose(outfile); return 0; } です。どなたかエラー解決お願いします。
[1] 授業単元:オペレーティングシステム [2] 問題文(含コード&リンク): HTTPリクエストを受け付けると、URLに記載された名前のHTMLファイルをブラウザに返す 簡単なWebブラウザをC言語を用いて作成せよ。 このWebサーバはHTTPリクエストを受け付ける毎にforkシステムコールにより新しいプロセスを生成し、 そのプロセスがURLに指定されたHTMLファイルをファイルシステムから取り出して、ブラウザに返す。 基本的には、リクエストを送りリプライを返すことができればいい。 また、結果をブラウザで表示できる程度の実装で構わない。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: gcc 3.4.4 [3.3] 言語: C言語 [4] 期限: 2007年11月15日 [5] なし 最低限の実装でいいのでよろしくお願いします。
>>11 ×y += dx(x,y)*delta;
○y += df(x,y)*delta;
つかエラーメッセージ吐いてるんだからこのぐらい自分で気づこうよ。
>未解決の外部シンボル _dx が関数 _main で参照されました。
14 :
デフォルトの名無しさん :2007/10/24(水) 01:31:13
[1] 授業単元: プログラミング技術W
[2] 問題文(含コード&リンク):
こんばんわ、夜も更けてしまいましたがよろしくお願いします。
文字列str1からstr2と一致する文字列を削除し、結果を表示するプログラムを作成せよ。
・文字列 st の pos 番目から始めて、len の長さの文字列を削除する
関数:void d _word(char st[], int pos. int len)を作成する。
・pos の場所と削除語の長さを d_wordに渡し、文字列削除を実行する
関数:void search_del(char str1[], char str2[])を作成する。
・main 関数で文字列1つと削除する文字列1つを入力させ、関数search_del
を用いて文字列から削除語を削除したものを出力する。
(メインのプログラムはヒントで出題されたのですが、うまく出来ませんでした。)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5132.txt [3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: cygwin gcc
[3.3] 言語: C言語
[4] 期限: 25日(木)
[5] その他の制限:
15 :
デフォルトの名無しさん :2007/10/24(水) 01:47:59
>>14 すいません、リンク先にあるプログラムコードの下から2行目の
ss}
のssはゴミです。
>>14 その二つの関数があるなら、できてるも同然な気がするが…
int main()
{
char str1[256], str2[256];
printf("string? : ");
gets(str1);
printf("deleted word? : ");
gets(str2);
serach_del(str1, str2);
puts(str1);
return 0;
}
17 :
デフォルトの名無しさん :2007/10/24(水) 02:16:11
頭は#include <stdio.h>のみで大丈夫でしょうか?
どのソースに対していってんだ?
19 :
デフォルトの名無しさん :2007/10/24(水) 02:40:08
>>19 > if(j=m2)
==
> printf("%d\n", st1);
%s
これで動くかはわからんが。
21 :
11 :2007/10/24(水) 05:16:42
>>13 さん
すいません。ありがとうございました。
[1] 授業単元:専門演習 [2] 問題文(含コード&リンク): 1、数を入力し、その数が奇数か、偶数かを判定しなさい。 (ただし、数字以外を入力した際には「数字を入力してください」とメッセージボックスをでるように。 2、ビデオテープ一個の単価は150円である、しかし、購入個数が100個を超えると、ビデオテープの単価は2割引になる。 購入個数を入力して支払い金額を計算し、表示するプログラムを作りなさい。 3、三角形の三編の長さa,b,cを入力して、正三角形、二等辺三角形、直角三角形、直角二等辺三角形、単なる三角形を調べるプログラムを作りなさい。 [3] 環境 [3.1] OS: windows XP [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) 不明 [3.3] 言語: (C/C++/どちらでも可 のいずれか) 一応C#なんですが・・・大丈夫ですかね?? [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 今週中。 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 基礎レベル・・・。 どうかお願いいたします。
23 :
デフォルトの名無しさん :2007/10/24(水) 10:58:59
>>22 1番はこんな感じになります
#include<stdio.h>
int main(void)
{
int n;
printf("数を入力してください>");
while(scanf("%d",&n)>0) printf("入力がおかしいです。もう一度入力してください。>");
printf("%sです。\n",(n&1)?"奇数":"偶数");
return 0;
}
>>23 とりあえず次の入力を試しました
5
abon
何かがおかしいです。もう一度投稿して下さい。>
>>24 scanfの戻り値のチェック間違えてた…
始めに「失敗した」書式のとこ返すんだった…。
#include<stdio.h>
int main(void)
{
int n;
printf("数を入力してください>");
while(scanf("%d",&n)>1) printf("入力がおかしいです。もう一度入力してください。>");
printf("%sです。\n",(n&1)?"奇数":"偶数");
return 0;
}
次は無限ループを作る予感
scanfの挙動はよう分からんからなあ…… とりあえず、while(scanf("%d",&x))...みたいな書き方だと条件満たさないと思うよ %dは数字以外の文字をひたすら無視するから というかC#知らないけど、 scanfとかでいいのか?
>>22 の問題文によると「メッセージボックス」を出すらしい
>>22 ,29
…メッセージボックスですか見落としてた…Win32APIですね…
そしたら全然ダメだわ
>>26 24 はDOSアプリとしてなら確認しました
もしかして他の二つもWinアプリとして作らないといけないのかでしょうか?
基礎レベルでWin32APIは使わないと思うのだが…
>>30 だからC#なんだってば。
つーか、>25もおかしいぞ。
メッセージボックス以前の問題だろ
>>28 scanfの戻り値
代入された項目数を返す とある
新ANSI C言語辞典(ISBN4-7741-0432-9)より
この本一部妖しいが…多次元配列あたりの説明が…
>>22 ,31
…あーー!。Cとして書いてしまった…
書き方違うや…全然…ごめん…
33、この発言取り消しで…
>>34 いや、それはいいから>25が拙いってことは理解しておいた方がいいよ。
二重の罠に填まっているから。
>[3.3] 言語: (C/C++/どちらでも可 のいずれか) 一応C#なんですが・・・大丈夫ですかね?? これおかしいだろ
>>25 日曜あたりからこのスレに書き始めた人っぽいけど、まだ他人の宿題に答えるレベルじゃないんじゃない?
うん、だから>22は無視して>23以降を構って遊んでる。
>>22 3.をあくまでCで
#include <stdio.h>
int main(void)
{
double a, b, c, max, mid, min;
scanf("%lf%lf%lf", &a, &b, &c);
max = a > b ? c > a ? c : a : b > c ? b : c;
min = a < b ? c < a ? c : a : b < c ? b : c;
mid = a + b + c - max - min;
if(max>=min + mid) printf("三角形じゃない\n");
else if(max == min) printf("正三角形\n");
else if(max * max == min * min + mid * mid) {
if(min==mid) printf("直角二等辺三角形\n");
else printf("直角三角形\n");
}
else if(max==mid||mid==min) printf("二等辺三角形\n");
else printf("ただの三角形\n");
return 0;
}
>>37 分りました…これ以降自粛します…。
>>22 もう書いてしまったので参考にしてください。
2.をCで書くと
#include<stdio.h>
int main(void)
{
long x;
printf("何本購入しますか?>");
while(scanf("%ld",&x)>1) printf("入力がおかしいです。もう一度入力してください。>");
x *=150;
if(x >= (150*100) ){
x = x * 8 / 10;
}
printf("%d円になります。\n",x);
return 0;
}
>>40 テストしてから書き込むことを勧める
例えば入力に次のものを入れてみる
abon
100
#あと負数をどうするとか
とりあえず、scanfの戻り値は使わない方がいい というかscanfを使わない方がいい
C#って、VBみたいに簡単にMessageBox出せたりするの?
>>43 C# メッセージボックス でググったらすぐに出る
出せる
へえ、つまらん言語だな
>>42 scanfが不評な理由が身に染みました…。
かといってgetsもバッファオーバーランの危険がありますが…
stdinからfgstsしてから変換が安全でしょうか?
うざいよ ここはお前の質問スレじゃないから、とっとと失せろ
>>47 >35を無視するから……
初心者スレ辺りに移動するなら付き合うけど、また無視するならしらね。
fgetsが定石なんだろうが、 俺はgetcharをこよなく愛してる
オレは scanf Loveだぜ #include<windows.h> #include<stdio.h> int main(void){ int n; printf("数を入力してください>"); while(scanf("%d",&n)<1){ scanf("%*s"); MessageBox(NULL, "数字を入力して下さい", "Error", MB_OK | MB_ICONERROR); printf("\n入力がおかしいです。もう一度入力してください。>"); } printf("\n%sです。\n",(n&1)?"奇数":"偶数"); return 0; }
[1] 授業単元:プログラミング2 [2] 問題文(含コード&リンク): (1)モンテカルロ法を用いて、y=x^2,y=0,x=1で囲まれる領域の面積を求めよ。 (2)モンテカルロ法を用いて、半径1の球の体積を求めよ。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: Visual Studio.NET2003 [3.3] 言語: C [4] 期限:10/25の12時 [5] その他の制限:(1)(2)において発生させる乱数の数を10,100,1000…1000000 と増やし、それぞれの場合における結果を画面に表示させること。 どうかよろしくお願いします。
>>53 前スレのとは別の人?
(1)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i, j, cnt;
double x, y;
srand(time(NULL));
for(i=10; i<=1000000; i*=10) {
for(j=0, cnt=0; j<i; j++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
if(x*x >= y) cnt++;
}
printf("試行回数:%7d 面積:%f\n", i, (double)cnt / i);
}
return 0;
}
(2) #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i, j, cnt; double x, y, z; srand(time(NULL)); for(i=10; i<=1000000; i*=10) { for(j=0, cnt=0; j<i; j++) { x = (double)rand() / RAND_MAX; y = (double)rand() / RAND_MAX; z = (double)rand() / RAND_MAX; if(x*x + y*y + z*z <=1) cnt++; } printf("試行回数:%-7d 球の体積:%f\n", i, cnt * 8.0 / i); } return 0; }
scanfもちゃんと使えば、大分有用なんだけどね
【質問テンプレ】 [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): リストへのポインタを引数としてとり、その内容を逆順に並べ替えたリストへの ポインタを返す関数struct c *re(struct c *l)を再帰を用いて作成せよ。 並べ替え後に元のリストが破壊されていても構わない。 リストは連結リストで、その構造体は、 struct c{ int a; struct c *n; }; とする。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 木曜日の15時までです。 [5] その他の制限: 必ず再帰を使うこと。
58 :
デフォルトの名無しさん :2007/10/24(水) 15:22:13
>>14 です。
アドバイスを頂き
>>16 と
>>20 を組み込みましたが、コンパイルが通りません。
エラーメッセージは関数:void d _wordに受け渡しがうまく行ってない趣旨のものがでました。
出来る方、問題回答お願いします。
それと昨晩、途中まで付き合ってくれた方ありがとうございます。
>>58 typo だと思われる
自分で探せるよね
>>57 struct c *re(struct c *l)
{
struct c *p;
if(l->n==NULL) return l;
p = re(l->n);
l->n->n = l;
l->n = NULL;
return p;
}
63 :
デフォルトの名無しさん :2007/10/24(水) 18:17:29
[1] 授業単元: アルゴリズム C言語応用U
[2] 問題文(含コード&リンク):
英文を入力すると、単語に分割して出力するプログラムを書く。
ただし、ピリオドとカンマは出力しないようにすること。
(実行例)
英文を入力してください:
There is , a textbook.
---
There
is
s
textbook
---
今回はプログラム作成にあたり、用意されているテンプレートにプログラムを付け加えプログラムを完成させよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5138.txt [3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: CYGWIN gccバージョン不明)
[3.3] 言語: C言語
[4] 期限: 無理を承知で明日の午前中までにお願いします。
[5] その他の制限: テンプレートに従ってプログラムを付け加えて完成させてください。
前スレで質問したものです ただ単に不等号と&&→||のミスでした お騒がせして申し訳ありません
65 :
デフォルトの名無しさん :2007/10/24(水) 18:56:01
[1] 授業単元: C++
[2] 問題文(含コード&リンク):ファイルのリンク:
http://spot.pcc.edu/~cdjones/CS161/Assignments/gasprices.txt リンクに含まれるようなファイルを読み取って、金額(ファイルの一番右の項目)を州(ファイルの真ん中の項目)別に集計し、
アルファベット順にそれぞれの州の平均額を表示する。その後、全ての州の合計金額の平均を表示する。
最後に、最も平均金額の高かった州と、最も平均金額の低かった州を表示する。
注意: 町の名前(ファイルの一番左の項目)は、“Grants Pass” や “Klamath Falls”のように、空白で区切られているものが入ることもある。
[3] 環境 ?
[3.1] OS: Windows
[3.2] Dev C++ 4
[3.3] 言語: C++
[4] 期限: 2007年10月27日深夜まで
[5] その他の制限: 標準ライブラリのみ使用可能。Getlineを使わず、Cinのみで作る方がよりよい。また、ファンクションは使用不可。
よろしくお願いします(_ _)
[1] 授業単元:線形台数 [2] 問題文(含コード&リンク): 対角行列の固有値を求めよ。 10次元の。 対角成分は3.4 2.3 5.1 8.2 2.21 -4.21 23.2 9.3 -21.2 0.2 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年10月25日 [5] その他の制限: なし
>>65 >[5] その他の制限: 標準ライブラリのみ使用可能。Getlineを使わず、Cinのみで作る方がよりよい。また、ファンクションは使用不可。
ファンクション使用不可ってのを詳しく
>>66 対角行列の固有値は自明。
対角行列の固有値は対角成分そのもの。
つまり、
3.4 2.3 5.1 8.2 2.21 -4.21 23.2 9.3 -21.2 0.2
となる。
scanfは失敗したの残すし、改行残すから鬱陶しくて仕方ない。 ってことで、fgets使うとか、 戻り値を変数に格納した後、残った文字を全部食ってから次の処理とかでいいんじゃね?
ベクトルを作って、ベクトルを初期化して
$ gcc -lm a.c
# ./a.out
すると
0.000000 0.000000 2.080315
というよく分からないベクトルが作られます。
init_vectorにバグがあるのでしょうか?そうは見えないのですが・・・
他にプログラムの宿題があるのですが、ここらへんがとりあえずバグってるので
問題を簡単化して質問します。
ttp://www.uploda.org/uporg1080506.c.html コンパイラは
gcc3.3.6です。緊急の宿題です
[1] 授業単元:C/C++宿題スレ [2] 問題文(含コード&リンク): 書式付標準出力関数printfと同様の動作を示すprint関数を作りなさい。標準出力関数等を用いてよいが、printf関数は使用してはならない。 なお、終わった者はscanfと同様の動作を示すscan関数を作ってもよい。 [3] 環境 [3.1] OS: 任意 [3.2] コンパイラ名とバージョン: 任意 [3.3] 言語: C言語 [4] 期限: 無期限 [5] その他の制限: これよりも、他の宿題を優先すること
>>74 ありがとうございます。逆ですね。
いつもRuby使ってて、授業でC使う事になったこういうミスが・・・涙
だったらコンパイル通さないでくれよ・・・
そういえば、可変引数を使う宿題てあまり見ないな
[1] 授業単元:文字列操作プログラム [2] 問題文(含コード&リンク): 配列とポインタを使用し、文字列操作を行うプログラムを作成せよ。 @独自のstrlen関数mystrlen関数を自作する。 文字列のポインタを受け取り、文字列の長さを返す関数を作成する。 A独自のstrcpy関数mystrcpy関数を自作する。 文字列のポインタ2つを受け取り、文字列のコピーを行う関数を作成する。 B独自のatoi関数myitoa関数を自作する。 数値を受け取り、指定された基数で文字列変換を行う関数を作成する。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:不明 [3.3] 言語:C言語 [4] 期限:2007年10月26日朝5:00まで [5] その他の制限:問題が初級編ということで、出来るだけ難しくならないよう お願いします。
すみませんがよろしくお願いします。 さっぱりわかりません・・ [1] 授業単元:C++ [2] 問題文(含コード&リンク): 次のソースコードを参照して、DateTimeClass の代入演算子を定義してください。 ただし、定義はクラスの外で行うものとします。 class DateClass { int year, month, day; }; class TimeClass { int hour, min; }; class DateTimeClass : public DateClass, public TimeClass { char* strDate; char* strTime; }; [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C++ [4] 期限: 10/26いっぱい [5] その他の制限:なし
問題の題名は「オペレータ オーバーロードを使ったプログラム作成」でした。 なのでオペレータオーバロードを使わなければいけないっぽい。。
>>78 >B独自のatoi関数myitoa関数を自作する。
myatoi関数?それともmyitoa関数?
>>82 >数値を受け取り、指定された基数で文字列変換を行う関数を作成する。
itoaだな
もしくはltostrとでもいうか
>>71 >|Σ|っていうのは対角成分をかけたものってことでいいのかな?
対角行列においてはその通り。
φA(λ) = |λI - A|= 0
を満たす値λがベクトルAの固有値。固有値は行列ではなく数値。
Iは対角単位行列。
Aがn×nの正方行列なら、重解を含めて、λはn個存在する。
個別のλのことを「固有値」と呼ぶ。
だから、
>ある問題で正規分布を使っていて、|Σ|を対角行列の対角成分をすべてかけたものを
>固有値として計算する
という部分がおかしい。
これ以上は数学板で聞いたほうがいいかも。
[1] 授業単元:Fizz Buzz問題 [2] 問題文(含コード&リンク): 1から100までの数字を順に表示しなさい ただし3で割り切れる数の場合は数字の代わりにFizz、 5で割り切れる場合はBuzz、 3と5の両方で割り切れる場合はFizz Buzzと表示しなさい。 剰余演算を使うバージョンと、使わないバージョンを作ること。 ただし、あらかじめ該当数字を配列等に格納しておいてのチェックは無しとする。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: bcc [3.3] 言語: C [4] 期限: 10月25日PM1時 [5] その他の制限: よろしくお願いします
就職試験対策キターーーー
>>79 void quicksort(int a[], int l, int r){
int comp(const void*a, const void*b){
if(*(int*)a < *(int*)b)
return -1;
else if(*(int*)a > *(int*)b)
return 1;
else
return 0;
}
qsort(a, r-l+1, sizeof(int), comp);
}
89 :
デフォルトの名無しさん :2007/10/24(水) 22:49:56
剰余を使わずに、もっとも短いコードをつくる 出力は次のようにする 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34,
関数内関数なんて使うなって一瞬言おうとしたけど、 そうゆうことなら許すw
>>86 「Fizz Buzz問題」 ネーミングがイカしてるな
#include <iostream.h>
int main (void)
{
int i;
for (i=1; i<=100; i++){
if (i%3==0 && i%5==0)
cout << "Fizz Buzz" << endl;
else if (i%3==0)
cout << "Fizz" << endl;
else if (i%5==0)
cout << "Buzz" << endl;
else
cout << i << endl;
}
}
>>73 #include <stdarg.h>
int print(const char*f, ...){
va_list a;
va_start(a, f);
vprintf(f,a);
va_end(a);
}
>>85 固有値ではないってことだね。
|Σ|は行列の値ってことか。
ってことは間違っている原因は|Σ|じゃないってことか。
94 :
73 :2007/10/24(水) 23:01:09
>>92 すみません、後出しで悪いですが、
printfと同様の書式付き関数は使用しないで作ってください。
とにかく考えてくださりありがとうございます。
95 :
12 :2007/10/24(水) 23:03:56
>>62 迅速な対応ありがとうございます。
参考にさせて頂きます。
96 :
デフォルトの名無しさん :2007/10/24(水) 23:04:06
#include<stdio.h> main(){ int a=3,b=5,n; for(n=1;n<101;n++){ if(n!=a && n!=b)printf(" %d,",n); else {if(n==a){a+=3;printf(" Fizz");} if(n==b){b+=5;printf(" Buzz");} if(n<100)printf(","); }}}
97 :
デフォルトの名無しさん :2007/10/24(水) 23:08:51
[1] 授業単元:コンピューターグラフィックス [2] 問題文CGを作れ(自由課題) ただし以下の評価項目に関して採点を行うのでこれを満たすようなCGを作成すること 1.CGアニメーションになっていること 2.マウスによってなんらかの操作ができる 3.ホップアップメニューが使用できること 4.シェーディングが適切に行われていること 5.テクスチャマッピングが使用されていること [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:11月6日 [5] その他の制限:あまりにも難しすぎる表現はNG いきなり自由課題しろとか言われても俺にはイミフ 誰か助けてクレヨン
ナンセンス? #include<stdio.h> char * fizzBuzz( int n ) { static char buffer[BUFSIZ]; return n % 15 == 0 ? "FizzBuzz" : n % 5 == 0 ? "Fizz" : n % 3 == 0 ? "Buzz" : (sprintf( buffer, "%d", n ), buffer); } int main() { int m = 0; while( m != 100 ) { ++m; printf("%s\n", fizzBuzz( m ) ); } return 0; }
printf同様って・・・ 300行くらいいるんじゃね?
101 :
デフォルトの名無しさん :2007/10/24(水) 23:15:38
剰余を使わず文字数が少なくてこう出力して 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, 最後は , をつけないプログラム
>>80 strDate, strTimeをどう扱うかによって回答が変わるけど、
こんなのを期待されてそう。
DateTimeClass &operator = (DateTimeClass &a, const DateTimeClass &b)
{
(DateClass &)a = (const DateClass &)b;
(TimeClass &)a = (const TimeClass &)b;
strcpy(a.strDate, b.strDate);
strcpy(a.strTime, b.strTime);
return a;
}
>>97 どう考えてもOpenGLとかDirectXとかが必要になりそう気がする……
どう考えてもcだけじゃコンピュータグラフィックは作れなさそうな気がする……
104 :
デフォルトの名無しさん :2007/10/24(水) 23:18:49
>>99 今まではただ惑星とかロボット作ってそれをキーボード入力で動かしてたしてただけだった
だけど授業でシェーディングとかの話し始めて出た課題がこれ
参考にできるサイトなどなんでもいいので参考になるものを教えてください
105 :
デフォルトの名無しさん :2007/10/24(水) 23:20:32
>>97 OpenGLいるな。。。じゃあここはスレ違いか
失礼しました
>>104 wisdomsoft OpenGLでググれ
もしくは単位をあきらめる
>>100 7行スレで7行printfがあったとか何とかって言ってた。
>>104 てっきりプログラミングの授業の第一回目とかで出されたのかと思った>いきなり
>>102 ありがとうございます。
そのように解答します。
>>104 少なくともCでCGできる時点でこのスレの住人の3分の2くらいよりレベル上だろうな
111 :
デフォルトの名無しさん :2007/10/24(水) 23:23:32
112 :
デフォルトの名無しさん :2007/10/24(水) 23:26:27
>>63 だれか、お願いします。
現在作成中でしたら、おとなしく待ってます。
113 :
デフォルトの名無しさん :2007/10/24(水) 23:28:43
>>106 ググって来るわ
OpenGLの課題片付けてくれるスレってある?
[1] 授業単元:C++ [2] 問題文(含コード&リンク): class BaseClass { char* name; public: BaseClass(const char* p) {name = strdup(p);} ~BaseClass() {free(name);} }; class MyClass : public BaseClass { int count; public: MyClass(const char* p, int n = 0) : BaseClass(p), count(n) { // ... } }; ソースコードを参考にして派生クラスでの生成と消滅の順序を画面に 表示するプログラムを作成してください。 プログラムを実行し、派生クラスと基本クラスのコンストラクタ、 デストラクタが呼ばれる順序を確認してください。 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C++ [4] 期限: 10/26まで [5] その他の制限:なし お願いします。
>>101 とりあえず剰余有版はこれでOK?
剰余無し版はfizzBuzz関数の実装を変更すればいいし。
就職活動がんばってな
#include<stdio.h>
char * fizzBuzz( int n )
{
static char buffer[BUFSIZ];
return n % 15 == 0 ? "FizzBuzz" :
n % 5 == 0 ? "Fizz" :
n % 3 == 0 ? "Buzz" :
(sprintf( buffer, "%d", n ), buffer);
}
int main()
{
int m;
for( m = 1; m <= 100; ++m )
{
printf( (m == 100 ? "%s\n" : "%s,"), fizzBuzz(m));
}
return 0;
}
116 :
デフォルトの名無しさん :2007/10/24(水) 23:50:14
117 :
デフォルトの名無しさん :2007/10/24(水) 23:50:19
>>111 >>86 と同じ人?Fizz Buzz問題でも今回は内容Fizz Buzzじゃないんだ。
>>86 はもういいの?
とりあえず1問答えてるし、先客が終わるまで待てて。
121 :
111 :2007/10/24(水) 23:54:12
>>117 すいません。同一人物じゃないです。
>>86 の人のテンプレコピペしたんで授業単元変えるの忘れました
>>101 はもういないのか?
剰余無し版
#include<stdio.h>
#include<stdbool.h>
bool isMultipleOf( int n, int m )
{
int idx;
for( idx = 1; idx != 100; ++idx )
{
if( m == idx * n )
return true;
}
return false;
}
char * ff( int n )
{
static char buffer[BUFSIZ];
return isMultipleOf( 15, n) ? "FizzBuzz":
isMultipleOf( 5, n) ? "Fizz":
isMultipleOf( 3, n) ? "Buzz":
(sprintf(buffer,"%d", n ), buffer);
}
124 :
デフォルトの名無しさん :2007/10/24(水) 23:58:56
>>119 テンプレの
/* コンマかピリオドならstr2の位置を1つ左 */
}
}
/* str2(単語)に終端文字を追加 */
-------------------------------------------------------
上記の部分が
/* コンマかピリオドならstr2の位置を1つ左へ */
}
/* str1を1文字右に移動 */
}
/* str2(単語)に終端文字を追加 */
でした。
真ん中の/* str1を1文字右に移動 */を追加お願いします。
>>111 の
if(num<=300+0*10 && day>=inc_day)
の部分がヘン
というかこのプログラム、何をするプログラムなのかが一見してわからない
126 :
デフォルトの名無しさん :2007/10/25(木) 00:02:22
>>121 そなの?変なこと言ってすまん。
いまチャレンジしてるから、ちっと待って。
>>124 i++;
を追加してくれ。忘れてた。
まあ、それでも入力の最後に空白付けないといけないのは
変わらない気がするんだが。テンプレがそれならいいのかな。
128 :
デフォルトの名無しさん :2007/10/25(木) 00:05:46
>>125 日にちと商品の在庫不足数を数字のみで表示してるんじゃない?
商品のほうはランダムで数字作成してるみたいだし。
〜日 在庫不足〜個みたいな。でも、
>>複数製品に対応したものに
ってのがわからない。
>>128 >>111 の
if(num<=300+0*10 && day>=inc_day) inc_day=day+3;
で、あきらかに 0*10 という意味不明な演算をしている件について
130 :
93 :2007/10/25(木) 00:08:40
>>85 正規分布を使いアルゴリズムに通して正解率を出すプログラムなんだけど
|Σ|を行列の値(対角成分の積)として計算すると全然正解率がでない。
どこがおかしいのかを見るために
試しに|Σ|に対角成分の和をいれてみて計算すると正解率98%だった。
ただ計算方法が違うのであっているかわからない。
正規分布について調べると|Σ|はΣの固有値とあるんです。
どうなんでしょうかね。
131 :
111 :2007/10/25(木) 00:09:32
>>125 簡単に書くと、はじめ300個あった物が毎日80〜120ずつ減っていき、
在庫が300+0*10以下になったら、その3日後に、350個プラスされるって感じです。
ちなみに、300+0*10の0の部分は1でも2でもなんでもよいです
>>125 別に変じゃなくないか?
numが一定値以下で、かつ現在発注中(到着待ち)じゃなけりゃ発注すんだろ?
inc_dayには発注日+3が入っているから、到着待ち中はday<inc_dayになる
133 :
デフォルトの名無しさん :2007/10/25(木) 00:16:59
>>127 「i++;」を付ける位置は以下で良いですか?
付けてみたのですが分割後に出力される最後の単語が文字化けしてしまいます。
後、テンプレ見直してみましたが、タイプミスや書き残しはもうないので仕様はこれでいいと思います。
/* コンマかピリオドならstr2の位置を1つ左へ */
}
/* str1を1文字右に移動 */
i++;
}
/* str2(単語)に終端文字を追加 */
プログラマは数学が苦手なんです。 プログラマはコーヒーとタバコが好きなんです。
135 :
デフォルトの名無しさん :2007/10/25(木) 00:18:36
136 :
86 :2007/10/25(木) 00:19:18
137 :
デフォルトの名無しさん :2007/10/25(木) 00:20:34
>>134 英語も苦手だよ。後、眠気覚まし+暇つぶしにガムもスキだよ。
>>133 i++はそこでいいよ。
テンプレどおりにやると入力の最後に空白入れないとバグる。
str1[i] != ' ' のとこを str1[i] != ' ' && str1[i] != '\0'
にすればたぶんOK.
139 :
86 :2007/10/25(木) 00:30:55
ミス…… 本当に助かりました ありがとうございます
140 :
22 :2007/10/25(木) 00:34:15
自分の問題に対してレスしてくれたり、といてくれた人達、 本当にありがとう!! 助かりました!!!!
141 :
デフォルトの名無しさん :2007/10/25(木) 00:37:59
>>138 提出の際に聞いてみます。
期限ぎりぎりで半ば諦めていたので、本当に感謝ありがとうです。
手直しも直ぐにやっていただき助かりました。
[1] 授業単元: C言語演習 [2] 問題文(含コード&リンク): 1:y=sin(x) x=0から4πまで、512分割して、yの値を求め、ファイルに書き込む。 2:y=sin(x-π/2) x=0から4πまで、512分割して、yの値を求め、ファイルに書き込む。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: bcc [3.3] 言語:C [4] 期限:なるべく早めに [5] その他の制限: 特にないです。 よろしくお願いします。
143 :
デフォルトの名無しさん :2007/10/25(木) 01:00:46
#include<stdio.h> #include<math.h> main(){ int n; FILE *fp=fopen("sin.txt", "w"); for(n=0;n<=512;n++)fprintf(fp,"sin(π×%d/512) = %f\n",n,sin(4*M_PI*(n+0.0)/512)); }
144 :
デフォルトの名無しさん :2007/10/25(木) 01:07:18
こっち訂正汁 for(n=0;n<=512;n++)fprintf(fp,"sin(4π×%d/512) = %f\n",n,sin(4*M_PI*(n+0.0)/512)); for(n=0;n<=512;n++)fprintf(fp,"sin(4π×%d/512 - π/2) = %f\n",n,sin(4*M_PI*(n+0.0)/512-M_PI/2));
145 :
デフォルトの名無しさん :2007/10/25(木) 01:13:41
#include<stdio.h> #include<math.h> main(){ FILE *fp=fopen("sin.txt", "w"); for(int n=0;n<=512;n++)fprintf(fp,"sin(4π×%d/512 - π/2) = %f\n",n,sin(4*M_PI*(n+0.0)/512-M_PI/2)); fclose(fp); }
>>63 テンプレがおかしい。指示通りにやるとセグメントエラーを起こす。
148 :
デフォルトの名無しさん :2007/10/25(木) 01:32:23
>>147 ありがとうございます。
残念ながら、今はプログラミングができる環境じゃないので、明日試して見ます。
149 :
142 :2007/10/25(木) 01:32:29
150 :
デフォルトの名無しさん :2007/10/25(木) 01:47:38
>>146 一応、
>>127 のi++;の付け加えでちゃんと動いてくれるので、OKです。
コンパイル通って、動作も「,.」削除+空白削除+分割表示できてるので。
151 :
デフォルトの名無しさん :2007/10/25(木) 01:48:52
i++;じゃなくてstr1[i] != ' ' && str1[i] != '\0'の変更ですね。
152 :
147 :2007/10/25(木) 02:07:00
>>111 念のため、
#define DAYS 10 // 販売期間
#define ITEMS 10 // 製品の種類数
の部分を
#define DAYS 1000 // 販売期間
#define ITEMS 100 // 製品の種類数
と書き換えると題意に沿った回答になる。
ただし、このとき、出力が最悪200000行になるので注意。
>>82 課題にはそのとおり書いてあったんですが・・。
自分には問題の@〜Bの意味がさっぱりで・・・。
>>83 それが答えってことになるのですか?
こたえだね。
答えかどうかもわからないって…
>>156 すでにC++ですっていって提出しちゃえば?
問題が曖昧すぎ
プログラムは配布されたプリントから打ち込みましたが、 問題文は文章でなく口頭で出題されました。全くこの通りです。 すでにC++になっているんでしょうか?
すいません、今更ですがトリップをつけるのを忘れていました
class Helonを作ってコンストラクタで三辺の長さで初期化して get()で返すとか、そういう風にすればどう? あとprintfをcoutに無理矢理直すとそれらしく見える。別にprintfでも C++の範囲内なのだが。
164 :
デフォルトの名無しさん :2007/10/25(木) 13:40:38
>>147 一つ目の製品はちゃんと発注するんですけど、二つ目以降は発注が行われないんですけど
どうすればいいんですか?
165 :
147 :2007/10/25(木) 14:00:28
166 :
デフォルトの名無しさん :2007/10/25(木) 14:06:31
>>165 できました。本当にありがとうございました。
167 :
65です :2007/10/25(木) 14:48:32
遅くなりました。すいません。 変数を州ごとに集計して平均を出す部分がよくわかりません。 >67 ファンクションについてはまだ授業で習っていないので、先生に避けたほうがいいと言われました。 でも、Voidとか変数のReferenceとか基本的なことは本で読んだので、使ってくださってもけっこうです。 提出するコードは、ファンクションを使わないように書き換えます。 >70 はい。州の略はその通りで大丈夫です。
168 :
デフォルトの名無しさん :2007/10/25(木) 15:30:40
170 :
デフォルトの名無しさん :2007/10/25(木) 16:54:31
>>14 まだ、待っています。出来る方お願いします。
アドバイスはいくつか貰ったのですが、関数から関数への受け渡しがうまく行きません。
171 :
169 :2007/10/25(木) 17:00:34
>>65 >>167 続き
・1行目にある #include <algorithm> は削除。
・出力は一応CSV のはず。
・アメリカの略号に誤入力があるかもしれない。
・アメリカの州って50だったっけ?
172 :
コンパイルは出来たがあってないぞ :2007/10/25(木) 17:06:21
#include<stdio.h> #include<string.h> void d_word(char st[], int pos, int len){ int l=strlen(st); int i; for(i=pos; i<=l-len; i++) { st[i] = st[i+len]; }} void search_del(char st1[], char st2[]){ int i, j; int m1=strlen(st1); int m2=strlen(st2); for(i=0; i<=m1-m2; i++) { for(j=0; j<m2; j++) { if(st1[i+j] != st2[j]) break; } if(j=m2) { d_word(st1, i, m2); m1 -= m2; }}} int main(){ char str1[256], str2[256]; printf("string? : "); gets(str1); printf("deleted word? : "); gets(str2); search_del(str1, str2); puts(str1); return 0;}
お願いします 問題【0からa-1までの整数の乱数をn個発生させ、発生した整数のヒストグラムを表示しなさい。 ただし。a<21とし、aとnはキーボードから入力する】 ______________________________________________とりあえずいままで作成したコードです__________________________________ #include <stdio.h> #include <math.h> #include <stdlib.h> main(void) { int n,a,b,i,val; int c[21]; printf("0からa-1までの整数の乱数をn個発生させ、\n"); printf("発生した整数のヒストグラムを表示させます\n"); printf("1から21までの任意の整数aを入力してください。\n"); scanf("%d",&a); printf("任意の正の整数nを入力してください。\n"); scanf("%d",&n); if(a<=0||a>=22) {printf("aの値を入力しなおしてください。\n");} else{ val=(double)rand()/(RAND_MAX+1)*a; if(n<=0) {printf("nの値を入力しなおしてください。\n");} else { for (i=0; i<=(a-1); i++) {printf("aが%dのとき、%d回\n",i,c[val]); c[val]=c[val]+1;} } } }___________________________________________________________________________________________________________________________
174 :
173 :2007/10/25(木) 17:24:12
結果表示はヒストグラムというか 〜は〜回という形式にします volとかそのへんの扱いかたがよく分からずに参っております よろしくお願いいたします。
レスしてくれた方やプログラムを作ってくれた
>>163 さん、ありがとうございました。
とりあえず課題を出したうえで、C++にするのはどういうことか詳しく聞いてみます。
176 :
65です :2007/10/25(木) 17:31:19
>169さん 丁寧にありがとうございます。 はい、アメリカの州は50です。 ところで、私は途中まで以下のようにコードを組み立てたのですが、以下のようなやり方でも、プログラムを完成させることはできますか? #include <iostream> #include <string> #include <fstream> using namespace std; int main (int argc, char **argv) { char peek; ifstream myFile; string cityName, stateName; float gasPrice; myFile.open("gasprice_file.txt"); while((peek = myFile.peek () ) ! = EOF) { myFile >> cityName; myFile >> stateName; myFile >> gasPrice; If(! myFile) { myFile.clear(); cityName = cityName + " " + stateName; myFile >> sateName; myFile >> gasPrice; { myFile.close(); return 0; }
>>173 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
main(void)
{
int n=-1,a=0,b,i,val,c[21];
for(i=0;i<21;i++) c[i]=0;
srand((unsigned int)time(NULL));// 乱数の初期化
printf("0からa-1までの整数の乱数をn個発生させ\n");
printf("発生した整数のヒストグラムを表示します。\n");
printf("1から21までの任意の整数aを入力してください。\n");
while(!(a>0&&a<22)){
scanf("%d",&a);
if(a<1||a>21)
printf("aの値を入力しなおしてください。\n");
}
printf("任意の正の整数nを入力してください。\n");
while(n<0){
scanf("%d",&n);
if(n<0)
printf("nの値を入力しなおしてください。\n");
}
for(i=0;i<n;i++){
val=(double)rand()/(RAND_MAX+1)*a;
c[val]++;
}
for (i=0; i<=(a-1); i++)
printf("%d = %d回\n",i,c[i]);
}
表示はヒストグラムでなくてもいいのかな。
>>170 アドバイスって言うか
>>20 で回答もらってるじゃない。
・if(j=m2)をif(j==m2)
・printf("%d\n", st1);をprintf("%s\n", st1);
この2点の変更だけで動くはず。変更の仕方が間違ってるんだと思う。
>>177 whileの条件とループの中のifで2回判定するのはムダ
>>177 の訂正。入力部分。
while(scanf("%d",&a),!(a>0&&a<22))
printf("aの値を入力しなおしてください。\n");
printf("任意の正の整数nを入力してください。\n");
while(scanf("%d",&n),n<0)
printf("nの値を入力しなおしてください。\n");
>>179 の指摘したムダを省くと多分こうなると思います。
ってやっちまった。
>>180 だと文字入力したら無限ループしてしまう。
while(scanf("%d",&a),!(a>0&&a<22)){
printf("aの値を入力しなおしてください。\n");
fflush(stdin);
}
printf("任意の正の整数nを入力してください。\n");
while(scanf("%d",&n),n<0){
printf("nの値を入力しなおしてください。\n");
fflush(stdin);
}
こうでした。
182 :
デフォルトの名無しさん :2007/10/25(木) 18:34:53
>>182 見ずにコメント。1.改行コード 2.全角スペース
そろそろコンパイラが吐いたエラー貼ったらどうだ?
>>182 #include<string.h>を追加。もしかしてstr〜の関数習ってない?
>>177 ありがとうございます
実行してみたところ、
0以外の数字が何度やっても0回になってしまいますが
これはどうすればよろしいのでしょうか?
186 :
デフォルトの名無しさん :2007/10/25(木) 18:50:01
187 :
デフォルトの名無しさん :2007/10/25(木) 18:52:46
>>186 「エラーが無いので」×
「エラーが長いので」○
1] 授業単元:C言語 [2] 問題文:ファイルの内容を読み込んで、下記の例のように読み込んだ内容を ディスプレイに表示させよ。 ファイルの内容 誕生年:2000 誕生月:1 誕生日:2 身長:120.0 体重:21.0 名字:Kouno 名前:Hiro 実行例 氏名 Kouno Hiroです。 生年月日は2000年1月2日です 身長120,0cm 体重21,0kgです [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年10月26日 [5] その他の制限: ライブラリ関数は使っても大丈夫です。 読み込むことはできたのですが、fgetsを使うと「誕生年:2000」と読み込んで しまって2000だけ表示させることができません。 よろしくお願いします。
>>185 valにちゃんと値が入ってないのかな。
val=(double)rand()/(RAND_MAX+1)*a;
を
val=rand()%a;
に変えてみてください。
>>186 インデントを全角スペースでやってない?
190 :
デフォルトの名無しさん :2007/10/25(木) 19:04:06
>>189 盲点、スペースを全角でやっていました。
スペースを全て消したらコンパイルが通って、ちょんと動きました。
全角スペースでエラー返されるんですね、勉強になりました。
次からはスペースの全角/半角に気をつけます。
>>189 ありがとうございます!ちゃんとできました
助かりました
192 :
デフォルトの名無しさん :2007/10/25(木) 19:57:16
193 :
169 :2007/10/25(木) 20:16:30
[1] 授業単元:プログラミング実験
[2] 問題文(含コード&リンク):
http://case.f7.ems.okayama-u.ac.jp/statedu/lispstat-book/node85.html にならって以下のデータ平均分散を用いて確率を出せ。10次元です。
データ
-18.858 1.046 -1.616 4.023 1.857 4.207 6.451 0.989
-3.807 0.744
平均
-6.388222e+00 -1.383500e+01 -1.249702e+01 -3.617623e+00 2.185494e-01
3.840833e+00 6.477101e+00 -1.552781e+01 4.537848e+00 -2.995257e+00
分散
1.504899e+01 2.376009e+01 2.176429e+01 2.650845e+01 2.850247e+01
5.442906e+01 3.594814e+01 7.991224e+01 2.946554e+01 3.397208e+01
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2007年10月26日まで
[5] その他の制限: なし
すいません、問題Bに間違い&追加がありました。
実装仕様もあって、書いてたことが違ってました。
以下が訂正問題です。
[1] 授業単元:文字列操作プログラム
[2] 問題文(含コード&リンク):
配列とポインタを使用し、文字列操作を行うプログラムを作成せよ。
@独自のstrlen関数mystrlen関数を自作する。
文字列のポインタを受け取り、文字列の長さを返す関数を作成する。
A独自のstrcpy関数mystrcpy関数を自作する。
文字列のポインタ2つを受け取り、文字列のコピーを行う関数を作成する。
B独自のatoi関数myatoi関数を自作する。
数値文字列のポインタを受け取り、数値を返す関数を作成する。
C独自のitoa関数myitoa関数を自作する。
数値を受け取り、指定された基数で文字列変換を行う関数を作成する。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:不明
[3.3] 言語:C言語
[4] 期限:2007年10月26日朝5:00まで
>>196 に続く
>>195 の続き
[5] その他の制限:実装仕様として、
@int mystrlen(const char*s)
第一引数:文字列のポインタ
戻り値:文字列の長さを返す
Achar*mystrcpy(char*s1,const char*s2);
第一引数:コピー先バッファのポインタ
第二引数:コピー元文字列のポインタ
戻り値:第一引数の文字列へのポインタを返す
Bint myatoi(const char*nptr);
第一引数:変換元の数値文字列
戻り値:変換された値を返す
Cchar*myioa(int value,char*buff,int radix);
第一引数:変換元の整数
第二引数:変換後の数値文字列を格納するバッファのアドレス
第三引数:基数(何進数で変換するか。2〜36の範囲内で指定可能)
戻り値:第二引数の文字列へのポインタを返す
と、なっております。
すいませんが回答の方をよろしくお願いします
198 :
デフォルトの名無しさん :2007/10/25(木) 21:28:40
>>195 >>196 いまさら?これから変更するの面倒だし
期限:2007年10月26日朝5:00
ってことは残り7時間、無理。
がんばれノシ
標準ライブラリ使っちゃダメって書いてないんだからそのまま引数渡せばいいだろ。
よろしくお願いします。 [1] 授業単元:C++プログラミング [2] 問題文(含コード&リンク): 次のクラス定義を参照して、関数 func 内の処理を記述してください。 関数 func 内では p が派生クラス MagazineMotorcycle のインスタンスを指すかどうかを調べて、 もしそうならメンバー関数 Reserve を呼び出してください。そうでなければ false を返してください。 class Magazine { public: virtual bool Order(int amount = 1) = 0; }; class MagazineMotorcycle : public Magazine { public: bool Order(int amount = 1) {} bool Reserve() {} }; bool func(Magazine* p) { // 可能ならば MagazineMotorcycle::Reserve() を呼び出す処理 } [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C++ [4] 期限: 10/26 12:00 [5] その他の制限:なし
>>198 昨日書き込んで、今日間違い気づいたんですよorz
できればお願いします。自分にとっては、これってホントに初級編!?って
いうぐらい難しい
>>201 bool func(Magazine* p)
{
// 可能ならば MagazineMotorcycle::Reserve() を呼び出す処理
if (MagazineMotorcycle* mm = dynamic_cast<MagazineMotorcycle*>(p))
mm->Reserve();
return false;
}
これでおk?
>>203 ありがとうございます。
こちらを提出してみます。
>>201 bool func(Magazine* p)
{
// 可能ならば MagazineMotorcycle::Reserve() を呼び出す処理
if (MagazineMotorcycle* mm = dynamic_cast<MagazineMotorcycle*>(p))
return mm->Reserve();
return false;
}
こんどこそおk?
>>204 // データvalをスタック x に積む
void push(int *x,int val)
{
// (1) スタックがオーバフローかどうかをチェック
if (stack_pointer < stack_size) {
// (2) オーバフローでなければデータ val をスタック x につむ
x[stack_pointer++] = val;
}
}
// データをスタック x からおろす
void pop(int *x)
{
// (1) スタックがアンダーフローかどうかをチェック
if (stack_pointer > 0) {
// (2) アンダーフローでなければスタックxからデータをおろして、
// スタックポインターを調整
stack_pointer--;
}
}
これでおk?
>>207 おkです。感謝です。
本当にありがとうございます。
助かりました。
209 :
57 :2007/10/25(木) 22:54:44
>>60 レスありがとうございます。
今日の朝、main関数を作って動かしてみたのですが、
おかしいです。
例えば、連結リストのaの値を10、11、12とすると、
11、10、56787
と、一番最後が変な数値になってしまいます。
並び替える前に表示すると、10、11、12となってちゃんと動作するので、
表示する関数は間違ってないと思います。
一応補足として、自分が扱っている連結リストは一番最初に、aに値が
含まれていない要素があり、その後からaに値が含まれる要素が並びます。
>>202 #include<stdio.h>
int mystrlen(const char *s)
{
int len=0;
while(*s++!='\0') len++;
return len;
}
int myatoi(const char *nptr)
{
int i,n=0,sign=0,len=0;
const char *s=nptr;
while(*s++!='\0') len++;
if(*nptr=='-'){
sign++; len--; *nptr++;
}
for(i=0;i<len;i++)
n=10*n+*nptr++-'0';
return sign ? -n : n;
}
mystrcpy,myitoaは
>>83 のままで仕様満たしてるのでそれ以外を。
211 :
デフォルトの名無しさん :2007/10/25(木) 23:11:09
>>168 さん、この生産管理プログラムの期限はいつまででしょうか。
>>83 >>210 遅い時間に本当にありがとうございます。
お手数おかけ致しました。(TT)
>>209 糞リストの仕様を書かなかったほうが悪い。
お願いします!! [1] 授業単元: C言語 [2] 問題文(含コード&リンク): 1:int型整数をchar型配列の文字列に変換するitoa関数を作れ 2:long型整数をchar型配列の文字列に変換するltoa関数を作れ 3:float型小数をchar型配列の文字列に変換するftoa関数を作れ [3] 環境 [3.1] OS: XP sp2 [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語: C [4] 期限: 明日26日(金)の16時まで
>>215 1.
char* itoa(int n){static char c[16];sprintf(c,"%d",n);return c;}
2.
char* ltoa(long n){static char c[16];sprintf(c,"%ld",n);return c;}
3.
char* ftoa(float n){static char c[16];sprintf(c,"%f",n);return c;}
>>215 itoaは
>>83 にあるよ。ltoaはitoaとほとんど変わらん。
ftoaも小数点以下あるだけであんま変わらないな。
218 :
57 :2007/10/25(木) 23:37:20
>>214 申し訳ないです。
リストの仕様は以下の様になります。
・リストは連結リストで片方向リストです。
・次の要素がない場合(リストの一番最後)は、次の要素へのポインタをNULLとします。
・リストの一番最初には、aに値が含まれていない要素があります。
よろしくお願いします。
219 :
デフォルトの名無しさん :2007/10/25(木) 23:42:13
木曜日の15時までです。
>>218 static struct c *re_internal(struct c *l)
{
struct c *p;
if(l->n==NULL) return l;
p = re(l->n);
l->n->n = l;
l->n = NULL;
return p;
}
struct c *re(struct c *l)
{
if(l->n) l->n = re_internal(l->n);
return l;
}
221 :
デフォルトの名無しさん :2007/10/25(木) 23:49:08
再帰は?
222 :
215 :2007/10/26(金) 00:03:01
>>216 さすがにsprintfは使うわけにはいかないかと・・・w
>>217 ありがとうございます。
>>83 を参考にしてやってみようと思います。
223 :
57 :2007/10/26(金) 00:03:47
>>219 減点はするけど、出さないよりは、ましだから今週の課題と一緒に来週に
出しなさいと言われました。
>>220 ありがとうございます。
リストの仕様は
>>218 に書いた通りですが、
問題自体は
>>57 に書いた通り、再帰を使わないと…
>>220 re_internalの中でre呼び出してる
225 :
57 :2007/10/26(金) 00:23:54
>>224 再帰って自分自身の関数を呼び出すんじゃないですっけ?
これだと、他の関数を呼び出してるだけな気がするのですが…
一つの関数で作ることって出来ないのですかね?
>>218 直した
static struct c *re_internal(struct c *l)
{
struct c *p;
if(l->n==NULL) return l;
p = re_internal(l->n); // <- この行
l->n->n = l;
l->n = NULL;
return p;
}
struct c *re(struct c *l)
{
if(l->n) l->n = re_internal(l->n);
return l;
}
>>224 thx
227 :
57 :2007/10/26(金) 00:50:35
リストの先頭にデータを入れないことによってどんな利点があるの?
229 :
168 :2007/10/26(金) 00:58:45
>>147 ・212
28日までにお願いしたいんですけど・・・
よろしくお願いします。
>>230 比較用演算子 == を使うこと.
if(fop=NULL)
if(fout=NULL)
あと、終盤で下記不要
> heikin=goukei/NUM;
> fprintf(fout,"番号\t平均点との差\n");
> for(i=0;i<NUM;i++)
> {
> fscanf(fop,"%d%d",&gakusei[i].bangou,&gakusei[i].seiseki);
> goukei=+gakusei[i].seiseki;
> }
最後は goukeiもNUMも整数なのでgoukei/NUMは整数となるのを防ぐ
heikin=(double)goukei/NUM;
>>230 14〜21行目: 使わない変数 (fairu, cp, sirusi1, sirusi2) の宣言は外しましょう
21行目: heikin は int 型でいいんじゃない?
double 型で行きたい場合、int型変数 (seiseki, goukei等) との計算をするときにキャストとか考えた方が良い
24,26行目: scanf("%s", &open); → scanf("%s", open);
ポインタを習っているかは知りませんが、配列名は単独で使用するとポインタ型になります
30,42行目: if (fop=NULL) → if (fop == NULL)
C言語での比較演算子は == です
56行目: goukei=+gakusei[i].seiseki; → goukei += gakusei[i].seiseki;
演算子を見直しましょう
63〜70行目: 平均2回計算してるから消そう
74行目: "%d\t%dn" → "%d\t%d\n"
改行文字は "\n" で表します
>>231 さん
>>231 さん
朝早くだったのにレスありがとうございます。
おかげ様でセグメントエラーも出ないで実行できました
来週中間試験があるので
もっと勉強しなきゃいけないなと思いました。
ホントにお世話様でした
中間試験って紙にコード書くの?
235 :
課題お願いします :2007/10/26(金) 09:05:21
[1] 授業単元:プログラミング演習 [2] 問題文:n個からr個を選ぶ組み合わせは、nCr = n!/r!(n-r)! ただし、n! = 1*2*3*…*(n-1)*nで求められる。そこで、n!を求める関数functorial(n)を定義し、それを3度呼び出す形で、組み合わせnCrをもおめるプログラムを作成せよ。 [3] 環境 [3.1] OS: (WindowsXP) [3.2] コンパイラ名とバージョン:Visual C++ [3.3] 言語: C [4] 期限: 今日の昼までに。 [5] その他の制限: 授業で配列とポインタは習いました。この問題は「関数」というセクションの問題です。大学の授業なのであまり難しくなり過ぎないようにお願いします。
236 :
235 :2007/10/26(金) 09:07:30
書き間違いorz [2] 問題文:n個からr個を選ぶ組み合わせは、nCr = n!/r!(n-r)! ただし、n! = 1*2*3*…*(n-1)*nで求められる。そこで、n!を求める関数functorial(n)を定義し、それを3度呼び出す形で、組み合わせnCr を求めるプログラムを作成せよ。
int function(int n) { return n<2 ? 1 : n * function(n-1); } int nCr(int n, int r) { return function(n) / function(r) / function(n-r); }
一瞬で片付くというのもある意味爽快だ
>>234 中間試験は筆記と実技があって
実技は端末からサーバーにアクセスして書きます。
実技は今のままじゃ、受かる気がしません…
ファイル処理、ポインタがかなりヤバイです
関数名functorialだw 階乗ならfactorialだし、関数ならfunctionだからfuncだけみて間違っちまった。
241 :
デフォルトの名無しさん :2007/10/26(金) 10:59:15
1] 授業単元: プログラミング [2] 問題文:3人の昼食代を入力し、その平均を関数aveにて計算し、 「割り勘で△円」と表示するプログラム (定義例:double ave(double c1,double c2,double c3)) [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月26日まで] できれば早いほうがうれしいです。 [5] その他の制限:定義例を使ってください if,while,switch,forは習いました お願いします
なんで金額がdoubleなんだよ・・・
>>234 別人だけど、フロッピーでソース提出とか、メールで添付とかもあるけど、一番多いのは紙。
正直、このご時勢で紙でやるのは馬鹿だと思う。
244 :
デフォルトの名無しさん :2007/10/26(金) 11:14:18
>>242 小数点出てもいいらしいです。要はaveを使って計算したいのだと思います。
俺の高校は紙にVBA書かされたぜ
>>243 国がやってる情報処理系の資格試験は、全部紙だぞ?
247 :
デフォルトの名無しさん :2007/10/26(金) 11:24:49
先日はありがとうござました。
[1] 授業単元: C言語演習U
[2] 問題文(含コード&リンク):
前回の授業で"姓/名"という形式の文字列を入力すると、これを姓と名を表す2つの文字列に分割するプログラムを作成した。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5158.txt このプログラムを関数を用いた形に書き換えようと思い、次のプログラムを作成した。
このプログラムを実行すると、おかしな出力になってしまった。
問題1:このプログラムのどこが間違っているのか、その理由を答えよ。
(ヒント:pt_s,pt_mはローカル変数)
問題2:プログラムを書き直せ。
(配列を渡す方法、ポインタのアドレスを渡す方法などある)
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: cygwin gcc
[3.3] 言語: C言語
[4] 期限:29日(月)
248 :
デフォルトの名無しさん :2007/10/26(金) 11:34:38
>>239 うちも紙〜
さすがにプログラムを卓上で作りコード全部書けは無いけど、
5〜6行くらいの穴埋めでプログラムを完成させよとか。
流石に資格試験でソース全部書けは無いだろ。 あったら死ねるけどw 普段書かない記号とか書かなきゃならんし、 インデント一つ追加しようと思ったらその間書き直しだし、 書いてる事がタイプ以上に考えてる事に追いつかないし、 変数名チェックも全部自分でしなけりゃならんから面倒だし。
250 :
デフォルトの名無しさん :2007/10/26(金) 12:01:52
>>239 うちは進んでるよ。
テストプログラムを当日教室で下してきて実行すると、P検みたいなプログラムが走って画面左半分が問題書いてあって、右半分の上がコマンドプロンプト?で下がテキストパッドになってる。
問題にある仕様のプログラムをテキストパッドで作って、「実行」ボタンがその下にあるから押すとコマンドプロンプトで自動的にコンパイル+実行してくれる。
作ってる途中のものを試しでコンパイルする度、実行はうざかった。
問題全部作ったら問題1番最後の回答終了を押すと自動で結果をサーバーに送信して、プログラム終了。
ファイヤーウォールに引っ掛かって提出できないとか、提出時に回線が込んでて提出できないとかで、良悪あるけどね。
>>239 高専電気科の情報の授業では
ごく普通にPCでやってるぞ
しかも、授業で書いたコードを参照してもいいというオマケ付きで。
授業理解度を確かめるのならこういう方式でもよさげな気がする。
>>241 これは……一見するととても簡単そうなプログラムに見える……
そう見えるのはオレだけか……?
strcpyの使い方で質問があるんですが、 strcpy(a+(変数),b+(変数)); これはどういう意味でしょうか?+が特に分からないんですが… a、bは配列です
>>250 せっかくプログラミングやってんだから、
講師の側でもそんな感じでテスト用プログラム作って欲しいもんだな
>>252 そういう方式もいいよなあ
実際のプログラミングだとソース参照し放題、ネットで調べ放題なわけで
それでもできない人がいるんだから、十分実力測れるだろう
プログラミングは暗記じゃない
>>254 その配列a, bの +変数分以降のみの文字列をコピーするという意味。
変数が 2 だったらaの先頭 2 文字は変化しない。
258 :
235 :2007/10/26(金) 15:23:52
>>247 元のプログラムではポインタ変数は仮引数なので呼び出し元に結果が反映されない
#include <stdio.h>
void namesplit(char [], char **, char **);
int main(void){
char full[200];
char *pt_sei, *pt_mei;
printf ("姓/名で入力せよ:");
scanf("%s", full);
namesplit(full, &pt_sei, &pt_mei);
printf("姓:%s\n 名:%s\n", pt_sei, pt_mei);
return 0;
}
void namesplit(char f[], char **pt_s, char **pt_m)
{
/*pt_sとpt_mをfの先頭アドレスにセット*/
*pt_s = f; *pt_m = f;
/*スラッシュまでpt_mを移動*/
while (**pt_m != '/')
(*pt_m)++;
**pt_m = '\0';
(*pt_m)++;
/*これで、pt_seiとpt_meiはそれぞれ姓と名を指す場所に移動した?*/
}
>>253 わかる人は簡単だよ
でも、習ったばっかりなんだろ
最初はみんなわからないもんだよ
一分で書けるけど書かない
なぜ書かない?
単純に3つの引数とって平均を求める関数て言えばいいのに、なんで割り勘とか余計な設定つけてんだよ。 一人一人の代金がわかってるなら、割り勘になんてしないだろ。
>>263 「相乗平均じゃなくて相加平均だよ^^ お前ら間違えんなよ^^」て言いたかったんだよ
気の回る良い先生じゃないか
宿題マダァ?(・∀・ )っ/凵⌒☆チンチン
ひつまぶしキボンヌ
267 :
デフォルトの名無しさん :2007/10/26(金) 22:12:45
質問テンプレ】 [1] プログラミング [2] 自然対数の底eを求めるプログラムをSRT除算を用いて求めよ。 exp(x)=Σ(n=0,∞){1/n!}=1/0!+1/2!+1/3!+…+1/n! =1+(1+1/2(1+1/3(1+…+1/n))) 固定小数点で、整数部を16ビット、小数部を48ビットとする(n≧17) [3] 環境 [3.1] Vine Linux [3.2] gcc [3.3] C言語 [4] 2007年10月29日8:40まで でも早い方がいいです。 [5] ループを使用してお願いします。
268 :
デフォルトの名無しさん :2007/10/26(金) 22:12:55
全ディレクトリのファイルを調べてサイズが一致するファイルをプルパスで出力せよ
269 :
デフォルトの名無しさん :2007/10/26(金) 22:19:18
270 :
デフォルトの名無しさん :2007/10/26(金) 22:22:06
>>265 自分で要求するほど、宿題を回答してやりたいのか。
この掲示板の鏡だな、解けない問題は無いってか?
271 :
デフォルトの名無しさん :2007/10/26(金) 22:25:20
SRT除算は簡単ではないな
272 :
デフォルトの名無しさん :2007/10/26(金) 22:43:03
>>269 これはむずい
もう少し前のページから見ないと単語がわからなすぎる
274 :
デフォルトの名無しさん :2007/10/26(金) 22:54:36
シンプソンは簡単 関数をf(x)とし、 区間(a,b)を一分割で積分するとする m=(a+b)/2 、d=(b-a)とするとき積分値は d/6 * (f(a)+f(b)+4f(m))だ N分割のときはこの値を使えばいい
276 :
デフォルトの名無しさん :2007/10/26(金) 22:59:44
具体的には、区間(a,b)をN分割するならば、 F(s,t)= (t-s)/6 * (f(s)+f(t)+4f(s+t /2)) 、 d = (b-a)/Nとおくとき n=0,・・・,N-1に対しF(a+nd, a+(n+1)d)の和を計算すればよい
278 :
デフォルトの名無しさん :2007/10/26(金) 23:03:56
>>275 プログラム自体は計算と結果の出力だけの簡単なものだからチャレンジしてみなってことじゃない?
計算内容自体は
>>274 が解説してくれてるし。
もしくは作成中か。
279 :
デフォルトの名無しさん :2007/10/26(金) 23:08:01
>>259 ありがとうございます。ポインタ変数が問題だったんですね。
仮引数だったのをポインタのポインタで呼び出しが出来るようにしたと。
なるほど納得しました。
280 :
デフォルトの名無しさん :2007/10/26(金) 23:09:01
#include <stdio.h> #include <math.h> double f(double x){return exp(-x*x);} double g(double x){return exp(1/sqrt(1+x*x*x*x));} #define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6 #define G(a,b) (g(a)+g(b)+4*g((a+b)/2))*(b-a)/6 int main(){ double x,d=0.1,sum; sum=0; for(x=0;x<1;x+=d)sum+=F(x,x+d); printf("%f\n",sum); sum=0; for(x=0;x<1;x+=d)sum+=G(x,x+d); printf("%f\n",sum); }
281 :
デフォルトの名無しさん :2007/10/26(金) 23:10:31
訂正 double g(double x){return 1/sqrt(1+x*x*x*x);}
282 :
デフォルトの名無しさん :2007/10/26(金) 23:12:03
値があっているか確認したいが数値計算ソフトだれか持っている?
283 :
デフォルトの名無しさん :2007/10/26(金) 23:12:09
何にせよ動作するリストを出すのがこのスレってもん
284 :
デフォルトの名無しさん :2007/10/26(金) 23:12:15
>>274 >>276 で組み込む計算式作ってくれてるから、もう課題出来てるも同然な気がする。
だって、その式を表示するだけで完成でしょ。
>>272 カウンタは整数のが良いと思うので便乗
#include <stdio.h>
#include <math.h>
double func1(double x)
{
return sqrt(pow(x, 4) + 1);
}
double func2(double x)
{
return exp(-pow(x, 2));
}
int main(void)
{
double l = 0.0, r = 1.0, h = 0.1, s = 0;
int i;
for(i = 0; i < (r - l)/h; i += 2)
s += h/3*(func1(l + i*h) + 4*func1(l + (i + 1)*h) + func1(l + (i + 2)*h));
printf("%g\n", s);
for(i = 0; i < (r - l)/h; i += 2)
s += h/3*(func2(l + i*h) + 4*func2(l + (i + 1)*h) + func2(l + (i + 2)*h));
printf("%g\n", s);
return 0;
}
[1] 授業単元: コンピューター [2] 問題文(含コード&リンク):整数演算と浮動小数点演算で自分のプロセッサのスピードをテストするプログラムと結果を示しなさい。 テストするのは整数、浮動小数点ともに、加減乗除の4つづ、計8つです。 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [5] その他の制限: 結果はcygwinのtimeを使えってばっちゃが言ってました。 お願いします。
ふざけてんの
289 :
デフォルトの名無しさん :2007/10/27(土) 00:18:05
なんで6で割っているんだぜ?
290 :
デフォルトの名無しさん :2007/10/27(土) 00:34:16
>>289 #include <stdio.h>
#include <math.h>
double f(double x){return exp(-x*x);}
double g(double x){return exp(1/sqrt(1+x*x*x*x));}
#define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6
#define G(a,b) (g(a)+g(b)+4*g((a+b)/2))*(b-a)/6
int main(){
double x,d=0.001,sum;
sum=0;for(x=0;x<1;x+=d)sum+=F(x,x+d);
printf("%f\n",sum);
sum=0;for(x=0;x<1;x+=d)sum+=G(x,x+d);
printf("%f\n\n",sum);
//単純な定積分
int n,N=1/d;
sum=0;for(n=0;n<N;n++)sum+=d*g(n*d);
printf("%f\n",sum);}
291 :
デフォルトの名無しさん :2007/10/27(土) 00:47:03
Integral(f,a,b,d)って出来るの? 関数わたし
292 :
デフォルトの名無しさん :2007/10/27(土) 00:55:29
スマソ全然見てなかったわ
293 :
272 :2007/10/27(土) 01:03:57
ありがとうございました 解説で分かってきたので色々と試してみます
294 :
291 :2007/10/27(土) 01:09:38
できた #include <stdio.h> #include <math.h> double f(double x){return exp(-x*x);} double g(double x){return 1/sqrt(1+x*x*x*x);} #define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6 typedef double (*func)(double); double Integral(func f,int a,int b, double d){ int n,N=(int)1/d;double s=0; for(n=0;n<N;n++)s+=F(n*d,n*d+d); return s;} int main(){ double d=0.001; printf("%f\n",Integral(f,0,1,d)); printf("%f\n",Integral(g,0,1,d));}
先こされた。 #include<stdio.h> #include<math.h> double quadInterpol( double (*fun)( double ), double begin, double end ) { return ((*fun)(begin) + 4*(*fun)( (begin+end)/2 ) + (*fun)(end)) * (end-begin)/3; } double integral( double (*fun)( double ), double begin, double end, double h ) { double result = 0.0; double pos = begin; while( pos <= end ) { result += quadInterpol( (*fun), pos, pos+h ); pos += h; } return result; } double f(double x) { return exp(-x*x); } int main(void) { const double diff = 0.1; printf("result=%f\n",integral(f,0.0,1.0,diff)); return 0; }
>>294 出題者じゃないんだが。
typedef double (*func)(double);
これってなにやってるの?
297 :
57 :2007/10/27(土) 01:29:04
>>228 自分も詳しい理由は分かりませんが、この再帰の問題以前にも、リストで
色々な動作をする関数を作ったので、その関数を作る時、関数に引数を
渡したりするのに、リストの先頭にデータを入れない方が都合が
良いんじゃないですかね?
リストは先頭にデータを入れないとばかり思ってたので、よく分かりませんが。
298 :
291 :2007/10/27(土) 01:30:26
>>296 たとえばDLLを使うとき次のように書く 型の定義
typedef int (__stdcall *FNC)(const HWND , LPCSTR , LPSTR , const DWORD);
main(){
HINSTANCE hd = LoadLibrary("UNZIP32.DLL");
FNC p = (FNC)GetProcAddress(hd,"UnZip");
}
299 :
デフォルトの名無しさん :2007/10/27(土) 01:30:41
>>290 すいませんd=0.001となってるのが良く分からないんですが
300 :
291 :2007/10/27(土) 01:31:39
>>299 細かくした方が値が正確になるって事だけだ d=0.1でいい
301 :
コッチェビン :2007/10/27(土) 01:32:28
なんかすごいシコシコしたい・・・
302 :
デフォルトの名無しさん :2007/10/27(土) 01:33:37
>>298 つまりfuncという関数型ができたということ?
そうしたらIntegral(func funcName,...)
とすべきでは?
それと
#define F(a,b) (f(a)+f(b)+4*f((a+b)/2))*(b-a)/6
ここでfつかっちゃったらマクロFでは常に関数fが呼び出されることにならない?
ちなみに追い詰めてるわけじゃないです。数値あわせがしたいだけです。 計算結果に自信がないので。
305 :
291 :2007/10/27(土) 01:36:19
>>303 呼び出すのはfでいいんだよ 引数でfとかgを指定するから
306 :
291 :2007/10/27(土) 01:37:56
>>304 単純な定積分の値と比較したから正解だろう
>>290 で求めている
あと
>>290 はgが間違えていて
正しくは
double g(double x){return 1/sqrt(1+x*x*x*x);}
>そうしたらIntegral(func funcName,...) スマソ。そうなってた。
>>305 double Integral(func f,int a,int b, double d){
int n,N=(int)1/d;double s=0;
for(n=0;n<N;n++)s+=F(n*d,n*d+d);
return s;}
引数でfという関数を取っているのは確かなんだけど
関数内で一回も使ってない。
309 :
291 :2007/10/27(土) 01:41:38
>>308 Fがマクロだから使っている
あと使っていないのはaとbだ 勝手に(0,1)だとおもって書いてしまった
>>308 マクロ展開してみればいい
でも名前が被っているのは気持ち悪いな
#include<stdio.h>
void a(void){printf("func a\n");}
void b(void){printf("func b\n");}
void c(void (*a)(void)){a();}
int main(void){
c(a);
c(b);
return 0;
}
>>309 なるほどね。理解できました。
exp(-x*x)の関数名をfにしないでくれたらよかった。
>>294 粘着すまん。
6じゃなくて3で割らないといけなくないか?
h=0.1で指定されているし。
313 :
修正版 :2007/10/27(土) 02:00:49
#include <stdio.h> #include <math.h> double exp_x2(double x){return exp(-x*x);} double ichiwaru_root_1tasu_x4(double x){return 1/sqrt(1+x*x*x*x);} #define F(a,b) (f((a))+f((b))+4*f(((a)+(b))/2))*((b)-(a))/6 typedef double (*func)(double); double Integral(func f,double a,double b, double d){ int n,N;double s=0; N=(int)(b-a)/d; for(n=0;n<N;n++) s+=F(a+n*d,a+(n+1)*d); s+=F(N*d,b);return s;} int main(){ double d=0.1; printf("%f\n",Integral(exp_x2,0,1,d)); printf("%f\n",Integral(ichiwaru_root_1tasu_x4,0,1,d));}
314 :
修正版 :2007/10/27(土) 02:03:09
>>312 そもそも2hの幅で積分しろってことか それならそうだな
うがあぁ数値が合わない。 何が違うんだ。。。。。
316 :
修正版 :2007/10/27(土) 02:07:29
>>312 でも最小の区間を与えた方が標準的だと思う
Integral(f, 0, 1, 0.2))と呼び出せば正解と一致する値が出るはずだ
>>316 考えてみる。
正解はちなみにいくつなんだ
俺は
result=1.560123
result=1.988458
そっちは
1.493648
1.854075
他の検証方法ってある?Excelあたりでできるもんかね?
あ。6->3にした値ね。
319 :
修正版 :2007/10/27(土) 02:17:43
正解は0.746825と0.927040じゃないか 単純な積分値とほぼ一致する #include <stdio.h> #include <math.h> double f(double x){return exp(-x*x);} double g(double x){return 1/sqrt(1+x*x*x*x);} int main(){ double x,s,d=0.001; s=0;for(x=0;x<1;x+=d)s+=d*f(x); printf("%f\n",s); s=0;for(x=0;x<1;x+=d)s+=d*g(x); printf("%f\n",s); }
Excelで確認したところ俺もexp(-x*x)の単純な積分の値は 0.747508011 ぐらいになった。 では6で割るべきなのか。
6->3にした結果 俺 result=0.780061 result=0.994229 そちら 0.746825 0.927040 そっちの勝ちだ.orz ノシ
間違えた 3->6
323 :
修正版 :2007/10/27(土) 02:31:52
そういうことか・・・ややこしい。
325 :
デフォルトの名無しさん :2007/10/27(土) 02:40:23
便乗質問なんだけど h=0.1で与えられてるから式の通りに3で割るんじゃないの? の辺りがイマイチ理解できんので教えてくれ…
326 :
修正版 :2007/10/27(土) 02:46:21
>>325 問題どおりにやるとひとつひとつの積分区間は2hなので
6で割る部分と打ち消しあって3になる
幅hの積分を求めるのではなく x とx+hとx+2hの三点を2次関数で近似したいと言うことなんだろう
だから2h幅になっている
327 :
修正版 :2007/10/27(土) 02:48:01
328 :
デフォルトの名無しさん :2007/10/27(土) 02:54:49
ありがとうございます
330 :
デフォルトの名無しさん :2007/10/27(土) 03:57:35
引用しますが、計算式を #define F(a,b,h) (f(a)+f(b)+4*f((a+b)/2))*h/3 #define G(a,b,h) (g(a)+g(b)+4*g((a+b)/2))*h/3 というようにhを用いた式で表すなら 図のように d=0.1 for(x=0;x<1;x+=d*2) とすればいいのか
331 :
修正版 :2007/10/27(土) 04:06:02
>>330 #include <stdio.h>
#include <math.h>
double f(double x){return exp(-x*x);}
double g(double x){return 1/sqrt(1+x*x*x*x);}
#define F(x,h) (f(x) + 4*f(x+h) + f(x+2*h)) * h/3
#define G(x,h) (g(x) + 4*g(x+h) + g(x+2*h)) * h/3
int main(){
double x,sum,h=0.1;
sum=0;
for(x=0;x<1;x+=2*h)sum+=F(x,h);
printf("%f\n",sum);
sum=0;
for(x=0;x<1;x+=2*h)sum+=G(x,h);
printf("%f\n",sum);}
332 :
デフォルトの名無しさん :2007/10/27(土) 04:12:10
何か邪魔臭くなっていましたね さんくすこ
まだやってたのか。俺は寝てしまって今起きた #define F(x,h) (f(x) + 4*f(x+h) + f(x+2*h)) * h/3 #define G(x,h) (g(x) + 4*g(x+h) + g(x+2*h)) * h/3 じゃなくて #define F(x,h) (f(x) + 4*f(x+h/2) + f(x+h)) * h/6 #define G(x,h) (g(x) + 4*g(x+h/2) + g(x+h)) * h/6 にするかもしくはh=0.05にしないといけない。
やっと数値のずれが直ったので貼る #include<stdio.h> #include<math.h> double quadInterpol( double (*fun)( double ), double begin, double h ) { return ((*fun)( begin ) + 4.0*(*fun)( begin + h ) + (*fun)( begin + 2.0*h )) * h/3.0; } double integral( double (*fun)( double ), double begin, double end, double h ) { double result = 0.0; double pos = begin; do { result += quadInterpol( (*fun), pos, h ); pos += 2.0*h; } while( pos < end ); return result; } double f(double x) { return exp(-x*x); } double g(double x) { return 1.0/sqrt(1 + x*x*x*x); } int main(void) { const double diff = 0.1; printf("result=%f\n",integral(f,0.0,1.0,diff)); printf("result=%f\n",integral(g,0.0,1.0,diff)); return 0; }
ひゃっほう。
なんでシンプソン公式だけでこんなにスレ進むんだよw
338 :
デフォルトの名無しさん :2007/10/27(土) 10:59:46
[1] 授業単元: プログラミング [2] 問題文:整数nをscanfで入力後"factorial"という関数を呼び出して、n!を 求めるプログラム(結果はmainにて表示) (定義例:int factorial(int num)) [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月28日まで] [5] その他の制限:定義例を使ってください if,while,switch,forは習いました お願いします
#include <stdio.h> int factorial(int num) { int i, ret = 1; for(i=2; i<=num; i++) ret *= i; return ret; } int main(void) { int n; printf("nを入力:"); scanf("%d", &n); printf("%dの階乗は%d\n", n, factorial(n)); return 0; }
340 :
デフォルトの名無しさん :2007/10/27(土) 11:17:19
>>339 全くわかんなかったのに数分で解いてるよ(>_<)
ありがとうございました。
階乗は頻出の基本問題だし、このスレで答えてる人なら数分とかじゃなくて、問題見た瞬間に即答だろ。
テンプレレベルだよな・・・と思ったらwikiにも書いてないな 今から編集してくる
344 :
デフォルトの名無しさん :2007/10/27(土) 11:51:23
×勉強不足 ○勉強する気がない
LU分解とか死ねwwwwww 京大電電でつけど、プログラムの課題がイミフwwwwwwww
それ、プログラム以前の問題だろ Fランの大学ですらやる基本的な問題だし
【質問テンプレ】
[1] 授業単元: 画像工学
[2] 問題文(含コード&リンク):ある特定の画像を自動的に判別する
フォルダ内の画像を自動的に判別し,緑の画像があればhighlightのフォルダに
なければotherのフォルダに分別する
[3] 環境
[3.1] OS: (Windows/Linux/等々) Windows
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) よくわかりません
[3.3] 言語: (C/C++/どちらでも可 のいずれか) Visual C++ 2005
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 来週水曜日まで
[5] その他の制限: 特にありません
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5159.zip
350 :
デフォルトの名無しさん :2007/10/27(土) 14:08:07
348 こんなの面倒 授業でていたやつのほうが関数にくわしいだろ
351 :
デフォルトの名無しさん :2007/10/27(土) 15:52:58
[1] 授業単元: C言語 [2] 問題文:2×2の行列A,Bの積(cのij成分=Σaのij成分bのij成分)を表示する a[i][j]=[0 4] b[i][j]=[5 0] [-5 -1] [0 -5] [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月28日まで] [5] その他の制限:for文を用いてください
352 :
デフォルトの名無しさん :2007/10/27(土) 16:02:13
#include <stdio.h> main(){ int i,j,x=0,a[2][2]={0,4,-5,-1},b[2][2]={5,0,0,-5}; for(i=0;i<2;i++)for(j=0;j<2;j++)x+=a[i][j]*b[j][i]; printf("%d\n",x); }
353 :
デフォルトの名無しさん :2007/10/27(土) 16:12:53
2次元配列のサイズを調べる方法ありますか?
354 :
デフォルトの名無しさん :2007/10/27(土) 16:16:09
#include <stdio.h> main(){ int x[70][6],m,n; m=sizeof(x)/sizeof(x[0]); n=sizeof(x[0])/sizeof(x[0][0]); printf("%d %d",m,n); }
355 :
デフォルトの名無しさん :2007/10/27(土) 16:27:45
#include <stdio.h> main(){ int i,j,k; int a[2][2]={0,4,-5,-1},b[2][2]={5,0,0,-5},c[2][2]; for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) c[i][j]=a[i][k]*b[k][j]; for(i=0;i<2;i++){ for(j=0;j<2;j++)printf("%d ",c[i][j]); printf("\n");} }
356 :
デフォルトの名無しさん :2007/10/27(土) 16:34:11
[1] 授業単元: C言語 [2] 問題文:キーボードから5点の座標を二次元配列に入力し、 原点から最も離れた点の座標を出力するプログラムを作成せよ [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月28日まで] [5] その他の制限:多次元配列まで習ってます
357 :
147 :2007/10/27(土) 16:35:47
>>356 #include<stdio.h>
#include<math.h>
int main(void)
{
double maximum_distance=0.0, distance;
double x, y, point[5][2], (*maximum_point)[2];
int i;
for(i=0;i<5;i++)
{
printf("Input x :");
scanf("%lf", &x);
printf("Input y :");
scanf("%lf", &y);
point[i][0]=x;
point[i][1]=y;
distance=sqrt(x*x+y*y);
if(distance>maximum_distance || !i)
{
maximum_distance=distance;
maximum_point=&point[i];
}
}
printf("\n( %lf , %lf )\n", (*maximum_point)[0], (*maximum_point)[1]);
return 0;
}
359 :
入力うまくいかない :2007/10/27(土) 16:48:36
#include <stdio.h> main(){ int x[6],y[6],i,ban; double max=0,d; for(i=1;i<6;i++){ printf("\n%d 番目のx座標を入力して下さい ",i); x[i]=getchar(); printf("\n%d 番目のy座標を入力して下さい ",i); y[i]=getchar();} for(i=1;i<6;i++){ d=x[i]*x[i]+y[i]*y[i]; if(d>max){max=d;ban=i;}} printf("原点からもっとも遠い座標は(%d,%d)です ",x[ban],y[ban]); }
360 :
scanfにしたら良くなったよ :2007/10/27(土) 16:54:18
#include <stdio.h> main(){ int x[6],y[6],i,ban; double max=0,d; for(i=1;i<6;i++){ printf("\n%d 番目のx座標を入力して下さい ",i); scanf("%d",&x[i]); printf("\n%d 番目のy座標を入力して下さい ",i); scanf("%d",&y[i]);} for(i=1;i<6;i++){ d=x[i]*x[i]+y[i]*y[i]; if(d>max){max=d;ban=i;}} printf("\n原点からもっとも遠い座標は(%d,%d)です ",x[ban],y[ban]);}
361 :
356 :2007/10/27(土) 16:54:35
//
>>356 ソート付き
#include <iostream>
#include <math.h>
#define NUM 5
using namespace std;
int main (void){
double p[NUM][2], absolute[NUM];
for (int i=0; i<NUM; i++){
cout << i+1 << "番目の点の" << endl;
cout << "\tx座標を入力してください : "; cin >> p[i][0];
cout << "\ty座標を入力してください : "; cin >> p[i][1];
}
for (int i=0; i<NUM; i++) absolute[i] = sqrt(p[i][0] * p[i][0] + p[i][1] * p[i][1]);
double tempabs, tempx, tempy;
for (int i=0; i<NUM-1; i++) {
for (int j=NUM-1; j>i; j--) {
if (absolute[j-1] > absolute[j]) {
tempabs = absolute[j]; tempx = p[j][0]; tempy = p[j][1];
absolute[j] = absolute[j-1]; p[j][0] = p[j-1][0]; p[j][1] = p[j-1][1];
absolute[j-1] = tempabs; p[j-1][0] = tempx;
p[j-1][1] = tempy;
}}}
cout << "(" << p[NUM-1][0] << ", " << p[NUM-1][1] << ")" << endl;
return (0);
}
>>356 既に何人も回答してるけど参考までに
#include <stdio.h>
int main(int argc, char* argv[])
{
int i, p[5][2], r2[5], r2max = 0;
printf("input points\n");
for(i=0;i<5;i++) {
printf("point[%d] : ", i);
scanf("%d %d", p[i], p[i]+1);
r2[i] = p[i][0] * p[i][0] + p[i][1] * p[i][1];
if(r2max < r2[i]) {
r2max = r2[i];
}
}
printf("maximum range points\n");
for(i=0;i<5;i++)
if(r2[i] == r2max)
printf("point[%d] : %d %d\n", i, p[i][0], p[i][1]);
return 0;
}
すいません!このJAVAコードをCに直せって言われました! 直してください!!!! public static int[] invoke(int[] input){ //WARNING: This will destroy the contents of the input array //This function assumes input.length=2^n, n>1 int[] output = new int[input.length]; for(int length = input.length >> 1; ; length >>= 1){ //length=2^n, WITH DECREASING n for(int i = 0; i < length; i++) { int sum = input[i*2]+input[i*2+1]; int difference = input[i*2]-input[i*2+1]; output[i] = sum; output[length+i] = difference; } if (length == 1) return output; //Swap arrays to do next iteration System.arraycopy(output, 0, input, 0, length<<1); } }
>>365 つまりテンプレ通りに書けってこった
とりあえずこのコードが何をするかぐらいは書いたほうがいい
>>357 根本的に考え方が間違ってるよ。
これは生産計画立案の問題。
(int[] input)これをcで引数一個で実現するのは無理では? 最後尾にNULL入れた配列が欲しくなったり、 サイズを持った構造体へのポインタにしたくなったり、 int *input, int sizeみたいに素直になりたかったり。
突っ込むところはinput.lengthこっちだろ
370 :
aho :2007/10/27(土) 19:02:35
>>364 今書いてて思ったけど何がしたいのかいまいち分からない。
sumとdifferenceを計算した後何でoutputを上書きするの?
どんどん足し込む仕様じゃないの?
とりあえず、今ので書いてみるよーん
371 :
aho :2007/10/27(土) 19:08:59
どうもごめんちゃーい。 最後の行のarrayCopyみてませんでした。
373 :
aho :2007/10/27(土) 19:24:07
/* メモリの確保は呼び出し元で行う。 この関数内でメモリを確保して配列を返すと、メモリの解放ができない。 \param input 入力配列 \param output 出力配列 \param size 入力配列の大きさ */ void invoke(int* input, int* output, int size){ // 1/2 for(int length = size >> 1; ; length >>= 1){ for(int i=0; i<length; i++){ int sum = input[i*2] + input[i*2 + 1]; int difference = input[i*2] - input[i*2+1]; output[i] = sum; output[length+i] = difference; } if(length == 1) return; //array copy for(int i=0; i<length<<1; i++){ output[i] = input[i]; } } } 一応作ってみた。 確認お願い!
>>373 ああ…ありがたい
今確認します!!!どうもありがとう!!!!涙出てきた
375 :
デフォルトの名無しさん :2007/10/27(土) 22:51:52
376 :
aho :2007/10/27(土) 23:01:10
課題1 int sqr(int x){ return x * x; } int pow4(int x){ return sqr(x) * sqr(x); }
377 :
デフォルトの名無しさん :2007/10/27(土) 23:01:24
>>375 最後のだけやってもいいよ 任意サイズでやってやるぜ
関数sqrってなんだ?sqrtの間違い? でもなんで四乗値求めるのに平方根必要?
379 :
aho :2007/10/27(土) 23:02:37
課題2 void hello(void){ printf("こんにちは。\n"); return; }
squareって事ね。
381 :
デフォルトの名無しさん :2007/10/27(土) 23:12:34
任意サイズの2次配列を引数にするにはどうすればいい?
382 :
aho :2007/10/27(土) 23:14:56
課題3 void rev_intary(int vc[], int no){ int i; int* tmp = (int*)malloc(sizeof(int) * no); /* noをコピーしておく */ for(i=0; i<no; i++) tmp[i] = vc[i]; for(i=0; i<no; i++) vc[i] = tmp[no-1-i]; free(tmp); return; } stdlib.hをインクルードするように!
配列のポインタかポインタのポインタを使う
384 :
デフォルトの名無しさん :2007/10/27(土) 23:20:08
パンチで
保存はできない。引数でサイズ指定するしかない。
387 :
168 :2007/10/28(日) 00:20:59
>>357 ありがとうございます。
続きはやっていただけませんか?
388 :
デフォルトの名無しさん :2007/10/28(日) 00:21:53
これうまくいかないけどなぜでしょうか?サイズがちゃんと求まりません #include <iostream> #include <vector> using namespace std; void sizehyoji(vector< vector<int> > x){ int m,n; m=sizeof(x)/sizeof(x[0]); n=sizeof(x[0])/sizeof(x[0][0]); printf("%d %d",m,n);} main(){ int i,j,M=200,N=100; vector< vector<int> > x; x.resize(M); for(i=0;i<M;i++)x[i].resize(N); for(i=0;i<M;i++)for(j=0;j<N;j++)x[i][j]=0; sizehyoji(x);}
>>375 課題3
void rev_intary(int vc[], int no)
{
int temp, i, n = no / 2;
for(i=0; i<n; i++) {
temp = vc[i];
vc[i] = vc[no-1-i];
vc[no-1-i] = temp;
}
}
391 :
デフォルトの名無しさん :2007/10/28(日) 00:27:20
>>389 できました vectorでやればサイズ渡せますね
#include <iostream>
#include <vector>
using namespace std;
void sizehyoji(vector< vector<int> > x){
printf("%d %d",x.size(),x[0].size());}
main(){
int i,j,M=200,N=100;
vector< vector<int> > x;
x.resize(M);
for(i=0;i<M;i++)x[i].resize(N);
sizehyoji(x);}
>>375 課題4
void mul(const int ma[2][3], const int mb[3][2], int mc[2][2])
{
int i, j, k;
for(i=0; i<2; i++) {
for(j=0; j<2; j++) {
for(k=0; k<3; k++) mc[i][j] += ma[i][k] * mb[k][j];
}
}
}
393 :
デフォルトの名無しさん :2007/10/28(日) 01:01:51
任意サイズのやつやろうとしたけど面倒になった あとでやるかもしれない 書き込んでおく #include <iostream> #include <vector> using namespace std; class Gyouretu { vector< vector<int> > x; public: Gyouretu(){Gyouretu(1,1);} Gyouretu(int M,int N){int i,j;x.resize(M);for(i=0;i<M;i++)x[i].resize(N); for(i=0;i<M;i++)for(j=0;j<N;j++)x[i][j]=0;} resize(int M,int N){Gyouretu(M,N);} Gyouretu& Gyouretu::operator=(Gyouretu& y){ if(&x!=this){} return *this;} }; main(){ Gyouretu x; x.resize(6,5);}
394 :
デフォルトの名無しさん :2007/10/28(日) 04:31:04
全ディレクトリのファイルでサイズが一致するものをプルパスで出力せよ
プルパスについてkwsk
396 :
デフォルトの名無しさん :2007/10/28(日) 04:42:58
植田佳奈 さんってこんな人だったの・・・?
相手の人、可哀想;;
http://www.nicovideo.jp/watch/sm1282003 25分14秒付近より
●植田佳奈、最近人生を丸投げしたくなることは?というフリに、「こないだー、悪口を絶賛喋ってた
ら、後ろに本人いて(笑)あんなことほんとにあるんだ!って思って、超びっくりしちゃった(笑)
実名って言うかその人しかあり得ないような悪口をバンバン言ってたの。そしたら、”そんな風に思っ
てたんだ、ごめんね”って逆に謝られちゃって…(笑)」
[2] 問題文(含コード&リンク):携帯の文字入力をコマンドプロンプトから行うプログラムをつくれ
[3] 環境
[3.1] OS: WindowsXP
[3.2] VisualStudio 2008
[3.3] 言語: C
[4] 期限: はやめに
途中までは作っているのですが、シンボルが重複しているみたいなエラーがでてしまいます
デバッグと、濁点等の変換処理を手伝ってもらえませんか?
Shift-jisでやろうと思うのですがこれでいいのかよくわかりません・・・
テンプレのうpろだに何故かうpできなかったので、別のうpろだを使いました
http://www.uploda.org/uporg1085799.zip.html よろしくお願いします
>>397 [1]が抜けてる
期限が曖昧
その上マルチ
そしてVisualStudio2008ってまだβ版だろ、そんなもん宿題に使うな
399 :
397 :2007/10/28(日) 12:41:20
すいません。あせってて・・・ [1] 授業単元: C言語 期限:今日中になりました VisualStudio2005でも同じエラーでした
400 :
デフォルトの名無しさん :2007/10/28(日) 14:14:11
1] 授業単元: c言語 [2] 問題文:1.文字列の先頭のアドレスを引数とし、 その文字列の中にある文字’A’を探してそれが何番目かを計算し、 ‘A’があればその値を、なければ0を返値とする関数を作成せよ。 2.1.で作成した関数を用いて、自分の学籍番号をポインタに代入し、 その中で文字'A'を探してそれを先頭に持ってくるプログラムを作成せよ。 [3] 環境 [3.1] OS:windows [3.2] VisualStudio2005 [3.3] 言語:c [4] 期限:10月31日まで [5] その他の制限:特になし 問題が2個ありますが、よろしくお願いします
402 :
デフォルトの名無しさん :2007/10/28(日) 16:08:15
#include<stdio.h> fnc(char *c){ int n; for(n=0;c[n]!='\0';n++)if(c[n]=='A')break; if(c[n]=='A')return n+1; else return 0; } main(){ char c[]="btfguhnexthgd,gj.lhgjkgh,nfgnvhg"; printf("%d\n",fnc(c)); }
403 :
デフォルトの名無しさん :2007/10/28(日) 16:11:30
#include<stdio.h> fnc(char *c){ int n; for(n=0;c[n]!='\0';n++)if(c[n]=='A')break; if(c[n]=='A')return n+1; else return 0; } main(){ int i,n; char c[]="Gakusekibango ha AGS000123"; printf("%s\n",c); n=fnc(c); for(i=n-1;i>=0;i--)c[i]=c[i-1];c[0]='A'; printf("%s\n",c); }
404 :
デフォルトの名無しさん :2007/10/28(日) 16:30:14
[1] 授業単元: C言語 [2] 問題文:整数nをscanfで入力後"prime"という関数を呼び出して、 nが素数ならば1(それ以外は0)を繰り返し、mainにて「○は素数です(ではありません)」 を表示させよ [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual Studio 2005 [3.3] 言語: C [4] 期限: ([2007年10月28日まで] [5] その他の制限:if文を用いる
nが素数ならば1(それ以外は0)を返し、 だよな?
406 :
デフォルトの名無しさん :2007/10/28(日) 16:42:35
#include<stdio.h> prime(int p){ int n,N=p/2; for(n=2;n<N;n++)if(p%n==0)break; if(n<N)return 0; else return 1;} main(){ int p; scanf("%d",&p); if(prime(p))printf("%dは素数です",p); else printf("%dは素数ではありません",p); }
>>406 N=p/2
でpが奇数だったらNに入るのはintじゃなさそうな気がする
408 :
デフォルトの名無しさん :2007/10/28(日) 16:47:22
#include<stdio.h> prime(int p){ for(int n=2;n<p/2;n++)if(p%n==0)return 0;return 1;} main(){ int p;scanf("%d",&p); if(prime(p))printf("%dは素数です",p); else printf("%dは素数ではありません",p);}
409 :
デフォルトの名無しさん :2007/10/28(日) 16:48:53
>>407 #include<stdio.h>
main(){
int p=5;
int N=p/2;
printf("Nは%dです",N);
}
#include<stdio.h> int prime(int p) { int n; for(n=2; n<=p/2; n++) if(!(p%n)) return 0; return 1; } int main(void) { int p; scanf("%d",&p); printf(prime(p) ? "%dは素数です" : "%dは素数ではありません", p); return 0; }
0 1
412 :
デフォルトの名無しさん :2007/10/28(日) 17:06:42
>>404 #include <stdio.h>
int prime(int n)
{
int i;
if(n<2) return 0;
for(i=2; i*i<=n; i++) if(n%i==0) return 0;
return 1;
}
int main(void)
{
int n;
scanf("%d", &n);
if(prime(n)==0) printf("%dは素数ではありません\n", n);
else printf("%dは素数です\n", n);
return 0;
}
414 :
デフォルトの名無しさん :2007/10/28(日) 17:43:11
cディレクトリのファイルでサイズが一致するものを出力せよ
はい。
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 8行10列の二次元配列においてです。 1行目の配列と2行目の配列を足します。(できた配列を配列Aとよぶ) 次に配列Aと3行目の配列を足します。(できた配列を配列Bとよぶ) 次に配列Bと4行目の配列を足します。(できた配列を配列Cとよぶ。) 次に 5行目の配列と6行目の配列を足します。(できた配列を配列aとよぶ) 次に配列aと7行目の配列を足します。(できた配列を配列bとよぶ) 次に配列bと8行目の配列を足します。(できた配列を配列cとよぶ。) そして配列Cを1行目、配列cを2行目とする 2行10列の二次元配列を表示しろ。(つまり4行の配列をたせということです) 配列のそれぞれの足し算は別関数にて行いなさい。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年10月29日まで [5] その他の制限: なし よろしくお願いします。
>>416 1行目から4行目の各成分をそれぞれ足してCとする。
5行目から8行目の各成分をそれぞれ足してcとする。
Cとcを横に並べて2x10にする。
という意味?
関数内はlogの加算にあとでかえますから。 logの加算じゃなかったらこんなめんどいことはしません。
8X10の配列を 4X10と4X10とみて、4行ずつ配列を足します。そしたら1X10と1X10になるでしょう? でこの1X10と1X10をいっしょにして2X10というわけです。 対数の加算なので一辺には計算できないわけです
なんでこんな簡単なこともできないのに、そんなに偉そうなんだ?
>>420 言いたいことは分かるが4行ずつ配列を足してないだろ
#include <stdio.h> void add(const int *a, int *b, int n) { while(n--) b[n] += a[n]; } int main(void) { int a[8][10], b[2][10] = {0}; int i; for(i=0; i<8; i++) add(a[i], b[i/4], 10); return 0; }
>>416 配列A, B, a, b は配列として必要なのか?
わかる人いますか? [1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 以下のような内容のテキストファイルを読み込んで それぞれ配列に格納した後、同じように出力せよ。 文章,文章,数字,数字,・・・,数字\n 文章,文章,数字,数字,・・・,数字\n 文章,文章,数字,数字,・・・,数字\n ただし行数および数字の列数は常に不定とする。 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C/C++どちらでも可 [4] 期限: 2007年10月28日24:00まで [5] その他の制限: 特になし
426 :
425 :2007/10/28(日) 20:46:49
すみません。 読み込むのはtxtファイルじゃなくてcsvファイルでした。 よろしくおねがいします。
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): e^x = 1 + x^1/1! + x^2/2! + x^3/3! + x^4/4! + … を利用して e^x を計算する関数 double myexp(double x) を作成せよ. k=0, 1, 2, 3, … について x^k/k! を加算してゆき, x^k/k!<10-6 となった時点で計算を打ち切るようにせよ (無限ループと break 文を用いるのが一解法). main から myexp を呼び出し, x=1.0, 2.0, …, 10.0 に対して myexp(x) の値を全体で 13 桁, 小数点以下 5 桁で表示せよ. [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語: C言語 [4] 期限: 2007年10月29日まで [5] その他の制限:特になし 次レスがプログラムです。実行はされますが値がおかしいです… よろしくお願いします。
#include <stdio.h> #include <math.h> double myexp(double); double x; int main( void ) { printf("\t x\t myexp(x)\n"); for(x=1.0;x<=10.0;x++) { printf("\t%.1f\t%13.5f\n",x,myexp(x)); } return 0; } double myexp(double x) { double r=1.0,f=1.0,y=1.0; int z,k; for(k=1;;k++) { for(z=1;z<=k;z++) { r=r*z; } if(pow(x,k)/r<1.0e-6) { return f; break; } f=f+pow(x,k)/r; } }
429 :
とくめい :2007/10/28(日) 21:06:55
すみませんがプログラミングの宿題を教えてください。 「言語」= c++ 「問題」= 速度のfileを読み込みそれを微分して加速度を求めろ。速度を積分して距離を求めろ なおプログラムは1通です。 「os] = xp micro studio 2005
430 :
とくめい :2007/10/28(日) 21:09:09
上の追加です。 去年の参考にfile名は何でもいいので #include<stdio.h> FILE * fp1,* fp2,* fp3; //ファイルポインタの宣言 int main() { double k1=0,k;//k1=一つ前の距離、k=距離 double s1=0,s;//s1=一つ前の速度、s=速度 double T=0.4;//刻み値(台形の高さ) fp1 = fopen( "C:\\suzuki2\\car06spd.txt", "r" );//ファイルを読み込みで開く fp2 = fopen( "C:\\suzuki2\\sekibun.txt", "w" );//ファイルを書き込みで開く if( fp1 == NULL ){//fp1にデータがあるか確かる printf("ファイルが開けません。\n"); fclose( fp1 ); }
431 :
とくめい :2007/10/28(日) 21:10:28
書き込めなかったので2分割しました while( 1 ) {//無限ループ(微分) if( fscanf( fp2,"%lf",&k) == EOF ) break;//ファイルを読み終えたらループから抜ける s=(k-k1)*2/T*3600-s1;//速度(s)の式 、単位変換を行う fprintf(fp3,"%.0lf\n",s);//ファイルに速度sを出力する k1=k;//k1にkの値を入れる s1=s;//s1にsの値を入れる } fclose( fp2 );//ファイルを閉じる fclose( fp3 );//ファイルを閉じる return 0; }
432 :
デフォルトの名無しさん :2007/10/28(日) 21:13:10
433 :
デフォルトの名無しさん :2007/10/28(日) 21:14:25
>>425 #include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
main(){
string str="",buf;
fstream fp("text.csv",ios::in);
do {getline(fp, buf);str+=buf+"\n";}while(!fp.eof());
int m,n;vector<string> x;
do{
m=str.find(",");n=str.find("\n");
if(m>n){x.push_back(str.substr(0,n));x.push_back("\n");m=n;}
else x.push_back(str.substr(0,m));
str=str.substr(m+1);}while(m>=0);
for(n=0;n<x.size();n++)cout<<x[n];
}
//
>>427 eのマクローリン展開
#include <stdio.h>
#include <math.h>
double myexp(double);
double x;
int main( void )
{
double x;
printf("\t x\t myexp(x)\t exp(x)\n");
for(x=1.0;x<=10.0;x++)
{
printf("\t%2.1f\t%13.5f\t%13.5f\n", x, myexp(x), exp(x));
}
return 0;
}
double myexp(double x)
{
double s = 0.0;
double a = 1.0;
s += 1.0;
for (int n = 1; n < 20; n++) {
a = a * x / n;
s = s + a;
}
return s;
}
435 :
デフォルトの名無しさん :2007/10/28(日) 21:26:58
/* e^x を計算する関数 double myexp(double x) を作成せよ. k=0, 1, 2, 3, … について x^k/k! を加算してゆき, x^k/k!<10-6 となった時点で計算を打ち切る main から myexp を呼び出し, x=1.0, 2.0, …, 10.0 に対して myexp(x) の値を全体で 13 桁, 小数点以下 5 桁で表示せよ. */ #include <stdio.h> #include <math.h> double myexp(double x){ double r=1,sum=0; for(int k=1;;k++){ sum+=r; r*=x/k; if(r < 1.0e-6)return sum;}} int main( void ){ double x; printf("\t x\t myexp(x)\n"); for(x=1.0;x<=10.0;x++){ printf("\t%.1f\t%13.5f\n",x,myexp(x)); } return 0; }
//
>>427 e(x)の計算 さっきのはforのなかで宣言があったんでC++
#include <stdio.h>
#include <math.h>
double myexp(double);
int main( void )
{
double x;
printf("\t x\t myexp(x)\t exp(x)\n");
for(x=1.0;x<=10.0;x++)
{
printf("\t%2.1f\t%13.5f\t%13.5f\n", x, myexp(x), exp(x));
}
return 0;
}
double myexp(double x)
{
double s = 0.0;
double a = 1.0;
int n;
s += 1.0;
for (n = 1; n < 20; n++) {
a = a * x / n;
s = s + a;
}
return s;
}
438 :
デフォルトの名無しさん :2007/10/28(日) 21:29:20
#include <stdio.h> double myexp(double x){ double r=1,sum=0; for(int k=1;;k++){ sum+=r;r*=x/k; if(r<1.0e-6)return sum;}} main(){ printf("\t x\t myexp(x)\n"); for(double x=1.0;x<=10.0;x++)printf("\t%.1f\t%13.5f\n",x,myexp(x));}
>>437 厳しい制限だな。GUIで作っちゃだめなのか
>>432 #include <stdio.h>
#include <math.h>
int solve(double a, double b, double c);
double answer1;
double answer2;
int solve(double a,double b, double c)
{
double check;
check = b * b - 4 * a * c;
if(check > 0){
answer1 = (b + sqrt(b * b - 4 * a * c)) / (2 * a);
answer2 = (b - sqrt(b * b - 4 * a * c)) / (2 * a);
return 2;
}else if(check == 1){
answer1 = (b + sqrt(b * b - 4 * a * c)) / (2 * a);
answer2 = answer1;
return 1;
}
return 0;
}
main()は省略
汚いコードだけどこんな感じ
>>432 int solve(double a, double b, double c)
{
double d = b * b - 4 * a * c;
if(d<0) return 0;
answer1 = (-b + sqrt(d)) / 2 / a;
answer2 = (-b - sqrt(d)) / 2 / a;
return d == 0 ? 1 : 2;
}
442 :
デフォルトの名無しさん :2007/10/28(日) 21:36:31
>>440 せっかくcheck計算してんのに、sqrtの引数に利用しないなんてムダすぎる
444 :
440 :2007/10/28(日) 21:39:29
445 :
425 :2007/10/28(日) 22:03:25
>>433 ありがとうございます!!
あと数字は数字として格納して次の問題での計算に使いたいのですが
文字列として取得した数字を別の配列に整数型の数として取得するには
どうすればいいでしょうか?
446 :
デフォルトの名無しさん :2007/10/28(日) 22:08:48
st=str.substr(0,n)に対して st[i]が'0'から'9'にあればいい コードはちょっと待ってくれ
>>445 std::string str = "1.234";
double d;
std::istringstream istr(str);
istr >> d;
448 :
デフォルトの名無しさん :2007/10/28(日) 22:30:14
stringが数値なら変換して違うならエラーを返す関数ってある?
449 :
デフォルトの名無しさん :2007/10/28(日) 22:33:09
atofで良いんだな
450 :
デフォルトの名無しさん :2007/10/28(日) 22:36:21
atofだと初めが数値だと計算してしまう
451 :
デフォルトの名無しさん :2007/10/28(日) 22:38:30
.8222とか、100,000とかは数値にするのか?
452 :
425 :2007/10/28(日) 22:42:07
>>446 その方法基本情報試験の勉強でやった覚えが!!!
でもどうにも思い出せないです・・・
>>447 stringがvector<string>なためかうまくいきません。
atoiなどもvectorは拒否されてしまうみたいですね。
うーん、難しい・・・
#include<stdio.h> int main(int argc, char *argv[]){ int i, index; double value; for(i=1;i<argc;i++){ if(sscanf(argv[i], "%lg%n", &value, &index)>=1 && argv[i][index]=='\0') printf("%s は数値だ\n", argv[i]); else printf("%s は数値ではない\n", argv[i]); } return 0; }
>>437 符号反転キーと演算キーがかぶる気がするんだけどどうするの?
456 :
デフォルトの名無しさん :2007/10/28(日) 22:58:12
class mojisu { string str; double su; } mojisu x; x.input("777"); という関数を作る 数値なら数字として保存 このとき文字は空にする 違うなら文字として保存
457 :
◆nzw4qNGj6U :2007/10/28(日) 22:58:19
[1] 授業単元:プログラミング2 文字列処理 [2] 問題文(含コード&リンク): 英文(英単語)を入力し、入力した文字列を、逆から表示するプログラムを作成すること。 [3] 環境 [3.1] OS:Windows [3.3] 言語:C [4] 期限:2007年10月29日0:00迄 [5] その他の制限:NULL文字を使用して下さい。 よろしくお願いします。
>>457 NULL文字をどこで使用するんだ・・・
#include <stdio.h>
int main()
{
int i=-1;
char buf[256];
while((buf[++i]=getchar())!=EOF);
while(i>0&&putchar(buf[--i])!=EOF);
return 0;
}
>>458 きっとこういう風にするんだよ
#include <stdio.h>
int main()
{
int i=-1;
char buf[256];
while((buf[++i]=getchar())!=EOF);
while(i>0&&putchar(buf[--i])!=NULL); // ここ
return 0;
}
NUL文字?
ぬるぽ?
がっ?
>>452 vector<string>ならiteratorを使って一つずつループさせればどうかな
for_eachでもいいし
atofはc_str()というメンバ関数があるからそれで使える
マジレスしといたほうがいい?
しといたほうがいいよ どれのことか知らないけど
プログラム板はふざけたスレ以外はマジレス基本
>>458 buf[0]にNULL文字セットして番兵にするくらいしか思いつかんね
>>469 仕様が違うからなんとも言えんな。
つーか、ほとんど宇宙語。
boost教えて。
>>468 がもっさいのは、仕様のせいだと思う。
471 :
デフォルトの名無しさん :2007/10/29(月) 02:34:33
boostはだめだろう C++の標準とwindowsの標準以外は使うべきでない
[1] 授業単元:プログラミング実験 [2] 問題文(含コード&リンク): ファイルから改行区切りの単語 (2字以上の全角の日本語)を読み込み 他の単語から合成出来るものを除去してファイルに書き出せ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C or C++ [4] 期限: 2007年10月29日17:00まで [5] その他の制限: なし お願いします
473 :
デフォルトの名無しさん :2007/10/29(月) 02:50:49
正弦波にガウス窓を掛けるプログラムを お願いします
474 :
437 :2007/10/29(月) 02:52:35
レス遅くなりました。すいません。
>>455 符号反転キーについては、書いている時にも気になたのですが、特に解説はありません。
問題の指定と違いますが’+/-’これでキーとして問題ないと思います。
>>468 ありがとうございます!!
凄いですね、、、とても自分では作りきれないです・・・・・
C言語入門書読んだだけでこれだけ作れると思ってるのかな・・・・教授。
頑張って改良してみます!
>>472 まず2文字の単語を抽出してソートしておく 4文字の単語を抽出して前半に2文字の単語を含むか調べる
含まなければ合成単語ではない 後半も存在すれば消す
つぎに3文字のものを抽出して、5字の単語の先頭に2か3文字の単語を含むか調べるっていう感じでやっていく1
476 :
468 :2007/10/29(月) 03:18:53
>>474 訂正
・ctype.hをインクルードしてますが使ってないので削除してください。(判定にis〜を使うつもりだったけど使わなかったので)
・atodの変数宣言でセミコロンが1つ多いので消してください。
ソースを見ていくと解るけど基本的な事しかしてないです。
scanfで文字列を読み込んでswitch文を使って先頭の文字で場合分けして処理してるだけです。
478 :
デフォルトの名無しさん :2007/10/29(月) 09:20:32
1問 数値int型を入力し、a文字から順に数値個アルファベットを 標準するプログラムを作成しなさい 実行画面 数値入力-->5 a b b d e
479 :
デフォルトの名無しさん :2007/10/29(月) 09:23:48
3つの数値int型を入力し、その合計を求めるプログラムを作成しなさい 実行画面 数値1入力-->10 数値2入力-->5 数値3入力-->8 合計:23
480 :
デフォルトの名無しさん :2007/10/29(月) 09:27:10
数値int型入力し、1からその数値までの合計を求め階乗計算プログラムを作成しなさい 実行画面 数値入力-->5 5までの合計:15 以上の3問お願いします
>>1 読んでテンプレに沿って書け
CかC++かすらわからんぞ
483 :
デフォルトの名無しさん :2007/10/29(月) 09:47:39
cです
>>483 >>478 負の数や、26以上が入力された場合はどうするんだ?
そこらへんも含めてテンプレ記入よろ
>>478 #include <stdio.h>
int main(void)
{
int n, ch = 'a';
printf("数値入力-->");
scanf("%d", &n);
while(n--) printf("%c\n", ch++);
return 0;
}
>>479 #include <stdio.h>
int main(void)
{
int i, n, sum;
for(i=1, sum=0; i<=3; i++, sum+=n) {
printf("数値%d入力-->", i);
scanf("%d", &n);
}
printf("合計:%d\n", sum);
return 0;
}
>>480 #include <stdio.h>
int main(void)
{
int n;
printf("数値入力-->");
scanf("%d", &n);
printf("%dまでの合計:%d\n", n, n * (n + 1) / 2);
return 0;
}
>>478 #include <stdio.h>
int main(){
unsigned n;
char c;
printf("Number?>");
scanf("%u",&n);
if(n>26){
puts("Too much number!");
return 1;
}
c = 'a';
for(n--){printf("%c\n",c++);}
return 0;
}
489 :
aho :2007/10/29(月) 11:33:55
>>454 軽く作ってみたけどどお?
void enqueue(char* str){
strcpy(queue[rear], str);
rear++;
rear %= QUEUE_SIZE;
return;
}
void queue_print(){
printf("%s\n", queue[front]);
return;
}
void dequeue(){
queue_print();
front++;
front %= QUEUE_SIZE;
return;
}
490 :
デフォルトの名無しさん :2007/10/29(月) 13:33:23
491 :
デフォルトの名無しさん :2007/10/29(月) 13:58:51
期限は現地時間じゃなくて、JSTで書け。 もしJSTなら、残り4時間じゃ無理。
でエラーがerror C2064: 1 引数を取り込む関数には評価されません。 とでて解決できません・・・どうすればいいのでしょうか?? お願いします。
#include <stdio.h> #include <math.h> double f1(double t,double v1,double a); double f2(double t,double v1,double a); double f3(double t,double v2,double b); double f4(double t,double v2,double b); double t,v1,v2,a,b,dt,tmax,g,m1,m2,l1,l2; int main() { double k1[4],k2[4],k3[4],k4[4]; l1=1.0; l2=1.0; m1=1.0; m2=1.0; g=1.0; v1=0.0; //位置v1の初期値 v2=0.0; //位置v2の初期値 a=0.5; //位置alphaの初期値 b=0.5; //位置betaの初期値 dt=0.001; //刻み幅 tmax=10.0; //繰り返し最大回数 FILE *output; output=fopen("output.data","w");
t=0; fprintf(output,"%f %f %f\n",t,v1,v2,a,b); for(t=0;t<tmax;t+=dt) { k1[0]=dt*f1(t,v1,a); k1[1]=dt*f2(t,v1,a); k1[2]=dt*f3(t,v2,b); k1[3]=dt*f4(t,v2,b); k2[0]=dt*f1(t+dt/2.0,v1+k1[0]/2.0,a+k1[1]/2.0); k2[1]=dt*f2(t+dt/2.0,v1+k1[0]/2.0,a+k1[1]/2.0); k2[2]=dt*f3(t+dt/2.0,v2+k1[2]/2.0,b+k1[3]/2.0); k2[3]=dt*f4(t+dt/2.0,v2+k1[2]/2.0,b+k1[3]/2.0); k3[0]=dt*f1(t+dt/2.0,v1+k2[0]/2.0,a+k2[1]/2.0); k3[1]=dt*f2(t+dt/2.0,v1+k2[0]/2.0,a+k2[1]/2.0); k3[2]=dt*f3(t+dt/2.0,v2+k2[2]/2.0,b+k2[3]/2.0); k3[3]=dt*f4(t+dt/2.0,v2+k2[2]/2.0,b+k2[3]/2.0); k4[0]=dt*f1(t+dt,v1+k3[0],a+k3[1]); k4[1]=dt*f2(t+dt,v1+k3[0],a+k3[1]); k4[2]=dt*f3(t+dt,v2+k3[2],b+k3[3]); k4[3]=dt*f4(t+dt,v2+k3[2],b+k3[3]); v1=v1+(k1[0]+2.0*k2[0]+2.0*k3[0]+k4[0])/6.0; a=a+(k1[1]+2.0*k2[1]+2.0*k3[1]+k4[1])/6.0; v2=v2+(k1[2]+2.0*k2[2]+2.0*k3[2]+k4[2])/6.0; b=b+(k1[3]+2.0*k2[3]+2.0*k3[3]+k4[3])/6.0; fprintf(output,"%f %f %f\n",t+dt,v1,v2,a,b); } fclose(output); return 0;
} double f1(double t,double v1,double a) { return -(g * (2 + m2/m1) * sin(a) + m2/m1 * (g * sin(a - 2 * b) + 2 * ((v2 * v2)/l2 + ((v1 * v1) * cos(a - b))/l1) * sin(a - b))) /(2 + m2/m1 - m2/m1 * cos(2(a - b))); } double f2(double t,double v1,double a) { return v1/l1; } double f3(double t,double v2,double b) { return 2(((1+m2/m1) * ((v1 * v1)/l1) + g * (1 + m2/m1) * cos(a) + m2/m1 * ((v2 * v2)/l2) * cos(a - b)) * sin(a - b)) /(2 + m2/m1 - m2/m1 * cos(2(a - b))); } double f4(double t,double v2,double b) { return v2/l2; }
本文が3つになってしまいましたが・・・すいません。
498 :
491 :2007/10/29(月) 14:42:39
>>492 どうも失礼いたしました
期限は変更されて日本時間で
10/30 19:00
です
どうかよろしくお願いいたします
499 :
デフォルトの名無しさん :2007/10/29(月) 14:45:19
>>お願いします 2( を 2*( にかえろ
500 :
425 :2007/10/29(月) 14:51:07
問題出して40分で期限変更かよ 嘘つくなってw
ありがとうございました。
503 :
472 :2007/10/29(月) 16:00:55
時間過ぎても出さないと駄目なのでおねがいします
504 :
aho :2007/10/29(月) 16:59:06
>>473 /*!
\param input サンプル値系列
\param output 結果
\param sample_num サンプル数
*/
void gauss_window(int* input, double* output, int sample_num){
double sigma = 0.4;
int* tmp = new int[sample_num];
memcpy(tmp, input, sizeof(int) * sample_num);
/* 区間の外は0とする */
int start = 2;
int end = 25;
for(int i=0; i<start; i++)
tmp[i] = 0;
for(int i=end; i<sample_num; i++)
tmp[i] = 0;
int cnt = 0;
while(cnt < sample_num){
double x = (double)cnt / (sample_num - 1);
double func = exp(- x * x / sigma / sigma);
double value = func * tmp[cnt];
output[cnt] = value;
cnt++;
}
if(tmp){
delete[] tmp;
tmp = NULL;
}
return;
}
505 :
aho :2007/10/29(月) 17:00:02
>>472 とりあえず、作ってみた。
もっと詳しい仕様を教えてくれれば作るよーん。
506 :
472 :2007/10/29(月) 17:11:15
単語は全角で100文字以内、単語数は可変で少なくとも1万は処理できるといいです。 input.txt 明治 大学 明治大学 ↓ ***処理後 明治 大学 output.txt というファイルを出力します
507 :
デフォルトの名無しさん :2007/10/29(月) 17:15:31
508 :
デフォルトの名無しさん :2007/10/29(月) 17:39:05
>>507 #include <stdio.h>
#include <math.h>
void divhalf(double *, double *,double a,double c);
double f(double x, double a,double c);
main(){
double a,c,x,x_1,x_2,xm,nc=0;
scanf("%f",&a); scanf("%f",&c);
scanf("%f",&x_1); scanf("%f",&x_2);
while(nc<50){
divhalf(&x_1,&x_2,a,c);
xm=(x_1+x_2)/2;
printf("%d %f %f %f\n",nc, x_1,x_2, f(xm,a,c));
if(abs(f(xm,a,c))< 0.000001)break;
}
}
void divhalf(double *x_1, double *x_2,double a,double c){
double x_m=(*x_1+*x_2)/2;
if(f(*x_1,a,c)*f(x_m,a,c)>0)
*x_1=x_m;
}
double f(double x, double a,double c){return tan(c*x)-a;}
509 :
デフォルトの名無しさん :2007/10/29(月) 17:54:10
[1] 授業単元:プログラミング言語 [2] 問題文(含コード&リンク): 日本の人口は1億5000万人であるが、毎年5%づつ減少していくとして、 5000万人を割り込むまでに必要な年数を求めよ。 [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 11/4 [5] その他の制限: 複利の計算を使うと思われます。
複利の利は利率の利
511 :
デフォルトの名無しさん :2007/10/29(月) 18:02:44
#include <stdio.h> main(){ double x=150000000,r=0.05; int n; for(n=1;;n++){ x*=1-r; if(x<50000000)break; } printf("%d",n); }
512 :
デフォルトの名無しさん :2007/10/29(月) 18:04:21
513 :
491 :2007/10/29(月) 18:11:43
>>512 #include<stdio.h>
double ave(double c1,double c2,double c3)
{
return (c1+c2+c3)/3.0;
}
main()
{
double c1,c2,c3;
printf("c1の昼食代="); scanf("%lf",&c1);
printf("c2の昼食代="); scanf("%lf",&c1);
printf("c3の昼食代="); scanf("%lf",&c1);
printf("割り勘で%lf円\n",ave(c1,c2,c3));
}
表示部分は自分で変更してください。
割り切れなかった場合の考慮をしていないのでその辺は自分で考えてみてください。
>>241 #include <stdio.h>
double ave(double c1, double c2, double c3) {return (c1 + c2 + c3) / 3;}
int main()
{
double co1, co2, co3;
printf("3人の昼食代を入力せよ:");
scanf("%lf%lf%lf", & co1, & co2, & co3);
printf("割り勘で%g円\n", ave(co1, co2, co3));
return 0;
}
516 :
デフォルトの名無しさん :2007/10/29(月) 18:15:45
>>514 ありがとうございました
大変助かりました
517 :
514 :2007/10/29(月) 18:16:18
コピペした後変更するの忘れてた。入力が全部c1なのでc2,c3に変更してください。
518 :
デフォルトの名無しさん :2007/10/29(月) 18:16:30
実行くらいしようぜ…
>>491 >>513 これって要するにテトリスを作れってことか?
テトリスをCUIで作れ、と。
アクティヴなゲームをCUIのCで。
>>491 #include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
avr関連は、USBなどのフラッシュメモリにアクセスするためのものです。
gccのIncludeフォルダにはもちろんありません。
523 :
491 :2007/10/29(月) 18:52:52
>>520 >>521 この課題はテトリスのプログラムを作って
avr studio を通してLEDにゲームを表示するというものです
いいなぁ〜留学かー
>>524 楽天KC、クレジットカード番号を含む個人情報1168件を流出
いつかやると思ってた
528 :
aho :2007/10/29(月) 21:00:13
>>524 クラスの基本的な部分はできた。
詳しい仕様が全然わからん。
530 :
aho :2007/10/29(月) 21:06:28
>>529 もう出来あがってるじゃん。
おぬし、これ以外に何を望む?
>>523 テスト&デバッグに必要なのでハード一式日本に送ってください
532 :
491 :2007/10/29(月) 22:28:42
明らかに丸投げするタイプの宿題じゃない気が…… 異国の友達に写さしてもらいなさい
これをDLするとバーチャルなLEDとかチップとかが実行できるわけ?
じゃないと明らかに
>>531 の言うとおりテスト・デバッグができない
536 :
491 :2007/10/29(月) 23:21:49
538 :
デフォルトの名無しさん :2007/10/29(月) 23:54:54
1] 授業単元:C言語 [2] 問題文(含コード&リンク): 2つの正の整数を2<=min<=max<=1000とする。キーボードからminとmaxを入力して min以上max未満の素数をすべて表示する。 [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン:Borland C++ Compiler5.5 [3.3] 言語: C [4] 期限: 10/30 9:00までにお願いします。 [5] その他の制限: if,for,while,swichは習いました。
>>538 #include<stdio.h>
int IsPrime(int n){
int i;
if(n<2)return 0;
else if(n==2)return 1;
if(n%2==0)return 0;
for(i=3;i*i<=n;i+=2)if(n%i==0)return 0;
return 1;
}
int main(void){
int max,min;
printf("min:");
scanf("%d",&min);
printf("max:");
scanf("%d",&max);
if(2<=min&&min<=max&&max<=1000){
while(min <= max){
if(IsPrime(min))printf("%d\n",min);
min++;}}return 0;}
途中で表示するのが素数だって気がついて少し慌てた 関数はまずかったかな?
540 :
デフォルトの名無しさん :2007/10/30(火) 00:16:57
>>539 ありがとうございます。
関数はちょっと・・・
まだ習ってないので、わからないんです。
作っていただいたのに申し訳ありませんm(_ _)m
関数でない他のプログラムはありますか?
>>537 って前でてた宿題の続きだよな。おれはてっきり virtual な関数の例題だと思ってたが、これはCとかわらんなw
>>540 #include<stdio.h>
int main(void){
int max,min,i;
printf("min:");scanf("%d",&min);
printf("max:");scanf("%d",&max);
if(2<=min&&min<=max&&max<=1000){
while(min <= max){
for(i=2;i<min;i++)if(min%i==0)break;
if(i==min)printf("%d\n",min);
min++;}}return 0;}
効率無視だけどたぶん素数が出力されてると思う。確認してから提出してくれ
543 :
デフォルトの名無しさん :2007/10/30(火) 00:24:29
>>542 どうもありがとうございました。
このようなやり方でよかったのですね。
とても助かりました。(*^_^*)
544 :
◆gKLa0lVLKo :2007/10/30(火) 00:56:15
545 :
デフォルトの名無しさん :2007/10/30(火) 02:32:07
546 :
491 :2007/10/30(火) 06:16:06
どなたか491をお願いします
547 :
◆gKLa0lVLKo :2007/10/30(火) 08:36:10
>>545 ありがとうございました。助かりました。
ただ、プログラムを実行させていただいた所、
戦況報告にて、コンピューターの残り部隊が0になり、
最終的に徳川方と石田方のどちらが勝利したか表示する部分がうまくいきませんでした。
while分の条件を変え、
if文で自軍が勝った場合と、敵方が勝った場合のメッセージを表示すれば良いのでしょうか?
ソースを書き直せばいいじゃん
>>491 >>546 [3]の環境には、暗黙の内に「ATMELのチップで制御されたLED」というものが含まれています。
これと同じ環境を構築しないとテスト&デバッグは無理です。
>>544 じゃんけんの勝敗は (hum - com + 3) % 3 の数値で判定すると楽
553 :
デフォルトの名無しさん :2007/10/30(火) 13:08:04
[1] 授業単元:C言語 [2] 2次元平面上の点を表す構造体 Point 型を定義する.ただし,構造体 Point型は,double型の X座標と Y座標のメンバをもつ. 構造体 Point型を使用して,二点を結ぶベクトルを求める関数 vector,ベクトルのスカラー倍を求める関数 scalar,ベクトルを表示する関数 print_v を定義し,以下のプログラムを完成させる. [3] 環境 [3.1] OS:Win [3.2] 任意 [3.3] 言語: C [4] 期限: 2007.10.30 16時まで
554 :
デフォルトの名無しさん :2007/10/30(火) 13:09:52
#include <stdio.h> #include <stdlib.h> /* (x,y)-平面の点を座標で表す構造体 */ ??????? /* 2点を結ぶベクトルを求める関数 */ ??????? /* ベクトルのスカラー倍を求める関数 */ ??????? /* ベクトルを表示する関数 */ ??????? int main(void) { Point p0=???????, p1, p2; /* p0:原点,p1:入力の点,p2:結果 */ double t; /* スカラー倍 */ printf("Input Point A, X: "); scanf("%lf", ???????); printf("Input Point A, Y: "); scanf("%lf", ???????); printf("Input scalar t: "); scanf("%lf", ???????); printf("The origin "); print_v(p0); p2 = vector(p0, p1); printf("vector A: "); print_v(p2); p2 = scalar(p2, t); printf("vector A * t: "); print_v(p2); return 0; } ????の部分埋めてください 見づらいってとこはスルーで^^
typedef struct { double x, y; } Point; Point vector(Point p1, Point p2) { p2.x -= p1.x; p2.y -= p1.y; return p2; } Point scalar(Point p, double t) { p.x *= t; p.y *= t; return p; } void print_v(Point p) { printf("(%f, %f)\n", p.x, p.y); } {0.0} &p1.x &p1.y &t
556 :
デフォルトの名無しさん :2007/10/30(火) 13:41:46
555さんありです よろしかったらこちらもおね コマンドラインから与えられた引数を文字列と見て,ポインタ result が指すメモリ領域にそのままコピーするプログラムを完成させなさい. #include <stdio.h> /* おまじない */ #include <stdlib.h> /* おまじない */ #include <string.h> /* strlen() のため */ void mycopy(char*, char*); int main(int argc, char *argv[]) { char *result; if (??????? != 2) { printf("Try again:\n"); exit(1); }else{ result = (???????)malloc(??????? * ???????); printf("Input : %s \n", ???????); mycopy(result, argv[1]); printf("Result: %s \n", result); ???????; /* 割り当てたメモリ領域を解放 */ } return 0; } void mycopy(char *after, char *before) { ??????? }
argc /*キャストは必要ない*/ /*sizeof(char)なんて必要ない*/1 (strlen(argv[1]) + 1) argv[1] free(result) while(*after++=*before++);
void *malloc(size_t);
1] 授業単元:数値解析 [2] 問題文(含コード&リンク):プログラムを完成させる問題 /* 二分法 */ #include <stdio.h> #include <math.h> double func(double); int main(){ double a, b, c, e, r; int i; a = 0; b = 1; e = 0.0001; i = 1; do{ c = /* 中間の値を求める */ printf("Loop %2d: %f\n", i, c); r = /* 中間の値の関数返値を求める */ if(( ) < 0){ /* 中間の値の関数返値と f(a) の時の値を掛けた結果が 0 より小さいとき */ /* b へ中間の値を代入する ( f(a)f(b) > 0 ) */ } else { /* 中間の値の関数返値と f(a) の時の値を掛けた結果が 0 より大きいとき */ /* a へ中間の値を代入する ( f(a)f(b) < 0 ) */ } i++; }while(!((r == 0) || ((b - a) < e))); /* 終了判定 */ return 0; } double func(double x){ return /* 関数定義 */
560 :
559 :2007/10/30(火) 14:03:19
[3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 今日 [5] その他の制限: なし よろしくお願いします
プログラムの授業で穴埋め式の課題、しかもコメントつきってなんの役にも立たない気がする
よっぽどの底辺校かな
563 :
559 :2007/10/30(火) 14:17:54
高1なんで結構初歩だと思います
564 :
491 :2007/10/30(火) 14:26:26
566 :
デフォルトの名無しさん :2007/10/30(火) 14:48:04
共分散と相関係数算出プログラムと実験結果がほしいです。 お願いします。
>>564 本当にやってもらいたかったら分析ぐらい下方がいいと思うよ。
全部一気にやってくれと言っているからやってくれないのであって
(やるのにコストがかかりすぎる)分析してくれて
なおかつやって欲しいところを分割して出題してくれればやってもらえると思うよ
それすらできないのであればやっぱり留年するしかないと思う・・・
厳しいけどそういうものだ。
このスレの存在意義は……とか言ってみる
だが自分でやれ
>>491
>気に入らない質問やその他や発言はスルーの方向で。
573 :
デフォルトの名無しさん :2007/10/30(火) 15:24:22
>>541 そうです。
前回のプログラムに条件を追加する課題です。
>>491 aStudio4b528のsetup.exeが73MB、それをインストールすると100MB。
たった一度きりのためにそこまでする人間はあまりいない。
>>575 いるかいないかは、お前には関係ないよ。
577 :
デフォルトの名無しさん :2007/10/30(火) 16:56:22
共分散と相関係数算出プログラムと実験結果がほしいです。 1] 授業単元:情報処理 [2] 問題文(含コード&リンク): 共分散と相関係数算出プログラムと実験結果を求めよ [3] 環境 [3.1] OS: Windows [3.3] 言語: C/C++/どちらでも可 [4] 期限: 2007年11月3日まで お願いします。
いちいちそんなこと報告しなくていいんですよ。
580 :
デフォルトの名無しさん :2007/10/30(火) 17:20:20
#include <stdio.h> double dollar(double); int yen; int main(void) { scanf("%lf",¥); printf("%f",dollar(yen)); return 0; } double dollar(double) { dollar = yen * (1.0/110.0); return 0; } 円をドルに変換するプログラムですが、 「浮動小数点の不正な使用」というエラーがでます。 修正お願いできますか?
¥ ¥
583 :
デフォルトの名無しさん :2007/10/30(火) 17:29:13
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):1ドル=110円で円を入力しドルで表示するプログラムを作れ [3] 環境 [3.1] ビスタ [3.2] Borlandのコンパイラ [3.3] C [4] 期限:ナシ [5] その他の制限: #include <stdio.h> double dollar(double); int yen; int main(void) { scanf("%lf",\); printf("%f",dollar(yen)); return 0; } double dollar(double) { dollar = yen * (1.0/110.0); return 0; } 途中までシコシコやったからこれを改変してやってもらいたい
double dollar(double) { dollar = yen * (1.0/110.0); return 0; } なんかVBっぽい。
585 :
デフォルトの名無しさん :2007/10/30(火) 17:32:34
アカン 初心者やから根本的に間違ってる気がしてきた アカン
>>583 #include <stdio.h>
double dollar(double yen);
int main(void)
{
double yen;
scanf("%lf",¥);
printf("%f",dollar(yen));
return 0;
}
double dollar(double yen)
{
return yen * 110.0;
}
それじゃ1円が100ドルだ。
お前らわざと間違えてるだろうww
589 :
デフォルトの名無しさん :2007/10/30(火) 17:41:09
yen * (1.0/110.0); return yen これではだめなんすかね?
return yen / 110.0; で十分だろ
#include <iostream> #define YEN 110.0 int main() { double dollar; std::cin >> dollar; std::cout << "\\" << dollar * YEN << std::endl; return 0; }
#include <stdio.h> #define YEN_DOLLAR_RATE (110.) int main() { int yen; scanf("%d", & yen); printf("%g\n", yen / YEN_DOLLAR_RATE); return 0; }
593 :
デフォルトの名無しさん :2007/10/30(火) 18:50:28
594 :
デフォルトの名無しさん :2007/10/30(火) 18:52:41
596 :
デフォルトの名無しさん :2007/10/30(火) 19:27:39
#include <stdio.h> #include <math.h> void divhalf(double *, double *,double a,double c); double f(double x, double a,double c); main(){ double a,c,x,x_1,x_2,xm; int nc=0; a=c=3; x_1=0;x_2=1; while(nc<50){ divhalf(&x_1,&x_2,a,c); xm=(x_1+x_2)/2; printf("%d %f %f %f\n",nc, x_1,x_2, f(xm,a,c)); nc++; if(fabs(f(xm,a,c))< 0.000001)break; } } void divhalf(double *x_1, double *x_2,double a,double c){ double x_m=(*x_1+*x_2)/2; if(f(*x_1,a,c)*f(x_m,a,c)>0) *x_1=x_m; else *x_2=x_m; } double f(double x, double a,double c){return tan(c*x)-a;}
// なんだ、被り捲くりだなぁ。まぁいいか。 #include <stdio.h> #include <math.h> static double f(double x, double a, double c) { return tan(x * c) - a; } static void divHalf(double * x1, double * x2, double a, double c) { double xm = (* x1 + * x2) / 2; if (f(* x1, a, c) * f(xm, a, c) > 0) { * x1 = xm; } else { * x2 = xm; } } int main() { int nc; double a, c, x1, x2; scanf("%lf%lf%lf%lf", & a, & c, & x1, & x2); for (nc = 1; nc < 50; ++nc) { double xm = (x1 + x2) / 2; printf("%d %g %g %g\n",nc, x1, x2, f(xm, a, c)); if (fabs(f(xm, a, c)) < 0.000001) break; divHalf(& x1, & x2, a, c); } return 0; }
598 :
デフォルトの名無しさん :2007/10/30(火) 21:48:15
ページランク を求めるプログラムを作ってください。(PageRankはGoogleの商標です)
詳しい導出方法はGoogle の秘密 - PageRank 徹底解説の3章に載っていますが
簡単に説明すると
ページがn枚ある場合、n×nの2次元配列を用意する。
ページiからページjにリンクがある場合、mat[j][i] = 1 / num_link[i]とする。
ただしnum_link[i]はi番目のページから出ているリンクの総数。
2次元配列の固有値、固有ベクトルを求める。
出力された固有ベクトルから合計が1になるような固有ベクトルを算出する
という流れになります。
http://ja.doukaku.org/48/ #include <iostream>
#define N 1000
using namespace std;
void main(){
int m,n;
float** a=new float* [N];for(m=0;m<N;m++)a[m]=new float [N];
for(m=0;m<N;m++)for(n=0;n<N;n++)
if(rand()%N<20)a[m][n]=1; else a[m][n]=0;
int sum;
for(n=0;n<N;n++){
sum=0;
for(m=0;m<N;m++)sum+=a[m][n];
for(m=0;m<N;m++)a[m][n]/=sum;}
//ここまでが行列の初期化 ここからコードを書いて下さい
}
ページランク?以前に全く同じ質問が出たような気がするが
601 :
デフォルトの名無しさん :2007/10/30(火) 21:55:50
テンプラ食ってこい
603 :
デフォルトの名無しさん :2007/10/30(火) 22:45:05
>> 598 リンク先にはライブラリ使うとか書いてあるけど、使用していいライブラリとかあるの? それとも、固有値計算を自力でやれってこと?
今科学技術計算の本を読んだけど固有値を求めるのは難しいな ヤコビ法というのが一番簡単なんだが
607 :
デフォルトの名無しさん :2007/10/30(火) 23:09:27
>>605 固有値は、1になるみたいだよ
たとえば A={{a,b}{c,d}} a+c=1 b+d=1とすると|A + E|=0となる
一般に A={ a(m,n) }に対してa(0,n)+・・・+a(m,n)=1 が全てのnについて成り立つならば|A + E|=0
計算方法は不明
608 :
デフォルトの名無しさん :2007/10/30(火) 23:11:30
まちがえた |A - E|=0だ グーグル行列 Aに対し Ax = xとなる連立方程式を解けばいい
>>607 ,
>>608 最近出没してるコードを書けない回答者きどりの人?
嘘まで混ぜるようになったの?
610 :
デフォルトの名無しさん :2007/10/30(火) 23:19:48
テンプレ埋めないようなやつの回答でもめるのはよそうぜ
>>598 リンク先よく見たら、C#とかDでライブラリ使わないコードがあるね。
これをCにすれば良さそうだが、これはホントに宿題なのかという疑問。
固有値計算のCライブラリって無いんですか?
MATLAB
GSL
>>615 ,616
ありがとん。
GSL良さげですね。
>>549 ,
>>552 お礼が遅れて申し訳ありません。
おかげで助かりました。
ありがとうございます。
for(o=0;o<p_num;o++){ fseek(fp3,0L, SEEK_SET); while(!feof(fp3)){ fscanf(fp3,"%d",&num_x2); printf("%d\n",num_x2); if(num_x2<0){ break; } if(num_x2==pickup[o]){ for(l=0;l<p_num;l++){ while(1){ printf("*"); fscanf(fp3,"%c",&moji); if(moji=='<'){ fscanf(fp3,"%d",&num_y2); for(m=0;m<p_num;m++){ if(pickup[m]==num_y2){ n++; } } break; } } } } while(1){ fscanf(fp,"%c",&moji); if(moji=='\n'){ break; } } }
619のプログラムですが 最初の方で無限ループしてしまってるようです 何か気になる点があったら、ご指摘御願いします この部分を飛ばしてプログラムを走らせると、希望通りに終わってくれてるので この中のどこかだと思うのですが・・・
>>620 C言語ではfscanf()を行ってからfeof()で判定する。
BASICとは順番が逆だよ
>>620 fscanfが失敗してて、ファイル読み込みが進んでないとか。
fscanfの戻り値が1(入力項目の個数)じゃなかったら失敗してるよ。
[1] 授業単元:プログラミングT [2] 問題文(含コード&リンク):下の関数のi,j,kの値をトレースせよ int main(void) { int i,j,k; int a[3][4]={{1,2,3,4}, {5,6,7,8}, {9,0,1,2}}; int b[4][3]={{1,2,3}, {4,5,6}, {7,8,9}, {0,1,2}}; int c[3][3]; for(i=0;i<3;i++){ for(j=0;j<3;j++){ c[i][j]=0; for(k=0;k<4;k++){ c[i][j]+=a[i][k]*b[k][j]; } } } for(i=0;i<3;i++){ printf("c[%d][0,1,2]:(",i); for(j=0;j<3;j++){ printf("%d,", c[i][j]); } printf(")\n"); } return 0; } [3] 環境 [3.1] OS:Vista [3.2] コンパイラ名とバージョン:bcc5.5.1 [3.3] 言語:C [4]期限:10月31日03:30まで 期限が短くて申し訳ありませんがよろしくお願いします
>>624 (i,j,k)=
(0,0,0)→(0,0,1)→(0,0,2)→(0,0,3)
→(0,1,0)→(0,1,1)→(0,1,2)→(0,1,3)
→(0,2,0)→(0,2,1)→(0,2,2)→(0,2,3)
→(1,0,0)→(1,0,1)→(1,0,2)→(0,0,3)
→(1,1,0)→(1,1,1)→(1,1,2)→(1,1,3)
→(1,2,0)→(1,2,1)→(1,2,2)→(1,2,3)
(2,0,0)→(2,0,1)→(2,0,2)→(2,0,3)
→(2,1,0)→(2,1,1)→(2,1,2)→(2,1,3)
→(2,2,0)→(2,2,1)→(2,2,2)→(2,2,3)
typoがあったらすまんね
(というか(0,0,4)とかの条件判断で落とされるのも含むべきか?)
626 :
625 :2007/10/31(水) 01:26:25
あ、よく見たら後半もあったのねw 後半部 (0,0,4)→(0,1,4)→(0,2,4) →(1,0,4)→(1,1,4)→(1,2,4) →(2,0,4)→(2,1,4)→(2,2,4)
[1] 授業単元:プログラミング2 [2] 問題文(含コード&リンク): (1)二次方程式ax^2+bx+c=0の各係数a,b,cを引数として渡し、 その解を戻り値として返すプログラムを作成する。 (2)float height[12]={140.5,150.4,181.3,175.3,121.7,136.4,138.5,122.5,181.3,135.3,121.5,136.0}; float weight[12]={50.4,48.6,80.4,46.4,44.4,99.9,40.4,40.6,66.4,42.4,40.4,39.3};を用いて 男a 140.5cm 50.4kg b 150.4cm 48.6kg c 181.3cm 80.4kg d 175.3cm 46.4kg e 121.7cm 44.4kg f 136.4cm 99.9kg 女a 138.5cm 40.4kg b 122.5cm 40.6kg c 181.3cm 66.4kg d 135.3cm 42.4kg e 121.5cm 40.4kg f 136.0cm 39.3kg それぞれ男の身長、体重、女の身長、体重、全体の身長、体重の平均値を求めよ。 (3)TRY&ERROR法を用いて、3,4,5,6,7,8,9それぞれの時のx乗が10になるxの値を求めよ。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: Visual Studio.NET2003 [3.3] 言語: C [4] 期限:10/30の12時 [5] その他の制限:(3)の精度は小数点以下第5位まで。 よろしくお願いします。
629 :
デフォルトの名無しさん :2007/10/31(水) 02:42:50
#include <stdio.h> #define gosa 0.000001 double pow(double z,int n){double w=1;for(int i=0;i<n;i++)w*=z;return w;} double h(double z,int n){z=z-(pow(z,n)-10)/(n*pow(z,n-1));return z;} main(){ double z,w; int i,n;z=10; // r 真値 d 誤差 (r+d)^n - r^n ≒ ndr^(n-1) for(n=3;n<10;n++){ printf("\nx^%d=10となるxをもとめる\n", n); for(i=1;i<6;i++){ z=h(z,n); w=z*z-10; printf("%d回目 %.10f\n",i, z); if(w<gosa*n*pow(z,n-1) && w>-gosa*n*pow(z,n-1))break; }}}
630 :
629 改良 :2007/10/31(水) 02:49:11
#include <stdio.h> #define gosa 0.000001 double pow(double z,int n){double w=1;for(int i=0;i<n;i++)w*=z;return w;} double h(double z,int n){z=z-(pow(z,n)-10)/(n*pow(z,n-1));return z;} main(){ double z,w; int i,n;z=10; // r 真値 d 誤差 (r+d)^n - r^n ≒ ndr^(n-1) for(n=3;n<10;n++){ printf("\nx^%d=10となるxをもとめる\n", n); for(i=1;i<100;i++){ z=h(z,n); w=(pow(z,n)-10)/(n*pow(z,n-1)); printf("%d回目 x=%.20f 誤差=%.10f\n",i, z,w); if(w<gosa && w>-gosa)break; }}}
これより速いソートプログラム書ける? 重複行は削除すること
そ〜太 2nd
http://park15.wakwak.com/~yu-ki/software.htm テストデータ生成
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void main(){
string s,t="あぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺ
ほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎
或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭";
int M=t.size()/2,i,j,d,n;
fstream fp("sorttest.txt",ios::out);
for(i=0;i<80000;i++){
s="";for(int k=0;k<20;k++){
d=2+rand()&0xF;
for(j=0;j<d;j++){n=rand()%M;s+=t.substr(2*n,2);}
s+="\n";}
fp<<s;}}
標準のSTLだとメモリ食う上に鈍い #include <iostream> #include <fstream> #include <string> #include <set> #include <time.h> using namespace std; void main(){ set<string> s; string buf; int cl=clock(); fstream fp("sorttest.txt",ios::in); for(;;){ getline(fp, buf);if(fp.eof())break; s.insert(buf);} fstream fq("sortzumi.txt",ios::out); set<string>::iterator p= s.begin(); while(p!= s.end()){fq << *p << endl;p++;} cl=clock()-cl;cout <<cl;}
vector<string>に入れてstd::sortしてstd::unique掛けたらどうかな
とりあえず500MBのテキストのソートが実感湧かないな そんなにでかいテキストは扱った事無い
500MB……概算で500000000バイトだから、 全角文字で250000000文字だから、400字詰め原稿用紙単純換算で650000枚…… 小説一つ分程度かと思って計算したら予想以上に多いな
実験データの加工なんかで1M行のテキストを扱うこともしばしばだけど、流石にソートはしないなぁ。 で、宿題スレで宣伝している阿呆な>631は作者なの? だったら自分でSTLと比較した実測値くらい出したら? まぁまさか、手元にあるのがsseも使えないCPUばかりだから恥ずかしくて実測値を出せないなんてこともないだろうし。
>>627 (1)
#include<stdio.h>
#include<math.h>
struct tuple
{
double fst;
double snd;
};
double discriminant( double coeffs[] )
{
return coeffs[1] * coeffs[1] - 4.0 * coeffs[0] * coeffs[2];
}
/* 解けない場合は未定義 */
void getQuadEqRoots( struct tuple *solvs, double coeffs[] )
{
double d = sqrt( discriminant( coeffs ) );
solvs->fst = (-coeffs[1]+d)/(2.0 * coeffs[0]);
solvs->snd = (-coeffs[1]-d)/(2.0 * coeffs[0]);
return;
}
int main(void)
{
double coeffs[3] = { 1.0, 1.0, -2.0 };
struct tuple solvs;
if(discriminant( coeffs ) >= 0.0)
{
getQuadEqRoots( &solvs, coeffs );
printf("alpha=%lf,beta=%lf\n",solvs.fst, solvs.snd);
}else{printf("the polynomial has no real roots\n"); }
return 0;
}
STL版の時間かかっているところは主にファイルを1行ずつ読んでいるところだとおもう
戻り値voidじゃなくてboolにして成功する場合trueを返すようにすればよかった。
640 :
627 :2007/10/31(水) 11:30:37
期限間違えました。11月1日の12時までです。 よろしくお願いします。
とりあえず小説一冊でも500kBいけば大著。 1MBいく本は早々無いな 100MBのテキストデータをソートするなんてのはきっと国ぐらいだろう
手元に4096x4096の実数値が入ったテキストファイル(200MiB超)があったのでソートしてみた。 -- [user@foo /tmp]$ time sort v1_r.txt > foo real 0m58.864s user 0m46.452s sys 0m11.849s [user@foo /tmp]$ time wc v1_r.txt 4096 16777216 226707147 v1_r.txt real 0m31.798s user 0m31.683s sys 0m0.112s [user@foo /tmp]$ -- wcの所要時間から見ると、えらく速くソートできたなw
ゼミの課題 void main(int argc,char** argv){ として プログラム名、パラメータを標準出力するプログラム。 ただし変数型を適宜変換すること (例えばパラメータに"1"があったらchar型からint型に変えて表示する) [3.1]Windows XP [3.2]bcc [3.3]C [4]11/6 よろしくお願いします
1行1データにばらして実測。 -- [user@foo /tmp]$ time wc fooz 16777216 16777216 243480267 fooz real 0m49.162s user 0m47.278s sys 0m0.145s [user@foo /tmp]$ time sort fooz > foo ; time sort -u fooz > foo real 4m32.997s user 4m24.198s sys 0m3.291s real 3m28.555s user 3m25.035s sys 0m1.876s -- 流石に時間が掛かるようだ。 で、誰かこのテストデータ要る?w
>>643 >(例えばパラメータに"1"があったらchar型からint型に変えて表示する)
どうせ表示するのに、何その無駄な作業w
646 :
デフォルトの名無しさん :2007/10/31(水) 15:02:06
647 :
644 :2007/10/31(水) 15:19:05
で、作ってみた。 # iostreamの方が遅かったのでcstdio版 -- #include <cstdio> #include <ctime> #include <string> #include <vector> #include <algorithm> using namespace std; int main(int argc, char ** argv) { if (argc < 2) return 1; FILE * fp = fopen(argv[1], "r"); vector<string> vecStrs; char buf[100]; while (fgets(buf, sizeof(buf), fp) != NULL) { vecStrs.push_back(buf); } fclose(fp); sort(vecStrs.begin(), vecStrs.end()); vecStrs.erase(unique(vecStrs.begin(), vecStrs.end()), vecStrs.end()); for (vector<string>::const_iterator it = vecStrs.begin(); it != vecStrs.end(); ++it) { printf("%s", it->c_str()); } return 0; } -- real 1m58.819s user 1m57.001s sys 0m1.628s -- sortコマンド涙目w
>>646 // 面倒なんで、unified-diff形式で。
// 要は、main()の前にテーブルを追加して、後はそれぞれ修正するだけ。
@@ -14,0 +15,11 @@
+static const struct {
+ int addDays;
+ int firstNum;
+ int addNum;
+} itemTable[] = {
+ {3, 300, 350},
+ {4, 350, 400},
+ {5, 400, 450},
+ {6, 450, 500},
+ {7, 500, 550},
+};
@@ -30 +41 @@
- int ADD_NUM = 300;
+ int ADD_NUM = itemTable[count - 1].addNum;
@@ -32 +43 @@
- int ADD_DAYS = α;
+ int ADD_DAYS = itemTable[count - 1].addDays;
@@ -37 +48 @@
- num = prev_num = FIRST_NUM;
+ num = prev_num = itemTable[count - 1].firstNum;
@@ -55 +66 @@
- if(num<=100*α+1*sqrt(100/3)*sqrt(α) && day>=inc_day)
+ if(num<=100*ADD_DAYS+1*sqrt(100/3)*sqrt(ADD_DAYS) && day>=inc_day)
649 :
デフォルトの名無しさん :2007/10/31(水) 16:03:00
>>648 実行できました。
ありがとうございました。
>
>>645 いや無駄じゃないかもしれないぞ
パラメータをcharからintに直すのは基本的で重要な作業だ
>>643 はその部分の問題を抽出したんだろう
>>647 Cで書いてみた。よければ測ってみてw
#include <stdlib.h>
#include <stdio.h>
int scomp(const void *a, const void *b) {
return strcmp(*(char *const *)a, *(char *const *)b);
}
int main(int argc, char **argv) {
int i, buffsize = 1024, datamaxsize = 1, datasize = 0;
char **data = (char **)malloc(datamaxsize * sizeof(char *));
char buff[buffsize], *p, *delim = "\r\n\t ", *saveptr, *last = "";
FILE *in = 0 < argc ? fopen(argv[1], "r") : 0;
if (in) while (fgets(buff, buffsize, in) != NULL) {
for (p = strtok_r(buff, delim, &saveptr); p; p = strtok_r(0, delim, &saveptr)) {
if (datamaxsize <= datasize) {
datamaxsize *= 2;
data = realloc(data, datamaxsize * sizeof(char *));
}
data[datasize++] = strdup(p);
}
}
fclose(in);
qsort(data, datasize, sizeof(char *), scomp);
for (i = 0; i < datasize; i++) {
if (strcmp(last, data[i]) != 0) puts(data[i]);
last = data[i];
}
return 0;
}
653 :
デフォルトの名無しさん :2007/10/31(水) 17:50:37
1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): // Calculate +, -, *, /, and , % #include <iostream> using namespace std; int main() { int a, b, wa, sa; int seki; int sho; int amari; // 余り // cout << "Input a = "; cin >> a; // a の入力 cout << "Input b = "; cin >> b; // b の入力 wa = a + b; sa = a - b; seki = a * b; if ( b != 0 ) { // b が 0 ならば割算できない。 sho = a/b; amari = a % b; } cout << " a = " << a << " b = " << b << endl; // a, b の出力 if ( b != 0 ){ //割算可能な場合 if ( amari == 0 ){ // 割り切れる場合 cout << "和= "<< wa << " 差= " << sa << " 積= "<< seki << " 商= "<< sho << endl; } else{ //余りが出る場合 cout << "和= "<< wa << " 差= " << sa << " 積= "<< seki << " 商= "<< sho <<" 余り= "<< amari << endl; } }else{ //割算不可能な場合 cout << "和= "<< wa << " 差= " << sa << " 積= "<< seki << "b が 0 なので a/b は不能!!" << endl; } return 0; } これだと2つの数の積が一定以上になると計算結果がおかしくなる。 その問題を解決したプログラムを作れ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: bcc [3.3] 言語: C++ [4] 期限: 11/1 8時 [5] その他の制限:なし よろしくお願いします。
654 :
デフォルトの名無しさん :2007/10/31(水) 18:01:24
>>653 Karatsuba法つかえ
( a + bX ) ( c + dX ) = ac + { ( a + b )( c + d ) -ac -bd } X + bd X^2
655 :
デフォルトの名無しさん :2007/10/31(水) 18:11:35
32bit 、64bit コンパイラだと整数(int)演算は内部で何ビットまで計算可能なんですか?
656 :
652 :2007/10/31(水) 18:12:06
a = ('a'..'z').to_a + ('A'..'Z').to_a + ["\n"] * 5 max = 200 * 1024 * 1024 # bytes sum = 0 while sum < max c = a[rand(a.size)] print c sum += c.size end でテケトーにでっち上げたファイル us.txt を使ってみた。 $ time wc us.txt 18393191 16781068 209715200 us.txt real 0m39.699s user 0m1.999s sys 0m0.671s $ time sort us.txt > foo real 3m45.018s user 1m10.577s sys 0m18.077s $ time ./a.exe us.txt > foo real 1m20.217s user 0m59.436s sys 0m15.108s やはりsortコマンド涙目w
657 :
デフォルトの名無しさん :2007/10/31(水) 18:45:53
BCCだと内部は32ビットみたいだ 多倍長作るときは演算が溢れないようにしないと #include <iostream> using namespace std; #define N 33000 main(){ unsigned int a; a=4*N*N-3*N*N; cout<<a<<endl;}
658 :
デフォルトの名無しさん :2007/10/31(水) 18:50:56
Karatsuba法つかうとき、 ( a + b )( c + d )の部分が32bitで収まればいいだろう 全てが同じ値だとすると4a*aだからこれが32bit以下になるとすると、a,b,c,d < Xだから X=2の15乗とすれば良いな ( a + bX ) ( c + dX ) = ac + { ( a + b )( c + d ) -ac -bd } X + bd X^2
659 :
644 :2007/10/31(水) 19:01:21
>>652 ひょっほ、std::string使わないから速いこと速いこと。
--
real 0m37.009s
user 0m35.683s
sys 0m1.319s
--
一応、sort -uと同じ条件にする為にデリミタを"\r\n"にしたけど。
ちなみにgccでは42秒掛かっている。
スレ立ててそこでやれ
661 :
デフォルトの名無しさん :2007/10/31(水) 19:05:34
>>653 途中までやった
#include <iostream>
#include <vector>
#define X 32767 //2^15 - 1
using namespace std;
class seisu {
char fugou;
vector<unsigned short int> x;
public:
seisu operator + (seisu& su){
int n;
for(n=0;n<x.size();n++)x[n]+=su.x[n];
return *this;}
};
main(){}
662 :
661 :2007/10/31(水) 19:07:25
演算結果が負か正か初めにチェックして、基数の桁上がりがあるかどうかをいれる必要あり
663 :
デフォルトの名無しさん :2007/10/31(水) 19:16:34
[1] 授業単元:情報工学演習 [2] 問題文(含コード&リンク):スタックを用いて、nCmを求める再帰関数combinationから再帰呼び出しを除去せよ。nCm=n-1Cm-1+n-1Cmとする。 [3] 環境 [3.1] OS: windows XP [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) 不明 [3.3] 言語: c言語 [4] 期限: 11月2日 [5] その他の制限: なし 自分でcombinationの関数作りました。 #include<stdio.h> int combination(int x,int y){ int a; if(y==1) return x; else if(x==y) return 1; a=combination(x-1,y-1)+combination(x-1,y); return a; } int main(){ int n,m; scanf("%d%d",&n,&m); printf("%d\n",combination(n,m)); } このプログラムの関数を直してもらえるとありがたいです
664 :
デフォルトの名無しさん :2007/10/31(水) 19:36:32
今後使えるように多倍長演算をここで作っておこうぜ CとC++用
665 :
627 :2007/10/31(水) 19:53:16
637さん(1)ありがとうございました
666 :
644 :2007/10/31(水) 19:54:08
結局、>652のsortをqsort()からstd::sort()に替えたのが最速で35秒程度。 C++版も、std::unique()をやめて>652同様出力時にチェックしたら僅かに速くなった。 これにて、本日のCPUぶん回しテストは終了。 お騒がせしました。
>>627 (2)のデータは12人分ずつあるが、6人ずつの平均を求めるのか?
(3)のTRY&ERROR法とは?
668 :
デフォルトの名無しさん :2007/10/31(水) 19:59:04
(3)はやったのに礼無しかよ
669 :
デフォルトの名無しさん :2007/10/31(水) 20:01:39
TRY&ERROR法 ねらいを定めて失敗ならやり直す アルゴリズムは限定されない自由な方法 開平法はTRY&ERRORでない
670 :
667 :2007/10/31(水) 20:05:29
つーかあれか、前6データが男ので後6データが女のってことか。 #include <stdio.h> float height[12]={140.5,150.4,181.3,175.3,121.7,136.4,138.5,122.5,181.3,135.3,121.5,136.0}; float weight[12]={50.4,48.6,80.4,46.4,44.4,99.9,40.4,40.6,66.4,42.4,40.4,39.3}; static double average(float * begin, float * end) { unsigned num = 0; double sum = 0; for (float * it = begin; it != end; ++it) { sum += * it; ++num; } return sum / num; } int main() { printf("男の身長:%g、体重:%g、女の身長:%g、体重:%g、全体の身長:%g、体重:%g\n", average(height, height + 6), average(weight, weight + 6), average(height + 6, height + 12), average(weight + 6, weight + 12), average(height, height + 12), average(weight, weight + 12)); return 0; }
671 :
627 :2007/10/31(水) 20:06:59
>>668 さん
すいません、せっかく改良までしていただいたのに見忘れていました。
そして今コンパイルしたのですが、4行目でエラーが出てよくわかりませんでした…
>>667 さん 男6人、女6人、全体12人、それぞれの場合を求めます。TRY&ERROR法の説明はありませんでした。すいません
672 :
デフォルトの名無しさん :2007/10/31(水) 20:10:05
627これは? #include <stdio.h> #define gosa 0.000001 double pow(double z,int n){ double w=1; for(int i=0;i<n;i++) w*=z; return w;} double h(double z,int n){ z=z-(pow(z,n)-10)/(n*pow(z,n-1)); return z;} main(){ printf("%f",pow(3,7)); }
673 :
667 :2007/10/31(水) 20:11:32
>>671 >630 の4行目、for (int i = 0; でエラーが出るならint i; for (i = 0; にして味噌。
どうでもいいけど、>629=>630=>672は思いっきり勘違いしていそうだ。 勘違いはさておくと、9乗を掛け算で計算するのは誤差が却って大きくなりそうだ。
675 :
デフォルトの名無しさん :2007/10/31(水) 20:21:54
677 :
627 :2007/10/31(水) 20:25:31
>>670 さん
10 11行目でエラーが出てしまいました。
>>673 さん
参考になりました。ありがとうございます。
678 :
667 :2007/10/31(水) 20:31:48
>>677 >10 11行目でエラーが出てしまいました。
あーそれも同じだ。
- for (float * it = begin; it != end; ++it) {
+ float * it;
+ for (it = begin; it != end; ++it) {
679 :
627 :2007/10/31(水) 20:44:03
>>678 さん
そうですね!出来ましたありがとうございました。
680 :
デフォルトの名無しさん :2007/10/31(水) 20:44:19
logとかexpつかうのは反則だよな #include <stdio.h> #include <math.h> #define gosa 0.000001 double h(int n,double z){z=z-(pow(n,z)-10)/(log(n)*pow(n,z));return z;} main(){ double z,w; int i,n;z=10; for(n=3;n<10;n++){ printf("\n%d^x=10となるxをもとめる\n", n); for(i=1;i<5;i++){ z=h(n,z); printf("%d回目 x=%.20f 誤差=%.10f\n",i, z,w); }}}
681 :
デフォルトの名無しさん :2007/10/31(水) 20:47:56
#include <stdio.h> のみで真値との誤差が0.000001以下になるやつをつくろう
だが断る
683 :
デフォルトの名無しさん :2007/10/31(水) 20:53:55
2の x乗 をどう計算するのか
xの範囲は?
685 :
デフォルトの名無しさん :2007/10/31(水) 21:03:34
2の x乗 = 10を求めるのに必要な範囲の実数
686 :
デフォルトの名無しさん :2007/10/31(水) 21:04:59
log_2(n) とか使ったら駄目だよ log_2(10)として答えが求まってしまうから
687 :
デフォルトの名無しさん :2007/10/31(水) 21:09:28
p=m/nを有理数として、2^m - 10* 2^n がどのくらいの値だったら真値との誤差が0.000001以下になるのか?
688 :
652 :2007/10/31(水) 21:20:00
qsortが微妙に「速くない」との噂(?)を裏付けるものですね。 楽しいひと時をどうもありがとん! エンジョイプログラミング! ;-)
689 :
652 :2007/10/31(水) 21:20:49
690 :
デフォルトの名無しさん :2007/10/31(水) 21:21:21
2^x = 10の解を r とし、近似解をpとする その誤差をdとし、D=2^r - 2^pとおくと d<=D Dが0.000001以下ならdの誤差も保証される
691 :
デフォルトの名無しさん :2007/10/31(水) 21:50:15
#include <stdio.h> #define gosa 0.01 main(){ int n,a=1,b=1; double p=10,q=2,d; for(;;){ d=p/q-1; if(d<gosa && d>-gosa)break; if(d>0){q*=2;a++;} else {p*=10;b++;} printf("%d %d \n",a,b);} printf("%d %d %f\n",a,b,(a+0.0)/b ); }
692 :
691 :2007/10/31(水) 21:54:32
#define gosa 0.001とか小さくすると、2の1000乗とかの計算になり落ちる 浮動小数点では計算不可能か ?
あほ丸出しの変数宣言に 汚いソースだなぁ よく人にそんなもの見せられるわぁ
694 :
691 :2007/10/31(水) 22:39:48
そんなこといってないで 2^(m/n) = 10 + d |d|<0.001となるものをみつけろ
695 :
691 :2007/10/31(水) 23:05:31
#include <stdio.h> #define gosa 0.001 main(){ double r=5; int a=1,b=1; for(;;){ if(r-1<gosa && r-1>-gosa)break; if(r>1){r/=2;a++;} else {r*=10;b++;} printf("%d %d %.8f\n",a,b,(a+0.0)/b);}}
696 :
完成版 :2007/10/31(水) 23:10:46
誤差は適当に変えてくれ #include <stdio.h> #define gosa 0.0000001 main(){ int a=1,b=1,n; double r; for(n=2;n<10;n++){ r=10.0/n; for(;;){ if(r-1<gosa && r-1>-gosa)break; if(r>1){r/=n;a++;} else {r*=10;b++;} } printf("%d^x=10 を満たす解 %d / %d = %.12f\n",n,a,b,(a+0.0)/b); }}
697 :
デフォルトの名無しさん :2007/10/31(水) 23:12:30
訂正 #include <stdio.h> #define gosa 0.0000001 main(){ int a,b,n; double r; for(n=2;n<10;n++){ r=10.0/n;a=b=1; for(;;){ if(r-1<gosa && r-1>-gosa)break; if(r>1){r/=n;a++;} else {r*=10;b++;} } printf("%d^x=10 を満たす解 %d / %d = %.12f\n",n,a,b,(a+0.0)/b); }}
何回も貼り付けるな 書き込む前によくチェックしろ
699 :
デフォルトの名無しさん :2007/11/01(木) 00:12:57
[1] 授業単元: C言語基礎 [2] 問題文(含コード&リンク): 1. キーボードから数字(0〜99)を入力できるようにする 2. 1で入力した数字を以下の例のように2byteのchar型の領域Aに格納せよ。 例:1で“12”と入力したらchar型の1byte目に"0x31"、2byte目に"0x32"で格納 1で“3” と入力したらchar型の1byte目に"0x30"、2byte目に"0x33"で格納 3. 2で格納した文字列を以下の例のように1byteのchar型の領域Bに変換し格納せよ。 例:1で“12”と入力したらchar型の領域に"0x12"で格納 1で“3” と入力したらchar型の領域に"0x03"で格納 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限:なるべく早めで [5] その他の制限: 特にありません。
>1. キーボードから数字(0〜99)を入力できるようにする これは「全角で入力できるようにせよ」ってことか?
ありとあらゆる"数字"を入力できるようにするんだろ
702 :
699 :2007/11/01(木) 00:33:27
>>700 半角(0〜99)ですね。全角で書いてしまいました。
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 二分木の実装を行う。 二分木の節点は構造体を用いて struct n{ int a; //節点が保持するデータ struct n *l; //左の子へのポインタ struct n *r; //右の子へのポインタ }; とする。 節点がない場合は、その節点はNULLとみなす。 深さ優先探索でたどること。 1.引数として節点へのポインタをとり、その節点を根とする二分木(部分木)の 高さを返す再帰関数int h(struct n *t)を作成せよ。 2.引数として接点へのポインタをとり、その節点を根とする二分木(部分木)を 削除する再帰関数void d(struct n *t)を作成せよ。 削除する順番に注意すること。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 金曜日の11時まで [5] その他の制限: 必ず再帰を用いること。「幅優先探索」ではなく、 「深さ優先探索」でたどること。 よろしくお願いします。
>>699 #include <stdio.h>
main()
{
int num;
char A[2],B;
while( 1 ) {
scanf("%d",&num );
if ( num > 0 && num < 100 ) { break; }
}
A[0] = 0x30 | ( num/10 );
A[1] = 0x30 | ( num % 10 );
B = ( ( A[0] & 0x0f ) << 4 ) | ( A[1] & 0x0f );
printf( "num = %d\n", num );
printf( "A[0] = %#0x, A[1]=%#0x \n", A[0],A[1] );
printf( "B = %#04x\n", B );
}
>>704 0-99 だった.
if ( num >= 0 && num <= 99 ) { break; }
706 :
699 :2007/11/01(木) 00:53:43
>>704 即レスありがとうございます。
実行してみて確認できました。
助かりました。
>>703 #define maxof(a,b) ((a) > (b)) ? (a) : (b)
int h(struct n *t)
{
if (t) {
int l_height = h(t->l);
int r_height = h(t->r);
return maxof(l_height, r_height) + 1;
}
else {
return 0;
}
}
void d(struct n *t)
{
if (t) {
d(t->l);
d(t->r);
free(t);
}
}
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: vista [3.2] コンパイラ名とバージョン: ? [3.3] 言語:C [4] 期限: ([2007年11月1日9:00まで [5] その他の制限:特になし ↓に問題を書きます。実行結果は自分の都合で載ってあるものより簡単になってます。 どうかよろしくお願いします
[2] 問題文(含コード&リンク): 1.キーボードから数字を三つ入力し、そのうちの二つの数字の和を表示する。なお、 二つの数字の和を計算するために、keisan()関数を利用するものとする。 [使用関数] int keisan(int, int) 実行結果:数字を三つ入力してください:1 2 3 1 + 2 = 3 2 + 3 = 5 3 + 1 = 4 2.キーボードから数字を何回か入力していき、入力された数字の平均を表示する。 なお、入力された数値の合計と個数を計算するために、j_heikin()関数を利用するものとする。 [使用関数] void j_heikin(int) 実行結果:数値を複数入力してください(終了^z) 1 2 3 ^z 入力した数値の平均は2です。 3.キーボードから数字を一つ入力し、入力された数字と同じ数の星を等しい二辺とする二等辺三角形を表示する。 なお、二等辺三角形の作成には引数の数だけ星を表示するstar()関数を利用するものとする。 [使用関数] void star(int) 三角形の一辺を入力してください:4 * ** *** ****
下に書くとかしないで、うpろだ使えよ
すいません、次回からは気をつけます。 今回はすでに書いてしまったのでこれでよろしくお願いします
>>708 @
#include<stdio.h>
int keisan(int n,int m)
{
return n+m;
}
main()
{
int a,b,c;
printf("数字を三つ入力してください:");
scanf("%d%d%d",&a,&b,&c);
printf("%d + %d = %d\n",a,b,keisan(a,b));
printf("%d + %d = %d\n",b,c,keisan(b,c));
printf("%d + %d = %d\n",c,a,keisan(c,a));
}
A
#include<stdio.h>
int x[1000];
void j_heikin(int n)
{
int sum,i;
for(sum=i=0;i<n;i++) sum+=x[i];
printf("入力した数値の平均は%dです。\n",sum/n);
}
main()
{
int n=0;
printf("数値を複数入力してください(終了^z)\n");
while(scanf("%d",&x[n])==1) n++;
j_heikin(n);
}
>>708 B
#include<stdio.h>
void star(int n)
{
int i;
if(n>1) star(n-1);
for(i=0;i<n;i++) printf("*");
putchar('\n');
}
main()
{
int n;
printf("三角形の一辺を入力してください:");
scanf("%d",&n);
star(n);
}
716 :
703 :2007/11/01(木) 02:47:30
>>707 ありがとうございます。
2点ほど疑問があるのですが、
#define maxof(a,b) ((a) > (b)) ? (a) : (b)
とはどういう意味ですか?
#define a 10とすると、aを10と定義すると言う意味なのは分かるので、
#define自体の意味は分かるのですが、その後の
maxof(a,b) ((a) > (b)) ? (a) : (b)の意味が全く分かりません。
それと、if(t)ってどういう意味ですか?if(t!=NULL)の様に、ifの中に
式がある使い方しか知らないのですが。
>>716 別人。
上は関数マクロっていうからググれ。
if文の中にただの値がある場合。
0以外なら真、0なら偽と決まってる。
>>707 の
return maxof(l_height, r_height) + 1;
の部分バグってね?
719 :
707 :2007/11/01(木) 08:34:25
>>718 あぁ、バグってんね
#define maxof(a,b) (((a) > (b)) ? (a) : (b))
でよさそうかな。
マクロなんて使わないで素直に関数にしとけという良い例になってしまった
720 :
デフォルトの名無しさん :2007/11/01(木) 11:02:01
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): ファイル「kyotocity.txt」には、(2007年9月1日現在の) 京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されている。 これらの情報を格納する構造体 struct division を宣言しなさい。 struct division { char name[20]; int population; double area; } struct division型の配列 kyoto[11]を用意し、 ファイルからデータを読んで、配列に入力しなさい。 入力した構造体の配列を調べて、以下の情報を出力しなさい。 人口が最大の区と最小の区の、名前と人口。 面積が最大の区と最小の区の、名前と面積。 人口密度が最大の区と最小の区の、名前と人口密度。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VS2005 [3.3] 言語: C [4] 期限: 無期限 [5] その他の制限: 特になし kyotocity.txtの内容は↓に書きます。
721 :
デフォルトの名無しさん :2007/11/01(木) 11:02:36
>>720 Kita 123167 94.92
Kamigyo 82867 7.11
Sakyo 168198 246.88
Nakagyo 102121 7.38
Higashiyama 41424 7.46
Yamashina 136222 28.78
Shimogyo 75900 6.82
Minami 98182 15.78
Ukyo 202712 291.95
Nishikyo 153887 59.20
Fushimi 284112 61.62
よろしくお願いします
//
>>721 前半
#include <stdio.h>
#include <stdlib.h>
struct division {
char name[20];
int population;
double area;
};
#define NUM_DIVISION 11
static struct division kyoto[NUM_DIVISION];
#define CITY_FILE "kyotocity.txt"
static void foo()
{
int popMinIdx = 0;
int popMaxIdx = 0;
int areaMinIdx = 0;
int areaMaxIdx = 0;
int densMinIdx = 0;
int densMaxIdx = 0;
for (int ic = 1; ic < NUM_DIVISION; ++ic) {
if (kyoto[ic].population < kyoto[popMinIdx].population) popMinIdx = ic;
if (kyoto[ic].population > kyoto[popMaxIdx].population) popMaxIdx = ic;
if (kyoto[ic].area < kyoto[areaMinIdx].area) areaMinIdx = ic;
if (kyoto[ic].area > kyoto[areaMaxIdx].area) areaMaxIdx = ic;
if (kyoto[ic].population / kyoto[ic].area < kyoto[densMinIdx].population / kyoto[densMinIdx].area) densMinIdx = ic;
if (kyoto[ic].population / kyoto[ic].area > kyoto[densMaxIdx].population / kyoto[densMaxIdx].area) densMaxIdx = ic;
}
// 以下後半へ
// 以下前半より printf("max population: %s (%d)\nmin population: %s (%d)\n" "max area: %s (%g)\nmin area: %s (%g)\n" "max area: %s (%g)\nmin area: %s (%g)\n", kyoto[popMaxIdx].name, kyoto[popMaxIdx].population, kyoto[popMinIdx].name, kyoto[popMinIdx].population, kyoto[areaMaxIdx].name, kyoto[areaMaxIdx].area, kyoto[areaMinIdx].name, kyoto[areaMinIdx].area, kyoto[densMaxIdx].name, kyoto[densMaxIdx].population / kyoto[densMaxIdx].area, kyoto[densMinIdx].name, kyoto[densMinIdx].population / kyoto[densMinIdx].area); } int main() { FILE * fp = fopen(CITY_FILE, "r"); if (fp == NULL) return 1; for (int ic = 0; ic < NUM_DIVISION; ++ic) { fscanf(fp, "%s%d%lf", kyoto[ic].name, & kyoto[ic].population, & kyoto[ic].area); } fclose(fp); foo(); return 0; }
注意点を書き忘れてた。 ・for (int ic = 1; でエラーが出るなら、int ic; for (ic = 1; に書き換えること。 ・書式は適当に調整すること。例えば、%20sとか%9.2fとか。 ・関数名(foo)も適当に。 # 最初は人口面積人口密度を別の関数にしてたんだけど行数も多くなるから纏めちまったぜw
725 :
デフォルトの名無しさん :2007/11/01(木) 11:50:04
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 1)b <0 のとき、エラーで終了する。改良して、 b<0 の時もa*b 、a^b を計算できるようにせよ。 改良後のプログラムをデバッガ上で実行し、b<0 の場合、 a^b を計算している繰り返し中のデバッガ実行画面を 提出せよ。 変数 a, b, i, power の値が画面上に表示されて いること [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: bcc [3.3] 言語: C++ [4] 期限: 11/3 [5] その他の制限: if 文を使い、 b< 0 のときは、 multi(乗算) b の絶対値回aを加算し最後に-1 を掛ける。 Power(べき乗) b の絶対値回数 a で割る。 ように場合分けしてやれと指示されてます。 ぜんぜんわからないんです。どうかよろしくお願いします。元々↓のプログラムが与えられててそれを改良するんですが・・・
726 :
デフォルトの名無しさん :2007/11/01(木) 11:51:13
#include <iostream> using namespace std; int main() { double a; // 入力実数 int b; // 入力整数, 0以上 double multi; // a * b double power; // a^b cout << "Input a = "; cin >>a; cout << "Input b = "; cin >>b; if ( b < 0 ) { cerr << "0 以上の整数を入力して下さい\n"; return 1; } // a を b 回加算して a*b を計算する multi = 0; for(int i = 0; i< b; i++ ){ multi = multi + a; // multi += a; } /* a を b 回積算して a^b を計算する */ power = 1; for( i = 0; i< b; i++ ){ power = power * a; // power *= a; } cout << " a = " << a << " b = " << b << endl; cout << "a*b = " << multi <<" a^b = "<< power <<endl; return 0; }
>>720 #include <stdio.h>
#include <stdlib.h>
#define SIGN(val) ((val)<0?-1:(val)>0?1:0)
struct division {
char name[20];
int population;
double area;
};
double density(const struct division *city){return city->population/city->area;}
int cmp_population(const struct division *a, const struct division *b){return SIGN(a->population-b->population);}
int cmp_area(const struct division *a, const struct division *b){return SIGN(a->area-b->area);}
int cmp_density(const struct division *a, const struct division *b){return SIGN(density(a)-density(b));}
int main(void){
struct division kyoto[11], *maximum, *minimum;
FILE *fp;
int i;
fp=fopen("kyotocity.txt", "r");
if(fp==NULL) return 1;
for(i=0;i<11;i++) fscanf(fp, "%s%d%lf", kyoto[i].name, &kyoto[i].population, &kyoto[i].area);
fclose(fp);
minimum=&kyoto[0];
maximum=&kyoto[11-1];
qsort(kyoto, 11, sizeof(kyoto[0]), (int (*)(const void*,const void*))cmp_population);
printf("%s %d\n%s %d\n", minimum->name, minimum->population, maximum->name, maximum->population);
qsort(kyoto, 11, sizeof(kyoto[0]), (int (*)(const void*,const void*))cmp_area);
printf("%s %f\n%s %f\n", minimum->name, minimum->area, maximum->name, maximum->area);
qsort(kyoto, 11, sizeof(kyoto[0]), (int (*)(const void*,const void*))cmp_density);
printf("%s %f\n%s %f\n", minimum->name, density(minimum), maximum->name, density(maximum));
return 0;
}
728 :
デフォルトの名無しさん :2007/11/01(木) 12:16:45
実数 xに対して | x - m/n | < 10^-8 をみたす自然数のうちm+nが最小のものを求めるプログラムを書け 特に、√2、√3の値を求めよ
>>725 #include <iostream>
using namespace std;
int main()
{
double a; // 入力実数
int b; // 入力整数, 0以上
double multi; // a * b
double power; // a^b
cout << "Input a = "; cin >>a;
cout << "Input b = "; cin >>b;
if ( b == 0 ) {
cerr << "0 以外の整数を入力して下さい\n";
return 1;
}
// a を b 回加算して a*b を計算する
multi = 0;
for(int i = b; i< 0; i++ ) multi-=a;
for(int i = 0; i< b; i++ ) multi+=a;
/* a を b 回積算して a^b を計算する */
power = 1;
for(int i = b; i< 0; i++ ) power/=a;
for(int i = 0; i< b; i++ ) power*=a;
cout << " a = " << a << " b = " << b << endl;
cout << "a*b = " << multi <<" a^b = "<< power <<endl;
return 0;
}
>>727 どうでもいいけど、cmp_poppulation()においてはそのSIGN()は無駄だよ。
qsort()が要求する比較関数の要件から言えば-1, 0, 1である必要はないし、
SIGN()の有無に関わらずaとbの値が離れすぎると誤動作するし。
>>727 の該当箇所を以下のように書き換えておいてね
#define SIGN(val,org) ((val)<(org)?-1:(val)>(org)?1:0)
int cmp_population(const struct division *a, const struct division *b){return SIGN(a->population,b->population);}
int cmp_area(const struct division *a, const struct division *b){return SIGN(a->area,b->area);}
int cmp_density(const struct division *a, const struct division *b){return SIGN(density(a),density(b));}
>>728 遅いけど
#include <stdio.h>
#include <math.h>
int is_range(double x, double m, int n)
{
return (fabs(x-m/n)<1e-8);
}
int main(int argc, char *argv[])
{
long i, n=1e+9;
double j, m=0, x=1.414213562373;
if(argc==2) sscanf(argv[1], "%lf", &x);
for(i=n;i>0;i/=2)
{
j=floor(x*i);
if(is_range(x, j, i)){m=j;n=i;}
else if(is_range(x, j+1, i)){m=j+1;n=i;}
}
for(i=n;i>0;i--)
{
j=floor(x*i);
if(is_range(x, j, i)){m=j;n=i;}
else if(is_range(x, j+1, i)){m=j+1;n=i;}
}
printf("x=%.9e m=%.0f n=%ld\n", x, m, n);
return 0;
}
>>728 シンプルに作ったらでーりゃーおせーがねw
--
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
double x = argc >= 2 ? atof(argv[1]) : sqrt(2);
double differ = argc >= 3 ? atof(argv[2]) : 1e-8;
int begin = x < 1 ? 1 : x;
for (int mn = 2; ; ++mn) {
int tmp = (int) (x * (mn - 1)) + 1;
int end = tmp > mn - 1 ? mn - 1 : tmp;
for (int m = begin; m <= end; ++m) {
int n = mn - m;
if (fabs(x * n - (double) m) < n * differ) {
printf("x=%.9g m=%d n=%d m/n=%.9g\n", x, m, n, (double) m / n);
return 0;
}
}
}
return 0;
}
734 :
デフォルトの名無しさん :2007/11/01(木) 15:45:45
[1] 授業単元: C言語 [2] 問題文: 外接球(半径1)に内接する正四面体の各三角形の中点を求め、 求めた中点を新たな三角形の頂点とし4つの三角形に分割する。これを再帰的に行うことにより 球体を生成せよ。 以下の情報を出力するようにしなさい。 分割した回数、各三角形の頂点座標および接続情報。 (頂点座標と接続情報がわかればVRMLを用いて描画することができます。) [3] 環境 OS: WindowsXP 言語: C [4] 期限: 11/5 [5] その他の制限: 特になし 正四面体の初期座標は求めました。 (0, 0, 1) (0, 0.942809) (-0.816497, -0.471405, -0.33333) (0.816497, -0.471405, -0.33333) です。
>>734 > 求めた中点を新たな三角形の頂点とし4つの三角形に分割する
というのがよくわからんのだけど。
4つの三角形の中点を結んで新しい四面体を作るってことではないよね
(それだと球にならないし)
すまん、中点てゆーのは、面の重心ではなくて辺の中点で分割して角を落とすってことか。
737 :
732 :2007/11/01(木) 16:07:51
>>728 #include <stdio.h>
#include <math.h>
int is_range(double x, double m, int n){
return (fabs(x-m/n)<1e-8);
}
int main(int argc, char *argv[]){
long i, n;
double j, m=0, x=1.414213562373;
if(argc==2) sscanf(argv[1], "%lf", &x);
for(i=1;i<=1e+9;i++){
j=floor(x*i);
if(is_range(x, j, i)){m=j;n=i;break;}
else if(is_range(x, j+1, i)){m=j+1;n=i;break;}
}
printf("x=%.9e m=%.0f n=%ld\n", x, m, n);
return 0;
}
738 :
デフォルトの名無しさん :2007/11/01(木) 16:20:01
739 :
733 :2007/11/01(木) 17:06:08
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]) { double x = argc >= 2 ? argv[1][0] == 'r' ? sqrt(atof(& argv[1][1])) : atof(argv[1]) : sqrt(2); double differ = argc >= 3 ? atof(argv[2]) : 1e-8; int m, n; int cnt = 0; for (int mn = 2; ; ++mn) { if (x < 1) { // m>nとm<nで分けて、ショートカットしたらずっと速くなった int begin = 1; int end = mn / 2; for (m = end; m >= begin; --m) { n = mn - m; ++cnt; if (fabs(x * n - (double) m) < n * differ) goto end; if (x * n > m) break; } } else { int begin = x < mn / 2 ? mn / 2 : x; int tmp = (int) (x * (mn - 1)) + 1; int end = tmp > mn - 1 ? mn - 1 : tmp; for (m = begin; m <= end; ++m) { n = mn - m; ++cnt; if (fabs(x * n - (double) m) < n * differ) goto end; if (x * n < m) break; } } } end: printf("x=%.9g m=%d n=%d m/n=%.9g cnt:%d\n", x, m, n, (double) m / n, cnt); return 0; }
740 :
733 :2007/11/01(木) 17:09:11
むぅ、二重ループである必要さえなかったか。
741 :
デフォルトの名無しさん :2007/11/01(木) 18:46:20
742 :
デフォルトの名無しさん :2007/11/01(木) 19:00:11
C言語での課題です 16進数の値を10進数に変換。 条件: 関数は使わない。 コードは1行のみ。 調べているのですが分かりません。 教えてください
>>742 問題文が不完全なので回答不能。
もっと詳しく書くことを要求する。
744 :
デフォルトの名無しさん :2007/11/01(木) 19:14:15
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): ニュートン法と二分法の両方を用いて、直線y=x+1/2と単位円x*x+y*y=1の交点のの近似解(小数点以下第6位まで)を求めよ。 1つのプログラムに書くこと。 二分法の初期値[a,b]=[-1,1] ニュートン法で用いる初期値は2つとも0とせよ。 ニュートン法も二分法もともに何回で収束したかがわかるようにすること。 関数へのポインタは必ず使うこと。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: Cのみ [4] 期限: 2007年11月2日17時 [5] その他の制限: 関数へのポインタを必ず使うこと。
745 :
デフォルトの名無しさん :2007/11/01(木) 19:26:13
y =f(x) = x + 1/2 z=x^2 + y^2 - 1 dz/dx = 2x + 2y y' = 2x + 2( x + 1/2) =4x + 1 F(x) = x - ( x^2 + f(x)^2 - 1 )/( 4x + 1 )とおく
746 :
デフォルトの名無しさん :2007/11/01(木) 19:34:39
ニュートン法 #include <stdio.h> double f(double x){return x+1/2;} double g(double x){return x*x+f(x)*f(x)-1;} double h(double x){return g(x)/(4*x+1);} main(){ double x=0; int i; for(i=0;i<100;i++)x=h(x); printf("%.6f",x); }
747 :
デフォルトの名無しさん :2007/11/01(木) 19:39:40
二分法 #include <stdio.h> double f(double x){return x+1/2;} double g(double x){return x*x+f(x)*f(x)-1;} main(){ double a=-1,b=1,x; int i; for(i=0;i<100;i++){ x=(a+b)/2; if(g(a)*g(x)>0)a=x; else b=x; } printf("%.6f",x); }
748 :
デフォルトの名無しさん :2007/11/01(木) 21:01:11
[1] 授業単元: C言語 [2] 問題文: 20行3列の2時限配列を用意する。 行は学生数に対応し、列は国語、英語、数学の3科目の試験結果に対応する。 乱数を発生させる関数rand()を利用して、全ての配列要素を0点から100点の範囲で 埋め、結果を表示するプログラムを作成せよ。ただし、右端には3科目合計点数を、 最下段には科目毎の平均点を出力せよ。 [3] 環境 OS: WindowsXP 言語: C [4] 期限: 11/2 am10:00 [5] その他の制限: 大体を下の実行結果に合わせて作るよう指示されています。 国語 英語 数学 合計 54 84 7 145 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 76 99 58 233 =============== 61.8 59.8 44.7 お願いしますm(_ _)m
749 :
748 :2007/11/01(木) 21:04:07
実行結果が酷いことになってすいませんorz それぞれ国語、英語、数学、合計の列に合わせてもらえると助かります^^;
750 :
デフォルトの名無しさん :2007/11/01(木) 21:09:36
[1] 授業単元: プログラミング演習(仮) [2] 問題文(含コード&リンク): *説明* n 個の町の間に、それらをつなぐ道路が m 本ある。 ここに新たに道路を建設し、どの道路が h 本破壊されても 町が相互に行き来できるようにしたい。 増設しなければならない道路の最低数を求めよ。 *入力* n m h u1 v1 u2 v2 ... um vm 1 行目の n, m, h は町の総数,現在の道路数,壊されてもよい道路数. 2 行目から 1+m 行目は道路の始点と終点(同じものがあるかもしれない). *出力* 増設しなければならない道路の最低数。 (例1) 3 3 1 1 2 2 3 3 1 このとき出力は 0。すでにどの 1 本が破壊されても大丈夫なので。 (例2) 3 3 2 1 2 2 3 3 1 このとき出力は 2 。たとえば 1-2, 2-3 間に道を増やせばよい。 [3] 環境: OS, コンパイラ,言語問わず. [4] 期限:11月8日 [5] その他の制限:とくになし
[1] 授業単元: c言語 [2] 問題文(含コード&リンク): ユーザが文字列を入力し、 半角英数字の入力(最大でも1000文字)を改行があるまで受け付ける。 次に、ユーザに検索する文字列(最大でも半角20文字)を入力させ、 はじめに入力された文字列内にあるかどうかを表示するプログラムを作成せよ。 配列の外部を参照しないように注意すること。 そのプログラム内で以下の関数を完成させよ。 int str_srch (char str [], char srch_str[]) : 文字列strの中に文字列srch_strが含まれていれば、1を返し、含まれていなければ0を返す関数とする。 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: VC++2005 [3.3] 言語: C [4] 期限:今日中 [5] その他の制限: 特になし よろしくお願いします。
[1] 授業単元:C言語 [2] 問題文(含コード&リンク):2つの日時をキーボードから入力し、 入力された2つの日時の差を求めるプログラムを作成し、実行させなさい (日時の入力は、○○年△△月××日とし、2つの日時の差も同様に表記すること) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限: 今日中 [5] その他の制限:うるう年は無視して良いようです お願いします
>>748 #include<stdio.h>
#include<time.h>
main()
{
int i,j,s[20][3];
int sum[20];
float ave[3]={0.0,0.0,0.0};
srand((unsigned int)time(NULL));
for(i=0;i<20;i++){
sum[i]=0;
for(j=0;j<3;j++){
s[i][j]=rand()%100+1;
sum[i]+=s[i][j];
ave[j]+=s[i][j];
}
}
printf("国語 英語 数学 合計\n");
for(i=0;i<20;i++)
printf("%4d %4d %4d %4d\n",s[i][0],s[i][1],s[i][2],sum[i]);
printf("===================\n");
printf("%2.1f %2.1f %2.1f\n",ave[0]/20.0,ave[1]/20.0,ave[2]/20.0);
}
>>751 #include <stdio.h>
#include <string.h>
#define MAXLINE 1000
#dwfine MAXSRCH 20
int str_srch(char str[],char srch_str[])
{
int i,j,k;
for(i=0;i<=strlen(str);i++){
for(j=i,k=0;str[j]==srch_str[k];j++,k++);
if(srch_str[k]=='\0') return 1;
else if(str[j]=='\0') return 0;
}
return 0;
}
main()
{
int i;
char line[MAXLINE],kline[MAXSRCH];
printf("文字列入力 : ");
fgets(line,MAXLINE-1,stdin);
for(i=0;line[i]!='\n';i++); line[i]='\0';
printf("検索する文字列入力 : ");
fgets(kline,MAXSRCH-1,stdin);
for(i=0;kline[i]!='\n';i++); kline[i]='\0';
if(str_srch(line,kline))
printf("line中に %s は存在する\n",kline);
else
printf("文字列中に %s は存在しない\n",kline);
}
>>754 後から書き加えた部分でtypoしてたorz
#dwfineじゃなくて#defineです。
>>754 ありがとうございます。
助かりました。
[1] 授業単元: C言語 [2] 問題文:2行3列の行列と3行2列の行列の積を求めるプログラムを製作せよ [3] 環境 OS: WindowsXP 言語: C よろしくお願いします。 [4] 期限: 11/2 am10:00 [5] その他の制限:
このスレ見れば行列の積の解法のってるのに。
>>759 #include<stdio.h>
#include<string.h>
struct gstudent {
char name[20]; /*氏名*/
int height; /*身長*/
float weight; /*体重*/
long schols; /*奨学金*/
};
struct gstudent set_gstudent(char name[],int height,float weight,long schols)
{
struct gstudent a;
strcpy(a.name,name);
a.height = height;
a.weight = weight;
a.schols = schols;
return a;
}
void show_gstudent(struct gstudent *gs)
{
printf("%s %d %.1f %ld\n",gs->name,gs->height,gs->weight,gs->schols);
}
main()
{
struct gstudent s;
s=set_gstudent("Mike",165,72.0,70000);
show_gstudent(&s);
}
>>759 A
main()
{
int i,max;
struct gstudent s[3];
s[0]=set_gstudent("Mike",165,72.0,70000);
s[1]=set_gstudent("Bob",185,82.0,30000);
s[2]=set_gstudent("Michel",145,42.0,80000);
for(i=0;i<3;i++)
show_gstudent(&s[i]);
putchar('\n');
for(i=0,max=i;i<3;i++)
if(s[max].height<s[i].height)
max = i;
show_gstudent(&s[max]);
}
>>762 のmainと差し替える。
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 下に書きます [3] 環境 OS: Linux 言語: C [4] 期限: 明日まで [5] その他の制限: 特になし
765 :
764 :2007/11/01(木) 23:23:51
>>764 の問題文
ある都市のタクシー料金は次のようになっている
2kmまで・・・・380円
3kmまで・・・・550円
5kmまで・・・・870円
8kmまで・・・・1300円
以後、2km増やすごとに200円増
距離を実数でキーボードから読み込み、料金を表示するプログラムを作成し、実行させなさい
ただし、0または負の数が入力されたときに処理を終了することとし、繰り返し料金を計算する
プログラムとすること
if でbreakさせれば余裕じゃねーか
お願いしますよ・・・・
768 :
716 :2007/11/01(木) 23:30:51
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):次のような情報から構成される学生の情報を5人分入力し、 出力するプログラムを作成せよ。入力した情報は構造体を使って格納する事。 所属学科、学年、学生番号、氏名、 ※例 所属学科を入力して下さい。 看護情報科 学年を入力して下さい。 1 学生番号を入力してください。 032319 氏名を入力して下さい。 中村紀洋 所属学科 看護情報科 看護情報科 看護情報科 [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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
>>769 途中で送信を押してしまいました。
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):次のような情報から構成される学生の情報を5人分入力し、
出力するプログラムを作成せよ。入力した情報は構造体を使って格納する事。
所属学科、学年、学生番号、氏名、
※例
所属学科を入力して下さい。 看護情報科
学年を入力して下さい。 1
学生番号を入力してください。 032319
氏名を入力して下さい。 中村紀洋
所属学科 学年 学生番号 氏名
看護情報科 1 032319 中村紀洋
看護情報科 2 032424 鶴岡慎也
看護情報科 3 062422 戸叶尚
[3] 環境
[3.1] OS:Windows
[3.3] 言語:C
[4] 期限: 2007年11月02日00:30迄
[5] その他の制限:
宜しくお願いします。
>>764 #include <stdio.h>
int main(void)
{
while(1)
{
float kyori;
int ryokin;
printf("距離?"); scanf("%f", &kyori);
if(kyori <= 0.0) return;
if(kyori >= 8.0) for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200;
if(kyori <= 5.0) ryokin = 870;
if(kyori <= 3.0) ryokin = 550;
if(kyori <= 2.0) ryokin = 380;
printf("料金 : %d\n", ryokin);
}
}
>>771 訂正
> if(kyori >= 8.0) for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200;
for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200;
四則演算子とか習ってないだろうけど平気なのか
よく見たら平気じゃなかったです if(kyori <= 0.0) return; if(kyori >= 8.0) for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200; ここの部分が良くわかりませんでした・・・
>>770 #include <stdio.h>
int main(void)
{
#define MAX 5
struct {
char gakka[13];
char gakunen;
char bango[7];
char namae[21];
}seigaku[MAX];
{//入力部
int i;
for(i=0; i!=MAX; i++){
printf("所属学科を入力して下さい。"); scanf("%s", seigaku[i].gakka);
printf("学年を入力して下さい。"); scanf("%d", &(seigaku[i].gakunen));
printf("学生番号を入力して下さい。"); scanf("%s", seigaku[i].bango);
printf("氏名を入力して下さい。"); scanf("%s", seigaku[i].namae);}
}
{//出力部
int i;
printf("所属学科 学年 学生番号 氏名\n");
for(i=0; i!=MAX; i++)
printf("%-12s%-6d%8s %s\n", seigaku[i].gakka, seigaku[i].gakunen, seigaku[i].bango, seigaku[i].namae);
}
return 0;
}
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
>>770 のプログラムの入力学生数を最大50人までとし、50人以下の任意の人数で入力を止める事が出来るプログラム
を作成せよ。(例:10人分を入力した時点で入力を停止して、入力した10人分の情報を表示する。)
[3] 環境
[3.1] OS:Windows
[3.3] 言語:C
[4] 期限: 2007年11月02日12:30迄
[5] その他の制限:
改めて宜しくお願いします。
すいません、打ち忘れてました。 よろしくお願いします。
何度もすいません
>>771 >>772 のプログラミングリストでfloatの型を使わず表すことはできるでしょうか?
785 :
デフォルトの名無しさん :2007/11/02(金) 02:21:07
[1] 授業単元:プログラミング演習U [2] 問題文(含コード&リンク):フラクタル図形であるシルピンスキーのギャスケットは、 三角形の各辺の中・を結んで三角形の中に三角形を繰り返し作成したものである。 再帰呼び出しを使って、同じ手順で三角形の中に小さな三角形を描くプログラムを 作成しなさい。 以下の処理を指定回数だけ繰り返します。 @初期三角形を描く。 A三角形の各辺の中点を結んだ三角形を描く。全体の1/4の大きさの三角形が 4個できる。 Bその中にさらに三角形を描く。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年11月03日17:00まで [5] その他の制限:特になし 宜しくお願いしますm(__)m
>>784 #include <stdio.h>
int main(void)
{
double distance;
int fare;
while(1){
scanf("%lf", &distance);
if(distance <= 0)
break;
if(distance <= 2.0)
fare = 380;
else if(distance <= 3.0)
fare = 550;
else if(distance <= 5.0)
fare = 870;
else if(distance <= 8.0)
fare = 1300;
else
fare = 1300 + ((int)((distance - 8.0)/2.0))*200;
printf("%d\n", fare);
}
return 0;
}
○○年△△月××日 --> ○○*365 + (△△ -1)×各月の日数 + ××
>>785 描画ライブラリの指定がないから、頂点を出力するものにした。 3^Nは無理あるな。
#include <stdio.h>
typedef struct{ double x, y;}point;
point middle_point(point p1, point p2){
point ret;
ret.x = (p1.x + p2.x)/2;
ret.y = (p1.y + p2.y)/2;
return ret;
}
void gasket(point p1, point p2, point p3, int n){
if(n > 0){
gasket(p1, middle_point(p1, p2), middle_point(p1, p3), n - 1);
gasket(middle_point(p2, p1), p2, middle_point(p2, p3), n - 1);
gasket(middle_point(p3, p1), middle_point(p3, p2), p3, n - 1);
}else{
printf("p1(%g, %g)\tp2(%g, %g)\tp3(%g, %g)\n", p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);
}
}
int main(void){
point p[3];
int i, n;
printf("input three point\n");
for(i = 0; i < 3; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
printf("input n\n");
scanf("%d", &n);
gasket(p[0], p[1], p[2], n);
return 0;
}
三角形は4つ
791 :
デフォルトの名無しさん :2007/11/02(金) 04:05:58
>>784 オメーが実数で頼むって言ってるからfloatでやってるんだろうがwww
float → double
scanf("%f", &kyori); → scanf("%lf", &kyori);
でおk。
doubleもダメなら知らん。
793 :
デフォルトの名無しさん :2007/11/02(金) 08:49:06
>>728 #define EPS 1e-8
/* using Stern-Brocot Tree */
void solve(double x, int *p_, int *q_) {
int pl = 0, ql = 1, pr = 1, qr = 0, pm, qm;
while ( 1 ) {
/* { [x-e, x+e] \subset [pl/ql, pr/qr] } */
pm = pl + pr;
qm = ql + qr;
if ((x + EPS) * qm < pm) {
pr = pm;
qr = qm;
} else if ((x - EPS) * qm > pm) {
pl = pm;
ql = qm;
} else {
*p_ = pm;
*q_ = qm;
return;
}
}
}
int main() {
int p, q;
double x;
scanf("%lf", &x);
solve(x, &p, &q);
printf("%d / %d\n", p, q);
}
794 :
デフォルトの名無しさん :2007/11/02(金) 09:11:36
>>752 出力形式が意味不明だな。単なる日数に年月を割り当てる方法がわからん。
1月1日と2月1日の差は 1月?それとも 31日?
2月1日と3月1日の差は 1月?それとも 28日?
1月31日と2月1日の差は 1月?それとも 1日?
>>728 #include <stdio.h>
#define EPS 1e-8
typedef struct mn{ int m, n; }mn_t;
void farey(double x, mn_t *left, mn_t *right){
mn_t check;
check.m=left->m+right->m;
check.n=left->n+right->n;
if((x-EPS)*check.n>check.m){
*left=check;
farey(x, left, right);
}else if((x+EPS)*check.n<check.m){
*right=check;
farey(x, left, right);
}else{
*right=*left=check;
}
}
int main1(int argc, char *argv[]) {
mn_t left={0,1}, right={1,1};
double x=1.41421356, y;
if(argc==2) sscanf(argv[1], "%lf", &x);
y=x-floor(x);
farey(y, &left, &right);
printf("m=%d n=%d\n", (int)(left.m+floor(x)*left.n), left.n);
return 0;
}
796 :
デフォルトの名無しさん :2007/11/02(金) 09:57:21
いま残ってるのはどれだい?
799 :
デフォルトの名無しさん :2007/11/02(金) 11:26:37
>>796 734で質問した者です。
まだ未解決なのでお願いしますm(__)m
>>798 アルファベットと呼ばれる文字でできたものです
情報系の用語としてはoperating systemと略されてるようです
802 :
デフォルトの名無しさん :2007/11/02(金) 11:37:50
キーボードから n と r とを入力し、その組み合わせの数 nCr を出力するプログラムを作る これについて教えてください OSはMAC OS X です
急ですみませんが・・・ [1] 授業単元:C++ [2] 問題文(含コード&リンク):異なる80bitの素数を2つ発生させる [3] 環境 [3.1] OS:win xp [3.2] Microsoft Visual Studio .NET 2003 [3.3] 言語:c++ [4] 期限:2007年11月3日10:30まで [5] その他の制限: 出力は10進数ですること よろしくお願いします
>>805 すまん、mainの二つ目の座標が(0, 0.942809, -0.33333)だったぽい
なおしてくれ。
807 :
デフォルトの名無しさん :2007/11/02(金) 13:33:59
>>807 ・それぞれの種類の機械は何台ずつあるのか。
・問題文の中であなたが注釈を加えた部分はどこか。
各機械が一台ずつしかないとすると表示例はおかしいと思うのだが。
809 :
デフォルトの名無しさん :2007/11/02(金) 14:19:11
>>808 >それぞれの種類の機械は何台ずつあるのか。
各機械は一台ずつです。
>各機械が一台ずつしかないとすると表示例はおかしいと思うのだが
5製品を同時に作り始めた場合は、おかしいことになりますが、今回はそれぞれの製品を
一製品ずつ作った場合でよいと先生が口頭で言っていたのを書き忘れました。
すいません。
つまり、各製品が常に自由に機械を使えるということです。
>問題文の中であなたが注釈を加えた部分はどこか。
つまり、10日間、各製品の加工時間の和が各製品出ることになります。
製品1なら3+1+5+2+7=20時間なので一日後
製品4なら10+5+7+3+2=27時間なので二日後になります。
よろしくお願いします。
>>809 機械の割り当てに関しては了解。
ただやっぱり表示例は疑問。
あれを10日分ループするのは無駄が多すぎる。
単純に計算すると製品1は18時間、製品2には14時間がかかるが、
機械は一台ずつしかなく同時に使えないため、機械の割り当てを考える必要がある。
> 今回は一製品ずつ作った場合でよい
とのことなので順番に製作すると、
製品2の製作は18時間後から開始されるので、完成は32時間後になる。
したがって表示例は
製品1: 18時間後 (=1日後)
製品2: 32時間後 (=2日後)
...
となるようにすればよい。
問題文の前半を読むとこう解釈できるんだがいかがだろうか。
俺の考えすぎならすまん。
811 :
デフォルトの名無しさん :2007/11/02(金) 15:04:37
>>810 各製品が常に自由に機械を使えるので、順番に作る場合ではなくて、機械が使用されてないと仮定して、
今から作ると何日後に完成するかを出せればいいので、10日分ループするのは無駄なんですけど、10回同じものを
表示するプログラムをお願いします。
よろしくお願いします。
812 :
デフォルトの名無しさん :2007/11/02(金) 15:15:12
>>805 ありがとうございます!!
ほんと助かりました!
814 :
デフォルトの名無しさん :2007/11/02(金) 16:21:43
815 :
デフォルトの名無しさん :2007/11/02(金) 17:38:30
>>805 頂点座標は出力されるのですが、三角形の接続情報を出力するにはどうしたら
いいですか?VRMLで描画させなければならないので。
お願いします。
>>816 「ポインタを使わない」というのは、具体的には何を指すの?
gets()などの関数を使う以上、ポインタを使わずにはできないのだけれど。
>>815 VRMLよく知らんのだけど、頂点リストと面リスト用意して、面は3つの頂点番号で指定するってパターン?
>>805 のやつは隣の面と頂点を共有するようにはしてないから、
同一位置にある頂点を別々のものとして定義するんじゃダメ?
それでいいなら、n番目の面は、3*n, 3*n+1, 3*n+2番目の頂点から構成されるってことになる。
すまん…誤爆った…
/.: : : : : : : .ヽ
R: : : :. : pq: :i} メッ!!
|:.i} : : : :_{: :.レ′
ノr┴-<」: :j|
/:r仁ニ= ノ:.ノ|! _
/:/ = /: :/ }! |〕) ガッ!!
{;ハ__,イ: :f | /´
/ }rヘ ├--r─y/
/ r'‐-| ├-┴〆 _, 、_ '⌒ ☆
仁二ニ_‐-イ | | ∩`Д´)
>>820 | l i 厂  ̄ニニ¬ ノ ⊂ノ
,ゝ、 \ \ __厂`ヽ (__ ̄) )
/ /\_i⌒ト、_ ノrr- } し'し′
└-' ̄. | |_二二._」」__ノ
つーか805のって正三角形になるの真ん中だけじゃね?
>>820 の画像のぱんつを脱がせるプログラムを作ってください。
>>823 正三角形に分割とは書いてなかったから、
>>741 の正20面体のアルゴリズムを
そのままつかってみた
>>818 リンク先の main をそのまんま使うのが思ったより難しかった
CHAR_MAX ギリギリまで使うのは大変
#include<ctype.h>
int get_word(char buf[], char word[][MAX_CHAR]){
int i, j, wordnum=0;
for(i=j=0;;i++){
if(isalpha(buf[i]) && j<MAX_CHAR){
word[wordnum][j++]=buf[i];
}else if(j){
if(j<MAX_CHAR)word[wordnum][j]='\0';
wordnum++;j=0;
}
if(!buf[i] || wordnum>=MAX_WORD) break;
}
return wordnum;
}
int strlng(char word[]){
return (strlen(word)>MAX_CHAR)?MAX_CHAR:strlen(word);
}
void print_word(int wordnum, char word[][MAX_CHAR]){
int i;
for(i=0;i<wordnum;i++) printf("%.*s: %d letters\n", MAX_CHAR, word[i], strlng(word[i]));
}
>>828 >>826 はポインタを使っているが、
一見そうは見えないだけ
gets の引数とか
strlen の引数とか
get_word print_word strlng の引数とか
printf の書式指定とか、書式指定 %s に対応する引数とか
いろいろ使ってる
831 :
デフォルトの名無しさん :2007/11/03(土) 01:13:30
課題1 変数xが12より大きく24未満ならば12を引いた数を表示、 0より小さいか24以上ならばOut of rangeを表示、 0以上12以下ならばそのまま表示するプログラムを作れ。 課題2 フィボナッチ数列の最初の10項を成分とするベクトルを作成せよ スレ違いなんですが「scilab」でおねがいできませんか?;; scilabの板が見つからなくってほとほと困りはててここに参りましたorz
>>831 分かってるとおりスレ違い。せめて雑談用などに行こうね。
>>831 scilabは全く知らないが、↓のマニュアル片手にやってみた。
ttp://www.ecl.sys.hiroshima-u.ac.jp/scilab/man.html 課題1
[x]=scanf('%d')
if x>12 & x<24 then
printf('%d\n', x-12)
elseif x<0 | x>=24
printf('Out of range\n')
else
printf('%d\n', x)
end
課題2
V=[1,1,2,3,5,8,13,21,34,55]
834 :
デフォルトの名無しさん :2007/11/03(土) 01:49:51
>>750 これどうやんの?少し考えてみたがわからんかったが
837 :
デフォルトの名無しさん :2007/11/03(土) 10:28:06
1] 授業単元: 情報処理 [2] 問題文(含コード&リンク): 2行2列の行列を入力し、その逆行列を表示させなさい。逆行列がない場合は「逆行列なし」 と表示させること。 実行結果(例) va[1][1]:1 va[1][2]:2 va[2][2]:3 va[2][2]:4 逆行列は -2.00 1.00 1.50 -0.50 [3] 環境 [3.1] OS: (Windows/Linux/等々) windows2000 [3.2] コンパイラ名とバージョン: C++Builder [3.3] 言語: C [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 来週の月曜 [5] その他の制限: 多次元配列までならいました。できるかぎり簡単な文でお願いします。
838 :
デフォルトの名無しさん :2007/11/03(土) 10:29:17
見づらいのでもう一度。。。 ] 授業単元: 情報処理 [2] 問題文(含コード&リンク): 2行2列の行列を入力し、その逆行列を表示させなさい。逆行列がない場合は「逆行列なし」 と表示させること。 実行結果(例) va[1][1]:1 va[1][2]:2 va[2][2]:3 va[2][2]:4 逆行列は -2.00 1.00 1.50 -0.50 [3] 環境 [3.1] OS: (Windows/Linux/等々) windows2000 [3.2] コンパイラ名とバージョン: C++Builder [3.3] 言語: C [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 来週の月曜 [5] その他の制限: 多次元配列までならいました。できるかぎり簡単な文でお願いします。
>>838 main() {
int i, j;
double A[2][2], B[2][2], D;
for (i = 0; i < 2; ++i) {
for (j = 0; j < 2; ++j) {
scanf("%lf", &A[i][j]);
}
}
D = A[0][0]*A[1][1]-A[0][1]*A[1][0];
if (D == 0) {
printf("no inverse\n");
} else {
B[0][0] = A[1][1]/D; B[0][1] = -A[0][1]/D;
B[1][0] = -A[1][0]/D; B[1][1] = A[0][0]/D;
for (i = 0; i < 2; ++i) {
for (j = 0; j < 2; ++j) {
printf("%.2lf ", B[i][j]);
}
printf("\n");
}
}
}
840 :
デフォルトの名無しさん :2007/11/03(土) 11:40:30
どんどん付け加えられているなら テンプレにそって新たに質問したら? 横着するのはイクナイ
付け加えられるたびにここに丸投げか。おめでたいな。
843 :
デフォルトの名無しさん :2007/11/03(土) 13:16:55
今週末は宿題少ないのかね
845 :
デフォルトの名無しさん :2007/11/03(土) 16:37:55
[1] 授業単元:C言語 [2] 問題文:ルンゲ・クッタ法を用い、dy/dx=(3x-5y-4)/5 の常微分方程式を解きなさい。 また、その結果をExcelファイルに出力しなさい。諸条件は以下のようにする。 初期値 (x,y)=(0,0) きざみ幅 Δh=0.3 積分区間 [a,b]=[0,3] [3] 環境 [3.1] OS: Windows [3.3] 言語: C [4] 期限: 2007年11月5日まで [5] その他の制限: CSVファイル出力可 お願いします。
846 :
デフォルトの名無しさん :2007/11/03(土) 17:06:17
>>750 のようなグラフ問題は相当難しいぞ オレにとっては。
巡回セールスマンとかハミルトン経路とかの問題ですら(オレにとっては)難しいというのに。
>>750 町A・町B・町Cとあって、町Bから町Aと町Cに1本ずつ道があった場合
町Aと町Cは繋がっているものと考えてよいか?
>>750 円周上にn個の点があり、それらの点がm本の辺で繋がっており、閉路をなしている。
上記のグラフからh本の辺を取り除いたところ、独立してしまう点、あるいは分断された複数の閉路が出来た。
再び閉路を形成するには、何本の辺をどの頂点間に追加すればよいか。
……立派に離散数学の範疇だな
>>845 #include <stdio.h>
double f(double x,double y)
{
return (3.0*x-5.0*y-4.0)/5.0;
}
main()
{
double a=0.0,b=3.0,x=0.0,y=0.0,dh=0.3,i;
double k1,k2,k3,k4;
FILE *fp;
if((fp=fopen("runge.csv","w"))==NULL){
printf("file can't open.\n");
return;
}
for(i=a;i<=b;i+=dh){
k1=f(x,y)*dh;
k2=f(x+dh/2.0,y+k1/2.0)*dh;
k3=f(x+dh/2.0,y+k2/2.0)*dh;
k4=f(x+dh,y+k3)*dh;
fprintf(fp,"%lf,%lf\n",x,y);
x+=dh;
y+=(k1+k2*2.0+k3*2.0+k4)/6.0;
}
fclose(fp);
}
精度の指定が無いので通常(小数点以下第6位)の精度で出力してます。
ファイル名は適当に書き換えてください。
>>845 4次のルンゲ・クッタ
#include <stdio.h>
#define FUNC(x, y) ((3*(x) - 5*(y) - 4)/5)
int main(int argc, char *argv[]){
FILE *fp;
double s1, s2, s3, s4;
double x, y, h;
double a, b;
int i, n;
if(argc < 2) return fprintf(stderr, "usage : %s filename\n", argv[0]), 1;
fp = fopen(argv[1], "w");
/* 初期値 */
x = 0, y = 0, h = 0.3;
fprintf(fp, "%g %g\n", x, y);
/* 積分区間 */
a = 0, b = 3;
n = (b - a)/h;
for(i = 0; i < n; i++){
s1 = FUNC(x, y);
s2 = FUNC(x + h/2, y + s1*h/2);
s3 = FUNC(x + h/2, y + s2*h/2);
s4 = FUNC(x + h, y + s3*h);
y = y + (s1 + 2*s2 + 2*s3 + s4)*h/6;
x += h;
fprintf(fp, "%g %g\n", x, y);
}
return 0;
}
853 :
デフォルトの名無しさん :2007/11/03(土) 18:54:55
>>750 完全グラフごとに分割せよ
各町が道路をn個持てばn完全グラフの可能性がある
n完全グラフはn-1まで道路がこわせれても平気
例えば、4つまで壊して良いなら、5完全グラフは一つの町であるとして良い
854 :
デフォルトの名無しさん :2007/11/03(土) 18:56:20
間違え n完全グラフはn-2まで道路がこわせれても平気
855 :
デフォルトの名無しさん :2007/11/03(土) 19:05:16
例えば3つまで壊して良いならば、5以上の完全グラフは一点に縮める すると、残ったのは4以下の完全グラフである ひとつ道路を作れば5完全グラフに出来るなら道路数をカウントしてそれを一点に縮める もっとも少ない道路で5完全グラフになるものを見つけて道路数をカウントしてそれを一点に縮める 最後にひとつ町しか無くなればひつような道路数が求まる
856 :
853 :2007/11/03(土) 19:09:11
間違えた
コーディングじゃなくてアルゴリズムの問題となると まったく手がでらん・・・
858 :
853 :2007/11/03(土) 20:09:45
たとえば、5本消して良い場合、各町からは最低道路が6つ必要である もっとも道路が少なくなるように設置すれば良いはずだ たとえば3点あって道路がひとつもなく、5本消して良い場合は、最大18本必要になるが お互いをつなぐようにすれば9本で済む もともと道路が設置してある場合でも、うまくつなげば出来るはず たとえば100本ひつようとなったら50個道路を作り、101個なら51個で良いはずだ(証明はわからない)
859 :
デフォルトの名無しさん :2007/11/03(土) 20:15:40
たとえば
>>750 の例2でいうと、各頂点から2本出ているから、2本消して良いようにすると
各頂点から1つ道路を増やせばよいが、そのうち1つはお互いに繋がるようにすれば道路は2つで済む
860 :
858 :2007/11/03(土) 20:29:15
どうやら
>>858 では駄目みたいだ
4完全グラフが2つあって1つの頂点同士で繋がっているとすると
各頂点から3つ以上道路が出ているから2つ消しても良いはずだが、この場合上のひとつの道路を壊せば分断されてしまう
辺連結度増大問題でぐぐれ
862 :
858 :2007/11/03(土) 20:50:03
863 :
できるかな? :2007/11/03(土) 21:47:33
Solaris10を超えるOSを作成しろ
865 :
845 :2007/11/03(土) 23:29:44
866 :
デフォルトの名無しさん :2007/11/04(日) 00:29:41
867 :
デフォルトの名無しさん :2007/11/04(日) 00:35:20
868 :
866 :2007/11/04(日) 01:28:55
11月4日午前1時30分まで →11月5日午後11時までに変更
C言語の1から7くらいまで教えてください
>>869 #include <stdio.h>
#define N 7
int generate(int n){return n>=N?-1:n+1;}
void createarray(int *array){
int num = 1;
*array++ = num;
while((num = generate(num)) != -1) *array++ = num;*array = -1;
}
void str(char *buf, const int *array){
while((*buf++ = *array++ + '0') != -1);*--buf = '\0';
}
void tell(){
int ar[128];char buf[128];
createarray(ar);str(buf,ar);
puts(buf);
}
int main(){
tell();
return 0;
}
>>870 日本語でおk
っていうかC言語ってなんだよ。俺らの使ってる言語に合わせてよ^^;
>>872 すまん、適当に作ったもんで
#include <stdio.h>
#define N 7
int generate(int n){return n>=N?-1:n+1;}
void createarray(int *array){
*array = 1;
while((*(array+1) = generate(*array)) != -1 && ++array);
}
void str(char *buf, const int *array){while((*buf++ = *array++ + '0') != '0'-1 || (*--buf = '\0'));}
void tell(){
int ar[128];char buf[128];
createarray(ar);str(buf,ar);
puts(buf);
}
int main(){
tell();
return 0;
}
引っ張るほどのネタでもない
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 21 22 23 24 25 20 07 08 09 10 19 06 01 02 11 18 05 04 03 12 17 16 15 14 13 のように数字を順番に反時計回りに書いていくことを考える。 10^9 以下の自然数 k が与えられたとき、k を中心とする 9 マスを表示せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: 今日中 [5] その他の制限: とくにありません。 よろしくおねがいします
時計回りな件について
878 :
876 :2007/11/04(日) 14:35:04
まちがえました!!すみません。時計回りでお願いします。
>>866 ,873
(1)
int main(void){
int i,ch;
int cnt[10] = {0}; /* 数字文字の出現回数 */
do{
ch = getchar();
if(ch >= '0' && ch <= '9') cnt[ch - '0']++;
}while(ch != EOF); /* 無闇に無限ループ化しない方が無難 */
puts("数字文字の出現回数");
for(i = 0;i < 10;i++){
printf("\'%d\' : ",i); /* 文字列内の『'』は『\'』 */
for(ch = cnt[i];ch > 0;ch--) printf("*"); /* 新たにjを使わずchでもよいかと */
putchar('\n');
}
return(0);
}
(2)
unsigned set(unsigned x,int pos){ return (x & (0x1U << pos)); }
unsigned reset(unsigned x,int pos){ return (x | ~((unsigned)0x1U << pos)); }
unsigned inverse(unsigned x,int pos){ return (x ^ (0x1U << pos)); }
/* unsigned reset(unsigned x,int pos){ return (x | 0xFFFFFFFFUL ^ (0x1U << pos)); } */
変数の使いまわしは避けるべき
returnに()は冗長
883 :
879 :2007/11/04(日) 15:22:20
>>880 さよか。メモリ少ない頃に学んだもんでつい。
>>881 元のがreturn()だったんで一応と思ったんだが、たしかに。
>>882 ああ、ホントだ……。
色々スマン。駄目な見本とでもしてくれorz
884 :
879 :2007/11/04(日) 15:26:50
ああ、違う。return()は元じゃなくて先のmain()のがそうだったんで、勘違いした。元のは普通にreturnのみだった。ゴメン、半年ROMってくる
遥か過去、retrun (0)と書いてコンパイルに通らなかったことがあってな、 そのエラーが物凄く見つけづらかったらしくてな、 そこから「returnの値は括弧で囲むな」という(古い)格言が生まれた 〜C言語を256倍使うための本 ASCII〜
>〜C言語を256倍使うための本 ASCII〜 懐かしいw 黄色本だよね。
年がばれるが確かにあの黄色くて安っぽい本は懐かしい
っていうか、括弧で囲むだけでエラー出るとかどういう理屈なのかゆとりだから分かんない。
889 :
744 :2007/11/04(日) 22:04:31
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): ニュートン法と二分法の両方を用いて、直線y=x+1/2と単位円x*x+y*y=1の交点のの近似解(小数点以下第6位まで)を求めよ。 1つのプログラムに書くこと。 二分法の初期値[a,b]=[-1,1] ニュートン法で用いる初期値は2つとも0とせよ。 ニュートン法も二分法もともに何回で収束したかがわかるようにすること。 関数へのポインタは必ず使うこと。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: Cのみ [4] 期限: 2007年11月2日17時 [5] その他の制限: 関数へのポインタを必ず使うこと。 前と同じ書き込みです。745-747見てもいまいちできません。 よろしくお願いします。
890 :
866 :2007/11/04(日) 22:30:45
>>873 ,879
873と879の作ったプログラムは間違いって事ですか?
>>888 ある文が関数呼び出しかどうかの判断は括弧を見て行うのだが、
return は関数ではないため、括弧を見つけて関数と誤解釈してこける。
return (1+1)*2;
893 :
デフォルトの名無しさん :2007/11/04(日) 23:58:37
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
894 :
デフォルトの名無しさん :2007/11/04(日) 23:59:18
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
895 :
デフォルトの名無しさん :2007/11/04(日) 23:59:51
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
>>893 話はわかった。つまりこうだな?
void main(){while(1);}
897 :
デフォルトの名無しさん :2007/11/05(月) 00:07:34
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
898 :
デフォルトの名無しさん :2007/11/05(月) 00:08:38
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
899 :
デフォルトの名無しさん :2007/11/05(月) 00:10:43
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
900 :
デフォルトの名無しさん :2007/11/05(月) 00:11:14
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
>>770 のプログラムの入力学生数を最大50人までとし、50人以下の任意の人数で入力を止める事が出来るプログラム
を作成せよ。(例:10人分を入力した時点で入力を停止して、入力した10人分の情報を表示する。)
[3] 環境
[3.1] OS:Windows
[3.3] 言語:C
[4] 期限: 2007年11月05日01:00迄
[5] その他の制限:
改めて宜しくお願いします。
902 :
デフォルトの名無しさん :2007/11/05(月) 00:28:18
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
903 :
デフォルトの名無しさん :2007/11/05(月) 00:28:48
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
904 :
デフォルトの名無しさん :2007/11/05(月) 00:29:34
クソの集まり創価学会 偽善者が政治活動、公明党 キチガイ集団が政治活動、公明党 池田狂信ネズミ講が政治活動、公明党 騙されバカ信者、池田犬作チョン大教祖様、さっさと死ねや
>>876 多分、0を中心とした9×9を手計算で求めて配列の初期値にして、それにkの値を加えるという方法が妥当、ということに今気づいた。
#include <stdio.h>
#include <stdlib.h>
#define N 9
int main(void){
int k, l, m, n, o;
int mass[N*N] = {0}, *p;
scanf("%d", &k);
p = mass + (N - 1)/2 + (N - 1)/2*N;
for(l = 2, m = 0, n = 1, o = 0; o < N*N; o++){
*p = o + k;
if(m++ < l/2)
p += n;
else
p += n*N;
if(m == l)
l += 2, m = 0, n *= -1;
}
for(l = 0; l < N; l++){
for(m = 0; m < N; m++)
printf("%03d ", mass[l*N + m]);
printf("\n");
}
return 0;
}
>>907 やっぱ最初そういう風に考えるよなw
で、10の9乗の領域が確保できなくて……
>>907 だが、
>>906 を見て俺は、
問題文の意味を取り違えてる事に気がついた。 これは恥ずかしいw
911 :
デフォルトの名無しさん :2007/11/05(月) 04:54:40
右1 左5 下3 上7 変化するから配列使わなくても出来る nが与えられたとき上へ4つ進めると+28 そこから左へつ進めると+20 n+48 n+43 ・・・・ n+41 n+36 ・・・・ とすればよい
906も907も全く題意を理解してないと思うが。 例えばk=5を与えられたら、 19 06 01 18 05 04 17 16 15 の9マスを表示するんだろ。
コードで示してくれまいか?
>10^9 以下の自然数 k が与えられたとき、k を中心とする 9 マスを表示せよ。
916 :
デフォルトの名無しさん :2007/11/05(月) 05:14:14
9 マス×9 マスでは無いからな
コードはswitchだらけの糞コードになっちまったから恥ずかしくて晒せない。 かわりにレス番入れたときの結果をあげとく 1038 913 796 1037 912 795 1036 911 794
じゃなくて、kが与えられた時そこから新たに渦巻状の配列を作るのか、
それとも1から作った渦巻きの中で、kの周辺を取り出すのかってこと
そこらへんが
>>876 は明確じゃない
kから渦巻き作るのが問題になるかよw
920 :
デフォルトの名無しさん :2007/11/05(月) 05:23:12
1から作った渦巻きの周囲だな
だから全く理解してないって言ってるんだろ。
923 :
デフォルトの名無しさん :2007/11/05(月) 05:32:00
現在の進行方向と、のこりいくつ進んだら曲がるのか記録していき 与えられた数字で出たらなんとかすればいいのでは?
925 :
デフォルトの名無しさん :2007/11/05(月) 05:37:20
進む量は 1、1、2、2、3、3、4、4 となる。 1の位置を(0,0)として 右方向で進むなら0、下へ進むなら1、左へ進むなら2 を記録していれば求める位置にたどり着く
926 :
デフォルトの名無しさん :2007/11/05(月) 06:04:47
#include <iostream> using namespace std; void zahyomotomeru(int &su,int &x,int &y){ int dx,dy,n=0,muki=0; double nokori=1; x=y=0; while(1){ if(muki==0){dx =1;dy= 0;}if(muki==1){dx= 0;dy=-1;}if(muki==2){dx=-1;dy= 0;}if(muki==3){dx= 0;dy= 1;} for(int i=0;i<nokori;i++){ if(n==su)return ; x+=dx;y+=dy;n++;} if(muki==3)muki=0; else muki++; nokori+=0.5;}} int nummotomeru(int a,int b){ int x=0,y=0,dx,dy,n=0,muki=0; double nokori=1; while(1){ if(muki==0){dx =1;dy= 0;}if(muki==1){dx= 0;dy=-1;}if(muki==2){dx=-1;dy= 0;}if(muki==3){dx= 0;dy= 1;} for(int i=0;i<nokori;i++){ if(x==a && y==b)return n; x+=dx;y+=dy;n++;} if(muki==3)muki=0; else muki++; nokori+=0.5;}} main(){ int x,y;zahyomotomeru(912,x,y); cout<<nummotomeru(x-1,y+1)<<" "<<nummotomeru(x,y+1) <<" "<<nummotomeru(x+1,y+1)<<endl; cout<<nummotomeru(x-1,y )<<" "<<nummotomeru(x,y ) <<" "<<nummotomeru(x+1,y )<<endl; cout<<nummotomeru(x-1,y-1)<<" "<<nummotomeru(x,y-1) <<" "<<nummotomeru(x+1,y-1)<<endl; }
927 :
926 :2007/11/05(月) 06:06:51
924や917と数字は同じだが回転してるな
929 :
926 なおした :2007/11/05(月) 06:36:52
#include <iostream> using namespace std; void zahyomotomeru(int &su,int &x,int &y){ int dx,dy,n=1,muki=0; double nokori=1;x=y=0; while(1){ if(muki==0){dx =1;dy= 0;}if(muki==1){dx= 0;dy=-1;} if(muki==2){dx=-1;dy= 0;}if(muki==3){dx= 0;dy= 1;} for(int i=0;i<(int)nokori;i++){ if(n==su)return ;x+=dx;y+=dy;n++;}muki++; if(muki==4)muki=0;nokori+=0.5;}} int nummotomeru(int a,int b){ int x=0,y=0,dx,dy,n=1,muki=0; double nokori=1; while(1){ if(muki==0){dx =1;dy= 0;}if(muki==1){dx= 0;dy=-1;} if(muki==2){dx=-1;dy= 0;}if(muki==3){dx= 0;dy= 1;} for(int i=0;i<(int)nokori;i++){ if(x==a && y==b)return n;x+=dx;y+=dy;n++;} muki++;if(muki==4)muki=0;nokori+=0.5;}} main(){ int x,y;zahyomotomeru(912,x,y); cout<<nummotomeru(x-1,y+1)<<" "<<nummotomeru(x,y+1) <<" "<<nummotomeru(x+1,y+1)<<endl; cout<<nummotomeru(x-1,y )<<" "<<nummotomeru(x,y ) <<" "<<nummotomeru(x+1,y )<<endl; cout<<nummotomeru(x-1,y-1)<<" "<<nummotomeru(x,y-1) <<" "<<nummotomeru(x+1,y-1)<<endl; }
>>928 期限は12時と書いてあるけれど、11月6日のお昼の12時のこと?
933 :
デフォルトの名無しさん :2007/11/05(月) 09:13:11
質問です。 c++で素数を求めるプログラムなんですが、7=素数 というコードは書けるんですが 素数ではない数を8=2*4 9=3*3 10=2*5 とするにはどうしたらいいんでしょうか?
>>933 >>1 あと 8=2×4 って、8=2×2×2 としてはいけないということ?
935 :
デフォルトの名無しさん :2007/11/05(月) 09:25:08
937 :
デフォルトの名無しさん :2007/11/05(月) 09:27:46
√nまでの数で実際わってみろよ それだけだろが
938 :
デフォルトの名無しさん :2007/11/05(月) 09:32:19
#include <iostream> using namespace std; main(){ int n=87451202,i,q,r; for(i=2;i*i<=n;i++){ q=n/i; r=n-i*q; if(!r){cout<<i<<" * "<<q;return 0;} } cout<<"peinme";}
939 :
デフォルトの名無しさん :2007/11/05(月) 09:39:03
[1] プログラミング演習 [2] c++で 2=素数 3=素数 4=2*2 5=素数 6=2*3 7=素数 8=2*4 9=3*3 10=2*5 ... を50まで求め、画面に出力せよ [3] 環境 [3.1] OS:Linux [3.2] gcc [3.3] C++ [4] 期限: なし [5] その他の制限: 特になし
940 :
g :2007/11/05(月) 10:18:29
>>940 ・テンプレに沿って書いたほうがいい
・ソースにパスをかけるのは面倒くさい
結論:出直してきてください。
943 :
デフォルトの名無しさん :2007/11/05(月) 10:58:13
C言語の宿題です 整数をn個入力すると、入力した数値をソートして昇順に表示するプログラムを作成してください お願いします
>>939 #include<stdio.h>
#define MAX 50
int main(void){
int i,j;
for(i=2;i<=MAX;i++)
for(j=2;;j++)
if(i%j==0){
if(i>j)printf("%d = %d * %d\n",i,j,i/j);
else printf("%d = 素数\n",i);
break;
}
return 0;
}
945 :
デフォルトの名無しさん :2007/11/05(月) 12:19:15
>>944 本当に、ありがとうございました。
求めていたものどうりになっていました。
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): (1)キーボードから入力した任意の整数nを素因数分解して画面に表示。 (2)5つのさいころを振ってその合計が10になる確率を乱数を用いて求める。 (3)TRY&ERROR法(試行錯誤で探す)を用いて5.24x^2-3.60x-1.38=0の解を求める。 (4)5つの正の整数を引数として渡し、最大値を戻り値とする関数を使ったプログラムを求めよ。 (5)3^x=7を満たす実数をTRY&ERROR法(試行錯誤で探す)を用いて求める。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: Visual Studio.NET2003 [3.3] 言語: C [4] 期限:11/6の12時 [5] その他の制限:(3)の精度は小数点以下4桁まで。(5)の精度は小数点以下5桁まで。 どうかお願いします
>>946 (1)
#include <stdio.h>
int main(void)
{
int i, n;
scanf("%d", &n);
printf("%d = ", n);
for(i=2; i<n; ) {
if(n%i==0) {
printf("%d * ", i);
n /= i;
}
else i++;
}
printf("%d\n", n);
return 0;
}
(2) #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 int main(void) { int i, j, cnt, sum; srand(time(NULL)); for(i=0, cnt=0; i<N; i++) { for(j=0, sum=0; j<5; j++) sum += (int)(rand() / (RAND_MAX + 1.0) * 6 + 1); if(sum==10) cnt++; } printf("%.2f%%\n", cnt * 100.0 / N); return 0; }
949 :
デフォルトの名無しさん :2007/11/05(月) 14:52:16
[1] 授業単元: プログラミング [2] 問題文:整数nで入力後"factorial"という関数を呼び出して、n!を求めるプログラム。 結果はmainにて表示 定義例:int factorial( int num ) [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: C [4] 期限: 今日中にお願いします [5] その他の制限: 特にないです よろしくお願いします
>>946 (4)
#include<stdio.h>
int max(int *n){
int i,j=0;
for(i=1;i<5;i++)
if(n[j]<n[i]) j=i;
return n[j];
}
int main(void){
int i,n[5];
for(i=0;i<5;i++){
printf("n[%d]=",i);
scanf("%d",&n[i]);
}
printf("max = %d\n",max(n));
return 0;
}
952 :
949 :2007/11/05(月) 14:55:41
同業者がいたようですね。 指摘ありがとうございます。
>>946 D
#include<stdio.h>
#include<math.h>
int main(void){
double x;
for(x=0;pow(3,x)<7;x+=0.00001);
printf("%.5lf < x <= %.5lf\n",x-0.00001,x);
return 0;
}
[1] 授業単元: [2] 問題文: 正四面体があるとする。底面(ある一つの面)に平行な(n-1)枚の面で高さをn等分することを考える。この作業を他の面に平行な面でも行う(他の方向にもn等分する)場合、正四面体は全部で何個に分けられるか。 nの入力に対してその個数を求めるプログラムを作成せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: どちらでも可 [4] 期限:11月7日AM10:00 [5] その他の制限: 基本的なことは大体習いました。 よろしくお願いします。
nの三乗じゃないの?
957 :
デフォルトの名無しさん :2007/11/05(月) 16:58:00
配列の入力の時に,EOFだと-1入力で終了になりますよね? 改行で入力終了にしたいのですが,どうすればいいですか? 1 1 0 0 1 0 1 1 改行 で入力を終了したいです。 教えてください。よろしくお願いします。 //---- 配列入力 num = 0; do { scanf("%d", &arr[num]); } while ( arr[num++] != EOF ); // 改行は入力の終了 num--; // 有効な入力数
>>957 scanf()は改行で入力を終了するのに適しない。
fgets()とsscanf()を組み合わせろ。
961 :
デフォルトの名無しさん :2007/11/05(月) 17:59:43
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):Q-learningを用いて電力の需要家と供給家が最適な入札を選択するプログラムを作りなさい。 [3] 環境 [3.1] os: windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限:11月7日 12時 [5] その他の制限:
>>955 >>956 の言うとおり、
まず、一辺がaの正三角形四枚からなる正四面体の体積は V0 = (sqrt(2) * a^3) / 12 。
ここでn = 2 とすると、分割後の一つの小正四面体の体積は V2 = (sqrt(2) * a^3) / 96 。
V0 : V1 = 8 : 1
他の場合も同様にしてnの三乗
[1]授業単元:経路選択アルゴリズム [2]問題文:任意の2ノード間の最短路と最短最大路を求めるアルゴリズムを実行するプログラムをC,C++いずれかの言語で作成せよ [3]環境: [3.1]os:windows [3.2]コンパイラ名とバージョン:gcc [3.3]言語:C,C++ [4]期限:11月8日 午前9時 [5]その他の制限: 最短路:各リンクeに非負の重み L(e)が与えられている時、あるノードsからノードdへの経路に含まれるリンクについてこの重みの総和ととったものを経路の距離と言う ノードsからノードdへの最短路とは、ノードsからdへの経路のうちで最小のものを言う。 最大路:各リンクeに非負の重みB(e)が与えられている時、あるノードsからノードdへの経路に含まれるリンクのうち、この重みが最小であるものをボトルネックと言う。 最大路とはこのノードsからノードdへの経路のうちでボトルネックの持つ重みが最大のもののことである
>>955 main(){
int n;
printf("n=");
scanf("%d",&n);
printf("%d\n",n*n*n);
}
965 :
デフォルトの名無しさん :2007/11/05(月) 19:14:08
>>963 頂点(a,b)ごとにL(a,b) bpsが与えられているとして
もと、頂点0からN+1 (N+1が最後の番号とする) へ移動するなら、
頂点の経由数K=0,1,2・・・ごとに1からNの頂点を挿入する
この個数は、P(K,N)個ある 重複なるえらんだ順列
966 :
デフォルトの名無しさん :2007/11/05(月) 19:35:08
訂正 頂点(a,b)ごとにB(a,b) bpsが与えられているとして L(a,b) = 1/B(a,b)とする 通信速度が0ならばそこの負荷は無限大 通信不可能
>>963 最大路の定義は明確だが、
最短最大路の定義が不明瞭。
969 :
デフォルトの名無しさん :2007/11/05(月) 20:32:45
そういえば次は99代目だ
>>969 はテンプレとトリップを使おうね。
973 :
963 :2007/11/05(月) 20:44:09
説明文がわかりずらくてすいません 最大路の中から最短路を選ぶって事です
>>973 長さKの順列をリストアップ出来ればあとは簡単だろう
>>963 重み付きグラフの最短経路問題ならダイクストラ法で解けばいい。
ちょうど B = 1/L なので、最大と最短両方が同じアルゴリズムで解けることになる。
>>963 >>973 >最大路の中から最短路を選ぶって事です
最大路が一本だとすると、「その中から」選ぶことは出来ない。路は一本しか。
最大路が複数だとすると、ボトルネックの重さは各最大路において等しくなる。じゃないと「複数の最大路」っていう仮定が崩れる。よって選ぶことは出来ない。
つまり、最大路の中からは最短路は選べない。
978 :
aho :2007/11/05(月) 20:59:06
>>974 前にも来たろ!
クラスの中身とやらも晒せ!
どうせ前みたく出来あがってんだろ!
これが何で宿題なんだよ!
>>977 ボトルネックの値が同じ小ささの中で、経路の和が最短の物は選べる
980 :
955 :2007/11/05(月) 21:20:09
>>956 >>962 >>964 回答ありがとうございます
ですが……おそらく、非常に厄介なことに、それぞれの小片が正四面体にはならないと思います
(n=2の時を考えてくれれば分かりやすいかもしれません
それぞれの角を切り落とす形なので5個(≠2^3)に分かれると思います)
あくまでそれぞれの面に平行な面での分割ですので……
981 :
aho :2007/11/05(月) 21:30:36
>>980 違ってたらごめんなさい。
問題文に”n等分する”とあるから、出来るのは正四面体なんじゃないのかな?
981 どうやって各ブロックが四面体だとわかるんだ?
983 :
aho :2007/11/05(月) 21:39:22
>>982 すまん。もう少し考えてから出直してくる。
984 :
955 :2007/11/05(月) 21:40:54
すいません、はっきり書くべきだったのかもしれませんが、n^3でないことは確かなんですよ…… もしかしたら私の問題の説明が曖昧だったせいかもしれませんが……補足要求があったら言ってください
5,14,30,55…が答えでいいのかな?
平面ごとに見れば、頂点の部分から数えて、1、4、8、16・・・個ずつの三角形がある その中心から見て正四面体としての面がちゃんとあるかチェックすればいいのでは? 平面の方程式を考えて
987 :
955 :2007/11/05(月) 22:02:00
ああ、というか、すみません 後出しで悪いですが、プログラム中で図形的?に求めてください…… あらかじめ式を出すのではなくて……
988 :
デフォルトの名無しさん :2007/11/05(月) 22:06:40
たとえば986のようにチェックするって事?方程式を立てて保存して内部かどうかの判定すればできるけどめんどそう
989 :
デフォルトの名無しさん :2007/11/05(月) 23:07:28
[1] 授業単元:C
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5213.c リンク先の/*↓ここから各自のプログラムを挿入する*/
/*↑ここまで各自のプログラムを挿入する*/
の間に、三目並べでこちらが先攻で○の時、
引き分けになる(コンピュータが負けない)プログラムを書く
[3] 環境
[3.1] OS: (Windows/Linux/等々) Windows
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) Visual Studio2005
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 水曜日まで
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
990 :
aho :2007/11/05(月) 23:41:07
>>989 きれいではないが単純な、アルゴリズムは考えた。
縦・横・斜めの列で'0'が2つ揃ったら、その列の残り1つに'X'を置く。
例として、1行目に注目する。
if((ch0 == '0') && (ch0 == ch1)){
ch2 = 'X';
if((ch1 == '0') && (ch1 == ch2)){
ch0 = 'X';
これを残りの7列についても記述してやればいいんじゃない?
これより先は、実装が面倒なのでここでやめます。
ポインタが使えるなら、もっときれいに書けるよ〜
991 :
aho :2007/11/05(月) 23:42:09
>>990 ごめんなさい。
if文の終わりに括弧付け忘れました。
>>963 なんか混乱してる人が居るみたいだけど・・・
グラフに二種類の辺重み L(e), B(e) が与えられたとき,
・パスの長さを ΣL(e) で定義したときの最短パスを「最短路」
・パスの長さを max B(e) で定義したときの最長パスを「最大路」
と言ってるんだよね?
993 :
992 :2007/11/06(火) 00:21:44
ごめん嘘.最大路は min B(e) で定義したときの最長パスだよね?
995 :
デフォルトの名無しさん :2007/11/06(火) 01:53:20
テンプレに従って書かないと ここの住人さんは絶対に解答してくれません
997 :
デフォルトの名無しさん :2007/11/06(火) 02:52:53
Floyd-Warshallって凄い簡単だけど、知らないと思いつかないな 2点間の距離を、他を経由した方が短ければ置き換えるって言う普通のことだけど・・・なかなか思いつかないな
998 :
997 :2007/11/06(火) 03:47:17
でも計算順序によっては値が変化しないか? かわらなくなるまで計算し続ければ良さそうだけど
>>997-998 計算順序によらないよ.大雑把に言うと Floyd-Warshall は
(u,v の w まで経由してよい最短経路) =
min { (u,v の w-1 まで経由してよい最短経路)
(u,v を w を経由する最短経路) }
という漸化式を動的計画法で計算しているのであって、
「短くなったら置き換える」というのとは本質的に違う.
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。