[1]プログラム演習 [2] いろいろな整数地a,bに対して、tを媒介変数として、座標が x=cos(2πat) y=sin(2πbt) で表される曲線(リサージュ)を描くlisajous関数を作成しなさい [3]C言語(emacs) [4]12/6 [5]for,while,if文 ポインター 文字列 1,2次配列 関数 いまならってる範囲でグラフの描き方がわかりません。すいませんが力を貸してください。
3 :
デフォルトの名無しさん :2006/12/04(月) 10:11:16
下のものなんですけど、図書館で調べないと出てこないマイナーなものなんですか? 出来ればネット上にあるといいんですがありませんか? 概要だけでも説明してもらえないですか?やり方わかればできると思うんですが... x + y = 1, x, y >= 0の条件の下で(2x + y)^2 + (x - y)^2 + (x + 2y)^2の最小値を求める という問題の変数を増やした場合 x(1) + ・・・+ x(n) = 1, x(i) >= 0の条件の下でΣ{i=1,m} (Σ{j=1,n} a(i,j) * x(j))^2の最小値 はどのように解いたらいいのかわかりますか?
どこまでヒッキーやねん
前スレうまったのでいちおうこっちにもかかせてもらいます [1]プログラム演習 [2] 一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 ただし、以下での単語とは空白以外の文字からなる列のこととする。 1,s中の単語は同じ順番で t に現われる 2,t中では単語は一つの空白に区切られる 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である 例えば文字の列 _This___is__a____good___program___ を入力すると ______This_is_a_good_program______ が出力される。ここで、_は空白を表すものとする。 [3]C言語 [4]12/7 [5]for,while,if文 ポインター 文字列 1,2次配列 関数の書き方
6 :
3 :2006/12/04(月) 10:47:22
ラグランジュの乗数法でいけそうです 出来たら報告しますね ありがとうございました
にくちゃんねる閉鎖に備えて過去ログ庫作り始めました とりあえずさくらのサーバーレンタルしてきて、NAMAZUでも入れようかと思ったけど 一番安いプランじゃシェルログインできなかった(ズコー プラン変更してくる
8 :
3 :2006/12/04(月) 11:02:45
>>7 perlが動けば無料サーバーでも動かせますよ
ただしインディックスは自前で用意する必要がありますが
9 :
3 :2006/12/04(月) 11:18:27
ラグランジュの乗数法によりn元連立1次方程式を解けば良いだけでした 簡単でした
>5 #include <stdio.h> #include <string.h> int main(void) { int i, j, l, count = 0; char str[256]; gets(str); l = strlen(str); for(i=0; i<l-1; i++) { if(str[i]==' ') { while(str[i+1]==' '){ for(j=i; j<l; j++) str[j] = str[j+1]; count++; } } } for(i=0; i<l; i++) str[l-1-i] = str[l-1-count/2-i]; for(i=0; i<(count-count/2); i++) str[l-1-i] = ' '; for(i=0; i<count/2; i++) str[i] = ' '; puts(str); return 0; }
>前スレの九九の表の人 ググれば出てくる
13 :
デフォルトの名無しさん :2006/12/04(月) 13:02:17
[1] 授業単元:コンピュータ実習 [2] 問題文(含コード&リンク): 以下のプログラムを参考に、 指定したファイルの内容に行番号をつけて表示し、 さらに、空白(スペース)、タブ、改行を除く文字数を 表示しなさい。 ---------------------------サンプル------------------------------- #include <stdio.h> int main( void ) { FILE *fp; char c; char inFileName[64]; char str[256]; printf("File name ?"); scanf("%s", inFileName); if (( fp = fopen( inFileName, "r")) == NULL) { perror("fopen"); exit(1); } while( fgets( str, 256, fp) ) printf("%s", str); fclose( fp ); } [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 12月6日12:00 [5] その他の制限:特になし
[1]プログラム演習 [2] いろいろな整数地a,bに対して、tを媒介変数として、座標が x=cos(2πat) y=sin(2πbt) で表される曲線(リサージュ)を描くlisajous関数を作成しなさい [3]C言語(emacs) [4]12/6 [5]for,while,if文 ポインター 文字列 1,2次配列 関数 おねがいします
15 :
しんご :2006/12/04(月) 14:29:07
<問題> 実行結果が次のようになるプログラムをつくりなさい。 例 Please enter a statemant: This is a programming class Total 5 words. Each word contains; This: 4 letters. is: 2 letters. a: 1 letters. programming: 11 letters. class: 5 letters. ただし、単語数の上限は30、一単語の最大文字数は20と仮定する。 文章入力にはgets関数を使用する。 という問題なんですがよろしくお願いします。
一文字でもletters
[1] プログラミング演習 [2] wavファイルを読み込んで、一番音の強い部分の前後1秒間をwavで出力 し、音の一番強かった時間を表示するプログラムを作成せよ。 って課題なのですが、どうかご助力お願いします。 [3] Windows C言語 [4] 期限:2006年12月11日まで [5] 特になし
>>18 入力WAVファイルの量子化ビット数、チャネル数、コーデック、サンプリング周波数。
>>18 wavで出力とはファイルに出力?1秒に満たなかった場合は無音?カット?
強い部分が複数の場合は?
>>20 対応範囲。まさか全種類に対応しろってか?
>>13 #include <stdio.h>
int main( void )
{
FILE *fp;
int i,lcnt=1,size=0;
char inFileName[64]; char str[256];
printf("File name ?"); scanf("%s", inFileName);
if (( fp = fopen( inFileName, "r")) == NULL) {
perror("fopen"); exit(1);
}
while( fgets( str, 256, fp) ) {
i=0; printf("%d\t%s",lcnt, str);
while(str[i]){
switch(str[i]){ case '\n': lcnt++;break;
case '\t': case ' ': break;default:size++;break;
}i++;}}
printf("total: %d characters\n",size);
fclose( fp );
}
マジ適当。マジデバッグしてない。
ちゃんと動いてるのか確認してから出すべし。
>>17 の突っ込みに対応する為に最後のprintfは
printf("total: %d character%s\n",size,size>1?"s":"");
でもいいかもしれん(三項演算子キライだけど。)
24 :
デフォルトの名無しさん :2006/12/04(月) 16:49:40
[1] 授業単元: Cプログラミング
[2] 問題文(含コード&リンク):
整数 ID の二分木を表示する関数(簡単なものがスライドにあるのでそのまま打ち込んでも良いが、もっと見やすく拡張したほうが良い)と
二分探査木を作る関数(スライドにもあるが改変しても良い)を作り、二分探査木に以下のようなデータを入力した結果を表示せよ。
データは並んでいる順に入力すること。
(ア)1,2,3,4,5,6,7
(イ)1,7,2,6,3,5,4
(ウ)4,2,1,6,3,5,7
ソース
http://www.geocities.jp/c_prog2011/struct3.ppt [3] 環境
[3.1] OS: Windows XP Home Edition SP2
[3.2] コンパイラ名とバージョン: Microsoft Visual Studio 2005 Academic Edition
[3.3] 言語: C
[4] 期限: 2006年12月6日23:59まで
[5] その他の制限: 線形リストの基本は学んだが二分木は初めてです。
よろしくお願いします。
25 :
デフォルトの名無しさん :2006/12/04(月) 16:50:26
>>25 意味解らんなぁ。
リングバッファはFIFOなんだから入れた順に取り出されるだけだろ。
(*) は何の意味だろう。
>>25 追い越しとか全然考慮してない。
#include<stdio.h>
#define QMAX 32
#define QO() printf("%d\n",qo())
int WP = 0;
int RP = 0;
int QUEUE[QMAX];
void qi(int a){QUEUE[WP]=a; WP=(WP+1)%QMAX;}
int qo(){int ret=QUEUE[RP]; RP=(RP+1)%QMAX;return ret;}
int main(void){qi(1);qi(2);qi(3);qi(4);QO();QO();qi(5);qi(6);qi(7);QO();qi(8);QO();
qi(9);qi(10);QO();QO();QO();QO();QO();QO();return 0;}
前スレ
>>979 >
>>919 >候補表示中にポインタがウィンドウ外に行ったとき、
>ウィンドウ外をクリックされたときの挙動はどうしたらいい?
候補中にウィンドウ外をクリックされたときは挙動を起こさず
ウィンドウ内に戻ったらそのまま続くでお願いします。
[1] 授業単元: プログラミング基礎
[2] 問題文:文章だとわかりにくいので、画像をご覧ください。。。
ttp://up.kabubu.net/cgi/img2/17722.jpg [3] 環境
[3.1] OS: WinXP HOME
[3.2] コンパイラ名とバージョン:VC++ 2005
[3.3] 言語:C++
[4] 期限:できれば本日中に・・・
よろしくお願いします。
>>31 4分もかからん。コンパイルもしてないけど。
#include <stdio.h>
#include <math.h>
#define VAL_MAX (12)
int main( void ) {
double a[VAL_MAX], ave = 0.0, ss = 0.0, var, std;
int i;
for( i = 0; i < VAL_MAX; i++ ) {
printf( "a[%d]:", i + 1 ); scanf( "%lf", a + i );
}
for( i = 0; i < VAL_MAX; i++ )
ave += a[i];
ave /= (double)VAL_MAX;
for( i = 0; i < VAL_MAX; i++ )
ss += ( a[i] - ave ) * ( a[i] - ave );
var = ss / (double)VAL_MAX;
std = sqrt( var );
printf( "Ave = %lf, Var = %lf, Std = %lf\n", ave, var, std );
return 0;
}
34 :
31 :2006/12/04(月) 20:14:26
>>33 早速、ありがとうございます。
しかし、「#define VAL_MAX (12) 」をまだ習ってないので。。。
for文を使って解く方法でお願いします。
forの中のVALの所を全部12に変えればいけるんじゃないの?
VAL_MAXの前のキャストって必要なの?
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): * 2つの整数 x と y の全ての公約数を求めて配列 d に格納する関数 void compute_cd(int x, int y, int d[]) を作成せよ. ただし, 配列 d へのデータの格納には 0 をターミネータとして用いよ. 例えば, 公約数が 1, 2, 3, 6 の場合, d[0]=1, d[1]=2, d[2]=3, d[3]=6, d[4]=0 となるようにせよ. * 公約数の表示は print_cd を呼び出して行うのではなく, main から compute_cd を呼び出し, 配列に格納された公約数を main の中で表示するようにせよ. [3] 環境 [3.1] OS:windows [3.2] cygwin [3.3] C [4] 期限:2006年12月7日 [5] あるプログラムを書き換えるようにやる問題です。 一応、原型が留まっていたほうが嬉しいので次にそのプログラムを貼ります
38 :
37 :2006/12/04(月) 20:32:37
void print_cd(int a,int b){ int g,i; g=gcd(a,b); for(i=1;i<=g;i++){ if(g%i==0){ printf("%d ",i); } } } int gcd(int a,int b){ int z; while((z=a%b)!=0){ a=b; b=z; } return b; } 最大公約数を計算する関数と求める関数はこれを使っていました。 今度は最大公約数を計算して配列に入れるプログラム もしくはこの計算する関数自体を配列に入れるプログラムを作りたいです。 関数だけで結構です。よろしくお願いします。
>>33 #defineがダメなら
ポインタ演算とかプリプロセッサとか、
もしかしてdouble使うのもまずいんじゃないか。
40 :
31 :2006/12/04(月) 20:37:49
>>33 ,35,36,39
ありがとうございます!
VALを12に変えて#defineを消して、ちゃんと動きました。
また何かありましたらよろしくおねがいします。
「習ってない」をNGワードに。
42 :
31 :2006/12/04(月) 20:40:51
>>40 他人事だからどうでもいいけど、
>>33 のソースはポインタ演算使ってるから
もしポインタ演算やった事ないなら
printf( "a[%d]:", i + 1 ); scanf( "%lf", a + i );
を
printf( "a[%d]:", i + 1 ); scanf( "%lf", &a[i] );
にしたほうが人に頼んだってバレづらいぞ。
極力原型をとどめてみた。 void print_cd(int x,int y, int d[]){ int g,i; g=gcd(a,b); for(i=1;i<=g;i++){ if(g%i==0){ *d++=i; } } *d = 0; }
おいおい 極力人に頼んだことがバレやすいソースを書くことを目的にしてる 俺みたいな人間もいるんだぜ 少しは配慮してくれよ
46 :
37 :2006/12/04(月) 21:26:20
>>44 すいません、その関数をmainの中に書くときの書き方を教えてもらえませんか?
print_cd(a,b,d)
とかでやったら何も出なかったりエラー出たりです。
まさかここで詰まるとは思いませんでした。
>>14 条件は満たした( ´,_ゝ`)
#include <stdio.h>
void lisajous(int a,int b){
char str[1024];
sprintf(str,
"echo \"set parametric;"
"set samples 400;"
"plot cos(2*pi*%d*t),sin(2*pi*%d*t)\""
"| gnuplot -persist",a,b);
system(str);
}
>46 44じゃないが関数名はcompute_cd(int x, int y, int d[])にしなきゃいけないんじゃないのか?
>>48 そのはずだったけど元のがa,bでされてるから
>>44 の内容もa,bで作られてるし
a,bと書きましたが実物を全部x,yに置き換えます。
50 :
31 :2006/12/04(月) 21:50:31
割り込み失礼します
>>31 ですが、下記のように手を加えて課題どおりの書式にしたのですが、
測定データ:
*
*
51 :
31 :2006/12/04(月) 21:52:04
>49 じゃあmainの中で配列を宣言してないとか?
>>52 してるつもりなんですけど勘違いしてるかもです。
int d[];
って入れたら中になんか入れろやってエラー出るんですが、
意味が分かりません。
128とか適当な数字入れても無理です。どうするのでしょうか。
>>53 main の中で配列 int d[サイズ]; のように宣言してる?
>>54 int main (void){
int a,b,d[];
printf("a bの値>>");
scanf("%d %d",&a,&b);
ほかの関数(a,b);
compute_cd(a,b,d); もしくはcompute_cd(a,b,d[]);
return 0;}
これがメインです。[]をなくしたりいろいろ試しても正常にいきません。
[1]プログラム演習 [2] いろいろな整数地a,bに対して、tを媒介変数として、座標が x=cos(2πat) y=sin(2πbt) で表される曲線(リサージュ)を描くlisajous関数を作成しなさい [3]C言語(emacs) [4]12/6 [5]for,while,if文 ポインター 文字列 1,2次配列 関数
d[] → d[128] compute_cd(a, b, d) でいけるはずだけど。
>>55 2行目の
int a,b,d[];
dのサイズ入れなあかん
int a,b,d[100]; とか
配列の表示自体は for(i=0; d[i]; i++) printf("%d ", d[i]); mainの中でやらなきゃダメよ。
>>57 それ最初にやったらエラーは出ないけど何も表示されませんでした。
今やってみてもですけど
>>36 暗黙のキャストがあるので必要ではない。
単なる習慣。
>60 何も表示されないのはcompute_cd()関数には表示が含まれてないから。 渡した配列に約数を格納しただけ。 >59のをcompute_cdの後に追加すれば表示される。 「配列に格納された公約数を main の中で表示するようにせよ」 ってのはそういう意味。
>for(i=0; d[i]; i++) printf("%d ", d[i]); でもおかしいよな
65 :
33 :2006/12/04(月) 22:23:42
>>31 =
>>51 a[i] をループで printf() するだけだろ。
そのくらいは自分で直せ。
その程度の事も自分で出来ないなら学校を辞めるべきだ。
もっとも
>>31 の問題自体も人に聞くレベルのものでは無い。
>64 どこがおかしい?
>for(i=0; d[i]; i++) printf("%d ", d[i]); 真ん中の d[i] って何か式を評価しているのか?
>67 >配列 d へのデータの格納には 0 をターミネータとして用いよ
なるほど、そういう使い方をしていたのか。まぁ、そういうのってwhileを使う人が多いのかな。
71 :
60 :2006/12/04(月) 22:34:10
意味が分かりました。ありがとうございます。 配列をよく分かってませんでした。 あと、*d++と*dを使わないポインタ無し版はどうしたらいいでしょうか。 課題はポインタ有りと無し2種類出さなくてはいけないです。 単純に*を消して()入れるくらいに考えてたんですが
>69 この問題でd[i]==0を使わない配列の表示方法を教えてくれ
i=0; while( d[i] ) printf("%d ", d[i++]);
>71 ポインタなし void compute_cd(int x,int y, int d[]){ int g,i,j; g=gcd(a,b); for(i=1,j=0;i<=g;i++){ if(g%i==0){ d[j]=i; j++; } } d[j] = 0; } >73 d[i]を評価しないでって意味で頼む
結局は0か1、あるいは0か0でないか、1か1でないかでの評価がされるなら 真偽で判断すりゃええがな
77 :
31 :2006/12/04(月) 22:47:12
お世話になりました!
78 :
37 :2006/12/04(月) 22:53:34
>>75 iとdだけで考えていました><ありがとうございます。
根本的にわかってない部分があるから早く冬休みに最初から見直したいんですが
忙しいからお世話になりました。
79 :
28 :2006/12/04(月) 23:06:03
正直28の文章だけ読んでまたイチヂクか!と思った俺がいる
>>79 俺
>>30 じゃないけど
主キーってのは重複することが許されないもの
たとえば
apple 100 40
apple 50 20
と言う追加が許されない(appleが2つあることが許されない)なら
apple が主キーになる
79の実行結果を見る限りではDB的な処理は必要無さそうだな (主キーはいらない) 各品目に対して値段は一つだけ
85 :
デフォルトの名無しさん :2006/12/05(火) 02:20:37
>>85 malloc習ってません>< と返って来るにmalloc(100)
exitする直前にfreeなんて無駄な事をするな
ヌルと読むものとばかり思っていたが 意外とナル派も多かった ナル文字 の検索結果 約 600 件中 1 - 10 件目 (0.22 秒)
[1] 授業単元: プロフラミング実習II [2] 問題文(含コード&リンク): コマンドライン版 加減乗除 演算機の作成 ※必ずコマンドラインから入力データを与えてください.本課題の必須要件です. 使い方: calc 数値1 [+|-|*|/] 数値2 (例)calc 4 + 2 <enter> 6.00 上記の例に示すようなコマンドライン版の超簡単な加減乗除演算機を作成してください. 加減乗除ですから,+ - * / の4つのオペレータ(加減乗除演算子)を考えるだけで十分です. 括弧の処理はなくて構いません. 括弧による優先順位や四則演算の優先順位を考慮すると格段に難しい問題になります. したがって本課題では考慮の必要はありません. コマンドラインから与える「数値1」と「数値2」は実際には文字列として main 関数に渡されます.ご注意ください. 例にあるように,コマンド名calcと数値1の間には半角スペースを入れます.同様に数値1とオペレータの間にも半角スペースを入れます.もちろんオペレータと数値2の間にもスペースが必要です. 例では小数点以下2桁で結果を表示しています.表示方法は各自で工夫してください. [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: ([2006年12月09日20:00まで] [5] その他の制限:なし よろしくお願いいたします。
93 :
デフォルトの名無しさん :2006/12/05(火) 13:19:53
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): キーボードから入力した文章を単語単位で切り出し 総単語数と各単語の文字数を表示せよ。単語の区切りは半角スペース。 単語数の上限は30、一単語の最大文字数は20と仮定 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:bcc32 [3.3] 言語:C [4] 期限:12月5日夕方まで [5] その他の制限:文字入力にはgets関数を使用。ポインタだけでかければ 更に可
94 :
デフォルトの名無しさん :2006/12/05(火) 13:24:35
このような事ができるようなプログラムを1時間以内で教えて下さい。お願いします 1:4個の1桁の数字からなる順列を乱数で生成 (4個の数字は全て異なる) 2:4個の数字の順列を入力 3:生成した順列と入力の順列を比較 (数と位置があっている「hit]) (数はあるけれど位置が違う「blow]) 4:hit数とblow数を表示 5:順列があたるまで入力を繰り返す 実行例 Number?:0123 Hits:0,Blows:1 Number?:0124 Hits:0,Blows:0 Number?:3567 Hits:3,Blows:0 Number?:3568 Hits:3,Blows:0 Number?:3569 Hits:4,Blows:0 Trials:5
95 :
デフォルトの名無しさん :2006/12/05(火) 13:46:06
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 数値を順番に読み込んで二次元の配列に格納する [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: どちらでも可
>>94 テンプレにも従わずに図々しい
>>95 配列のサイズは?
入力のしかたは?
100 :
89 :2006/12/05(火) 14:10:32
>>91 ,
>>99 勉強になりました。
'\0' == 0だと知らなかった……orz
101 :
デフォルトの名無しさん :2006/12/05(火) 14:15:31
すみません… 配列のサイズは4 入力の仕方はscanfです
>>94 ソース汚いけど出来たぞ。テンプレに書き直したらUPする。
103 :
94 :2006/12/05(火) 14:24:11
いろいろなスレでマルチポストしたのでもういらないです
104 :
のいまんさん :2006/12/05(火) 14:28:01
C++のウィンドウズプログラミングで右クリックすると画面の表示がクリアされるものを作りたいんですけど、どのようなコードを書けばいいかわかりません。
いやなやつ。
106 :
デフォルトの名無しさん :2006/12/05(火) 14:31:58
>>104 ExitWindowsEx(EWX_POWEROFF, 0);
でおk
108 :
のいまんさん :2006/12/05(火) 14:47:11
>>107 これはOnDraw()関数に書き込むんですか?
109 :
デフォルト名無しさん :2006/12/05(火) 14:47:42
[1] 授業単元: [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS:Linux (Windows/Linux/等々) [3.2] コンパイラ名とバージョン:コンパイラはgcc [3.3] 言語: C言語 [4] 期限: ([2006年12月19日12:00まで] [5] その他の制限: 無し
>>104 プラットホームSDKもってないからヒントだけ。
1、ウインドウを出す。
2、WindowProcのWM_RBUTTONDOWNで、InvalidateRectを呼ぶ。またはfillrectで白塗りする。
そんな感じ。
>>109 コードを書く前に言っておくッ!
おれは今
>>109 の宿題をほんのちょっぴりだが体験した
い…いや…体験したというよりはまったく理解を超えていたのだが……
,. -‐'''''""¨¨¨ヽ
(.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ!
|i i| }! }} //|
|l、{ j} /,,ィ//| 『内容がないよう』
i|:!ヾ、_ノ/ u {:}//ヘ
|リ u' } ,ノ _,!V,ハ |
/´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが
/' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった
,゙ / )ヽ iLレ u' | | ヾlトハ〉
|/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった…
// 二二二7'T'' /u' __ /:::::::/`ヽ
/'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ C言語だとかC++だとか
/ // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ
ノ ' / ノ:::::`ー-、___/:::::// ヽ }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
112 :
デフォルトの名無しさん :2006/12/05(火) 14:55:39
113 :
110 :2006/12/05(火) 15:03:39
>>108 おまい、MFCか。
それならそうと初めにかいてくれ。
っていうかテンプレ書いてくれ。
114 :
173 :2006/12/05(火) 15:10:58
>111 ネ申
115 :
デフォルトの名無しさん :2006/12/05(火) 15:12:34
[1] 授業単元:計算機演習 [2] 問題文(含コード&リンク): 1:4この1桁のすうじからなる順列を乱数で生成 2:4個の数字の順列を入力 3:生成した順列と入力の順列を比較 (数と位置が合っている[hit],数はあるけど位置が違う[blow]) 4:ヒット数とブロー数を表示 5:順列があたるまで入力を繰り返す [3] 環境 [3.1] OS:Linux (Windows/Linux/等々) [3.2] コンパイラ名とバージョン:コンパイラはgcc [3.3] 言語: C言語 [4] 期限: ([2006年12月19日12:00まで] [5] その他の制限: 無し
116 :
のいまんさん :2006/12/05(火) 15:12:43
[1] 授業単元:MMM(マルチ・メディア・モデリング) [2] 問題文(含コード&リンク): 例題2.1を以下の点について拡張せよ. マウスを左クリックしたときに追加される文字列を各自変更すること. マウスを右クリックしたときに,クリアすること.(マウスを右クリックすると何も表示されなくなる.) [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC++ 6 [3.3] 言語: C++ [4] 期限: 12月5日17:00まで [5] その他の制限:
117 :
115 :2006/12/05(火) 15:14:27
訂正 [4] 期限: ([2006年12月12日12:00まで]
118 :
のいまんさん :2006/12/05(火) 15:22:41
119 :
デフォルトの名無しさん :2006/12/05(火) 15:24:23
[1] 授業単元: C言語演習 [2] 問題文(含コード&リンク): ライブラリ関数「strcmp(char str1,char str2」 と同じ処理をする関数を記述せよ。 [3] 環境 [3.1] OS:windows xp [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C言語 [4] 期限: ([2006年12月8日) [5] その他の制限: for文、if文、ポインタなし、 for(i=0;str1[i]=str2[i];i++)はわかるんですけど、 if文の分け方がいまいちわかりません。 どうかお願いします。
for(i=0;str1[i]=str2[i];i++) これってstrcpyだよな 最後セミコロンいるけど
121 :
のいまんさん :2006/12/05(火) 15:44:42
プロジェクトはMFC(exe)です。
122 :
115 :2006/12/05(火) 15:54:13
訂正(何度もすみません…) [3] 環境 [3.1] OS:Linux
123 :
デフォルトの名無しさん :2006/12/05(火) 16:03:58
>>115 ヒット&ブロウでいいと思ったのでそういうものつくってみた。
カスタマイズはご自分で!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4
int main(){
int Number[N],In[N];
int i,j,hit,blow;
srand(time(NULL));
for(i=0;i<N;i++){Number[i]=rand()%10;In[i]=0;}
do{
printf("%d桁の数を入力!:",N);
for(i=0;i<N;i++){if((In[i]=getchar()) ==EOF) break;
In[i]-='0';}
fflush(stdin);hit=0,blow=0;
for(i=0;i<N;i++){if(Number[i]==In[i]) hit++;}
for(i=0;i<N;i++){for(j=0;j<N;j++){if(Number[i]==In[j]) {
blow++;
break;
}}}
for(i=0;i<N;i++) printf("%d-",In[i]);
printf("%dHit,%dBlow\n",hit,blow-hit);
}while(hit!=N);
for(i=0;i<N;i++) printf("%d",Number[i]);
puts("\nComplete!!");
}
>>119 ライブラリ関数「strcmp(char str1,char str2」
なんてないと思うんですけど.....
strcmp(char* str1,char* str2) なのか?
上だと文字列が関数に引き渡せないんじゃないか?
>>119 gcc3.4.4のコードを張ってみる。
google code searchって便利だね。
GPLライセンス付けて提出すればOKじゃね?
int
strcmp (const char *s1, const char *s2)
{
#ifdef __OPTIMIZE__
if (inside_main)
abort ();
#endif
while (*s1 != 0 && *s1 == *s2)
s1++, s2++;
if (*s1 == 0 || *s2 == 0)
return (unsigned char) *s1 - (unsigned char) *s2;
return *s1 - *s2;
}
126 :
デフォルトの名無しさん :2006/12/05(火) 16:22:54
二つの文字列s1,s2 をキーボードから入力し,それぞれの文字列の長さ(NULL 文字は含まな い)を画面表示し,さらに文字列s1 の後ろに文字列s2 を連結して画面表示するプログラムを 作成しなさい.ただし,文字列s1 と文字列s2 を連結したものを一度文字列s1 に格納してから 表示を行うこと.また,strlen(),strcat()等の関数を使ってはならない. よろしくお願いします。
128 :
のいまんさん :2006/12/05(火) 16:30:09
自分のプログラミングはどうなったのでしょうか?
>>116 です。
130 :
127 :2006/12/05(火) 16:37:16
>>129 関数名が違うわけじゃなかったわ。関数の引数が違うってことでした。
131 :
デフォルトの名無しさん :2006/12/05(火) 16:38:10
有難うございました
MFC つかったことないんだけど、こんな感じじゃないかなー。 OnRButtonDown( UINT nFlags, CPoint point ){ CClientDC hdc(this); RECT rt; CBlush bl(RGB(0,0,0)); this->GetClientRect(&rt); hdc->FillRect(&rt,&bl); return; }
133 :
のいまんさん :2006/12/05(火) 16:46:34
>>132 エラーがでちゃいますね。
CBlush blはどこから持ってきた関数なんですか?
134 :
デフォルトの名無しさん :2006/12/05(火) 16:48:36
135 :
かき☆ :2006/12/05(火) 16:52:00
今日課題が出たんです... 簡単すぎたらすみません;;;; 【2以上の整数を読み込み素数であるかどうかを判定する文をつくる】 というのなんですけど... お願いします!!!m(_ _。)m ペコリ
137 :
かき☆ :2006/12/05(火) 16:59:52
テンプレって何ですか??☆ごめんなさいっ[壁]ノ_<。)
138 :
のいまんさん :2006/12/05(火) 16:59:57
>>134 FullRectが構造体、共有体のポインタではないとでるんですが・・・。
>>138 hdc->FillRect(&rt,&bl);
を
hdc.FillRect(&rt,&bl);
に変更。
テンプレがわからないのはともかく、 コピペができる人でないと難しい。
142 :
のいまんさん :2006/12/05(火) 17:04:19
143 :
揚げ物2号 :2006/12/05(火) 17:04:20
[1] 授業単元: C言語基礎演習 [2] 問題文(含コード&リンク):二次元配列 [3] 環境 [3.1] OS:windows xp [3.2] コンパイラ名とバージョン:わかりません [3.3] 言語: C [4] 期限: 12月6日1:00まで [5] その他の制限: defineは使わずに。二次配列(hyo[i][j])を使って 作る。 1から3までの3種類の商品について、1月から12月までの売り上げ個数 を入力すると、商品ごとの合計売り上げ個数と月ごとの合計売り上げ個数を 表示するプログラム。
144 :
のいまんさん :2006/12/05(火) 17:07:15
>>140 エラーがなくなったのですが、右クリックをすると画面が黒くなって、左クリックをすると元の画面に戻ってしまいます。
145 :
のいまんさん :2006/12/05(火) 17:08:10
146 :
かき☆ :2006/12/05(火) 17:08:28
[1]プログラム演習 [2]2以上の整数を読み込み素数であるかどうかを判定する文をつくる [3]C言語 [4]12月12日 [5]for文if文switch文while文break文は習ってます お願いします!!
>>144 FillRectは四角形の塗りつぶしメソッド。
CBlush bl(RGB(0,0,0));
RGBで色を指定してる部分をうまく合わせてくれ。
0は色を発色しないという意味になるから、そこをなんとか。
148 :
のいまんさん :2006/12/05(火) 17:20:36
>>147 でも左クリックすると、もともと右クリックで消える前にあった文字列が表示されるんですよね・・・・。
>>146 #include <stdio.h>
int main() {
int n, i, j, k, f = 1;
scanf("%d", &n);
for(i=2;i<n;i++) {
if(n%2) {
switch(n%i) {
case 0: f = 0; break;
}
}
}
j = 0;
while(j<100) {
j++;
}
}
if(n == 1) f = 0;
printf("%s", f ? "素数" : "非素数");
return 0;
}
150 :
149 :2006/12/05(火) 17:35:14
>>146 間違えた
#include <stdio.h>
int main() {
int n, i, j, k, f = 1;
scanf("%d", &n);
for(i=2;i<n;i++) {
switch(n%i) {
case 0: f = 0; break;
}
}
j = 0;
while(j<100) {
j++;
}
if(n == 1) f = 0;
printf("%s", f ? "素数" : "非素数");
return 0;
}
>>148 むー。もしかして、ダブルバッファリングしてるのか。
それなら、バックバッファにFillRectすればOK。
情報が小出しなのはやめてくれーTT
なんでこんなのにマジレスしてるやつがいるんだ・・・
153 :
かき☆ :2006/12/05(火) 17:46:30
>>150 ありがとうございます☆
これは何桁でも使えますか??なぜkを定義してつかってないのですか??
154 :
のいまんさん :2006/12/05(火) 17:47:39
>>146 #include <stdio.h>
int main(void)
{
int num, i, rem;
printf("整数を入力:");
scanf("%d",&num);
for(i=2;i<num;i++)
{
rem = num % i;
if(rem == 0)
{
printf("%dは素数ではない\n", num);
return 0;
}
}
printf("%dは素数\n",num);
return 0;
}
こいつらに関わるな スレのレベルがどんどん下がる そのうち「2つの整数の和を求めるプログラムがわかりません><」 とか来るぞ
>>153 intの最大値まで使える
kがいらないなら外せばいい
158 :
揚げ物2号 :2006/12/05(火) 17:53:07
[1] 授業単元: C言語基礎演習 [2] 問題文: 1から3までの3種類の商品について、1月から12月までの売り上げ個数 を入力すると、商品ごとの合計売り上げ個数と月ごとの合計売り上げ個数を 表示するプログラム。 [3] 環境 [3.1] OS:windows xp [3.2] コンパイラ名とバージョン:わかりません [3.3] 言語: C [4] 期限: 12月6日1:00まで [5] その他の制限: defineは使わずに。二次配列(hyo[i][j])を使って 作る。 143でミスってたので、もう1度書き直しました。
[1] プログラミング演習 [2] Buffonの針の問題 床に間隔2Lの平行線を引き、長さ2a(<2L)の針をN本用意すればランダムに針を投げn本が平行線に交差する。 確率はn/N=2a/πLとなる。 a=Lの場合はしたがってP=n/N=2/πになる。 これを用いてπの値を求めるプログラムを作成せよ。 [3] 環境 [3.1 Windows [3.2] Borland C++ Compiler 5.5 [3.3] C++ [4] 12月11日まで
>>154 そろそろ余裕がなくなってきたからこれが最後。
ダブルバッファリングのバックバッファというのは主対象と類似したものをもう一個用意して、下準備するためのもの。
グラフィックの場合は表示される領域と同じだけの大きさの領域を確保してそこに下準備として描画する。
グラフィックにおける恩恵は画面のチラツキなどを防止するという効能がある。
そんなわけでやね、どこかにDrawTextかなんかで文字列をバックバッファに書き込んでる所があるはずだから、
そこを探し出してこぴーして変更してみてくれ。
そもそも、MFC知らないんだってば。TT
じゃ、がんばってくれ。
長さ2a(<2L)って条件で求めた式で、a = Lを仮定しちゃダメだろ。
163 :
デフォルトの名無しさん :2006/12/05(火) 18:10:11
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):以下の機能をもつプログラムを作る ・行列(要素は整数型、3行x3列)に値を入力する ・行列を表示する ・利用者が入力した列番号に基づいて、行列の2つの列を入れ替える ・転置行列を求める ただし、以下の機能を持つ関数のプログラムを個別に作り、一つにまとめる。 主プログラム(main) 行列に値を入力する関数 行列を表示する関数 利用者が入力した列番号に基づいて、行列の2つの列を入れ替える関数 転置行列を求める関数 機能の一覧(終了、行列成分を入力、表示、列の入れ替え、転置)を表示する関数 (行列は大域変数とし、2次元配列を用いて表現すること) [3] 環境 [3.1] OS:Windows [3.2] バージョン:VC++2005 [3.3] 言語:C++ [4] 期限:12/7 木曜日 [5] その他の制限:何という呼び名かよくわかりませんが、行列計算がプログラムを長々と書かなくてもできるような機能があるみたいですが、そういうのを使うのは無しと制限されました。 入出力ライブラリは #include <iostream> using namespace std; っていうのしか習ってません。 よろしくお願いします。
>>160 これって無限に広い平面状で投げるわけじゃないよね?
165 :
のいまんさん :2006/12/05(火) 18:17:50
うーん、条件のクリアするって言うのが多分もとの状態に戻すっていうニュアンスのものなので上からかぶせるっていう方法は多分違うと思います。
166 :
かき☆ :2006/12/05(火) 18:18:21
>>155 本当にありがとうございます☆
幼稚な内容でごめんない[壁]ノ_<。)丁寧に教えてくださってありがとうございます☆
顔文字使う奴死ねばいいのに
>>164 興味が有ったので少し調べたら、
『無限平面に無限長の線分が等間隔に無限本存在する』イメージで良いみたい。
結局、ランダムな要素とは『針の中心から直近の線分までの距離』と『針の角度』だけだから。
ビュッフォンの針たあ懐かしい 別に有限と仮定しちまってもおkだぜ
>>168 なるほど、平行線も無限本ね
とすると有限で考えられるな
>>160 doubleでa,Lを、intでN,nを宣言して
for(int i=0;i<N;i++)if(L*rand()/RAND_MAX+a*cos(M_PI/2*rand()/RAND_MAX)>=L)n++;;cout << 2*a*N/n/L << endl;
>>167 自分勝手な感情をやたらと公の場で敢えて表現しちゃう
自分勝手な奴こそ(ry
>>172 わざわざ名前消してsageて自分擁護ですか
174 :
デフォルトの名無しさん :2006/12/05(火) 19:31:36
>>167 =
>>173 自分勝手な判断基準で公の場に自分のみっともない恥を晒して
バカだなぁw お前みたいなのは世間知らずって言うんだよw
良く周りから、つまらないことで笑われるだろ?w
悪いが俺は顔文字を使った本人じゃないw
お望みどおりお前のバカ発言を晒しageしちゃるw
176 :
デフォルトの名無しさん :2006/12/05(火) 19:40:35
>>175 ぷぷっ、そういうことでしか場を濁すことしか出来なくなったかw
宿題に答える気がないなら失せろ、俺もこれ以上お前みたいな
世間知らずの知能、知性の低い奴を相手にはしない
もっと広い世の中を知るんだな、井の中の蛙w
178 :
のいまんさん :2006/12/05(火) 19:45:41
どなたかMFCわかる方いませんか?
179 :
160 :2006/12/05(火) 19:46:30
>>171 出来ました。
ありがとうございました。
>>178 今ココ見たんで、よくわからんけど
文字の追加、クリアだけなら
イチイチ画面を塗りつぶす必要は無いのでは?
例えばウィンドウクラスのメンバに文字を格納するバッファを持っておいて
それをOnDraw()内でTextOut()で描画して
左クリック→バッファに文字追加
右クリック→バッファの内容をクリア
とすればいいのでない?
つか元の問題あるんなら何故それを晒さないんだぜ?
>>116 で「例題2.1を拡張せよ」ってなってるのに
例題2.1がどんなモンだか示さないのでは、エスパーでもない限り
どうしようもないよな。
183 :
のいまんさん :2006/12/05(火) 21:00:26
プロジェクトワークスペースの作成 表示する文字列を格納するためのメンバー変数を追加. onDraw に文字列を表示する記述を追加 クラスウィザードで,「マウスの左ボタンを押した」というイベントに対するメッセージハンドラを生成する. 生成したメッセージハンドラに,文字列を1文字分長くするという記述を追加. 例題2.1はこんな感じです。
こんな感じ
186 :
のいまんさん :2006/12/05(火) 21:31:59
どんなノリだったらもっと詳しく教えてもらえるんでしょうか?
>>186 ・Viewクラスに文字列を保持するメンバ変数Aを追加した
・OnLButtonUp()あたりに、Aに値をセットするコードを記述した
・OnDraw()に、Aの内容をTextOut()か何かで描画するコードを記述した
んだろ?
んなら、
・OnRButtonUp()あたりに、Aの値をクリアするコードを記述する
でおk。
Aの型がCStringなら、
A = "";
の一行を追加するだけだ。
188 :
のいまんさん :2006/12/05(火) 22:21:32
出来た。どうもありがとうございました。
189 :
デフォルトの名無しさん :2006/12/05(火) 22:24:59
『データ用整数型変数a,bを宣言して、aをbで割り算した値をcに、余りをdに代入して表示しなさい。必要な変数は適宜、宣言すること。』という問題がどうしてもわかりません。 申し訳ありませんが教えてください。
>>189 どうしてもわからないんじゃないだろ
素直にやる気がないので教科書も見る気はない、検索する気もないって言えよ
int a=1, b=0, c=a/b, d = a%b;
191 :
デフォルトの名無しさん :2006/12/05(火) 22:32:34
192 :
デフォルトの名無しさん :2006/12/05(火) 22:33:18
ありがとうございます! うちの学校、プログラミングの教科書とかないんですよ。 本当に助かります。
193 :
デフォルトの名無しさん :2006/12/05(火) 22:33:51
つか、図書館なり図書室なり無いんか
195 :
デフォルトの名無しさん :2006/12/05(火) 22:36:38
図書館とかにC言語の本とかって置いてあるんですか!!??
196 :
デフォルトの名無しさん :2006/12/05(火) 22:37:04
>>194 本人が無いと主張しているし、無いのでは?
蔵書が少ない図書室をあはれむ。
197 :
デフォルトの名無しさん :2006/12/05(火) 22:38:23
それなりの本屋に行けば有るから。 Cの入門書とか大量に有るから。 別にD言語とか、そんな新しい言語とかサポートが行き屆いてない言語じゃないんだからw
198 :
デフォルトの名無しさん :2006/12/05(火) 22:39:39
そうなんですか! 今度図書室とか本屋とか覗いて見ます! とてもいい情報をありがとうございました!
本見なくてもネットにC言語のサイトが山ほどある
200 :
デフォルトの名無しさん :2006/12/05(火) 22:47:49
みなさん色んな情報をしってるんですね! 勉強になります!
201 :
デフォルトの名無しさん :2006/12/05(火) 22:49:07
と云うか先ず、ググってみるなりなんなりしてみ。
うちの高校の図書室スレイヤーズの文庫あったな
203 :
デフォルトの名無しさん :2006/12/05(火) 22:50:45
了解しました!! ありがとうございました☆
ウチの中学はニュータイp(ry
2chで質問したって善意に見せかけた悪意の答えが返ってくるだけだしやめときな
>>205 >善意に見せかけた悪意の答え
見分けられるようになれば2ちゃんは便利
ようは使い方次第だぜ
実は
>>205 が善意に見せかけた悪意の答えだったり
209 :
デフォルトの名無しさん :2006/12/05(火) 23:28:58
[2] 問題文(含コード&リンク): @学生番号(3桁の整数)と氏名(アルファベットで姓のみ)をメンバとする構造体を定義し,キーボードから学生番号と氏名を5名分読み込むプログラムを作成しなさい. ただし,3桁以外の整数値を入力した場合は再入力するようにし,最後に5名分のデータをすべて表示すること. 〔実行結果〕 学生番号(3桁の整数)> 444 氏名(アルファベットで姓のみ)> Takeda ………… 学生番号(3桁の整数) 学生番号(3桁の整数) > 99 学生番号(3桁の整数)> 631 氏名(アルファベットで姓のみ)> Sato 学生番号(3桁の整数)> 107 氏名(アルファベットで姓のみ)> Furukawa 〔5名分のデータ表示例〕 学生番号: 444 氏名: Takeda 学生番号: 221 氏名: Kato 学生番号: 859 氏名: Azuma 学生番号: 631 氏名: Sato 学生番号: 107 氏名: Furukawa A @の構造体に,身長,体重,肥満度のメンバ(いずれも浮動小数点数)を加えた構造体を新たに定義する. また,あらかじめ5名分の学生番号と氏名のデータ(任意、実際の学生番号と一致する必要は全くない)で初期化しておく. まず,この5名のデータにキーボードから身長[m],体重[kg]のデータ(任意)を入力する. 次に,個人ごとの構造体データへのポインタを受け取り,身長,体重から肥満度[%] を計算する関数を作成し,その関数を用いて各人の肥満度を表示するプログラムを作成しなさい. ただし,肥満要注意の人(肥満度30%以上)には,任意の注意マークをつけること.肥満度は次の式で計算され,0%のとき標準体重,正の値は肥満型,負の値は痩せ型を表わす(BMI (Body Mass Index)の計算式より). 肥満度[%] = {体重/(身長×身長×22)}×100−100 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: Visual Studio 2003 [3.3] 言語: C [4] 期限: 12月11日
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 整数値が1行に1つづつ記入されたファイルがあるとする(最大100行)。この ファイル名をコマンドライン引数で指定し、その内容をintの配列に格納して 順に表示するプログラムを作成せよ。なお、本プログラムの作成にあたって は以下の3つにソースを分割し、makeコマンドによって実行ファイルを生成 するようにすること。 1.main()関数を含むファイル。 2.指定されたファイルの内容を全て読み込む関数(引数はファイル名とintの 配列を示すポインタ、返り値は読み込んだ整数値の個数)を含むファイル。 3.ポインタで示されたintの配列を順に表示する関数(引数はintの配列を 示すポインタと格納された整数値の個数)を含むファイル。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日の16時 [5] その他の制限: 大域変数を用いてはならない。2および3の関数はmain 関数から、それぞれ1回づつ呼び出されるようにする。 よろしくお願い致します。
>>211 各ファイルに分けてmake
/* -- 1.c -- */
#include <stdio.h>
#include "h.h"
main(int argc, char *argv[]){
int a[100];
pt(a, rd(argv[1], a));
return 0;
}
/* -- 2.c -- */
#include <stdio.h>
int rd(char *f, int *a)
{
int *b = a;
FILE *fp = fopen(f, "r");
while (fscanf(fp, "%d", b++) != EOF)
;
return --b-a;
}
/* -- 3.c -- */
#include <stdio.h>
void pt(int *a, int i)
{
while (i-- > 0)
printf("%d\n", *a++);
}
/* -- h.h -- */
int rd(char *, int *);
void pt(int *, int);
213 :
212 :2006/12/06(水) 00:49:54
/* makefile */ /* ccの行の先頭はtabをおく */ a: 1.o 2.o 3.o cc -o a 1.o 2.o 3.o .c.o: cc -c $< 1.o: h.h
あ、1.o: h.h はいらないかも
ぐあ、課題明後日までって忘れてたorz [1]プログラミング演習 [2] 1,Y=sin(X)のグラフを書きなさい。ただし0<X<2πとする 2,名前と点数からなる複数のデータを入力し、点数にしたがって並び替えなさい。 3,(1)文字列を入力しその長さを出力するプログラムを作りなさい (2)数字の文字列を読み込んで、それぞれの数字の出現回数を出力するプログラムを作りなさい 4,次の積分を台形法により求めよ。またシンプソンの積分公式で求めよ ∫sinxdx=1(積分範囲は[0,π/2]) [3]C++ [4]12月7日 [5] その他の制限:特にありません よろしくお願いします。
216 :
デフォルトの名無しさん :2006/12/06(水) 01:48:40
すいません。
>>163 をどなたか教えてもらえませんか?
217 :
211 :2006/12/06(水) 02:03:34
>>212 解答ありがとうございます。
助かりました。
>>215 全部丸投げかよw
どれか一個くらい解け
219 :
◆GJenck4cmw :2006/12/06(水) 02:05:39
[1] 授業単元: 情報処理T [2] 問題文(含コード&リンク): 1万円以上の金額を入力し、必要となる金種別の 枚数計算を行い、結果を配列Aに設定するプログラム をつくれ。ただし、使用する金種は、1万円・千円 百円・十円・一円も5種類のみとし、配列Bに予め 値が格納されているとする。結果は配列Aと配列Bの 内容を印刷せよ。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:Borland C++Compiler 5.5 [3.3] 言語: C++ [4] 期限:2006年12月6日午前8:00 まで [5] その他の制限:C言語を習い始めて3ヶ月と6日です。 1次元配列を習っているところなので1次元配列を 使用した形でよろしくお願いします。
>>218 ごめん、でも全部じゃないんだ。
これでも半分は自力でやって後残りなんだよ。
>>215 俺、前もこのシンプソンの積分問題ちがった形式で見て、答え書いたぞ
シンプソンの積分以外の条件はもう見る気しないから、前はったソース貼るから見て
勝手に考えてちょーだい
//台形公式と2次のシンプソン則に基づく数値積分を行う
#include <stdio.h>
double func(double x);
double integra10(double (*func_p)(double x),double a, double b, unsigned int n);
main(){
double a,b;//区間
unsigned int n;//分割数
printf("積分区間 [a,b]と区間数n a,b,n : ");
scanf("%lf,%lf,%ud", &a,&b,&n);
printf("長方形近似 I=%20.17f\n",integra10(func,a,b,n));
}
double func(double x){ return(2.0/(1.0+x*x));}
double integra10(double (*func_p)(double x), double a, double b, unsigned int n)
{
double dx ; double h0, hn, hsum = 0.0,x , sum = 0.0; unsigned int i;
if(n == 0 && b == a)
return 0;
dx = (b - a)/n; h0 = (*func_p)(a); hn = (*func_p)(b);
for(i = 1, x = a + dx; i < n -1; x+= dx, i++){ hsum += (*func_p)(x); }
if(((h0 + hn + (2 * hsum)) * dx / 2) < 0 )
return (((h0 + hn + (2 * hsum)) * dx / 2) * -1);
else
return ((h0 + hn + (2 * hsum)) * dx / 2);
}
[1] 授業単元:プログラミングT [2] 問題文: 学生の成績データがseisekiというファイルに以下のように格納されて いる。 20060001 88 20060002 97 20060003 58 20060004 77 ・ ・ このファイル内のデータを入力し、@データの組数(学生何人分のデー タが格納されているか)、A成績の最高点と最高点の学生の学籍番号、 B成績の最低点と最低点の学生の学籍番号、C成績の平均点、を求 め、以下の形式で画面に表示するプログラムを作成せよ。なお、最高 点もしくは最低点をとった学生が複数いる場合、それぞれファイルに 近いほうのデータ内の学籍番号を示すこと。
・1から20までの数について3乗の数表を作れ ・次の計算をしろ e=(1/1!)+(1/2!)+・・・+(1/10!) ・データの数n(n≦50),及び,n個の整数データを読み込み 読み込んだデータを読み込んだ順と逆の順で出力(nの値は出力しない)するプログラムを書け なお,各データは1つ以上のスペースを空けて出力すること.
画面への表示形式(・・には数字が入る) 学生数: ・・名 最高点: ・・点、学籍番号・・の学生が該当する。 最低点: ・・点、学籍番号・・の学生が該当する。 平均点: ・・点 ファイル内のデータ組数が多くても、正しく処理できるようにせよ。 (ファイル内のデータをすべてメモリに読み出してから処理するので はなく、ファイルからデータを読み出しながら処理をするようにせよ [3] 環境 [3.1] OS:Unix [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2006/12/06 [5] その他の制限:先日、ファイルの入出力を教えていただいたばかり です。
>>219 配列Bに10000やら1000が初期値として入ってるってこと?
227 :
223 :2006/12/06(水) 02:39:00
225は223の続きです。
>>222 ありがとうございます。
つか最初の問題と難しさが違いすぎるなこれ。
>>221 224が解いた問題です。
229 :
◆GJenck4cmw :2006/12/06(水) 02:55:57
>>219 #include<stdio.h>
int main (void){
int A[5] = {0, 0, 0, 0, 0};
int B[5] = {10000, 1000, 100, 10, 1};
int money, i;
printf("input money: ");
scanf("%d", &money);
for(i = 0 ; i < 5; i++){
while(money >= B[i]){
money = money - B[i];
A[i] = A[i] + 1;
}
}
for(i = 0; i < 5; i++){
printf("A[%d] = %d\n", i, A[i]);
}
for(i = 0; i < 5; i++){
printf("B[%d] = %d\n", i, B[i]);
}
return 0;
}
こういうことかな?
寝ぼけてるので問題読み間違えてたらごめん。
3ヶ月と6日ならこんな感じのプログラムでいいのかな。
231 :
230 :2006/12/06(水) 03:08:09
言語を間違えた吊ってくる
#include <iostream> using namespace std; int main (void){ int A[5] = {0, 0, 0, 0, 0}; int B[5] = {10000, 1000, 100, 10, 1}; int money, i; cout << "input money: " << endl; cin >> money; cout << money << endl; for(i = 0 ; i < 5; i++){ while(money >= B[i]){ money = money - B[i]; A[i] = A[i] + 1; } } for(i = 0; i < 5; i++){ cout << "A[" << i << "] = " << A[i] << endl; } for(i = 0; i < 5; i++){ cout << "B[" << i << "] = " << B[i] << endl; } return 0; }
233 :
232 :2006/12/06(水) 03:20:49
9行目いらねえOTL gdgd
234 :
◆GJenck4cmw :2006/12/06(水) 03:36:42
>>230 できました。゚(゚ノ∀`゚)゚。
ほんとうにありがとうございます。
参考によく考えてみますね。
235 :
215 :2006/12/06(水) 03:38:52
最悪だ言語間違ってた。 でも1問出来たので改めて [1]プログラミング演習 [2] 1,Y=sin(X)のグラフを書きなさい。ただし0<X<2πとする 2,(1)文字列を入力しその長さを出力するプログラムを作りなさい (2)数字の文字列を読み込んで、それぞれの数字の出現回数を出力するプログラムを作りなさい 3,次の積分を台形法により求めよ。またシンプソンの積分公式で求めよ ∫sinxdx=1(積分範囲は[0,π/2]) [3]C [4]12月7日 [5] その他の制限:特にありません よろしくお願いします。
>>235 2-1
#include<stdio.h>
#include<string.h>
main(){
char s[30000];
scanf("%s", s);
printf("%d\n", strlen(s));
return 0;
}
30000字まで。
238 :
デフォルトの名無しさん :2006/12/06(水) 04:08:10
>>237 ありがとうございます。
自分ももうちょい頑張ってみますね
240 :
デフォルトの名無しさん :2006/12/06(水) 04:12:40
241 :
デフォルトの名無しさん :2006/12/06(水) 04:24:36
>>240 自分はこんなプログラムは到底できなかったです。
自分みたいな初心者というか、タコ野郎向けにこんな長いプログラムを書いてもらって、ありがとうございました。
これで、自分以外のタコも救われます。
>>235 2-1
#include<stdio.h>
void main(){
char st[100];
scanf("%s",st);
printf("語長:%d\n",strlen(st));
}
2-2
#include <stdio.h>
#include <ctype.h>
int main(){
char st[100];
int count[10];
char zero='0';
for(int i=0;i<10;i++)count[i]=0;
scanf("%s",st);
for (i=0;st[i];i++){
if(!isdigit(st[i])){
printf("半角数字だけで頼むわ\n");
return 1;
}
count[st[i]-zero]++;
}
for (i=0;i<10;i++)printf("%dの数%d個\n",i,count[i]);
return 0;
}
243 :
242 :2006/12/06(水) 05:31:13
2-1に#include <string.h>つけといて
>>235 2-3 以前貼ったやつの改訂版を書き換えた。前の色々間違ってたが大丈夫だったかな…
#include <math.h>
#include <stdio.h>
#define PI 3.1415926535898
double f(double x) {return sin(x);}
double trapezoidal(double a, double b, int n) {
double s = 0., h = (b - a) / n; int i;
for (i = 1; i < n; ++i) s += f(a + i * h);
s *= 2; s += f(a) + f(b); s *= h / 2;
return s;
}
double simpson(double a, double b, int n) {
double s = 0., c0, c1 = a; int i;
for (i = 0; i < n; ++i) {
c0 = c1; c1 = a + (b - a) * (i + 1) / n;
s += (c1 - c0) * (f(c0) + 4 * f((c0 + c1) / 2) + f(c1)) / 6;
}
return s;
}
int main(void) {
int n = 2; double a = 0, b = PI / 2, a1, a2 = trapezoidal(a, b, n), e = 0.000001;
do {
a1 = a2; a2 = trapezoidal(a, b, n <<= 1);
} while (fabs(a1 - a2) > e);
printf("台形 : S=%f\n", a2, n);
n = 2; a2 = simpson(a, b, n);
do {
a1 = a2; a2 = simpson(a, b, n <<= 1);
} while (fabs(a1 - a2) > e);
printf("シンプソン : S=%f\n", a2, n);
return 0;
}
>>235 間違い発見。さらに修正版。
#include <math.h>
#include <stdio.h>
#define PI 3.1415926535898
double f(double x) {return sin(x);}
double trapezoidal(double a, double b, int n) {
double s = 0., h = (b - a) / n; int i;
for (i = 1; i < n; ++i) s += f(a + i * h);
s *= 2; s += f(a) + f(b); s *= h / 2;
return s;
}
double simpson(double a, double b, int n) {
double s = 0., c0, c1 = a; int i;
for (i = 0; i < n; ++i) {
c0 = c1; c1 = a + (b - a) * (i + 1) / n;
s += (c1 - c0) * (f(c0) + 4 * f((c0 + c1) / 2) + f(c1)) / 6;
}
return s;
}
int main(void) {
int n = 2; double a = 0, b = PI / 2, a1, a2 = trapezoidal(a, b, n), e = 0.000001;
do {
a1 = a2; a2 = trapezoidal(a, b, n <<= 1);
} while (fabs(a1 - a2) > e);
printf("台形 : S=%f\n", a2);
n = 2; a2 = simpson(a, b, n);
do {
a1 = a2; a2 = simpson(a, b, n <<= 1);
} while (fabs(a1 - a2) > e);
printf("シンプソン : S=%f\n", a2);
return 0;
}
[1]ポインタ
[2]
出来なくて困っています。
[1]
200×200の画像を、右下図のようなグラデーションを付けて作成しましょう。
?? プロジェクト名:10grad ファイル名:10grad.c
?? 入力:四角の幅と高さ,出力ファイル名(grad.bmp)
?? 出力:右下に示すようなbmp画像(色にグラデーションを付ける)
?? 数値の入力にatoi関数を利用しましょう
?? 画像のメモリはmalloc関数を用いて動的に確保しましょう
[2]
200x200画素の画像の中心に指定した底辺と高さの三角形
を配置したプログラムを作成しよう。画像は1次元配列で動
的にメモリを確保しよう。
?? プロジェクト名:10triangle ファイル名:10triangle.c
?? 入力:出力ファイル名(triangle.bmp)
?? 出力:例に示すようなbmp画像(色は自由・グラデーションも可)
?? 数値の入力にはatoi関数を利用しましょう
?? 画像のメモリはmalloc関数を用いて動的に確保しましょう
?? ソースファイルと結果のbmp画像をWordに貼り付けて、A4の大きさ
で1ページに印刷して提出しましょう
?? 入力した数値は明記しましょう(値は自由)
?? 画像は白黒でもOKです
例)三角形の画像
詳細は
http://mobiledatabank.jp/s/src/MDBS1055.pdf の練習問題と課題です。よろしくお願いします。
[3]XP
[4]12月10日
>>246 フローチャートまでつけてくれてるのか
親切な先生だなw
248 :
デフォルトの名無しさん :2006/12/06(水) 13:08:55
[1] 授業単元:プログラミングT [2] 問題文: 学生の成績データがseisekiというファイルに以下のように格納されて いる。 20060001 88 20060002 97 20060003 58 20060004 77 ・ ・ このファイル内のデータを入力し、@データの組数(学生何人分のデー タが格納されているか)、A成績の最高点と最高点の学生の学籍番号、 B成績の最低点と最低点の学生の学籍番号、C成績の平均点、を求 め、以下の形式で画面に表示するプログラムを作成せよ。なお、最高 点もしくは最低点をとった学生が複数いる場合、それぞれファイルに 近いほうのデータ内の学籍番号を示すこと。
249 :
デフォルトの名無しさん :2006/12/06(水) 13:09:50
画面への表示形式(・・には数字が入る) 学生数: ・・名 最高点: ・・点、学籍番号・・の学生が該当する。 最低点: ・・点、学籍番号・・の学生が該当する。 平均点: ・・点 ファイル内のデータ組数が多くても、正しく処理できるようにせよ。 (ファイル内のデータをすべてメモリに読み出してから処理するので はなく、ファイルからデータを読み出しながら処理をするようにせよ [3] 環境 [3.1] OS:Unix [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2006/12/06 [5] その他の制限:先日、ファイルの入出力を教えていただいたばかり です。
>>248 学籍番号は8桁、点数は0〜100点、データはdata.txtにあるものと仮定する。
#include <stdio.h>
#include <string.h>
int main(void) {
char gakuseki[9], min_gakuseki[9], max_gakuseki[9];
int num_gakusei = 0, score, max_score = -1, min_score = 101, total_score = 0;
FILE* fp = fopen("data.txt", "r");
if (fp == NULL) return -1;
while (fscanf(fp, "%s%d", gakuseki, &score) != EOF) {
if (score > max_score) {
max_score = score;
strcpy(max_gakuseki, gakuseki);
} else if (score < min_score) {
min_score = score;
strcpy(min_gakuseki, gakuseki);
}
++num_gakusei;
total_score += score;
}
fclose(fp);
printf("学生数: %d名\n", num_gakusei);
printf("最高点: %d点、学籍番号%sの学生が該当する。\n", max_score, max_gakuseki);
printf("最低点: %d点、学籍番号%sの学生が該当する。\n", min_score, min_gakuseki);
printf("平均点: %f点\n", (double)total_score / num_gakusei);
return 0;
}
252 :
デフォルトの名無しさん :2006/12/06(水) 15:37:00
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): 以下の処理を行うプログラムを作成しなさい.ただし,文字列s,t の要素数は50 とすること. strlen(),strcmp()等の関数を使ってはならない. (1) キーボードから文字列を入力し,文字列s に格納する. (2) 文字列sを逆順に並べ替えたものを文字列t に格納する. (3) 文字列sと文字列t が同一であるかどうかを比較し,その結果を画面表示する. [3.1] OS: (Linux) [3.2] コンパイラ名とバージョン: (gcc 3.4) [3.3] 言語: (C/C++) よろしくお願いします。
関数を使ってはならない、か どうやって文字入力をするんだろう
254 :
デフォルトの名無しさん :2006/12/06(水) 15:39:13
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): int型の変数3個(※配列で宣言する)に数値を入力し、その合計を求めて表示する プログラムを作成せよ。 プログラムの作成にあたり、以下に従うこと。 ・入力数値を格納するint型の配列はmain()関数内で宣言すること ・指定された個数の数値の合計を求める関数getsum()を自作して使うこと。 getsum()関数の仕様は以下の通り。 ----- getsum() ---------------------------------------------------- int getsum(int *pnum, int numcnt); 引数 :pnum :数値を格納している配列の先頭アドレス numcnt :和を求める変数の個数 返却値:算出した和 処理 :指定された個数の変数の和を求める ------------------------------------------------------------------- ※getsum()は、「int getsum(int *, const int);」としてもよい 《実行例》 Enter number(1) : 10 Enter number(2) : 23 Enter number(3) : 41 Sum = 74 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 本日中にお願いします [5] その他の制限: 簡単なポインタと配列までは進んでいます。
>254 #include <stdio.h> int getsum(int *pnum, int numcnt) { int i, sum = 0; for(i=0; i<numcnt; i++) sum += pnum[i]; return sum; } int main(void) { int i, a[3]; for(i=0; i<3; i++) { printf("Enter number(%d) : ", i + 1); scanf("%d", &a[i]); } printf("Sum = %d\n", getsum(a, 3)); return 0; }
>>254 #include<stdio.h>
#include<stdlib.h>
int getsum(int* pnum, int numcnt){int res=0;do{res+=pnum[--numcnt];
}while(numcnt);return res;}
int main(void){int ary[3],i,sum;char tmp[100];for(i=0;i<sizeof(ary)/sizeof(int);i++){
printf("Enter number(%d) :",i+1);fgets(tmp,sizeof(tmp),stdin);ary[i]=atoi(tmp);}
sum=getsum(ary,sizeof(ary)/sizeof(int));printf("Sum = %d\n",sum);return 0;}
intの和をintなんかで返すのは何故ですか?と質問した学生時代を思い出した
>252 #include <stdio.h> int main(void) { int i, j; char s[256], t[256]; gets(s); for(i=0; s[i]; i++); for(j=0; j<i; j++) t[j] = s[i-1-j]; t[i] = '\0'; for(j=0; j<i; j++) if(s[j]!=t[j]) break; if(i==j) printf("s=t\n"); else printf("s!=t\n"); return 0; }
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 実数 x と自然数 p に対し、階乗冪 x[p] = x(x-1)‥(x-p+1) を計算する関数 pow_f(x, p) を、再帰的に定義する。 なお、初期条件 x[0] = 1.0 である。まず、漸化式 x[p] = x[p-1] * (x-p+1) を立てる。 正実数および負実数に対して実行せよ。 [3] 環境 [3.1] OS: (Windows/Linux/等々) windowsXP [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) bcc32 [3.3] 言語: (C/C++/どちらでも可 のいずれか) C言語 [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [2006年12月13日まで] [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
>260 double pow_f(double x, int p) { return p ? (x-p+1)*f(x, p-1) : 1.0; }
f → pow_f
263 :
デフォルトの名無しさん :2006/12/06(水) 17:02:09
[1] 授業単元:programming [2] 問題文(含コード&リンク): double型の変数3つ(※配列で宣言する)に値を入力し、その平均値を求めて表示 するプログラムを作成せよ。 プログラムの作成にあたり以下の仕様に従うこと。 ・double型の変数3つはmain()関数内で宣言すること ・double型の変数3つに対する数値入力は別関数inpnum()にて行うこと。 void inpnum(double *dp); 返り値:なし 引数 :dp:数値を格納する変数配列の先頭アドレス 処理 :変数配列に値を入力する ※main()関数内の配列変数を別関数inpnum()にて扱うため、引数として ポインタを用いる ※3変数の入力を促す表示もinpnum()内で行う ・平均値の算出は別関数getave()関数にて行うこと。 double getave(double *dp, int numcnt); 返り値:平均値 引数 :dp :数値変数配列の先頭アドレス numcnt:平均値算出対象変数の個数(3が渡されてくる) 処理 :平均値を算出する 実行例 Enter number(1) : 1.1 Enter number(2) : 5.4 Enter number(3) : 3.2 Average : 3.233333 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 2006/12/6
264 :
デフォルトの名無しさん :2006/12/06(水) 17:03:17
1] 授業単元: プログラミング [2] 問題文(含コード&リンク):下記のプログラムで、ip,jp,kpのポインタのみを使用してi,jの値を入れ替えて表示するようにしなさい。またST型構造体のポインタstpを使用し、st[1].a[4]の値を表示しなさい。 #include typedef struct{ int i; char a[10]; } ST; int main() { int i,j,k; ST st[3]={1,"ABCDE",2,"FGHIJ",3,"KLMNO"}, *stp=st; int *ip=&i, *jp=&j, *kp=&k; i=3 , j=1; ip=&i, jp=&j, kp=&k; ここにi,jを入れ替えるための式を書く何行使ってもよいが、操作できるのはip,jp,kpのみ printf("i=%d j=%d \n", i, j); printf("st[1].a[4]=%c \n",ここにstpを使った式を書く); return 0; } [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: lcc [3.3] 言語: C [4] 期限: 12月10日まで
265 :
デフォルトの名無しさん :2006/12/06(水) 17:11:16
>>264 下記のプログラムというのを正確に書きなおします。
すみません。
#include <stdio.h>
typedef struct{
int i;
char a[10];
} ST;
int main(){
int i,j,k;
ST st[3]={1,"ABCDE",2,"FGHIJ",3,"KLMNO"}, *stp=st;
int *ip=&i, *jp=&j, *kp=&k;
i=3 , j=1;
ip=&i, jp=&j, kp=&k;
ここにi,jを入れ替えるための式を書く。
操作できるのはip,jp,kpのみ
printf("i=%d j=%d \n", i, j);
printf("st[1].a[4]=%c \n",ここにstpを使った式を書く);
return 0;
}
>>265 *ip^=*jp^=*ip^=*jp;
>265 *kp = *ip; *ip = *jp; *jp = *kp; (stp+1)->a[4] or stp[1].a[4] >int *ip=&i, *jp=&j, *kp=&k; >ip=&i, jp=&j, kp=&k; 下のはいらないだろ。
>26.3 #include <stdio.h> void inpnum(double *dp) { int i; for(i=0; i<3; i++) { printf("Enter number(%d) : ", i + 1); scanf("%lf", dp + i); } } double getave(double *dp, int numcnt) { double sum = 0; int i; for(i=0; i<numcnt; i++) { sum += *(dp + i); } return sum / numcnt; } int main(void) { double a[3]; inpnum(a); printf("Average : %f\n", getave(a, 3)); return 0; }
[1] 授業単元: C言語演習 [2] 問題文: 正弦関数sin xを計算する関数を作りなさい。また、標準関数sin(X)と結果を比較しなさい。 [3] 環境 [3.1] OS:windowsXP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:2006年12月14日まで [5] その他の制限 C言語は学習し始めて半年ぐらいです。 それぞれx,sin x, sin(X)の結果が縦に並んだ表のように出力しろとのことでした。
>>270 アルゴリズム?数式のことでいいのかな?
指定されたのは
sin x=x-(x^3/3!)+(x^5/5!)-(x^7/7!)+(x^9/9!)-(x^11/11!)
です
>>271 あーなんで後出しするんだよ
書いちまったのに
あ、付けたし厳禁だったか すいませんです。 ルール破ったからうpしてくれないよねぇ
なんだかんだでどうしても後出ししてしまう事はあるだろうし そこまで原理主義的に対処する気はないが アルゴリズムを指定されているのに書かない理由が理解できない
276 :
RISA :2006/12/06(水) 20:02:01
[1] 授業単元:情報処理基礎実習 [2] 問題文(含コード&リンク): 入力:2次元平面上のn点からなる集合S(ただしどの3点も一直線上にない) 出力:Sの凸包CH(S) (SH(S)とはSを含む凸集合で最小のもの) [3][3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: 2006年12月8日 [5] その他の制限:構造体(struct)を用いること 出来るだけ早く、よろしくお願いします(o>_<o)
急かして得する事は何も無いぞ
>>278 > [3][3.3] 言語: (C/C++/どちらでも可 のいずれか)
が理解できないならやらなくて良いよ
>言語: (C/C++/どちらでも可 のいずれか) C C++ どちらでも可 の三択のようです
>>279 おいおいテンプレコピっただけだろ
どちらでも可と言いたいのなら「のいずれか」はいらないんだし
SH(S)はどうでもいいからCH(S)について説明しろよ あとどう出力するんだ
283 :
デフォルトの名無しさん :2006/12/06(水) 20:17:02
君って屁理屈だねって言われるだろ
>>276 は言語のところ書き忘れただけじゃねーの?
で、入力はどう受け取るんだ?
285 :
RISA :2006/12/06(水) 20:28:54
ごめんなさい。 言語はC++です。 SH(S)はCH(S)の書き間違いです。 出力は何角形になるかを出力したいです。
287 :
RISA :2006/12/06(水) 20:41:10
手打ちです☆
289 :
215 :2006/12/06(水) 20:52:39
>>242 ,244
ありがとう、これで課題もなんとかなりそうだ
290 :
269 :2006/12/06(水) 20:56:15
291 :
デフォルトの名無しさん :2006/12/06(水) 21:03:36
1] 授業単元:C言語 [2] 問題文(含コード&リンク): 30人のテストの得点データを読み込む。 得点は0点以上100点以下である。各点数の人数を求め、その人数を点数毎 に*の数で示しなさい。また、最も多い得点と、最も少ない得点を示しなさい。 [3] 言語: C [4] 期限: 12/10/2006 [5] その他の制限:ポインタなし、if,for文でお願いします。
scanf
[1] 授業単元: C言語基礎 [2] 問題文(含コード&リンク): aからzまで書かれたファイルがあり、これを読み込み読み込んだ順とは 逆に表示させるようにせよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日の朝10時00分〆 [5] その他の制限: お願いします。
>>294 マジ適当。
#include <stdio.h>
#include <stdlib.h>
#define FNAME "a.txt"
int main(){
int size=0,i=0,*str=NULL;
FILE *fp=NULL;
if(!(fp=fopen("r")))
return -1;
fseek(fp,0,SEEK_END);
size = ftell(fp);
fseek(fp,0,SEEK_SET);
str = (int *)malloc(size+1);
while((str[i++] = fgetc(fp)) != EOF);
while(i--)printf("%c",str[i]);
free(str)
return 0;
}
296 :
294 :2006/12/06(水) 22:34:59
>>295 レスありがとうございます。
これは
while((str[i++] = fgetc(fp)) != EOF);
while(i--)printf("%c",str[i]);
の部分が逆に表示させるというか、while(i--)にしているから逆に
表示させることが出来るのですか?つまりwhile(i++)にしていたら通常の
表示になるってことですか?
>while(i--)にしているから逆に表示させることが出来るのですか? そう >つまりwhile(i++)にしていたら通常の表示になるってことですか? 違う while((str[i++] = fgetc(fp)) != EOF)printf("%d",i); while(i--)printf("%c",str[i])printf("%d",i); こうやってiの値でも確認してみ
おっとすまん 二つ目は while(i--)printf("%c %d ",str[i], i);
299 :
296 :2006/12/06(水) 22:43:54
>>297 すいません、今家なんでプログラミングできなくて…。
明日の早朝に行くので早朝じゃないと確認できないです。
>>299 頭の中でiの値を動かしてみるんだ
あとはコンパイラ落として家のPCに入れればいい
[1] C言語 [2] 問題文:名前と点数からなる複数のデータを入力し、点数にしたがって並び替えよ [3] 環境 [3.1] windowsXP [3.3] C言語 [4] 12月8日 [5]その他の制限 よろしくお願いします
302 :
デフォルトの名無しさん :2006/12/06(水) 23:00:45
1] 授業単元: 計算力学 [2] 問題文(含コード&リンク): 変数iとjが15×15のマトリスク方程式を解くプログラムを作成せよ。 右辺ベクトルは既知数とし、境界条件(ノイマン)を用いよ。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限 : 月曜日の朝8:00〆 [5] その他の制限: 出来れば、詳しい説明付きでお願いします><。。。
303 :
デフォルトの名無しさん :2006/12/06(水) 23:05:18
302の追加です 値をキーボードから入力して計算を実行するプログラムです。
304 :
299 :2006/12/06(水) 23:13:18
とりあえず、自分で考えたのは、 #include <stdio.h> #include <string.h> #define COLSIZE 80 int main(void) { char buffer[COLSIZE + 1]; FILE *fp1, *fp2; fp1 = fopen("a.txt", "r"); while(fgets(buffer, COLSIZE + 1, fp1) != NULL){ printf("%s", buffer); } fclose(fp1); return 0; } "a.txt"はa〜zまでが入ったファイル名です。 なんですが、これだと、a〜zまで順に表示してしまいます。 これを変えてz〜aまで順に表示させたいのですが、どうなるでしょうか?
305 :
RISA :2006/12/06(水) 23:16:14
288> 授業で外積を使っているので、角度ではなく、できれば外積を使った方法で行いたいのですがooo
>>305 できれば後から後から条件を追加しないで欲しい。
他にも何かあれば今のうちに言っておこう
307 :
デフォルトの名無しさん :2006/12/06(水) 23:30:30
>292 配列をつかって、scanfで入力です!
308 :
RISA :2006/12/07(木) 00:08:16
main関数以外に他の関数をつかいたいです。 ・3点の位置関係を確認する方法があればよいのではないか。 ・それをどのように使うか。 というのが、アルゴリズム設計のアイデアとして与えられています。
309 :
RISA :2006/12/07(木) 00:14:01
308> どの座標が多角形の頂点となっているかも出力したいです。
310 :
デフォルトの名無しさん :2006/12/07(木) 00:24:32
311 :
248 :2006/12/07(木) 00:27:00
>>251 ありがとう御座いました。お蔭様で期限内に提出することが出来ました。
312 :
デフォルトの名無しさん :2006/12/07(木) 00:32:42
[1]授業単元:アルゴリズム論U [2]問題文:44.44と-0.1111×102を入力し、 この二つの数値を足した結果を表示するプログラムをscanfを用いずに記述する。 [3]環境 [3-1] OS: Windows XP [3-2]コンパイ名とバージョン:Visual Studio 2003 [3-3]言語:C++ [4]期限:14日
313 :
デフォルトの名無しさん :2006/12/07(木) 00:39:18
[1]授業単元:アルゴリズム論U [2]問題文:下記構造体型配列を作る。 データは入力すること。 確認のため各配列要素を表示すること。 20 40 10 50 30 CD GH AB IJ EF [3]環境 [3-1] OS: Windows XP [3-2]コンパイ名とバージョン:Visual Studio 2003 [3-3]言語:C++ [4]期限:14日
314 :
304 :2006/12/07(木) 00:45:33
必要ないのがあったので訂正です。よろしくお願いします。 #include <stdio.h> #define COLSIZE 80 int main(void) { char buffer[COLSIZE + 1]; FILE *fp1; fp1 = fopen("a.txt", "r"); while(fgets(buffer, COLSIZE + 1, fp1) != NULL){ printf("%s", buffer); } fclose(fp1); return 0; }
>>312 #include <iostream>
main(){
char s[100];
fgets(s, 100, stdin);
printf("%lf", 44.44+(-0.1111*102));
return 0;
}
好きに入力しちゃって
>>314 #include <stdio.h>
#define COLSIZE 80
int main(void)
{
char buffer[COLSIZE + 1];
FILE *fp1;
int i, length;
fp1 = fopen("a.txt", "r");
/*
while(fgets(buffer, COLSIZE + 1, fp1) != NULL){
printf("%s", buffer);
}
*/
fgets(buffer, COLSIZE + 1, fp1);
length = strlen(buffer)-1;
for(i=0;i<=length;i++)
{printf("%c", buffer[length-i]);}
fclose(fp1);
return 0;
}
a.txtが単にabc...xyzだけならfgetsは1回でいいかと。
%sはbufferを文字列として一度に出力してしまうので逆にならない。
bufferの文字を添字で(後ろから順に)指定して%cで1文字ずつ出力。
317 :
314 :2006/12/07(木) 01:28:09
>>316 ありがとうございます。
プログラミングのやつを家のPCに入れてコンパイルして実行したのですが
これだとaのみしか表示されませんでした…
>>317 a.txtって
abcdefghijklmnopqrstuvwxyz
だよね?俺は無事にできてるんだけどな
320 :
319 :2006/12/07(木) 01:43:10
321 :
291 :2006/12/07(木) 02:24:51
>391 マルチポストになってしまってすいません。 解決しました!ありがとうございます!
悪と知りつつ悪をなした人間が謝るなよ
323 :
◆xScV5ptEhM :2006/12/07(木) 03:27:18
>>324 >if( EPS < ((fabs(x[i-1] - x[i-2]))/fabs(x[i-2]))
符号の向きちがわね?
>>324 あとさあ、宿題やってる限りはどうでもいいことだけど
cにおいてfloat型の存在は脳から消していいよ
if文の中に記号をごちゃごちゃ入れられると見づらいので よっぽどな事が無い限りは、適当な変数に値を入れ それで比較してくれると可読性が良いので助かる。
なにを言っているんだお前は
妥当に考えて条件のとこだろ
なにを言っているんだお前は
また変なのが来たな
なにを言っているんだお前は
338 :
デフォルトの名無しさん :2006/12/07(木) 12:55:19
挿入ソートの課題で、数字がちゃんと小さい順に並ばないんですが、どこが悪いのかプログラムを見てもらえませんか? それと、このプログラムはステップ1-5 を実行した時点で、ソート済み位置より前の要素 は小さい順に並ぶらしいんですけど、その説明はどういう風にしたらいいでしょうか? #define N 30 // 配列要素の個数 #include <iostream>using namespace std; void main() { int hairetsu[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331,444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 909}; // ソート対象の配列 int sortedPos, pos, insert, insertPos; // ソート済み位置,現在位置,挿入要素,挿入位置 // (1) ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、 // 配列末 尾の要素番号-1になるまで以下の処理を繰り返す。 for ( sortedPos = 0; sortedPos < N; sortedPos++ ) { insert = hairetsu[sortedPos + 1];//ソート済み位置+1の位置に格納されている要素を挿入要素とする。 insertPos = sortedPos + 1;//(1-2) 挿入位置←ソート済み位置+1 pos = sortedPos;// (1-3) 現在位置←ソート済み位置 // (1-4) 現在位置が配列先頭の要素番号以上であり、 // かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。 while ( pos >= 0 && insert < hairetsu[pos] ) { hairetsu[pos] = hairetsu[pos - 1];// (1-4-1) 現在位置の要素を1つ後ろの位置に格納する。 insertPos = pos;// (1-4-2) 挿入位置←現在位置 pos = pos + 1;}// (1-4-3) 現在位置を配列の先頭方向に1つ戻す。 insert = hairetsu[insertPos];}// (1-5) 挿入要素を挿入位置に格納する。 // (2) 配列の各要素を表示する。 for ( int i = 0; i < N; i++ ) {cout << hairetsu[i] << " ";}} よろしくお願いします。
スレ違い
340 :
デフォルトの名無しさん :2006/12/07(木) 13:06:54
すいません、詰めて書いたら動かなかったんで書き直しました。 #define N 30 // 配列要素の個数 #include <iostream> using namespace std; void main() { int hairetsu[N] = {636, 80, 246, 766, 881, 383, 244, 671, 503, 331,444, 723, 916,287, 492, 719, 476, 187, 704, 115,774, 334, 618, 625, 582, 938, 427, 831, 899, 909}; //ソート対象の配列 int sortedPos,pos,insert,insertPos; //ソート済み位置,現在位置,挿入要素,挿入位置 //(1)ソート済み位置を、配列先頭の要素番号-1から1ずつ増やしながら、 // 配列末 尾の要素番号-1になるまで以下の処理を繰り返す。 for ( sortedPos = 0; sortedPos < N; sortedPos++ ) { //(1-1)ソート済み位置+1の位置に格納されている要素を挿入要素とする。 insert = hairetsu[sortedPos + 1]; insertPos = sortedPos + 1;//(1-2)挿入位置←ソート済み位置+1 pos = sortedPos;//(1-3)現在位置←ソート済み位置 //(1-4)現在位置が配列先頭の要素番号以上であり、 // かつ現在位置の要素が 挿入要素よりも大きい限り以下の処理を繰り返す。 while ( pos >= 0 && insert < hairetsu[pos] ) { //(1-4-1)現在位置の要素を1つ後ろの位置に格納する。 hairetsu[pos] = hairetsu[pos - 1]; insertPos = pos;//(1-4-2)挿入位置←現在位置 pos = pos + 1;}// (1-4-3) 現在位置を配列の先頭方向に1つ戻す。 insert = hairetsu[insertPos];}// (1-5) 挿入要素を挿入位置に格納する。 // (2) 配列の各要素を表示する。 for ( int i = 0; i < N; i++ ) { cout << hairetsu[i] << " ";}}
if文の中に記号をごちゃごちゃ入れられると見づらいので よっぽどな事が無い限りは、適当な変数に値を入れ それで比較してくれると可読性が良いので助かる。
文の中に//をごちゃごちゃ入れられると見づらいので よっぽどな事が無い限りは、適当な変数に値を入れ それで比較してくれると可読性が良いので助かる。
テンプレ可ですかw
>>340 ソートされる様修正してみた。コメントは勝手に削除した。
#define N 30
#include <iostream>
using namespace std;
void main()
{
int hairetsu[ N ] = { 636, 80, 246, 766, 881, 383, 244, 671, 503, 331, 444, 723, 916, 287, 492, 719, 476, 187, 704, 115, 774, 334, 618, 625, 582, 938, 427, 831, 899, 909 };
int sortedPos, pos, insertPos;
for ( sortedPos = 0; sortedPos + 1 < N; sortedPos++ )
for ( insertPos = sortedPos, pos = sortedPos + 1; pos > 0 && hairetsu[ insertPos ] > hairetsu[ pos ]; insertPos--, pos-- )
hairetsu[ insertPos ] ^= hairetsu[ pos ] ^= hairetsu[ insertPos ] ^= hairetsu[ pos ];
for ( int i = 0; i < N; i++ ) { cout << hairetsu[ i ] << " "; }
}
化だorz
347 :
デフォルトの名無しさん :2006/12/07(木) 13:42:18
参四伍の師匠、すごいっす。マジ尊敬っす。マジ感謝っす。 おかげ様で今晩はクソして寝れそうです。 ありがとうございました。
またおかしな交換方法使ってるな。
>>345 だれかこの交換方法について説明してくれ
351 :
デフォルトの名無しさん :2006/12/07(木) 15:03:54
お願いします!! [1] 授業単元: プログラミング [2] 問題文(含コード&リンク):行継続の処理をするプログラムを作れ。 一行を文字列として読み込み、その一行を画面に表示するプログラムを作る。 ただし、改行の直前の文字が '\' であったときには、次の行も読み込んで 先の一行に続けるようにすること。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C
>>351 if文の中に記号をごちゃごちゃ入れられると見づらいので
よっぽどな事が無い限りは、適当な変数に値を入れ
それで比較してくれると可読性が良いので助かる。
353 :
◆xScV5ptEhM :2006/12/07(木) 15:10:50
>>330 丁寧な対応ありがとうございました!
参考にさせていただきます。
>>351 #include <stdio.h>
main()
{
int c, prev;
for (prev = 0; (c = getcha
r()) != EOF; prev = c) {
if (c == '\\')&nb
sp;{
if
(prev == '\\') putchar(prev);
} else if (c 
;== '\n') {
if
(prev != '\\') putchar(c);
} else {
if
(prev == '\\')
&n
bsp; putchar(prev);
putchar(
c);
}
}
}
355 :
354 :2006/12/07(木) 15:17:19
すまん張りなおす。 #include <stdio.h> main() { int c, prev; for (prev = 0; (c = getchar()) != EOF; prev = c) { if (c == '\\') { if (prev == '\\') putchar(prev); } else if (c == '\n') { if (prev != '\\') putchar(c); } else { if (prev == '\\') putchar(prev); putchar(c); } } }
356 :
デフォルトの名無しさん :2006/12/07(木) 15:24:38
これって何のプログラムですか?? #include <stdio.h> #include <ctype.h> #define MAX 2048 main() { char aline[MAX+1]; char *strpos; strpos = aline; while((gets(strpos))!=NULL ){ if (aline[strlen(aline)-1]=='\\') strpos = aline + strlen(aline) -1; else { puts(aline); strpos = aline; } } }
357 :
デフォルトの名無しさん :2006/12/07(木) 15:35:18
[1] 授業単元:プログラミング初級 [2] 問題文:二つの変数を入力し、その四則演算の結果を表示するプログラムを作成せよ。 ・main()関数では2つの入力値を格納する変数および四則演算結果を格納する変数 を宣言する ・2変数の入力を行うための関数inp_num()を作成する。関数仕様は以下の通り。 void inp_num(int *数値1へのポインタ, int *数値2へのポインタ); ※main()関数内の変数(数値1と数値2)に対して別関数inp_num()にて値を 書き込むため、引数としてポインタを用いる ※2変数の入力を促す表示もinp_num()内で行う ・四則演算の結果を求める関数calc()を作成する。関数仕様は以下の通り。 int calc(int 変数1, int 変数2, int *足し算結果格納先, int *引き算結果格納先, int *掛け算結果格納先, int *割り算結果格納先 ); 返却値: 0:正常終了 -1:エラー(ゼロ除算が発生する場合) ・ゼロ除算がある時には、割り算以外の結果は表示し、割り算結果はエラーが ある旨の表示を行う 例 Enter number(1) : 23 Enter number(2) : 0 23+0 = 23 23-0 = 23 23*0 = 0 23/0 = Error ←0除算の場合は割り算結果としてErrorを表示する [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 2006年12月8日 [5] その他の制限: 初級ポインタまで習いました。
ついに恐れていた四則演算まで来たか・・・
359 :
デフォルトの名無しさん :2006/12/07(木) 16:26:28
初心者ですが、家帰ってからも誰もやってないなら、書きます。 携帯から書くのは、さすがにダルい(´・ω・`) とにかく文法に慣れなきゃならんから、何も悩まず出来る宿題は有りがたい。
360 :
326 :2006/12/07(木) 17:05:30
×符号の向き ○不等号の向き 寝てなかったから脳がバグってた
361 :
デフォルトの名無しさん :2006/12/07(木) 17:11:56
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク):10000個の乱数を発生させ、それらの平均と標準偏差を計算するプログラムを書きなさい。平均を計算する部分、標準偏差を 計算する部分は、それぞれ、別個の関数とすること。 [3] 環境 [3.1] OS: Linux [3.2] gcc(?よくわかりません。) [3.3] c言語 [4] 期限:できれば明日まででお願いします。 [5] その他の制限: 関数とポインタを勉強中です。 よろしくお願いします!!
[1] 授業単元:計算科学
[2] 問題文 :棄却法による乱数の生成
P(x)=2/π√(1-x^2)に従う確率変数を生成するプログラムをつくろう.
この場合 [a,b] = [-1, 1] であり, pmax=2/π です.
サンプル数?
1000
シード?
128478
と入力すると, 棄却法を利用して p(x) に従う xをサンプル数
だけ生成し,平均, 分散, および -1.0 と+1.0 の間を何個かのビンに分割して
ヒストグラムを出力するプログラムを作ろう.
ビンの個数は, 8,80 など, 何種類か試そう.
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: Visual Studio.NET2003
[3.3] 言語: C
[4] 期限: 2006年12月12日09:00まで
[5] その他
ヒント
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3111.txt を使って作成して下さい。
363 :
302 :2006/12/07(木) 17:19:48
棄却法とは 連続な値をとる確率変数 X に対する確率密度 p(x) が区間 [a,b] 以外では 0 であり,[a,b]内での p(x) の最大値を pmax とします. このとき区間[a,b]の一様乱数 X1 と区間[0, pmax] の一様乱数 X2 を用いて, 次のように X を生成することができます: (1) X1 と X2 を生成する. (2) もし,X2 < p(X1) なら X1 を X として採用する。 (3) (1) に戻る. この手順を繰り返すと,下図の影をつけた部分に点 (X1 ,X2 ) が入ったときにのみ その点のデータが採用されるため,採用された点の X1 は確率密度 p(X1) に従うことになります. この方法を von Neumann の採択・棄却法と呼びます. 確率変数のとる値が有限の区間に限られる場合しか使えないことと, 場合によっては棄却される割合が大きくなり計算の効率が悪くなることが欠点です..
↑間違えました 362です
>>361 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
double ave(int*a,int n)
{
return n==0?*a:(ave(a,n-1)+(((double)*(a+n))/n))/(n+1)*n;
}
double sd(int*a,int n,double ave)
{
return n==0?pow((*a-ave)/10000,2):sd(a,n-1,ave)+pow((*(a+n)-ave)/10000,2);
}
int main()
{
int i;
int a[10000];
double av;
srand(time(NULL));
for(i=0;i<10000;i++)a[i]=rand();
av=ave(a,9999);
printf("%lf\n",av);
printf("%lf\n",sqrt(sd(a,9999,av)));
return 0;
}
>>210 返事遅れてすいません。
どうもありがとうございました。
368 :
デフォルトの名無しさん :2006/12/07(木) 20:50:04
>>365 ありがとうございます。もう大学のパソコンつかえないんで、明日の朝、やってみます!
自宅のパソコンでコンパイラ入れてやってくれよぉ〜〜〜
構造体 struct point { double x; double y; }; を用い、2 次元空間の2 点を対角線とする長方形を示す構造体 struct { struct point p1; struct point p2; }; を、typedef 宣言でrectangle 型と定義し、長方形の面積を求める関数 double area(const rectangle *r) および、重心を求める関数 struct point centroid(const rectangle *r) を作成せよ。これを用いて、2 点の座標を入力して長方形を構成し、その面積と重心を表示するプ ログラムを作成せよ。 座標1 x:1(ENTER) 座標1 y:2(ENTER) 座標2 x:3(ENTER) 座標2 y:4(ENTER) 面積:4.000000 重心:(2.000000, 3.000000)
[1] 授業単元:演習U
[2] 問題文(含コード&リンク):
>>370 [3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 本日の12時まで
[5] その他の制限:
372 :
デフォルトの名無しさん :2006/12/07(木) 23:02:15
[1]授業単元:アルゴリズム論U [2]問題文:下記構造体型配列を作る。 データは入力すること。 確認のため各配列要素を表示すること。 20 40 10 50 30 CD GH AB IJ EF [3]環境 [3-1] OS: Windows XP [3-2]コンパイ名とバージョン:Visual Studio 2003 [3-3]言語:C++ [4]期限:14日
373 :
デフォルトの名無しさん :2006/12/07(木) 23:06:40
[1]授業単元:アルゴリズム論U [2]問題文:単純交換ソート(バブルソート)をソートの途中、 昇順になった時点でソートを終了するように変更して処理効率をあげる。 [3]環境 [3-1] OS: Windows XP [3-2]コンパイ名とバージョン:Visual Studio.NET2003 [3-3]言語:C++ [4]期限:14日
>>372 前にもポストしてたと思うけど
正直問題が何を言ってるのかわからないんだ
構造体の仕様は無いのか
375 :
359 :2006/12/08(金) 00:45:59
>>357 初心者です。間違ってたらごめん。1/2
#include <stdio.h>
void inp_num(int *x, int *y);
int calc(int cal_x,int cal_y,int *add,int *dif,int *mul,int *div);
int main(void)
{
int x,y,add=0,dif=0,mul=0,div=0;
inp_num(&x,&y);
if(calc(x,y,&add,&dif,&mul,&div)) {
printf("%d+%d=%d\n",x,y,add);
printf("%d-%d=%d\n",x,y,dif);
printf("%d*%d=%d\n",x,y,mul);
printf("%d/%d=Error\n",x,y);
}
else {
printf("\n%d+%d=%d\n",x,y,add);
printf("%d-%d=%d\n",x,y,dif);
printf("%d*%d=%d\n",x,y,mul);
printf("%d/%d=%d\n",x,y,div);
}
return 0;
}
376 :
359 :2006/12/08(金) 00:47:20
>>357 2/2
void inp_num(int *x, int *y)
{
printf("二個の数値を、入力してください。\n");
printf("一つ目:");
scanf("%d",x);
printf("二つ目:");
scanf("%d",y);
}
int calc(int cal_x,int cal_y,int *add,int *dif,int *mul,int *div)
{
*add=cal_x+cal_y;
*dif=cal_x-cal_y;
*mul=cal_x*cal_y;
if(cal_y) {
*div=cal_x/cal_y;
return 0;
}
else return -1;
}
377 :
359 :2006/12/08(金) 01:02:33
>>356 NULL文字に当たるまで、ひたすら文字を入力させてそれを吐き出すプログラムだと思う。
っで、\が末尾に入力された場合だけ、入力された元の文字(\は抜く)以降の配列に、次に入力された文字を入れて表示。
よくわからないけど。
378 :
デフォルトの名無しさん :2006/12/08(金) 01:02:37
>>373 #include <iostream>
inline void swappu(int* x, int* y){
int tmp = *x; *x = *y; *y = tmp;}
int awasort(int* x, int size){
for(int lastswappu = 0;size != 0; size = lastswappu,lastswarppu = 0)
for(int i = 0; i < size; i++)
if(x[i] > x[i+1]){
swappu(&x[i], &x[i+1]);
lastswappu = i;}}
int main(void){
int i, n[10] = {1,6,4,7,8,3,4,5,7,9};
for(i = 0; i != 10; i++) std::cout << n[i] << " "; std::cout << std::endl;
awasort(n, 10);
for(i = 0; i != 10; i++) std::cout << n[i] << " "; std::cout << std::endl;
return 0;
}
>>372 #include <cstdio>
#include <cstdlib>
int main(void)
{
struct{
int seisu;
char* moji;
}s[5];
for(int i=0; i<5; i++){
scanf("%2d", &s[i].seisu);
}
for(int i=0; i<5; i++){
s[i].moji = (char*)malloc(3);
scanf("%2s", s[i].moji);
}
printf("%d %d %d %d %d\n", s[0].seisu, s[1].seisu, s[2].seisu, s[3].seisu, s[4].seisu);
printf("%s %s %s %s %s\n", s[0].moji, s[1].moji, s[2].moji, s[3].moji, s[4].moji);
return 666;
}
>>371 #include <stdio.h>
struct point {
double x; double y;};
typedef struct {
struct point p1; struct point p2;
} rectangle;
double area(const rectangle *r){
int x, y;
x = (r->p1.x < r->p2.x) ? r->p2.x - r->p1.x : r->p1.x - r->p2.x;
y = (r->p1.y < r->p2.y) ? r->p2.y - r->p1.y : r->p1.y - r->p2.y;
return x * y;}
struct point centroid(const rectangle *r){
struct point p;
p.x = 0.5 * (r->p1.x < r->p2.x) ? r->p2.x + r->p1.x : r->p1.x + r->p2.x;
p.y = 0.5 * (r->p1.y < r->p2.y) ? r->p2.y + r->p1.y : r->p1.y + r->p2.y;
return p;}
int main(void){
rectangle r;
struct point p;
printf("座標1 x:"); scanf("%lf", &r.p1.x); printf("座標1 y:"); scanf("%lf", &r.p1.y);
printf("座標2 x:"); scanf("%lf", &r.p2.x); printf("座標2 y:"); scanf("%lf", &r.p2.y);
printf("面積:%.6lf\n", area(&r));
p = centroid(&r); printf("重心:(%.6lf, %.6lf)\n", p.x, p.y);}
381 :
デフォルトの名無しさん :2006/12/08(金) 01:59:30
[1] 授業単元:プログラミング1 [2] 問題文:sin,cosのテイラー展開を求めるプログラムを作りなさい。 ・近似式はネットで探してよい ・近似する項数nを対話的に与えること ・θは0から2πの範囲を適当に分割し、各θに対する近似値、真値を求めること (真値は関数sin(角度),cos(角度)で求まる ・出力は、(グラフ化を見越した)表形式にすること [3] 環境 [3.1] OS: (Windows XP) [3.2] コンパイラ名とバージョン: (Borland C++Compiler 5.5) [3.3] 言語: (C言語) [4] 期限: ([2006年12月9日18:00まで] ) [5] その他の制限: (void main(void)以外に、階乗を求める関数をint kaijo(int p)のようにして自分で作り、計算結果をmain関数に返すようにする。)
382 :
デフォルトの名無しさん :2006/12/08(金) 02:01:35
どうかよろしくお願いいたします。 実行結果は以下のようになればよいそうです。 第何項までの近似をしますか:5 角度 sin近似 sin真値 cos近似 cos真値 3.600 0.062791 0.062791 0.998027 0.998027 7.200 0.125333 0.125333 0.992115 0.002115 10.800 0.187381 0.187381 0.982287 0.982287 14.400 0.248690 0.248690 0.968583 0.968583 18.000 0.309017 0.309017 0.951057 0.951057 21.600 0.368125 0.368125 0.929776 0.929776 25.200 0.425779 0.425779 0.904827 0.904827 28.800 0.481754 0.481754 0.876307 0.876307 32.400 0.535827 0.535827 0.844328 0.844328 36.000 0.587785 0.587785 0.809017 0.809017 39.600 0.637424 0.637424 0.770513 0.770513 43.200 0.684547 0.684547 0.728969 0.728969 46.800 0.728969 0.728969 0.684547 0.684547 50.400 0.770513 0.770513 0.637424 0.637424 54.000 0.809017 0.809017 0.587785 0.587785 57.600 0.844328 0.844328 0.535827 0.535827 といった感じに出力されればよいのですが。
>近似式はネットで探してよい ワロタ
>>382 角度が7.2の時の真値が明らかにおかしい件について
386 :
324 :2006/12/08(金) 03:11:08
>>326 仰るとおり向きが違いました。ありがとうございます。
修正してみたのですが、x0=0.5 EPS=0.01のときに-0.000000となるなどやっぱり不安定なようです…
どたなか原因わかりませんでしょうか。
>>329 ありがとうございます。
調べたところfloatは速度が遅く、もう過去のものだと。
そこでdoubleに置換しましたが、今度は値が出ません(汗
double型でも%fであってるし、他におかしいところもなかったように思うんですが…
何がだめなんでしょうか…
387 :
324 :2006/12/08(金) 03:15:20
>>331 あんまりうまく修正できませんでしたが、修正しました。
今後は心がけます。
>>386 double型のscanfは%lfだよ
>>382 #include <math.h>
#include <stdio.h>
//math.hでM_PIが定義されていないコンパイラ用
//#define M_PI 3.14159265358979323846
//#define M_PI_2 1.57079632679489661923
double mynorm(double x){
double pi2=M_PI*2;
x=fmod(x,pi2);
if(x<-M_PI)x+=pi2;
else if(x>M_PI)x-=pi2;
if(x>M_PI_2)x=M_PI-x;
else if(x<-M_PI_2)x=-M_PI-x;
return x;}
double mysin(double x,int kousuu){
x=mynorm(x);
double x2=x*x,y=1;
for(int i=(kousuu<<1)-1;i>=3;i-=2) y=1-x2*y/(i*(i-1));
return x*y;}
double mycos(double x,int kousuu) {return mysin(x+M_PI_2,kousuu);}
void main() {
int kousuu;
printf("第何項までの近似をしますか:");
scanf("%d",&kousuu);
printf("角度 sin近似 sin真値 cos近似 cos真値\n");
double r;
for(double i=3.6;i<=57.61;i+=3.6){
r=i*M_PI*2/360;
printf("%.3f %.6f %.6f %.6f %.6f\n",i,mysin(r,kousuu),sin(r),mycos(r,kousuu),cos(r));
}
}
390 :
389 :2006/12/08(金) 03:17:54
追記 その他の制限に書かれている事はあくまでヒントと判断して従っていない。
391 :
324 :2006/12/08(金) 03:20:07
>>388 本当にありがとうございます。
使ってなかったので忘れていました…
>>386 ニュートン法は初期値が悪いと収束するとは限らないけど
初期値は適切なの?
393 :
324 :2006/12/08(金) 03:24:51
>>392 初期値は与えられたものなので答えはわかりませんが、もしかすると収束しないのかもしれません。
でも今日提出したときに友達が、全部ちゃんと値が出たと言ってたんでやっぱり間違ってたんだなと…
その友達が間違ってたのかもしれませんが
プログラムは分からん時はさっぱり分からんからな よく苦しくなる
一度x全部出力してみてはどうですかお? 値から考えて収束してないとかわかることもありますお
[1] 授業単元:プログラミング [2] int型の値を要素とする2次元配列a[N][N]とb[M][M]が大域変数として用意されている。 ここでNとMはマクロであり、適当な正整数値に定義されているものとする。 これらの配列をそれぞれN次正方行列、M次正方行列とみなし、配列aのrow行col列からheight行width列以内にある要素を配列bにコピーする関数 void copy(int row, int col, int width, int height) を定義せよ。 引数rowとcolは0以上N−1以下の値をとり、heightとwidthは0以上の値をとるものとする。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語 [4] 期限: 2006年12月8日18:00まで [5] その他の制限: 四則演算、繰り返し文、マクロ、2次元配列
課題:1次元配列だけを利用して2次元の行列を表すクラスをC++で作れ。 期限:明後日 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
>>396 bのどこにコピーするかが分からんが
あと当たり前だけどN<Mという条件があるんだよな?
400 :
396 :2006/12/08(金) 04:31:19
>>399 配列bの左上にコピーします。
あと、N<Mという条件も確かにあります。
>>396 void copy(int row, int col, int width, int height)
{
int ekkusu, wai;
if(row < 0 || row > N-1 || col < 0 || col > N-1 || height < 0 || width < 0) return;
for(wai = 0, wai != height && wai < M && row + wai < N, wai++)
for(ekkusu = 0, ekkusu != width && ekkusu < M && col + ekkusu < N, ekkusu++)
b[wai][ekkusu] = a[row+wai][col+ekkusu];
}
げ、いつの間にか条件が増えてる。
>>396 void copy(int row,int col,int width,int height)
{
int i,j;
row--;
col--;
for(i = row;i < height;i++){
for(j = col;j < width;j++){
b[i-row][j-col] = a[i][j];
}
}
}
>引数rowとcolは0以上N−1以下の値をとり、heightとwidthは0以上の値をとるものとする。
は自分で付け足してくれ
404 :
デフォルトの名無しさん :2006/12/08(金) 05:33:43
>>397 おまえのその糞みたいな注:の文を読む前に
配列ってのは、宣言時には確かにそれだけのメモリを用意するが
後の配列に対する演算方法は、ポインタとして扱える。というかポインタなんだが。
そこがわかってんのか?
int a[2][2] ={{1,1},{2,2}};は
int a[4] = {1,1,2,2}と同じなんだよわかる?
で、おまえは2次元の行列っていってるからには
int a[][]みたいな形の事を1次元配列のa[]みたいな形でつくってくだちゃい
っていってんだろうけど、行列とは、行に対して列が対応する様を現す
数字の集合の表現方法なんだよ。
で、おまえは、何行何列の行列がつくりたいんだよ。
int a[2][3]の形なら、2行3列
int a[3][2]の形なら、3行2列
上記を一次元で現すなら
int a[6]
int a[6]
で聞きたいのはクラスを作る必要があんのか?
どうせ実装するなら、何かの型のポインタをメンバにしてnewでコンストラクタで配列作って
デスクトラクタで破棄するって形だろ。
でクラスをつくるのに、operatorやコピーコンストラクタ
行列演算のメンバ関数、転置行列や、逆行列、余因子展開、行列式の行や列の交換
行ベクトル、列ベクトル、ノルム、正規化・・・
おまえのその馬鹿みたいな課題の内容は、中途半端。そのくせ注:文ではやけに横柄。
自分で作れよ。おまえの注:文の最後の言葉をちょっと代えて君に贈る。
各自よく調べ、よく考え、正確な質問をするように。
えへ〜。久々あおりに乗っちゃった〜。
まず「私の有意義な発言に対し」でググった俺クール
うpろだのリンクにアクセス出来ないのは俺だけ?
408 :
382 :2006/12/08(金) 08:26:34
389さんありがとうございました。 <math.h>でM_PIは定義されています。 しかしなぜかコンパイルできませんでした。 16:ここでは宣言できない(関数 mysin ) 17:式の構文エラー(関数 mysin ) 17:未定義のシンボル i(関数 mysin ) 17:ステートメントにセミコロン(;)がない(関数 mysin ) 17:不正な文字' '(0x8140)(関数 mysin ) 18:'x2'に代入した値は使われていない(関数 mysin ) 18:パラメータ'kousuu'は一度も使用されない(関数 mysin ) 25:ここでは宣言はできない(関数 main ) 26:式の構文エラー(関数 main ) 26:未定義のシンボル i(関数 mysin ) 26:ステートメントにセミコロン(;)がない(関数 main ) *** 9 errors in Compile ***
>>408 何行目が何故エラーかまでコンパイラが教えてくれてるんだから、
「なぜか」とか言ってないでそのくらい直してみてはどうかと思う
411 :
デフォルトの名無しさん :2006/12/08(金) 09:19:40
>>365 実行すると
nan
nan
ってなってしまいます。助けてください!
>>408 ごめん17行目に全角スペースはいってた
他はうちでは問題ないから自分で何とかして
nan〜でかっ? それはね
ひょっとしてfor(int i=0;;)とかやるなってことなんかな
>>408 これ試してみて
#include <math.h>
#include <stdio.h>
double mynorm(double x){
double pi2=M_PI*2;
x=fmod(x,pi2);
if(x<-M_PI)x+=pi2;
else if(x>M_PI)x-=pi2;
if(x>M_PI_2)x=M_PI-x;
else if(x<-M_PI_2)x=-M_PI-x;
return x;}
double mysin(double x,int kousuu){
x=mynorm(x);
double x2=x*x,y=1;
int i;
for(i=(kousuu<<1)-1;i>=3;i-=2) y=1-x2*y/(i*(i-1));
return x*y;}
double mycos(double x,int kousuu) {return mysin(x+M_PI_2,kousuu);}
void main() {
int kousuu;
printf("第何項までの近似をしますか:");
scanf("%d",&kousuu);
printf("角度 sin近似 sin真値 cos近似 cos真値\n");
double r,i;
for(i=3.6;i<=57.61;i+=3.6){
r=i*M_PI*2/360;
printf("%.3f %.6f %.6f %.6f %.6f\n",i,mysin(r,kousuu),sin(r),mycos(r,kousuu),cos(r));
} }
>>415 すまんが仕様がわからん。
もう少し詳しく書いてくれん?
417 :
413 :2006/12/08(金) 11:48:07
ごめん。最初のプログラムは縦、横10の正方形の箱にN=20個粒子を入れて(initializeて言う関数ね) van der waalて言う公式を使って、それぞれの粒子にかかる力を計算します。 で、その力によって、一つ一つの粒子の場所やスピードを計算します。 それが、T_MAXになるまでループします。distていう関数はスピードの分布を記録します。 その分布は(マクスウェル・ボルツマン分布)て言われてます。 ま、その質問は自力でなんとかなりました。 今度はそのコードをちょっといじって、一つの粒子の軌道を追います。 (x_curr[1],y_curr[1]とか)それで、原点からの距離を求めよう、と いうやつです。スタート時点のポジションを(x0、y0)(これ、どうやって 出すか分からない)としたら、(x_curr[1]-x0)^2+(y_curr[1]-y0)^2、つまり r^2を出したいのね。 で、やっかいなのが周期型境界条件ってやつなんですが、これは何かというと、 もし粒子のx座標が0より少なくなると、L+xへ移動しますよ、ていうやつ(y も同様) r^2を計算するにはこうしたワープもオッケーじゃないと行けないのだ。で、考えたのが もし、新しいxが0より少なければx_bound[i]にー1を加算。もしxがLより大きければ x_bound[i]に+1を加算。そうすれば、本当の座標はx_curr[i]+x_bound*Lになるはず。。。 と思ったのですがなんか、駄目です。
418 :
413 :2006/12/08(金) 12:01:43
最初のプログラムの方でも何か変なところがあったら、 ご指摘お願いします。
ぱっと見、x0、y0はそれぞれ initialize関数 で保存しておくしかないね。 関数間でいちいち参照渡しするぐらいならグローバル変数のが良くないかい?
>>419 Cマガジンにグローバル変数を使うのは無能の証拠みたいに
書いてあったな
俺もグローバル変数使うだろうけど 楽だし
あ、なんとか条件とか考えてなかったw
>>415 これがオカシイのかどうかはワカランが、読んでいて「あれ?」と思った点
initialize関数なんだけど
for(i=0;i<N;i++){
rnd=(double)rand()/RAND_MAX; // ここで1個の乱数を生成して
gx[i]=(i/5)*2+2;
gy[i]=i*2 +1 -(i/5)*10;
x_curr[i]=gx[i]+2*(rnd-0.5)*dr; // Xの位置
y_curr[i]=gy[i]+2*(rnd-0.5)*dr; // Yの位置
vx[i]=2*(rnd-0.5)*v0; // 速度の方向性
if(rnd<0.5) vy[i]=sqrt(v0*v0-vx[i]*vx[i]);
else vy[i]=-sqrt(v0*v0-vx[i]*vx[i]);
x_prev[i]=x_curr[i]-vx[i]*dt;
y_prev[i]=y_curr[i]-vy[i]*dt;
}
に使用しているけど、これってその度に乱数生成しなくて良いの?
425 :
デフォルトの名無しさん :2006/12/08(金) 14:16:14
[1] 授業単元:情報の基礎個人メニュー [2] 問題文(含コード&リンク): C/C++とVB間で値渡しをするプログラムを作れ。 ヒント:argv [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ: BCC 5.5 VB2005 [3.3] C/C++ VB [4] 期限: 2006年12月11日9:00まで
>>425 コンピュータ専門ならまだわかるが、
その他のがっこならどうかと思う問題だな
[1] 授業単元:アングラ概論 [2] 問題文(含コード&リンク): 銀行口座をハッキングして個人情報を抜け。 ヒント:友達のハッカー [3] 環境 [3.1] SOS: ・・・−−−・・・ [3.2] コンパイル: ぷよぷよ検定10段 [3.3] C/C Lemon [4] 期限: 2006年12月11日9:00まで
1] 授業単元:プログラム言語実習 [2] 問題文(含コード&リンク): 買い物で購入した10000円以下の金額を入力し、支払った金額を入力して おつりと金種及び枚数を求めるプログラムを作成せよ [3] 環境 [3.1] OS: Windows2000 [3.3] C [4] 期限: 2006年12月12日12:00まで
>>428 複数解あるけど全てのパターン列挙するの?
金種は10000、5000、2000、1000、500、100、50、10、5、1という事?
そうではなくて、例えば 1円のものに対して10000円支払った場合に1円玉9999枚のお釣りという答えもあるわけで 枚数が最小になるようにという条件があれば一意に定まるかな
9999枚?馬鹿ジャネーノ?
>>432 可能性があるということと、常識をごっちゃにしてる馬鹿発見
9999枚なんて馬鹿らしいけど案外そうでもないよ 適当なプログラム書くと延々と処理が終わらなかったと思う
おつりをコインの数・札の枚数の合計が最小になるように渡すとき、 その組み合わせは一意的であることを証明せよ
>>436 非常識だろうがなんだろうがここはプログラム板です。
可能性として排除できない場合はそういう場合も考慮するのがプログラム。
そんなことも分からないお前は文系板にでもいってろwwwww
>>435 結構酷いプログラムだな・・・
ループで回すなんて非効率きわまりない。
割り算使えと。
>>438 行間の読めない馬鹿はプログラムするなよな
心底迷惑でジャマばかりしやがる
>>440 横レスだがお前は仕様にないことも独自の判断で勝手にやっちゃうタイプか
いるんだよなそういうはた迷惑な奴
>>441 すくなくとも9999枚なんて非常識なことはしない
中国のクソ外注じゃあるまいし
[1] 授業単元: プログラミング応用 [2] 問題文:以下の整列済み配列を分割せずに統合(マージ)を繰り返せば、 ソートされる。このプログラムを作成し、結果を出力せよ。 [11.34.58.62][20.61][100][250.300][400] [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:gcc? [3.3] 言語:C言語 [4] 期限:06年12月09日PM12:00まで [5] その他の制限:ポインタを使用しろと指示されていますが、よくわかりません 配列それぞれに割り振るということなのでしょうか・・・
9999枚なんて非常識なプログラムを書く奴は現実世界でも9999枚のおつりを渡すアホなんだろうな
>>444 禿同。仕様書にないからといって気の利かないプログラムを書く奴だろそいつは。
9999枚のおつりとかいってるやつは社会常識もないニートだろう。
>>447 禿同。正直そいつらには付き合ってられない。反論するだけ時間の無駄。
自作自演劇場が開催されていると聞いてやってきました
問題の意図が、買い物のシミュレーションなのか、 買い物を比喩にした数学の問題なのかによるし、 買い物のシミュレーションだとして店に無限のつり銭の用意があるのかとか 数学の問題だとして全ての場合を列挙するのかだとか、 曖昧な点が多すぎるわけで、 それを確認もしないで常識を持ち出すのはおかしいだろ。
>>450 買い物のおつりってのは日常的な行為。そこに常識的な判断が入るのは
何らおかしくない。
はい、論破。
先生も大変だな
>>451 非常識な入力がされてもちゃんと動くプログラムじゃないと
いけないわけだが。お前馬鹿だな
なにを言ってるんだお前は。
>>454 1万円を1種類の紙幣、硬貨で表した時、その枚数が他の紙幣、硬貨の枚数と同一にならない事の反証でおk。
しかしながら、どこぞの国では 2000+500+500 = 1000+1000+1000 だったりするから注意
円の話じゃなかったのか?
円の話だな。 誰だっけ、2000円作った人は
>>458 3000 = 2000+1000 で一意
[1] C言語 [2] 文字列として入力された2つの数値を、 char型の配列とint型を使用して四則演算を行う。 実数にも対応させること。 [3] 環境 [3.1] Linux [3.2] gcc4.0.2 [3.3] C [4] 期限: 2006年12月15日 [5] 構造体やポインタの基礎あたり。
>>437 一般のコインでは成立しない。
たとえば1円、3円、5円があるとき6円を作る方法は二通りあって、
どちらも 2 枚の支払いですむため、一意でない。
一般に、与えられたコイン集合から任意の金額が
一意に支払えるかどうかを判定する問題は NP 完全。
ただ、通常のコイン集合の場合に一意なのは簡単で、
貪欲解法がうまくいくことを詰めれば出る。ただしこれも
一般には駄目で、冒頭の例は貪欲はうまくいくが一意でない例。
通常のコイン集合の場合をやっておく:
X 円を支払う最適な方法が二つあったとき、それぞれにおける
1 円玉の数を a, b とおく。a, b < 5 は明らか
(≧5 なら 5円に置き換ればよりよい解になるので最適性に矛盾)。
また、X の 5 での剰余を考えれば a == b (mod 5) も明らか。
よって a = b。X を (X - a) / 5 とスケーリングすれば以下同様。
>>457 よくわからん。
>>437 できた。
m円払いたいとする。1円玉m枚から始める。n円玉k枚(k>=2)をn*k円玉1枚で置き換える操作を
「簡約」と呼ぶ。簡約するたびに枚数は減る。任意の払いかたは初期状態から適当に簡約していけば達成できる。
つまり、どのように簡約しても結局は合流することを示せば良い。
n=iとn=jでi!=jのときの簡約はお互い独立なので、合流するのは自明。
i=jのときの簡約は、日本の貨幣体系では上位の金種の価値が下位のものの倍数であることより、
iとjの大きい方に統一することで合流する。
3円???
466 :
464 :2006/12/08(金) 17:46:44
>iとjの大きい方に統一することで合流する。
いろいろアホだった。
>>463 が正解だな。
駄スレが良スレに進化する瞬間を見た
そして折角良スレになった所をまた元の駄スレに戻そうとする俺
>>469 募集されている技士の要件を満たしてないし、やりかたにも賛同できないので、お断りする。
どうみても宗教です
うわ、見てみたいけどクリックするのもヤバい雰囲気がプンプンするぜ
475 :
413 :2006/12/08(金) 19:27:04
>>474 ジョークだと思ってにやにやしてたのに、真正だったのか…
あれ みんなこいつがム板に立てたスレは読んでないの?
>>479 ここの前のスレでこいつが勧誘にきてたんだよ
とりあえず宣伝っぽいスレタイは大体スルーしてるな。 金になるわけでもなし。
>>480 お前は勧誘にひょいひょいついていくのか?あ?
いいカモだなおい。笑いも出ねえぞ。
483 :
デフォルトの名無しさん :2006/12/08(金) 21:20:31
おっしゃ、俺でもすぐに解ける宿題を質問してくれ! 小難しい厄介な数式、法則を使うような宿題はパスねw
485 :
382 :2006/12/08(金) 21:31:46
414さんありがとうございました。 うまく結果が表示できました。 ただ、cos近似値の計算結果が少しおかしいようなのですが、これはどこか式を作り直せばうまくいきそうですね。 本当にどうもありがとうございました。 でも自分の力でできたわけじゃないから、授業のときには正直にできませんでしたと言うつもりです。 ここのプログラマーの皆さんは本当にすごいですね。 感謝します!!
486 :
デフォルトの名無しさん :2006/12/08(金) 21:34:06
>>484 いや、だから 俺でもすぐに解ける が条件ですw
何でも質問してくれ!って意味じゃないっすw
>>469 要は、「金が欲しい」「おまんこしたい」ってこったろ
489 :
414 :2006/12/08(金) 22:34:25
>>485 うちでは小数点以下6桁程度では項数6以上取れば誤差でないんだが。
どこかコピペミスしてるんじゃねーの
あとcosのマクローリン展開は使ってないからそこ突っ込まれるかもな
マクローリン展開の性質上sinに帰着させた方が良いと俺は思っているが
時間に余裕があったら無理やりcosも使ったバージョンを書くかもしれないから
朝あたり覗いてみて
[1] 授業単元: アルゴリズム [2] 問題文 ・最小値選択法 ・バブルソート ・バブルソートにフラグを追加 ・番兵を用いた挿入法 ・ヒープソート ・クイックソート これらのソートの特徴を書け [3] 期限 2006年12月11日月曜日まで [4] 備考 バブルソートのフラグを追加は理解できました。 フラグがたっている状態=データが既に並んでいる状態になる。ということは理解できました。 ですが、その他の原理が理解出来ません。 スレ違いでしたらスレ汚し申し訳ございませんでした。
授業単元はアルゴリズムとなっておりますが、使用する言語は全てC++なのでこちらのスレで質問させていただきました。
>ソートの特徴を書け なんだからコーディング関係ないしやっぱりスレ違いなんじゃないの?
>>491 を理解させるべきなのか、ただ単に特徴を書けばいいだけなのか悩むな
>>493 スレ違いですか。すいません。
>>494 課題は特徴を書くだけでした。
よろしければ馬鹿にも理解できるようご説明していただけると幸いです。
・最小値選択法 わかりやすい ・バブルソート わかりにくい ・バブルソートにフラグを追加 理解できない ・番兵を用いた挿入法 気持ち悪い ・ヒープソート かっこいい ・クイックソート 趣味が悪い
・最小値選択法 (´・ω・`) ・バブルソート (´・ェ・`) ・バブルソートにフラグを追加 ('A`:) ・番兵を用いた挿入法 ( ̄ー ̄) ・ヒープソート \(゚∀゚)/ ・クイックソート ヽ(´ー`)ノ
>>490 #include<stdio.h>
int main(int argc,char *argv[])
{
FILE *fp;
int c,n;
if(argc==1) return 1;
for(n=1;n<argc;n++){
if((fp=fopen(argv[n],"r"))==NULL){
printf("エラー: ファイル %s をオープンできません。\n",argv[n]);
return 1;}
while((c=fgetc(fp))!=EOF) putchar(c);
fclose(fp);}
return 0;
}
501 :
デフォルトの名無しさん :2006/12/08(金) 23:45:05
503 :
デフォルトの名無しさん :2006/12/09(土) 00:07:48
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 1 11 121 1331 14641 (以下16行まで) 上記のようなパスカルの三角形を作るプログラムを書け。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc (恐らく) [3.3] 言語:C++ [4] 期限:できれば明日の9時半頃までにお願いします [5] その他の制限:if文、while文、for文、一次元配列、二次元配列まで習っています
>>503 スペースがないとぐちゃぐちゃになるがそれでおk?
>>503 とりあえず。
# include <iostream>
int main()
{
const int size = 16;
int pascal[size+2][size+2] = {{0}};
pascal[1][1] = 1;
for(int j = 2; j <= size; j++)
for(int i = 1; i <= j; i++)
pascal[j][i] = pascal[j-1][i-1] + pascal[j-1][i];
for(int j = 1; j <= size; j++)
{
for(int i = 1; i <= j; i++)
std::cout << pascal[j][i];
std::cout << '\n';
}
}
506 :
デフォルトの名無しさん :2006/12/09(土) 00:20:19
511 :
デフォルトの名無しさん :2006/12/09(土) 09:10:17
(1/2) [1] 授業単元:代数 [2] 問題文:LLLアルゴリズムのプログラムをCで作成せよ。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 2006/12/10
512 :
デフォルトの名無しさん :2006/12/09(土) 09:12:05
(2/3) mathematicaで作成したものがあるのですが、Cで書けず悩んでいます。 mathematica版(正しいかどうか分からないですが・・・) (*初期化*) Clear[u]; Clear[gstar]; Clear[a]; Clear[b]; Clear[c]; Clear[i]; y=0; (*関数の定義*) Norm[v_]:=Sqrt[v.v]; u[i_, j_]:=(g[i]. gstar[j])/(Norm[gstar[j]]^2) gstar[i_]:=g[i]-Sum[u[i,j]*gstar[j], {j, 1, i-1}]; GSO[g1_, g2_, g3_, g4_, g5_, g6_, z_]:=Module[{a,b,c}, (*GSO[g[1],g[2],g[3],g[4],g[5],g[6],a]*) (*a行目以降をGSO計算する*) (*Gの成分をGにセット*) G={g1, g2, g3, g4, g5, g6}; (*MとGSTARの成分のセット*) For[a=z, a<=6, a++, gstar[a]; (*GSTARの成分セット*) For[b=1, b<=a, b++, m[a,b]=u[a,b]]; For[c=a+1,c<=6,c++,m[a,c]=0]; ];
513 :
デフォルトの名無しさん :2006/12/09(土) 09:12:44
(3/3) (*Mの成分をMにセット*) M={{m[1,1],m[1,2],m[1,3],m[1,4],m[1,5],m[1,6]}, {m[2,1],m[2,2],m[2,3],m[2,4],m[2,5],m[2,6]}, {m[3,1],m[3,2],m[3,3],m[3,4],m[3,5],m[3,6]}, {m[4,1],m[4,2],m[4,3],m[4,4],m[4,5],m[4,6]}, {m[5,1],m[5,2],m[5,3],m[5,4],m[5,5],m[5,6]}, {m[6,1],m[6,2],m[6,3],m[6,4],m[6,5],m[6,6]}, }; (*GSTARの成分のセット*) GSTAR={gstar[1],gstar[2],gstar[3],gstar[4],gstar[5],gstar[6]}; (*GSOの実行回数をインクリメント*) y++; (*行列の表示*) Print["GSOの計算回数"]; Print[y]; Print["各種行列の表示"]; Print["行列M"]; Print[M]; Print["行列G"]; Print[G]; Print["行列GSTAR"]; Print[GSTAR]; (*G=M. GSTARが成り立つかどうかの検証*) Print["G=M.GSTAR?"]; Print[TrueQ[G==M. GSTAR]]; Print["-------------------------------------------"];
514 :
デフォルトの名無しさん :2006/12/09(土) 09:25:34
>>510 ありがとうございます。
説明不足だったんですが、出力される行を入力したら
このパスカルの三角形が出力されるようにしたいんですけど、
どうしたらいいですか?
>>514 いくらなんでもscanfくらい使えるだろ
ケーキを作って欲しいというからショートケーキを焼いたら 「やっぱりチョコレートケーキが良かったんですけど…」
その通り
>>509 のソースをいじってみる
#include<iostream>
using namespace std;
int main(){int **a;int nMax;cout<<"input = ";cin>>nMax;if(nMax<1)exit(1);
a=new int*[nMax];for(int i=0;i<nMax;i++)a[i]=new int[nMax];a[0][0]=1;
for(int i=1;i<nMax;i++){a[i][0]=1;a[i][1]=i;for(int j=2;j<i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];a[i][i-1]=i;a[i][i]=1;}for(int i=0;i<nMax;i++)
{for(int j=0;j<=i;j++)cout<<a[i][j]<<" ";cout<<endl;}for(int i=0;i<nMax;i++)
delete[]a[i];delete[]a;return 0;}
[1] プログラミング演習 [2] 少なくとも一方が 100万 以下であるような友愛数をすべて表示するプログラムを書きなさい. なお,完全数は除いて出力すること. 2つの自然数 n と m について,n のそれ自身を除く約数の和が m となり, m のそれ自身を除く約数の和が n となるとき,n と m のペアを友愛数と呼ぶ. 例えば,220 と 284 は友愛数 220 の約数は,1,2,4,5,10,11,20,22,44,55,110,220 であり, 1+2+4+5+10+11+20+22+44+55+110 = 284 284 の約数は,1,2,4,71,142,284であり, 1+2+4+71+142 = 220 2つの自然数 n と m について,n=m,すなわち n のそれ自身を除く約数の和が n となるような自然数 n を完全数と呼ぶ (例えば 6). [3] 環境 [3.1] Windows または UNIX [3.2] gcc [3.3] C++ [4] できればこの土日で [5] if,for,while,簡単な関数,1次配列くらいまで習ってます
友愛数は比較的近い数字の組っぽいけど 片方が100万以下ならもう片方がintに収まるって仮定しても大丈夫だよな
簡単そうだしやろうかと思ったがC++か C++覚えようかなあ
C++と指定されてるときってstd::coutを使えということ? #include <cstdio>でprintfは邪道なのかね
書いてみたけど激遅 誰か高速版書いてくれないか #include <iostream> using namespace std; int func(int n) { int sum = 1; for(int i=2;i*i<=n;i++) { if(n%i == 0) { sum += i; if(i != n/i) sum += n/i; } } return sum; } int main() { for(int i=2;i<1000000;i++) { int f = func(i); if(f <= i) continue; if(func(f) == i) { cout << i << " " << f << endl; } } return 0; }
スピード選手権にはCで参加しても良いですか?
C++としてコンパイルできて正常に動けばいんじゃねーの
528 :
521 :2006/12/09(土) 12:47:32
すいませんCでも構いませんです
>>525 よりは少しだけ早い。上界設定がインチキだが。
やってることは 525 と同じだが、func をエラトステネスの篩の変形版で前計算した。
#include <iostream>
using namespace std;
const int n = 1000000;
const int m = 4*n; // margin を4倍くらい取る
int num[m];
int main() {
for (int i = 1; i < m; ++i)
for (int j = i+i; j < m; j+=i)
num[j] += i;
for (int i = 1; i < n; ++i)
if (i < num[i] && i == num[num[i]])
cout << i << "," << num[i] << endl;
}
20000くらいからやってられんくらい遅くなるなあ
532 :
521 :2006/12/09(土) 13:15:26
再度すみません C++でなくCでお願いします
>>532 すでにプログラムは出てるんだからそれ見て書き換えるくらいできるでしょ
表示してるとこ以外はほどんと変わんないんだし
出題者にコピペ以上のスキルはないと思え
>>533 君は丸投げという言葉の意味が分からんのかね?
>>521 速度アップ&でかさアップ.結果が合ってるかは知らん
/* (1/2) */
#include <stdio.h>
#define MAX 1000000
int sum[MAX+1];
int sumDivisor(int value){
int i;
int save_value = value;
int least_prime = value;
for (i=2; i*i<=value; i++){
if (value % i == 0){
least_prime = i; break;
}
}
int power_series = 1;
while (value%least_prime == 0){
value /= least_prime;
power_series = power_series * least_prime + 1;
}
sum[save_value] = sum[value]*power_series;
}
/* (2/2) */ int main(){ int i; sum[1] = 1; for (i=2; i<=MAX; i++){ sumDivisor(i); } for (i=1; i<=MAX; i++){ sum[i] -= i; } for (i=1; i<=MAX; i++){ if (sum[i] > i && sum[i] <= MAX && sum[sum[i]] == i){ printf("(%d, %d)\n", i, sum[i]); } } return 0; }
HAEEEEEEEEEEEEEEEEEE
>>537 「少なくとも一方が 100万以下」 なので範囲が間違ってる。
>>529 のC移植版
#include <stdio.h>
#define N 1000000
#define M 4*N // margin を4倍くらい取る
int num[M];
int main(){
int i,j;
for(i = 1;i < M;i++){
for (j = i+i;j < M;j+=i){
num[j] += i;
}
}
for(i = 1;i < N;i++){
if(i < num[i] && i == num[num[i]]){
printf("%d,%d\n",i,num[i]);
}
}
return 0;
}
>>521 とりあえず
>>540 の倍くらいにはなってるはず。
#include <stdio.h>
#define MAX 1000000
int sum[MAX + 1];
void init(void)
{
int i, j;
for( i = 1 ; i <= MAX ; i++ )
for( j = i * 2 ; j <= MAX ; j += i )
sum[j] += i;
}
int sumDivisor(int n)
{
int i, s = 1;
if( n <= MAX ) return sum[n];
for( i = 2 ; i * i < n ; i++ )
if( n % i == 0 ) s += i + n / i;
if( n % i == 0 ) s += i;
return s;
}
int main(void)
{
int n, m;
init();
for( n = 1 ; n <= MAX ; n++ ) {
if( sum[n] <= n ) continue;
if( sumDivisor(sum[n]) == n )
printf("(%d,%d)\n", n, sum[n]);
}
return 0;
}
>>517 1つお願いがあるんだが。datをうpしてはくれまいか。
ブピュルピュル
誤爆スマソ
546 :
542 :2006/12/09(土) 14:52:50
>>545 今は手元にないが、27代目以外は全部持ってるはず。
551 :
542 :2006/12/09(土) 16:42:54
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 乱数生成の標準ライブラリ関数を利用し、 150以上200以下の整数を10個生成して 画面に出力しなさい。 [3] 環境 [3.1] OS: XPpro [3.2] visual studio2003 [3.3] 言語: C [4] 期限: ([2006年12月15日まで] [5] その他の制限:
>>552 #include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i;
//srand(12345);
for(i=0;i<10;i++)
printf("%d\n", 150+rand()%51);
return 0;
}
554 :
549 :2006/12/09(土) 19:48:36
>>553 seedのセットした方がよりランダムになるんでないの?
>>555 seedのパラメータを固定にするなら、セットしないのと変わらない
#include <time.h> srand(time(NULL));を追加汁!
だれか面白い問題あげてくださいおねがいします
>>559 レベル1
線形リストを用いて名前と住所のデータを入力、追加、削除、表示するプログラムを作れ。
レベル2
めんどくなった
[1] 授業単元:学校の授業じゃない [2] 問題文(含コード&リンク): ブラックジャック、ポーカー、ババ抜き、7並べのいずれか1つの プログラムを作れ。 [3] 環境 [3.1] OS: C言語で作ったプログラムが動くものならなんでも [3.2] bccでもgccでも [3.3] 言語: C [4] 期限: ([2006年年末まで]
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): tanx+40x-8=0の方程式をニュートン法で解くプログラムを作成せよ。 [3] 環境 [3.1] OS: WindowsXP [3.2] borland [3.3] C言語 [4] 期限: 明後日 [5] その他の制限: 特に無し。 よろしくお願いします。
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3127.txt プログラムのmain関数にあるメモリ確保の部分を関数化する。関数名はcreate_nodeとする。(それでmain関数で出力という形です。
それと、二分探索木として、最小値探索を作成せよ。
ただし、最小値の探索の関数は、再帰を使わなくてもかける。
再帰を使った場合と、再帰を使わない場合の、
2種類の関数を作成すること。
[3] 環境
[3.1] OS: WindowsXP
[3.2] visual studio2003
[3.3] C言語
[4] 期限: 15日まで
[5] その他の制限: 特に無し。
よろしくお願いします。
>>559 [1] 授業単元: 単元って何?
[2] 問題文(含コード&リンク): 2ちゃんのトリップを破るコードを書きなさい(りんくなんかねーよ)
[3] 環境
[3.1] OS:Windows
[3.2] すきにしろ
[3.3] 言語: どちらでも可
[4] 期限: 無制限
[5] その他の制限: 量子コンピュータまだか?
>>563 チェックしてない
#include <stdio.h>
#include <math.h>
double f(double x) { return tan(x) + 40 * x - 8; }
double df(double x) { return 1.0 / (cos(x) * cos(x)) + 40; }
int main(void) {
int x = 0.0, pre; // xの初期値は計画的に。
do {
pre = x;
x -= f(x) / df(x);
} while( fabs(x - pre) > 1e-7 );
// ここで x に近似解が入ってるはず
return 0;
}
[1] プログラミング
[2] ニュートン法を用いた解の求め方
[3] 環境
[3.1] OS: WinXP SP2
[3.2] BorlandC++ v5.5
[3.3] C
[4] 期限: 2006/12/10
自力で制作したソースコード
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3128.txt コンパイルエラーが発生。考えてみたけどバグが洗い出せない
/* エラー内容 */
エラー E2188 prog.c 18: 式の構文エラー(関数 main )
エラー E2379 prog.c 18: ステートメントにセミコロン(;)がない(関数 main )
エラー E2188 prog.c 24: 式の構文エラー(関数 main )
警告 W8070 prog.c 34: 関数は値を返すべき(関数 main )
[1] 授業単元: cプログラミング [2] 問題文(含コード&リンク): 底面の半径r、高さがh(2つともdouble型)の円錐の体積を計算結果として返す 関数volume_of_cone() を定義することによって、円錐の体積を出力するCプログラム。 [3] 環境 [3.1] Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: Cのみ [4] 期限: ([2006年12月11日 23:00まで [5] その他の制限:(1) 最初にマクロ定義 #define PI (3.1415926535897932)を入れる (2)関数volume_of_cone() のプロトタイプ宣言を書いて main() 関数を書く。 (3)関数volume_of_cone() を書く
570 :
デフォルトの名無しさん :2006/12/09(土) 23:36:37
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 簡単な grep を作る。 キーワードとファイル名を指定して、ファイル内のキーワードがある行の 行番号とキーワードの位置を示すようにしなさい。 例)fprintf.c から File というキーワードを探す ./a.out File fprintf.c 7: char inFileName[ MAXSTR ], outFileName[ MAXSTR ]; -----------^ ----------------------------------^ 12: strcpy( inFileName, argv[1]); strcpy( outFileName, argv[2]); -----------------^ ------------------------------------------------^ 15: if (( fpr=fopen(inFileName,"r"))==NULL) exit(1); -----------------------^ 16: if (( fpw=fopen(outFileName,"w"))==NULL) exit(1); ------------------------^ [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限:12月13日(水) [5] その他の制限:特になし
>>568 >#define EPS pow(10.0, -8);
>#define KMAX 10;
セミコロンいらない
>>568 cpp32 source.c
で#defineなどの置き換えを行った後のソースが見れるよ
573 :
568 :2006/12/10(日) 00:02:34
>>571 セミコロン抜いたらコンパイルは通りました。ありがとうございます
計算結果がおかしいようなので、処理の修正をやります
>>572 math.h マクロ abs の重複定義なるエラーが出ましたが、
とりあえずcpp32の使い方を教えていただきありがとうございます。
574 :
568 :2006/12/10(日) 00:11:15
>>572 追記
#defineで定義したEPSやKMAXに対して置換された値にセミコロンが付いてたので「何だこれ」というコンパイルエラーをはいてたのですね。
で、それを探すにはcpp32で中身を展開したら手っ取り早いということだったのですね。
ありがとうございます
>>569 #include <stdio.h>
#define PI (3.1415926535897932)
double volume_of_cone(double r, double h);
int main() {
double r,h;
printf("r=?\n");
scanf("%lf", &r);
printf("h=?\n");
scanf("%lf", &h);
printf("answer=%lf\n", volume_of_cone(r,h));
}
double volume_of_cone(double r, double h) {
return r*r*PI*h/3.0;
}
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 再帰による数列計算 第1項・第2項の値を1とし、 直前の2つの項の和を項の値とする数列を「フィボナッチ数列」と言う。 この数列のi番目の項を計算する関数は、 以下のように再帰的に記述することができる。 f(i) = f(i-1) + f(i-2) (i > 1のとき) f(i) = 1 (i = 1のとき) f(i) = 0 (i = 0のとき) キーボードから数字を入力して変数aに格納し、 フィボナッチ数列・第a項の値を計算するプログラムを作成せよ。 項の計算は上の定義を使い、再帰的な呼び出しを実行する関数 int Fibonacci(int i)を作成して呼び出すこと。 ↑と↓の発展版2つのプログラムの作成をお願いします。 【発展】 指定された項の値を計算は再帰を使わなくても可能である。 再帰を使わず(簡単な反復を使って)コードを作成し、どちらの方が有利か比較しなさい。 【ヒント】 CPUの計算時間を取り出す方法(発展) time.hをインクルードし、標準関数clock()を使う。 clock_t clock(void);詳しい使い方は開発環境でヘルプを参照すること。 「clock_t型」や「clock」で検索するとよい。 [3] 環境 [3.1] OS: WindowsXP [3.2] visual studio2003 [3.3] C言語 [4] 期限: 16日までまで [5] その他の制限: 特に無し。 よろしくお願いします。
577 :
デフォルトの名無しさん :2006/12/10(日) 01:59:19
/*********************************************************** fib.c -- Fibonacci (フィボナッチ) 数列 ***********************************************************/ #include <math.h> int fib1(int n) { return (int)(pow((1 + sqrt(5)) / 2, n) / sqrt(5) + 0.5); } int fib2(int n) { int a, a1, b, b1, c, c1, x, x1, y, y1; a = 1; b = 1; c = 0; x = 1; y = 0; n--; while (n > 0) { if (n & 1) { x1 = x; y1 = y; x = a * x1 + b * y1; y = b * x1 + c * y1; } n /= 2; a1 = a; b1 = b; c1 = c; a = a1 * a1 + b1 * b1; b = b1 * (a1 + c1); c = b1 * b1 + c1 * c1; } return x; } //アルゴリズム事典より
>>576 チェックしてないからコンパイル通らないかも
#include <stdio.h>
#include <time.h>
//int Fibonacci(int i) { return (i == 0)?0:(i == 1)?1:Fibonacci(i - 1) + Fibonacci(i - 2); } /* 基本版 */
int Fibonacci(int i) { /* 発展版 */
int a,b,c;
for( b = 1, c = 0 ; i >= 0 ; i--, c = b, b = a ) a = b + c;
return c; // 2項先まで求めてるけど気にするな。
}
int main(void)
{
int a, f;
clock_t st;
printf("i=?"); scanf("%d", &a);
st = clock(); // 計算開始クロック
f = Fibonacci(a);
printf("Fibonacci(%d)=%d\n%.3f[sec]\n", a, f,
(double)(clock() - st) / CLOCKS_PER_SEC);
return 0;
}
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 自己参照型構造体(リスト)を使ってキューを実装し、 以下の操作を行った結果取り出された値を画面に出力しなさい。 1 を追加 2 を追加 3 を追加 4 を追加 取り出し 取り出し 5 を追加 6 を追加 7 を追加 取り出し 8 を追加 取り出し 9 を追加 10 を追加 取り出し 取り出し 取り出し 取り出し 取り出し 取り出し [3] 環境 [3.1] OS: XP [3.2] visualstudio2003 [3.3] C言語 [4] 期限: 明後日 [5] その他の制限: 特に無し。 よろしくお願いします
[1] 授業単元:配列 [2] 問題文(含コード&リンク): 以下のことを実行するプログラムを作成しなさい。 スペースで区切った2つの実数を1つの行として、5行分のデータを読み込む。 1つの行にある2つの実数は、2次元座標上の点P(x,y)を示す。 2つの点の組み合わせ全てに対して、2つの点の座標位置、2つの点の距離を1行として出力しなさい。 (Hint:10行分出力されることになる。2重ループを利用すること。) 最も遠い点のペアを出力しなさい。 (添え字番号のペアとして出力する。同点の場合は、どれでも良いから1つだけ出力する) 原点を中心とした2点の角度が最も大きい点のペアを出力しなさい。 (添え字番号のペアとして出力する。同点の場合はどれでも良いから1つだけ出力する。) 以上です。 これらのことを実行するプログラムを1つ作成しなくてはいけないのですが、 よくわからないので、お願いします。 また以上のことを実行するユーザ定義関数を使ったプログラムもお願いします。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC++ 6.0) [3.3] 言語:C++ [4] 期限:2006/12/11まで [5] その他の制限:とくになし。
まとめサイトをac jpでナマズって自分の母校の奴を探して遊んでみた いた
>>570 /*めんどくさいので出力は適当。タブとかあると崩れる*/
/*例外処理は任せた*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUF 2048
int main(int argc, char *argv[]){
char line[BUF], *keyword, *pos;
int i, n = 0, flag, keylen;
FILE *fp = NULL;
keyword = argv[1];
keylen = strlen(keyword);
fp = fopen(argv[2], "r");
while(NULL != fgets(line, sizeof(line), fp)) {
n++;
flag = 0;
for (pos = line; NULL != (pos = strstr(pos, keyword)); pos += keylen) {
if(flag == 0) {
printf("%d:\t%s", n, line);
flag = 1;
}
putchar('\t');
for (i = 0; i < pos - line; i++)putchar('-');
puts("^");
}
}
return 0;
}
>>586 昨日の夜に質問して期限も15日までだからそう焦るな
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 配列に格納されたデータをソートするプログラムを作成するにあたり、 以下の機能を持つ関数を作成しなさい。 乱数を生成し配列要素に格納する init_array(int *pa, int n) 配列要素を1行で画面に出力する output_array(int *pa, int n) 指定された2つアドレスのデータを交換する swap(int *x, int *y) [3] 環境 [3.1] OS:XP [3.2] visualstudio2003 [3.3] C言語 [4] 期限: 12日まで [5] その他の制限: 特に無し よろしくお願いします
void init_array(int *pa, int n){for(n--;n>=0;n--)pa[n]=rand();} void output_array(int *pa, int n){for(n--;n>=0;n--)printf("%d ",pa[n]); void swap(int *x, int *y){*x^=*y^*x^=*y;}
>>589 >void swap(int *x, int *y){*x^=*y^*x^=*y;}
一つの式の中に同じ変数に対する副作用が複数あるので実行結果は未定義。
誰か18スレと21スレのdat持ってる人いないかな これだけどうしても手に入らない
[1] 授業単元: オペレーティングシステム [2] 問題文(含コード&リンク): 課題 HDRを作っている。 出来たばかりのUNIXのファイルシステムがある(NFS/XFS)。通常はファイルの リストを取るには、"ls"コマンドを使う。現在ではファイルシステムが完成した ばかりなので、これが無くて不便だ。そこで、 "ls"コマンドを作れ。 <参考> まずはi-nodeについてよく調べてみること。特に、実際のUNIXシステムで、本当 に本に書いてある通りになっているかどうか、自分で確認すること。ls -iでな にかはでてくるはず。これがスタートポイントでしょう。wikipediaよりは本を 見た方が良いかも。 他に、i-nodeリスト、物理ディスクと論理ディスク、パーティション、スーパーブロッ ク、などがキーワードになるはず。c言語では、open()、close()、read()、 lseek()が関係するかも。なお、間接ブロックのことは考えなくてOKです。 [3] 環境 [3.1] OS:Linux(UNIX) [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限:12月14日まで [5] その他の制限: 特になし ある程度の概念は理解できたのですが、プログラムの書き方がまったく分からない状態です よろしくお願いします
>>592 /*とりあえずファイル一覧を表示するプログラム*/
/*参考:
http://www.wakhok.ac.jp/~maruyama/Syscall/inode/section3.5.html*/ #include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char *argv[]){
struct dirent *dir = NULL;
DIR *dp = NULL;
if(argc != 2){
printf("usage:\t%s [dir_path]\n",argv[0]);
return 1;
}
if(NULL == (dp = opendir(argv[1]))){
printf("cannot open \"%s\"\n",argv[1]);
return 1;
}
while(NULL != (dir = readdir(dp))){
printf("%s ",dir->d_name);
}
printf("\n");
closedir(dp);
return 0;
}
>>593 >>592 はopendir()のような高級なサーヴィスを使うのではなく、
直接ディレクトリをopen()してディレクトリエントリの情報を読む
ようなプログラムが想定されてる気がする。
たぶん。
>>591 そういやずいぶん昔、まとめサイト作るっていってたやついたな
おまえか?
>>595 作ってもいいよ みたいなことを言ったのはログ検索したら
20日前だった
だから別人かな?
ノシ 作ると断言した記憶は無いが似たようなことを言った奴ならまだ見てるぞ
598 :
デフォルトの名無しさん :2006/12/10(日) 16:46:53
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): ポインタを受け渡しする関数を用いて以下のプログラムを作成せよ 1 3人分の学籍番号、氏名(ローマ字)をそれぞれ配列に格納する。 配列は1次元のchar型で宣言する。 2 画面に以下のメッセージを表示し、キーボードからの入力を待つ。 (1)学籍番号を入力して下さい (2)終了する 3 選択した学籍番号に応じた氏名を画面に表示する。 4 2に戻り(2)を選択するまで処理を繰り返す。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: cygwin [3.3] 言語: C [4] 期限: 12月15日 [5] その他の制限: 学籍番号と氏名は 015:taro 037:ziro 054:hanakoでお願いします。
599 :
592 :2006/12/10(日) 16:57:37
>>594 講師の説明の感じだとopendir()をつかっても問題なかった気がします。
それと593さんありがとうございます。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 配列を使ってリングバッファを実装し、以下の操作を行った結果取り出された値を画面に出力しなさい。 1 を追加 2 を追加 3 を追加 4 を追加 (*) 取り出し 取り出し 5 を追加 6 を追加 (*) 7 を追加 取り出し 8 を追加 取り出し (*) 9 を追加 10 を追加 取り出し 取り出し (*) 取り出し 取り出し 取り出し 取り出し (*) (終了) また(*)がついた処理の後に、キューの表示を実行すること。 [3] 環境 [3.1] OS:XP [3.2] visualstudio2003 [3.3] C言語 [4] 期限: 12日まで [5] その他の制限: 特に無し よろしくお願いします
これがまったくわかりません。 [1] 授業単元: C言語プログラミング [2] 問題文(含コード&リンク): チューリングマシンの動作をシミュレーションするプログラムを作成しなさい. 以下の要件を示します. 1 チューリングマシンのプログラムを記述したファイル名とテープに与えるデータを引数とします. 2 チューリングマシンの途中の実行経過が分かるような出力をしなさい. 実行例 ./a.out program.txt� 10_11_ プログラ ムファイル: program.txt 0 1 1 R 0 0 0 0 R 0 0 _ _ R 1 1 0 0 R 1 1 1 1 R 1 1 _ _ L 2 2 0 1 L 2 2 1 0 L 4 2 _ _ R 3 3 1 _ R 3 3 0 _ R 3 4 1 1 L 4 4 0 0 L 4 4 _ _ L 5 5 1 0 L 5 5 _ 1 R 0 5 0 1 R 0
3] 環境 [3.1] OS:MacOSX [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語: C [4] 期限: 来週中に。 よろしくお願いします。
>>595-597 誰か Wiki でも立ててくれれば適当になんとかするんだが。
俺は管理する気がないのでやらん。
>>601 チューリングマシンったって、人によって定義が違うこともある。
講義で示された定義を厳密にかいとくれ。
あと program.txt の仕様とテープの仕様も。
>>603 Wikiの管理くらいならやってもいいが、
恥ずかしい日記を書いてるとこくらいしかスペースが余ってない
レンタルのWikiとかでもいいのか?
atwikiとか
>>605 レンタルで十分。やってくれるなら助かる。
608 :
デフォルトの名無しさん :2006/12/10(日) 18:31:48
1] 授業単元: 計算力学 [2] 問題文(含コード&リンク): 値をキーボードから入力して計算を実行し、 変数iとjが15×15のマトリスク方程式を解くプログラムを作成せよ。 右辺ベクトルは既知数とし、境界条件(ノイマン)を用いよ。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限 : 明日の朝8:00〆 [5] その他の制限: 出来れば、詳しい説明付きでお願いします><。。。
>>608 問題文が全体的に意味不明。
出題されたとおりの問題をきちんと書き写すこと。
>>612 まとめサイト代わり?
考え無しで作ってしまった
614 :
601 :2006/12/10(日) 19:51:22
チューリングマシンの動作で 初期状態: ヘッドは,与えられたデータの先頭位置にいる テープ上のデータの読み込み: テープ上のデータは1,内部状態は0であるので,プログラムの 1行目が該当する. テープにデータを書き込む: プログラムの1行目で指定された値をテープに書き込む. ヘッドの移動と内部状態の変更: プログラムの1行目で指定された方向(R)に移動. 内部状態も,指定された値(0)に変更. テープ上のデータの読み込み: テープ上のデータは0,内部状態は0であるので,プログラムの 2行目が該当する. テープにデータを書き込む: プログラムの2行目で指定された値をテープに書き込む. ヘッドの移動と内部状態の変更: プログラムの2行目で指定された方向(R)に移動. 内部状態も,指定された値(0)に変更. テープ上のデータの読み込み: テープ上のデータは_,内部状態は0であるので,プログラムの 3行目が該当する. テープにデータを書き込む: プログラムの3行目で指定された値をテープに書き込む. ヘッドの移動と内部状態の変更: プログラムの3行目で指定された方向(R)に移動. 内部状態も,指定された値(1)に変更. とかかれています。
>>610 解決してない宿題のリストとか
解決した宿題の解説とか書く?誰かが
既出の解答については wiki へのリンク貼るだけにするとか? とすると、オレでも解けるレベルの問題が減るわけか…
>>614 全然意味不明。人にわかってもらう気無いでしょ。
俺たちは君と同じ講義を取ってはいないんだよ?
たぶん君はきちんと説明できない人だろうから、
配布された資料またはノートの該当部を全部スキャンして
アップロードすれば誰かやるんじゃないかな。
>>615 未解決のものはwikiに載せなくていいんじゃないかな
正直見にいくの面倒
質問者に解決済みリストを見にいくよう促すだけでいいと思う
>>616 別解という手もある。
でも、少しずつ異なる解が大量に wiki にあふれる可能性もでてくるな
全DATをHTML化して、googleに掘らせれば、それで十分だと思うけどねえ。。。
例えば、素数ってカテゴリを作って、そこに素数関係を集めるとか?
623 :
デフォルトの名無しさん :2006/12/10(日) 21:05:48
配列に文字を入力し、その配列全て足し合わせ、文字と和をファイルに保存する という問題で 1 charの配列に文字列を入力させる。 2 その配列の各 char値を加算する 3 1の文字列と2の結果をファイルに出力する という感じの問題なのはりかいでき #include <stdio.h> int main(){ int x[100],i=0,j,sum=0; while((x[i]=getchar())!='\n' && i<100) i++; for(j=0;j<i;j++) sum+=x[j]; return 0; } 単純に配列の中身をたしているだけの入力した文字コードの合計を求めるプログラムはつくれたのですがこの先どうしていいかわかりません
[1] 授業単元:情報処理W [2] 問題文:数式(y=a*e^-bx+c)のyの値を求めよ。 また数式とx軸に囲まれた決められた範囲の面積を求めよ。 [3] 環境 [3.1] OS:Windows XP SP2 [3.2] コンパイラ名とバージョン:Microsoft Visual C++ [3.3] 言語:C言語 [4] 期限:2006年12月12日 [5] その他の制限:ここでのa,b,c,xの範囲 は入力して決めます。 a=1,b=2,c=3,x=-5〜5 としてyの値と範囲の面積を求めました。 囲まれた面積を台形と考え、0.1や0.01など刻みを入力して求めるようにしました。 上記の入力ではない、数式とx軸が交わるときは誤差が大きくでてしまうので 交わった前後を三角形として考えたいのですが、どうも上手くできません。 よろしくお願いします。
627 :
549 :2006/12/10(日) 22:22:29
>>610 ちょwww
俺も作ってたのにひどいお
ここ1週間くらいの苦労が…
>>627 catはデフォルトで標準出力に出力するんじゃなかったっけ?
もしそうならfp2は常にstdout
>>620 >>11 がそんなんだな
検索エンジンはごぐる様じゃなくって
NAMAZUだけど
>>628 他の人が作ってる可能性まで考慮してなかった ( ´・ω・`)
利用する立場の人間から言えばまあ二つあってもいいんじゃねえの? って感じだけどな wikiは前にもあったけどそれは管理者しか更新できないよう設定してたので 管理者がやる気を失った途端更新されなくなってしまった
>>632 同一の動作をさせたいのに二つ以上のパスが存在するのをそんなに頼もしく聞こえるとは・・・\(^o^)/
>>633 出来てるものが同一じゃないからな
>>11 のは単なる検索付きの過去ログ庫。
S/N比は非常に悪いがとりあえず今までの過去ログはほとんどあがってるから
後は誰かが働かなくてもそこそこ機能する
>>610 のはwiki。
S/N比は過去ログ庫なんか問題じゃなく高い。
更新の手間とか荒らし対策くらいが難点か
>>627 コマンドラインに送る文字列はなんて入れてる?
これってコマンドラインに - が含まれてると stdin stdout 指定
それ以外は ファイルを指定ってことだよね
入力と出力のファイルが同じなのはなぜ?
636 :
627 :2006/12/10(日) 23:21:53
>>635 試すための実行はひとまず ./a.out XXX.txt という感じでしていました
入力と出力のファイルが同じというか
そこをどう指定すれば良いかが分からなくて
if(strcmp(argv[n],"-")==0) {
fp2=stdout;
}
else if((fp2=fopen(argv[n],"w"))==NULL) {
fprintf(stderr,"エラー: ファイル %s をオープンできません。\n",argv[n]);
exit(1);
}
この部分がおかしいとは思うのですが…
>>636 stdinやstdoutをfcloseしたら問題あった気がする
そうだっけ? 少なくともK&Rには問題ないって書いてあったような。
>>639 試しに書いてみたけどfcloseしたら駄目みたい
#include <stdio.h>
int main()
{
FILE *fp = stdout;
fclose(fp);
if(fprintf(fp, "%s", "a") < 0)
fprintf(stderr, "error");
return 0;
}
fcloseした後で使ったらそりゃダメに決まってるだろ 100年ROMってろカス
標準入出力をfcloseするのが問題あるかどうかは知らんがfcloseした後のストリームを使うのはまずいっぽいとは思う。
>642 オマエはどうしようもないカスだな もう一度良く読んでそれでも理解出来ないのなら200年ROMってろ
645 :
635 :2006/12/11(月) 00:07:01
>>645 >オンラインゲーム「ストーンエイジ」のWikiです。
ちょwwwww
ごめん、書き方が悪かったな
言いたかったのは
>>643 と同じ
実際
>>627 のソースではfcloseした後に使う可能性あるから
648 :
635 :2006/12/11(月) 00:10:24
>>636 ミスった
2つめのfor文の
printf("読み込みファイルオープン %s\n",(char*)(argv[n]+1));
これを
printf("入力ファイルオープン %s\n",argv[n]);
に変えといて
649 :
デフォルトの名無しさん :2006/12/11(月) 00:10:44
[1] 授業単元: コンピュータ概論 [2] 問題文(含コード&リンク): 演習 文字列(10文字まで)を入力して、逆順に表示するプログラムを作成せよ。 10文字に満たない場合は、何文字目に\0があるかを調べて、そこから表示する。 (strlen関数は使わないこと) 入力(scanf)のときは%sを使うこと [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン: [3.3] 言語:C [4] 期限:明日 [5]その他の制限:どうしても前にスペースができたりします。よろしくお願いします。
逆順大ブームだな
>>645 たぶん違う
cat a.txt - b.txt
を実行したら、
a.txtの中身を表示->標準入力から入力->b.txtの中身を表示
だと思う
652 :
デフォルトの名無しさん :2006/12/11(月) 00:16:21
>>649 10文字までって決まってるなら
「10−配列番号」すれば逆順になるだろ
「まとめサイト」を名乗るからには全スレのdatがないことには意味が 薄いと思う。でないとそもそも他に存在して欲しくなくて排除したいのか と勘ぐってしまうな。
654 :
635 :2006/12/11(月) 00:20:01
2つ目のミス
最初の(書き込み用ファイルのオープン)
if((fp2=fopen((char*)(argv[n]+1),"a"))==NULL)
モード a を
if((fp2=fopen((char*)(argv[n]+1),"w"))==NULL)
モード w にしといて
訂正版
http://sa-wiki.com/upload/src/up0073.txt >>651 詳しく
>標準入力から入力
何を入力?この入力はどこへ行くの?そもそも
>>636 が何をしたいのかよく分からんかった
入力したものを出力先にどんどん追加していけばいいのかと思ったんだけど
違ったかな?
datを提供してるまとめサイトって見たこと無いな dumperとか2chミラー系ならやってるけど
656 :
デフォルトの名無しさん :2006/12/11(月) 00:28:05
>>649 どうやらソース作ってるみたいだから、見してくれよ!
それ見て直したげるわ
>>654 基本的には引数で与えられたファイルの中身を表示(標準出力に出力)
ファイル出力機能はなし
-(ハイフン)だった場合は標準入力から入力した(通常はキーボードで打ち込んだ)ものを表示(エコーのような動作)
我ながら説明下手だなorz
658 :
デフォルトの名無しさん :2006/12/11(月) 00:36:04
659 :
569 :2006/12/11(月) 00:36:51
>>575 どうもありがとうです。早速、明日試してみます。
>char name[10]; アッー!
663 :
635 :2006/12/11(月) 00:42:42
>>657 あーエコーね
しかしそれなら出力先に入力ファイルと同じもの指定してるのおかしいよな
最初っから fputc(c,stdout);で良かったんだろうに
>>636 の書いてみたソースを見ると入力先、出力先をオプションで指定できるみたいな仕様にしたいのかと思った
>>658 >for(i=0; i--;){
何もせずに終了する予感
664 :
635 :2006/12/11(月) 00:43:59
>>658 文字列苦手な俺がやってみまつたよ
#include <stdio.h>
#define MAX 10
int main() {
int i,j;
char a[MAX+1]="";
printf("%d文字以内の文字を入力して下さい > ",MAX);
scanf("%s",a);
for(i=0; (i<MAX && a[i]!='\0'); i++);
for(j=i-1; j>=0; j--) printf("%c",a[j]);
return 0;
}
>>664 宿題解答の依頼をした者です。すみません。
>>638 stdin/out/err はプログラム終了時及び exit() でクローズされるから、
先にクローズすると問題が有るかも知れない。
でもまぁプログラムが終了した後の話だから目に見える問題は無いと思う。
668 :
635 :2006/12/11(月) 00:50:02
>>666 名前出してよ
で、文意はいかがなもの?
入力したものを出力にどんどん追加していくって物じゃないの?
俺のソースが目的と違う結果なら…
669 :
666 :2006/12/11(月) 00:55:31
catコマンドを作成せよ (fgetc、fputcを用いてみる) というものなので
>>657 に書いてある説明がとても有っているものだとと思いました
670 :
635 :2006/12/11(月) 01:00:28
>>669 できれば宿題解答の依頼の最初の番号のほうが良かったが
たとえば a.txt - b.txt とした場合
a.txtはファイル入力をそのままstdoutに表示
次のだけど - はstdin からってことだけど stdin の入力の終了はどう判断するの
何かしらの判断が無いと 次の b.txt にいけないけど
それとも CTRL+Zで入力終了とするとか?
671 :
666 :2006/12/11(月) 01:02:15
プログラムはctrl+で終了です。 色々と説明不足ですみません。
672 :
635 :2006/12/11(月) 01:02:43
>>669 あーゴメン、なってたね
CTRL+Zで終了
んじゃちょっくら行って来るさー
673 :
デフォルトの名無しさん :2006/12/11(月) 01:06:47
674 :
635 :2006/12/11(月) 01:12:25
>>669 いやいやすまん
一番聞かなきゃいけないこと忘れてた
>>627 の下のコードの場合ファイルが指定されてた場合出力もファイルになってたわけだがファイルに出力という動作も必要なのか?
すべてstdoutに出力…と言うわけじゃないのね?
それともstdinはstdoutでファイル入力はファイル出力でっていうまぁエコー(?)的な動作を望んでるのかな?
675 :
666 :2006/12/11(月) 01:22:25
詳しく言えなくて申し訳ないです。 catコマンドを作れ と言われていただけなので 指定したファイルの中身を表示(すべて標準出力に出力)でファイル出力機能はなし で良いです。
676 :
635 :2006/12/11(月) 01:28:49
677 :
666 :2006/12/11(月) 01:31:54
>>676 どうも。さんクスです
勉強不足で色々迷走してました…
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 自己参照型構造体(リスト)を使ってスタックを実装し、以下の操作を行った結果取り出された値を画面に出力しなさい。 1 を追加 2 を追加 3 を追加 4 を追加 取り出し 取り出し 5 を追加 6 を追加 7 を追加 取り出し 8 を追加 取り出し 9 を追加 10 を追加 取り出し 取り出し 取り出し 取り出し 取り出し 取り出し (終了) [3] 環境 [3.1] OS:XP [3.2] visualstudio2003 [3.3] C言語 [4] 期限: 12日まで [5] その他の制限: 特に無し よろしくお願いします
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): ポインタによる疑似間接参照 要素数が10のint型の配列に キーボードから数値を入力する関数を作成し (main関数の中で)呼び出しなさい。 配列はmain関数の中で宣言し、 入力の関数には配列のアドレスを引数で与えること。 【ヒント】 void input(int *p) [3] 環境 [3.1] OS:windowsXP [3.2] visualstudio2003 [3.3] C言語 [4] 期限: 明日まで [5] その他の制限: なし よろしくお願いします。
682 :
635 :2006/12/11(月) 01:56:35
>>677 どういたしまして
久々に燃えたよw
まぁがんばってね
683 :
デフォルトの名無しさん :2006/12/11(月) 02:22:11
あの、すごく初歩的なことで申し訳ないのですが、 Cのプログラムをbcc32でコンパイルしようとしたら 「インクルードファイル'stdio.h'がオープンできない」 と出てきてしまいました。 クラスパスの設定もしてあるし、原因が分かりません。 誰か教えてください。
マルチ
>>679 #include <stdio.h>
void input(int *p);
int main(void) {
int data[10];
input(data);
return 0;
}
void input(int *p) {
int i;
for (i = 0; i < 10; i++) {
scanf("%d", p);
p++;
}
}
>>678 #include <stdio.h>
void main(void) {
printf("4, 3, 7, 8, 10, 9, 6, 5, 2, 1");
}
>>678 #include<stdio.h>
#include<stdlib.h>
typedef int STACK_TYPE;
#define STACK_TYPE_SPECIFIER "%d"
typedef struct stack_impl_tag {
struct stack_impl_tag *prev;
STACK_TYPE data;
} StackImpl;
typedef struct stack_tag { StackImpl* ptr; } Stack;
int StackPushImpl(Stack *s, STACK_TYPE x) {
if (s->ptr) {
StackImpl *temp;
if (!(temp = (StackImpl*)malloc(sizeof(StackImpl)))) return 0;
temp->prev = s->ptr; s->ptr = temp;
} else {
if (!(s->ptr = (StackImpl*)malloc(sizeof(StackImpl)))) return 0;
s->ptr->prev = NULL;
}
s->ptr->data = x;
return 1;
}
int StackPush(Stack *s, STACK_TYPE x) {
if (StackPushImpl(s, x)) return 1;
else {
printf("スタックへのプッシュに失敗しました.");
return 0;
}
}
int StackPop(Stack *s, STACK_TYPE *x) {
StackImpl *temp;
if (!s->ptr) {
>>678 printf("ポップできません.\n");
return 0;
}
*x = s->ptr->data; temp = s->ptr->prev;
free(s->ptr);
if (temp) s->ptr = temp; else s->ptr = NULL;
printf("ポップしたデータは"STACK_TYPE_SPECIFIER"です.\n", *x);
return 1;
}
void StackInit(Stack *s) { s->ptr = NULL; }
void StackFree(Stack *s) {
StackImpl *t1, *t2 = s->ptr;
while ((t1 = t2) != NULL) {
t2 = t1->prev;
free(t1);
}
}
int main(void) {
Stack s;
STACK_TYPE x;
StackInit(&s);
StackPush(&s, 1); StackPush(&s, 2); StackPush(&s, 3); StackPush(&s, 4); StackPop(&s, &x); StackPop(&s, &x); StackPush(&s, 5);
StackPush(&s, 6); StackPush(&s, 7); StackPop(&s, &x); StackPush(&s, 8); StackPop(&s, &x); StackPush(&s, 9); StackPush(&s, 10);
StackPop(&s, &x); StackPop(&s, &x); StackPop(&s, &x); StackPop(&s, &x); StackPop(&s, &x); StackPop(&s, &x);
StackFree(&s);
return 0;
}
以上。見栄えが悪くなるので、表示とメッセージをPush, Popの中で行うという
暴挙に出ている。が、気にする必要はない。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 自分のウェブサイトへの訪問者を数えて人数を出力するカウンタを作成する場合を考える。 変数はFILE *fpのほか、 int countなど必要と思われるものを用意すること。 人数を格納するファイルは「count.txt」とする。 プログラム(CGI)が実行されると次のような処理を行うと考えられる。 人数を格納しているファイルを開く。(fopen) うまくファイルが開けた場合 ファイルから人数を読み取り、変数countに格納する。 countを1つ増やす。 countの内容を使って、標準出力にメッセージを出力する。 例)「あなたは○○人目のお客様です」 ファイルに、新しい人数を書き込む。 ファイルを閉じる。(fclose) 【ヒント】 新しい人数を書き込む前に、ひとつ処理が必要です。 [3] 環境 [3.1] OS:windowsXP [3.2] visualstudio2003 [3.3] C言語 [4] 期限: 明日まで [5] その他の制限: なし よろしくお願いします。
>>692 flock,かlockfでファイルをロックすることではないだろうか。
ロックするなら読み込む前だろう
>>693 そのタイミングで排他しても役には立たん。"r+"でfopen()することを
想定しているだろうから、
>>692 が正解。
↓のような感じで(ここではfseek()ではなくrewind()を使っている)
#include <stdio.h>
#define COUNTER "count.txt"
int main()
{
FILE *fp;
int count = 0;
/* 本当は排他すべき */
if ((fp = fopen(COUNTER, "r+")) == NULL) {
if ((fp = fopen(COUNTER, "w+")) == NULL) {
perror(COUNTER);
exit(2);
}
} else {
fread(&count, sizeof(count), 1, fp);
}
++count;
printf("あなたは%d人目のお客様です\n", count);
rewind(fp);
fwrite(&count, sizeof(count), 1, fp);
fclose(fp);
return 0;
}
>>691 です
695の解答なんですけど、↓の
ファイルに、新しい人数を書き込む。
という処理がないです。
すみません、自分の勘違いでした。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク 分割コンパイル 引数として受け取ったint型の数値nについて、 1からnまでの総和を計算して返す関数 int sum(int n) nの階乗を計算して返す関数 int fact(int n) を作成しなさい。 ただし、main関数を記述するファイルとは別のファイルに作成すること。 [3] 環境 [3.1] OS:XP [3.2] visualstudio [3.3] C言語 [4] 期限: 13日まで [5] その他の制限: 特に無し よろしくお願いします
>>698 int sum(int n){return n==0?0:n+sum(n-1);}
int fact(int n){return n==0?1:n*fact(n-1);}
>>698 分散コンパイルというからには、distccとか使うのかとおもたよ。
701 :
Avi ◆BER2jLqI72 :2006/12/11(月) 14:05:38
[1] 授業単元:情報実験第2
[2] 問題文(含コード&リンク):短期メモリを用いたタブー検索により、トラベリングセールスマン問題を解くアルゴリズムを設計・実装し、近傍、タブーリストをどのように定義し、パラーメータ調整したかを説明せよ。
また、
http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95/tsp/ にある、gr21,gr48,kroA100を含む実験データを利用すること。
[3] 環境
[3.1] OS: Vine Linux 3.2
[3.2] コンパイラ名とバージョン:gcc version不明
[3.3] 言語: C
[4] 期限: [2006年12月22日まで]
[5] その他の制限: タブー探索について以下の要素を必須とし、設定を説明すること。
近傍、評価値、タブー制約、タブーリストのサイズ、終了条件。
>>701 追記
どうかお願いします。あと、期限は一週間前くらいに変更して下さい。
705 :
りん :2006/12/11(月) 15:09:06
はじめまして。大学でC言語を学んでるものなんですが学校で課題がでて いろいろと教えてもらってプログラムの方はできたのですが、自分では まだよく理解できていません。誰かわかる人がいればソースの説明をして いただけないでしょうか?プログラムは別でのせます。
707 :
りん :2006/12/11(月) 15:13:20
#include <stdio.h> #include <string.h> #define TANGOSU 30 #define MOJISU 20 int main(void) { int i;int tango_index;int count; char buffer[TANGOSU * MOJISU];char splitted[TANGOSU][MOJISU]; char* p; printf("Please enter a statement: "); gets(buffer); p = buffer; tango_index = 0; count = 1; do { p++; if (' ' == *p || '\0' == *p) { strncpy(splitted[tango_index], "", MOJISU); strncpy(splitted[tango_index], p - count, count); tango_index++; count = 0;} else { count++; } } while('\0' != *p); printf("Total %d words. Each words contains;\n", tango_index); for (i = 0; i < tango_index; ++i) { printf("%s: %d letters.\n", splitted[i], strlen(splitted[i])); } return 0; }
ごめん遅れた。 確かにコメントがあればいいね。 勘違いしてれば指摘もしやすいし。
711 :
89 :2006/12/11(月) 15:19:56
>>707 ちょwwwそれ俺のコードwwww
同じ大学の中で出回ってる?wwww
>いろいろと教えてもらってプログラムの方はできたのですが >いろいろと教えてもらってプログラムの方はできたのですが >いろいろと教えてもらってプログラムの方はできたのですが >いろいろと教えてもらってプログラムの方はできたのですが >いろいろと教えてもらってプログラムの方はできたのですが
元々の質問も他スレか一般サイトへのマルチポストのようだし DQNのまわりもDQNか
715 :
711 :2006/12/11(月) 15:29:44
>>713 質問スレに張ったんだし、別にいいんだけどね(^^;
なんかワロタwwww
しまった、GPLにしとけばよかったなw
自分も彼女のためにソース(JAVAだけど)書いたことあるんだけど、 彼女が学校の友達にあげたらそれが出回っちゃって。 チューターも出回ってることに気付いて、結局彼女がそれを提出できなくなった事がある。 リファクタリングしたり変数増やして冗長にしてやった。
初期のBSDライセンスもいいかもなw
718 :
デフォルトの名無しさん :2006/12/11(月) 15:37:28
画像のRGB全ピクセル表示ってどうやるんでしょう?
スレタイ読めないのか?
>>705 まぁでも理解しようとするだけでもえらいね。
或る程度コメントつけたら書き込んでね。
721 :
デフォルトの名無しさん :2006/12/11(月) 16:08:15
[1] 授業単元: 画像処理 [2] 問題文(含コード&リンク):bmp画像をばらばらにする 全ピクセルのRGB情報を取得し、表示する [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 2006年12月15日12:00まで [5] その他の制限: 標準、OpenCVライブラリは使用可です よろしくお願いします
かみはばらばらになった
ばらばらってどういうこった
>>724 俺のエスパー能力ではm×nピクセルの画像を
m×n個の1ピクセルの画像にするのではないかという
気がしている
>>721 さすがに学校はそんな文章で課題は出さないだろ。
出されたまんまのせろよ。
君が自分の言葉で書いたんだろ?
誰も理解してないぞ?
・・・もしそのまんまの文なら学校名がききたい。
727 :
デフォルトの名無しさん :2006/12/11(月) 16:25:30
すみません。 ばらばらとはピクセルごとの情報を取り出したいと言う事です。 よろしくお願いします
パズルのようにバラバラにするんだろ
ピクセルごとの情報とは?
>>726 うちの学校の離散数学のプリントは片言だったりするぞ
作ってるのが日本人じゃないから…
731 :
デフォルトの名無しさん :2006/12/11(月) 16:29:14
追加 口頭でしたので、 ばらばらにするということと、 ピクセルごとの情報を取り出して表示するということを ノートに走り書きしておりました;;
733 :
デフォルトの名無しさん :2006/12/11(月) 16:32:56
>>729 左上の(1,1)から走査して(1,1)(1,2)・・・という
それぞれピクセルの色情報を取得することだと自分で捉えております。
>RGB情報を取得し、表示する どう表示するの? R:G:B = 137:215:191 R:G:B = 17:155:112 R:G:B = 201:65:106 ・ ・ とでも表示するの?
左上は1,1ではない
言うとおりに作る ↓ すみません 条件が間違えていました!
もう質問を却下って事でいいんじゃないかな。 また後だしされてはかなわんよ。
ビットマップの種類は?
739 :
デフォルトの名無しさん :2006/12/11(月) 16:38:52
・次の共用体のメンバーc[3]が示す値を答えなさい。 union { shorta[4]; charb[80]; intc[8]; doubled[2]; } u ; <メモリダンプ> 0000 0000 00 01 05 0A 08 0F BC 7F 94 02 00 0B 04 02 11 23 0000 0010 01 02 03 55 BA 2F 45 BB AD 23 11 45 00 00 00 00 0000 0020 11 22 33 55 EE FF FF BC 23 01 45 67 FE 00 02 01 0000 0030 00 01 05 0A 08 0F BC 7F 94 02 00 0B 04 02 11 23 0000 0040 01 02 03 55 BA 2F 45 BB AD 23 11 45 00 00 00 00 : : すいません、回答お願い致します。 出来れば解説もして頂けると助かります。
741 :
デフォルトの名無しさん :2006/12/11(月) 16:42:34
(0,0)ですね;;すみません
>>734 まさしくそれです!
a(0,0) = RGB(100,100,100);
a(0,1) = RGB(100,100,100);
・
・
のように表示したいです
そのビットマップって1ピクセル4バイトのやつ?
R = (pixel
>>16 )&0xFF;
G = (pixel
>>8 )&0xFF;
B = pixel&0xFF;
RGB情報の取り出しはこれでいいの?
OpenCV使えって事だろ
あら、使用不可に見えてた。 なんだ。じゃあOpenCV使え。
745 :
デフォルトの名無しさん :2006/12/11(月) 17:09:24
?? 使えと言われても;;
以後放置で
何で放置なんだろう。
ここまで聞けば解けそうじゃない?
[1] 授業単元: C言語講座 [2] 問題文(含コード&リンク): 最大10000行かつ1行が最大255文字のテキストファイルがあると する。ファイルの内容を1行ずつ読み込んで格納し、各行を辞書式順序に 並べ替えた後、出力するプログラムを作成せよ。プログラムは以下の関数 によって構成せよ。 1.main関数 2.指定されたファイルの内容をすべて読み込む関数。ただし関数の返り値 は読み込んだデータの行数(int)とし、文字列データを格納するための メモリ領域は動的に確保すること。 3.データを順に表示する関数。 4.2つの文字列へのポインタに対して、それらの値を入れ替える関数。 5.文字列データのソートを行う関数。ソートにはバブルソートを用い、 文字列の比較にはstrcmp関数を用いること。 6.文字列データを格納するために確保したメモリ領域をすべて解放する 関数。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日の朝11時00分までです。 [5] その他の制限: 問題にも書いてありますが、 問題で示した6つの関数によって構成する。 ソートにはバブルソートを用いる。 文字列の比較にはstrcmpを用いる。 大域変数は使用禁止。 よろしくお願いします。
750 :
デフォルトの名無しさん :2006/12/11(月) 17:49:39
ぜんぜん分かりません;; OpenCV備え付けのメソッドにあるんですか?;;
あります getとか名前のついてるものを調べるといい
何の義理もないから別にどうでもいいが。 最初の書き込みでOpenCVがヒントにかかれてたんだから 使うことくらいは分かってたんだろう。 それに、「OpenCV使え」って言って十分だろうとか、うーむ?
>752 うーむ?とか言ってないでてめーがなんとかしろよ、屑が
754 :
748 :2006/12/11(月) 18:30:19
>>721 を読んでも作るべきものがよくわからなかったけど、
ここまで聞けば大体分かったから放置しないで解いてあげてもいいんじゃない?
って意味です。なんか勘違いされてそうな気がしたんで一応。
755 :
デフォルトの名無しさん :2006/12/11(月) 18:32:13
[1] 授業単元:プログラミング [2] 問題文: 西暦1900年から2500年までのうるう年を全て表示するプログラムを作成せよ。 ここでは、西暦を引数としてその年がうるう年であるかを判定する関数を用いよ。 うるう年の定義を以下に記す。 ・4で割り切れない年はうるう年ではない ・4で割り切れる場合に、100で割り切れない年はうるう年 ・4で割り切れてかつ100でも割り切れる場合に、さらに400でも割り切れればうるう年 ・4で割り切れてかつ100でも割り切れる場合に、400で割り切れなければうるう年ではない [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 2006年12月12日 [5] その他の制限: ポインタはまだ習っていません。関数だけでお願い致します。
>>721 環境無いからコンパイルできないが。試してみておくれよ
#include <stdio.h>
#include <cv.h>
int main(int argc, char *argv[])
{
int i, j;
IplImage* src;
int sbpp = ((src->depth & 255)/8) * src->nChannels;
src = cvLoadImage(argv[1]);
for (i = 0; i < src->height; i++) {
unsigned char *rgb = (unsigned char*)src->imageData + (y * src->widthStep);
for (j = 0; j < src->width; j++) {
printf("x,y(%d,%d) = RGB(%d,%d,%d)\n", rgb[2], rgb[1], rgb[0]);
s += sbpp;
}
return 0;
}
759 :
デフォルトの名無しさん :2006/12/11(月) 19:02:11
検索しても判定プログラムはたくさんあるのですが、すべてを表示するプログラムがなかったです・・・
jとiが無いようだが・・・
>>759 うるう年の奴か?
範囲出されてるんやから1年ごと判定せいや
762 :
758 :2006/12/11(月) 19:08:58
おっと・・・全然ダメですな。コピペが祟ったな #include <stdio.h> #include <cv.h> int main(int argc, char *argv[]) { int i, j; IplImage* src; int sbpp = ((src->depth & 255)/8) * src->nChannels; src = cvLoadImage(argv[1]); for (i = 0; i < src->height; i++) { unsigned char *rgb = (unsigned char*)src->imageData + (i * src->widthStep); for (j = 0; j < src->width; j++) { printf("x,y(%d,%d) = RGB(%d,%d,%d)\n", j, i, rgb[2], rgb[1], rgb[0]); s += sbpp; } return 0; }
>>762 ちょっと気になったんだが、間違ってたらゴメン
>int sbpp = ((src->depth & 255)/8) * src->nChannels;
>src = cvLoadImage(argv[1]);
イメージロードする前に src->depth と src->nChannels を使うのはいいのか?
>>763 いや明らかにダメだろw
普通にsegvるはず
無理だおorz ああコンパイルしてえ。
766 :
デフォルトの名無しさん :2006/12/11(月) 19:29:06
コンパイルがダメならリンクをすればいいじゃない
767 :
デフォルトの名無しさん :2006/12/11(月) 19:43:56
[1] 授業単元:Cプログラミング [2] 問題文: 変数valueの12ビット目〜15ビット目(4ビット)をチェック(ビットテスト)して、 ゼロであれば上位2バイトに1を代入、ゼロ以外であれば、2を代入する文を示しなさい。 (32bitのデータです) intvalue; [3] 環境 [3.1] OS: (Windows) [3.2] bcc [3.3] C言語 [4] 期限: 明日まで [5] その他の制限: (ビットフィールドを使用して作成する) すみません、宜しくお願い致します。
771 :
770 :2006/12/11(月) 21:05:03
>>767 if( p->n4Bits )
↓
if( p->n4Bits == 0 )
772 :
767 :2006/12/11(月) 21:13:13
>>770 有難うございます。これから内容をじっくり見てみます!
773 :
767 :2006/12/11(月) 21:22:40
何度もすみません。767の問題なのですが、ビットフィールドを使わずに 処理する場合はどういう風になるでしょうか。 上位2バイトが1になるということは16ビット分全部1という事なのでしょうか。 宜しくお願い致します。
774 :
デフォルトの名無しさん :2006/12/11(月) 21:31:21
775 :
767 :2006/12/11(月) 22:20:50
776 :
749 :2006/12/11(月) 22:49:32
すいませんが、どなたか解答頂けないでしょうか?
777 :
デフォルトの名無しさん :2006/12/11(月) 22:50:07
>>739 union はデータの先頭を各メンバに割り当てる。
int が 4Byte であると仮定すると c[3] は 0x04021123 が該当する。
ちなみに union のサイズはメンバ中の最大サイズにより決定するので例では b の80byteとなる。
c[3] が10進数としていくつを表すかは環境により異なるので、以下の実行結果で求めよ。
char a[] = { 0x04, 0x02, 0x11, 0x23 };
int* b;
b = (int*)a;
printf( "%d\n", *b );
779 :
デフォルトの名無しさん :2006/12/11(月) 23:26:30
>>778 6-4 ひんと。
scanf("%f%[+-*/]%f",&a,&c,&b);
switch(c){
case '+': …
>>749 この問題の仕様には矛盾があるなぁ。出題者が素人かと。
2.で『格納する領域は動的に確保』とあるから普通に考えると『読み込んだ文字数+1』を確保する様に
思える。
よって各行毎に領域のサイズが異なる事になる。
しかし、4.で『2つの文字列へのポインタに対して、それらの値を入れ替える』とあるけどサイズが異なる
から strcpy() は使えない。
この矛盾を回避するには2.での領域確保を固定長(255+1)とするか、4.を『2つの文字列へのポインタ
へのポインタに対して、それらの値を入れ替える』に変更する必要がある。
前者の場合、ソート効率が悪すぎるので後者が妥当かと思える。
まぁ明日締め切りでは確認もできないわなぁ...
782 :
デフォルトの名無しさん :2006/12/12(火) 00:18:32
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS:Windows [3.2] VC2005 MFC [3.3] 言語: C++ 質問ぽい感じなんですけどPolylineで(10,10)から(10,11)に線を引きたい時ってPOINT型にこの座標入れてやると 1ピクセルの点になってしまうのは仕様ですか?2ピクセル分じゃなくて1ピクセルの点になってしまいます。 これは始点か終点どちらが削られているんですか? お答えお願いします!
>>782 Polylineってなんだよ?
そういうことはそれを作ったやつに聞け
784 :
739 :2006/12/12(火) 00:28:18
785 :
767 :2006/12/12(火) 00:32:02
回答いただいたのですが、どうもまだイマイチ飲み込めません。 ビットフィールドを使用する方なのですが、恐縮ですが解説、もしくは ヒントと共に今一度ご教授いただけないでしょうか?
>>781 メモリを動的に確保と言ってるだけだから
ようはスタティックに strtemp[256] と確保するなと言うだけで
動的にmallloc(255+1)で確保すればいんじゃないか?
788 :
781 :2006/12/12(火) 00:53:43
>>786 それでも良いんだけどね...バブルソートするときに strcpy しまくるのはいかがなものかと...
問題文を読み直したら『ポインタの値を入れ替える』だから、引数をポインタのポインタで与える様にも
読めるかなぁ。単にイチャモンつけてた様な気分。
>>780 回答ありがとうございます
さっそくそのヒントを得てない頭振り絞ってやってみたんですがどうもだめなのですが
#include <stdio.h>
void main(void)
{
int a,b,c;
printf("演算を入力してください:");
scanf("%f%[+-*/]%f",&a,&c,&b);
switch(c){
case '+':printf("\n%.1f+%.1f=%.1f",a,b,a+b);
break;
case '-':printf("\n%.1f-%.1f=%.1f",a,b,a-b);
break;
case '*':printf("\n%.1f*%.1f=%.1f",a,b,a*b);
break;
case '/':printf("\n%.1f/%.1f=%.1f",a,b,a/b);
break;
default :printf("エラー");
}
}
これではだめなのでしょうか?
[1] 授業単元:データ構造 [2] 問題文(含コード&リンク): Insertion sort,Merge sort, Heap sort, Quick sort, Randomized quick sort,Selection sortをC言語プログラムで作成し、それぞれのデータ数に対する命令実行回数の計測、評価をする。 各データの総数10万個 ASC||テキスト形式で、1行に1データ [3] 環境 [3.1] OS:Mac [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:2006年12月15日 よろしくお願いします
791 :
デフォルトの名無しさん :2006/12/12(火) 01:13:29
792 :
781 :2006/12/12(火) 01:13:40
>>749 勝手に解釈して書いてみたけど90ステップくらいあるので直接書くの面倒くさい。
どっか適当な晒し場所教えれ。
2時までにレスあれば晒すわ。
796 :
792 :2006/12/12(火) 01:54:14
>>797 うほっ!ありがとうございました!終点を書かないとはけしからん仕様ですな。
たしかにVGAでx座標が[0-640]だったら長さがが641になってしまうなw
800 :
787 :2006/12/12(火) 02:32:32
もう一度考えてみたけどやっぱりわかりませんでした。 このまま期限まで考えてるつもりですが、昨日から自分の中で全く発展がないので正直自信がないです。 どうか僕に突破口を与えてください。どなたかお願いします。
802 :
デフォルトの名無しさん :2006/12/12(火) 04:24:50
>>778 ヒント
>int a,b,c;
>printf("演算を入力してください:");
>scanf("%f%[+-*/]%f",&a,&c,&b);
↑だと
a,b,c は整数型
%fは浮動小数点数型
>>802 すみません
よそで教えてもらったのでもう結構です
804 :
デフォルトの名無しさん :2006/12/12(火) 04:59:51
>>803 マルチレスやめてくれ。
泣きたくなる。
>>804 おまいはよく頑張った。これからも答えてやってくれ。
てか俺が思うに
>>803 は成りすましだと思うんだがな。IDがでないことをいいことにさ。
↑ この人キモいです
>>564 ですけど、明日の早朝6時までにお願いします。
総長にでも頼もう>性帝トーマス氏w
809 :
749 :2006/12/12(火) 06:55:59
>>781 レス遅くなって申し訳ないです。解答ありがとうございます。
ポインタへのポインタについて解説していたので後者の4を『2つの文字列への
ポインタへのポインタに対して、それらの値を入れ替える』に変更だと思いま
す。
問題にミス(?)があったようなので提出期限が延びると思いますし、
>>781 さん
が教えて下さった解答を見て自分でも考えてみようと思います。
疑問があったら質問するかもしれませんがよろしくお願いします。
>>787 コード読んだけど何やりたいかわからん。
なんでアルファベットの出現頻度調べるのに2分木使うんだ?
読み込むファイルのフォーマットもわからんし。
単語入力するところはバグってるし。
あのコード流用しないといけないのか?
>>810 仲間いた。
俺も回答してあげたかったけど何したいかよく解らん。
しかも ReadBuffer をグローバル変数で定義して関数間の受け渡しに使ってるとか超ゴミソースなので
ちゃんと読む気も起きなかった。
>>787 あのソースが出題の一部だとするなら...その学校は辞めた方が良いだろう。
>>564 期限変わったん?
二分探索木って事はまず二分木をソートするって事?
813 :
デフォルトの名無しさん :2006/12/12(火) 09:49:09
【質問テンプレ】 [1] 授業単元: 情報工学実験 [2] 問題文(含コード&リンク): ファイル関数を扱う問題で test1.txt asdsdfga dsda test2.txt ssasfgda fsda と二つのテキストファイルが有る。この文字をファイル関数を使い配列に読み込み逐次比較したい。 比較し、同じ文字であれば1を計上し、異なれば0を計上し最終的に合計スコアを出力する。 例えば上記の場合、最初はaとsが比較されスコアは0。次にはsとsが比較されスコアは1を計上する。 [3] 環境 [3.1] OS: Windows/Linux [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: C [4] 期限: ([2006年12月15日23:59まで
814 :
813 :2006/12/12(火) 09:50:11
一文字づつ比較というのが上手くいきません。 よろしくおねがいします。
>>814 if(str[i] == str2[i])
818 :
せんせ :2006/12/12(火) 10:26:08
>>813 こらー 吉田ぁー 自分で解けって言っただろがぁー
吉田w
[1] 授業単元:Cプロ入門演習2 [2] 問題文(含コード&リンク): 最小公倍数・最大公約数を求める関数を作成し、それを利用するプログラムを作成せよ。関数は下記の通りとする。 void lcm_gcm(int in0,int in1,int *lcm,int *gcm) lcm最小公倍数(のポインタ) gcm最大公約数(のポインタ) 戻り値なし 入力に関して キーボードから、入力値をスペース1つあけて1行で入力する。 出力に関して 最小公倍数、最大公約数の順番でスペース1つあけて出力(+改行) [3] 環境 [3.1] OS: WindowsXPSP2 [3.2] study Cとかいうやつ [3.3] 言語: C [4] 期限: 12/20まで [5] ポインタまで これともう一問あるのでお願いします
>授業単元:Cプロ入門 何のプロになるんだ?丸投げのプロか?
うそお
>>820 void lcm_gcm( int in0, int in1, int *lcm, int *gcm )
{
int i;
for ( i = 2, *lcm = 1; i <= in0 / 2; i++ ) if ( in0 % i == 0 && in1 % i == 0 ) *lcm = i;
if ( in0 % in1 == 0 ) *lcm = in1;
if ( in1 % in0 == 0 ) *lcm = in0;
*gcm = in0 * in1 / *lcm;
}
void main( void )
{
int in0, in1, lcm, gcm;
scanf( "%d %d", &in0, &in1 );
lcm_gcm( in0, in1, &lcm, &gcm );
printf( "%d %d\n", lcm, gcm );
}
[1] 授業単元:Cプロ入門演習2
[2] 問題文(含コード&リンク):
void prime(int in,int *array, int *index)
in入力値
array素数が照準に格納されている配列(のポインタ)
indexarray に現在格納されている数(のポインタ)
in が素数であれば prime()内で+1すること。
戻り値なし
void print_array(int *array,int num)
array 素数が昇順に格納されている配列(のポインタ)
num出力すべき素数の数
戻り値なし
入力に関して
キーボードから、入力値(+改行)のみ入力する。
出力に関して
小さいものから順にスペース1つあけ、改行をいれずに出力。入力値分出力したら、改行。
[3] 環境
[3.1] OS: WindowsXPSP2
[3.2] study Cとかいうやつ
[3.3] 言語: C
[4] 期限: 12/20まで
[5] ポインタまで
>>821 正式な単元名がCプロ入門演習となってるので書いたまでですが?
825 :
813 :2006/12/12(火) 11:16:15
821の煽りも幼稚だが、釣られてどうする。 頼む側なんだからな。
>>824 に書き忘れ
小さい順にn個(最大100)の素数を求めるプログラムを作成せよ。
以下の素数であれば指定した配列に格納する関数と、結果を表示する関数を利用するものとする。
>>823 お早い解答ありがとうございます
早速はしらせてみます
>>824 そういう要らんレスするなよ、本当に回答する奴がいなくなるぞ?
態度が悪くて○投げって、逆にお前が困るだろ。
言動をつつしみなさい
さぞすばらしいプロになれるんでしょう 丸投げの。
>>824 結局キーボードから入力するのは配列に格納させる素数の数で良いのか?
831 :
787 :2006/12/12(火) 11:26:49
>>801 ありがとうございます。せっかくやってもらったのにいいにくいのですが
問題文を見落としてて、大文字小文字の区別をつけちゃいけなかったみたいなんです。
そうなるように改造していただけないでしょうか
>>810 >>811 >>801 の人の回答は間違いなんですか?そんなにまずいんですかこの問題・・・
既に丸投げプロみたいだけどな ここの常連だ
C/C++ができなくてもプロにはなれるんだからいいんじゃね? ○投げのプロも立派なプロだよ 胸をはって仕事の横流しをすればいい
834 :
830 :2006/12/12(火) 11:35:35
>>824 返事がねぇが、こんなもんか。
void prime( int in, int *array, int *index )
{
int f, i;
for ( f = 1, i = 0; i < *index && array[ i ] <= sqrt( in ); i++ ) if ( in % array[ i ] == 0 ) f = 0;
if ( f ) array[ (*index)++ ] = in;
}
void print_array( int *array, int num )
{
int i;
for ( i = 0; i < num; i++ ) printf( "%d ", array[ i ] );
printf( "\n" );
}
void _38_main( void )
{
int p[ 100 ], i, index, num;
scanf( "%d", &num );
for ( i = 2, index = 0; index < num; i++ ) prime( i, p, &index );
print_array( p, index );
}
>>831 801ではないけど解答
元のプログラムは単語をひとつずつ読み込んで集計するやつっぽいから,読み込みの単位を
単語からアルファベット1文字(の文字列)に変更する.
元のプログラムのReadWord関数を次のように書き換えてくれ.余裕があれば関数名も.
int ReadWord(FILE *fp){
int ch;
int i;
do{ /* アルファベット以外を読み飛ばす */
ch=getc(fp);
if(ch == EOF) return (0);
if(ch == '^') return (2);
}while(!isalpha(ch));
buffer[0] = toupper(ch);
buffer[1] = '\0';
return (1);
}
あと,MemoryAllocation関数の最後に
return current;
を加える必要がある.
アルファベットの集計にツリー使う必要はないんだけどね…
質問者の将来を心配するなんて、随分優しい人ばかりですねこのスレは。 俺としては○投げされた問題を解答する方が楽だな。 「ここまでは自分で作ったんですけど」とか、そんなのは先生に聞け。 質問文もまともに○投げできない奴はカエレ。
将来は心配していない、ここで答えられなければもっと悲惨だが 自力でとっていない単位じゃ本人も報われないだろうw
それらを含めてこのスレは成り立っています。
じゃぁ次スレのタイトルは「C/C++の宿題を片づけるかもしれません」になるの?
>>834 返事が遅れてしまい申し訳ないです
入力に関してはそれでいいと思います。というかそれ以外何かあるのか自分にはわからないです
コードを実行してみたのですがエラーを吐いてうまく動きませんでした
残りは自分でやってみようかと思います。ありがとうございました
>>840 _38_main() を main() にすれば良いんじゃね?
842 :
787 :2006/12/12(火) 12:05:20
>>835 buffer[0]=toupper(ch);
の部分で「未定義のシンボル」ってエラーがでます・・・
将来プログラム製作には関わりませんって宣言してくれれば何の心配もせず解答できるんだけどな
>>843 将来プログラム製作には関われませんって宣言しているんだから心配しなくていいです
>>839 というか、タイトルがそうでなくても今までも「かもしれません」だったから問題ないかとw
>>842 801のコードを使ってないか?
書き換えてほしいのは787でupされた元のコード.
847 :
801 :2006/12/12(火) 12:21:15
うちがつくったやつを本にするなら ReadAlphaのさいごを return toupper(ch);
849 :
811 :2006/12/12(火) 12:58:49
>>787 >>801 の書いたのを見ると以下の仕様と読める。
・ファイルを読み出現したアルファベットの個数リストを作成する。
・リストは双方向リンクで作成し文字が昇順になるように動的に生成すること。
・入力された文字の出現回数を表示する。
多分上記の動作をすると思うので正しいだろう。
>>810 も俺もこの仕様を
>>787 から読み取れなかっただけ。俺はソース読む段階で放棄したし。
>>787 がもう消えてるので確認できないけど、アルファベットの出現回数を得るだけなら 26 個の
カウンター配列を持てば済む話。
双方向なんかを使ってるから題意が読めない−まぁ双方向リンクがお題目なんだろうけどね。
もう少し必然性のある問題を作れないのかなぁ...とにかく、参考ソースがゴミである事は確か。
850 :
811 :2006/12/12(火) 13:06:26
あっよく見たら双方向じゃなくてバイナリだ、恥ずかし。
[1] 授業単元: 画像処理 [2] 問題文(含コード&リンク):入力ファイル(テキストファイル)の中から単語を切り出し 単語部分のみ文字列を反転するプログラムを作る。ただし 単語文字列を格納する配列を用いるとともに、文字列を反 転する関数を用意し引数にはポインタを使用すること。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 2006年12月13日8:00まで [5] その他の制限: stdio.hとstdlib.h以外は習ってないのでできるだけ使わないでお願いします。 よろしくお願いします
bを反転するとdとなる
>>852 ここのそのままコピったらバレるかもしらんやん
変数名変えたりforとwhileを変えたりしないと
きっとAが∀になるんだよ
6をひっくりかえすと9に(略
>>851 問題1と2は、1では二分木で作って、その1を改良修正したのが問題2で、2では二分探索木を用意して、最小値の探索を行う関数を作成する問題です。+イメージ出力
テンプレに具体例入れないか?分かりにくい問題多すぎる
解かりにくい問題を出す奴はテンプレもまともに書かないから無意味
>>854 ABCD -> DCBA
ってことでは?
863 :
デフォルトの名無しさん :2006/12/12(火) 14:09:59
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク):倍精度実数型変数a と,倍精度実数型ポインタ変数p を定義する.このとき,以下の動作を行 うプログラムを作成しなさい. @ キーボードから実数を読み込み,a に格納する A a の値とa のアドレスを画面表示する B a のアドレスをp に代入しておき,p を通じてキーボードから実数を読み込む C p の指し示す先の要素の値とp の値を画面表示する [3] 環境 [3.1] OS: (Linux) [3.2] コンパイラ名とバージョン: (gcc 3.4) [3.3] 言語: (C) よろしくお願いします。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 4 int main(){ int Number[N],In[N]; int i,j,hit,blow; srandom((unsigned) time(0)); for(i=0;i<N;i++){Number[i]=random()%10;In[i]=0;} do{ printf("%d桁の数を入力!:",N); for(i=0;i<N;i++){if((In[i]=getchar()) ==EOF) break; // この部分 // In[i]-='0';} fflush(stdin);hit=0,blow=0; for(i=0;i<N;i++){if(Number[i]==In[i]) hit++;} for(i=0;i<N;i++){for(j=0;j<N;j++){if(Number[i]==In[j]) { blow++; break; }}} for(i=0;i<N;i++) printf("%d-",In[i]); printf("(%dHit,%dBlow)\n",hit,blow-hit); }while(hit!=N); for(i=0;i<N;i++)printf("%d",Number[i]); puts("\nComplete!!"); }
865 :
864 :2006/12/12(火) 14:15:55
[1] 授業単元:計算機演習2 [2] 問題文(含コード&リンク):上記のfor文で数を読み取る部分をscanfの型に直す。 今のままだと、getcharで取り込んだ数が不具合を起こして、入力した数が正常に表示されません。 このプログラムでは一回試行する毎にランダムの数が書き変わってしまいます。 数を言い当ててComplete!が表示されるまで、設定された数が書き変わらないようにしてください。 [3] 環境 [3.1] OS: Linux [3.2] gcc -o [3.3] 言語: C [4] 期限: 2006.12.15 改行が多いため、二つのレスに分けました。
>864 ヒット&ブロウだったら同じ数字使えないようにしないと。
>>853 どうも題意が分かりにくいが、こんな感じでいいのかな。
#include <stdio.h>
#include <string.h>
/* MBS未対応 */
char *reverse(char *s)
{
char *p, *q, tmp;
if (!s || !*s) return s;
for (p = s, q = s + strlen(s) - 1; q > p; ++p, --q) {
tmp = *p;
*p = *q;
*q = tmp;
}
return s;
}
main()
{
char buff[8192];
while (scanf("%8191s", buff) != EOF)
printf("%s\n", reverse(buff));
}
>865 各種チェックは省略 scanf("%d", &n); for(i=0; i<N; i++,n/=10) In[N-1-i] = n % 10;
870 :
初心者@携帯 :2006/12/12(火) 15:18:21
>>863 int main(void)
{
int a,*p;
scanf("%d",&a);
printf("a=%d &a=%p",a,&a);
p=&a;
scanf("%d",p);
printf("*p=%d p=%p",*p,p);
return 0;
}
インデントは自分でしてね
871 :
864 :2006/12/12(火) 15:22:45
問題に関する記述が足りませんでした。 四つの数は全て異なっていなければなりません。 御迷惑をお掛けします。
>>869 問題文に「文字列を反転する関数を用意し」という記述があるのだが。
単語の切り出しはscanf()で出来るしな。
>>867 でいいんじゃないの。
874 :
デフォルトの名無しさん :2006/12/12(火) 15:43:18
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):下記 [3] 環境 [3.1] OS:Windows [3.2] VS2005 C++ [3.3] 言語: C++ サブ関数でa[0]=0 a[1]=1 a[2]=2 と値を入れてメイン関数でこのサブ関数を呼び出してポインタを使ってint a[3]にサブ関数で定めた値を 入れよ。 ポインタは全然わかりません!お願いします><
#include <stdio.h> void sub(int *p) { int i; for(i=0; i<3; i++) *(p+i) = i; } int main(void) { int a[3]; sub(a); return 0; }
>>874 #include <iostream>
using namespace std;
int* sub()
{
int a[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
return a;
}
int main()
{
int a[3];
int* r;
r = sub();
a[0] = r[0];
a[1] = r[1];
a[2] = r[2];
cout << a[0] << endl;
cout << a[1] << endl;
cout << a[2] << endl;
return 0;
}
877 :
876 :2006/12/12(火) 15:57:46
こうかなぁと思ったんだけど、スタックに乗ってる値をポインタで返すのはまずいよなぁ。 問題文からは、こう読めるんだが。
878 :
869 :2006/12/12(火) 16:03:18
>>878 いやだから君のプログラムと同じ動作になるよ。
scanf()の仕様、知らんでしょ。
880 :
デフォルトの名無しさん :2006/12/12(火) 16:18:42
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク):まず,整数型変数a,b,c を定義し,それぞれに10,100,1000 を代入する.次に,整数型ポイ ンタ変数p を定義し,c のアドレスを代入する.p の値をp+0 からp+9 まで変化させて,*p の値 を画面表示するプログラムを作成しなさい.また,実行結果がなぜそのようになるかを考察しな さい. [3] 環境 [3.1] OS: (Linux) [3.2] コンパイラ名とバージョン: (gcc 3.4) [3.3] 言語: (C) 分かる方、よろしくお願いします。
>>880 わざわざ動かないコードを書かせる意味が分からん。
この糞課題を出したクズ教官の名前を晒せ。
882 :
デフォルトの名無しさん :2006/12/12(火) 16:26:57
>>875 先生!ありがとうございます!
で、ですね( ;・∀・)もう一ついいですか?2次配列つかった場合ってどうやればいいですか?
Get8の中でd[8]のなかにdata[200][200]の指定のデータを入れたいんですが、どうすれば。。。
void Get8(int i, int j, int *data, int *d)
{
*(d)=data[i][j+1];
*(d+1)=data[i-1][j+1];
*(d+2)=data[i-1][j];
*(d+3)=data[i-1][j-1];
*(d+4)=data[i][j-1];
*(d+5)=data[i+1][j-1];
*(d+6)=data[i+1][j];
*(d+7)=data[i+1][j+1];
}
void main()
{
int d[8];
Get8(i,j,data,d);
}
こんな感じじゃじゃダメっした!上のやつは簡単に書いたやつでdata[200][200]は他のとこで値が入れてあります。iとjはforの中で使ってます。
Get8の中だけ書き直していただけると助かります><お願いします神様!
>>881 変な値にはなるが、動かなくはないでしょ。
でも、何故cからなんだろ?aからなら考察のしがいもあるのだが。
884 :
878 :2006/12/12(火) 16:30:28
885 :
デフォルトの名無しさん :2006/12/12(火) 16:31:45
>>883 アドレスが逆から振られる処理系なんじゃない?
Cだと代入した後に定義はできないだろ
>>880 #include <stdio.h>
int main()
{
int a = 10,b = 100,c = 1000;
int i,*p = &c;
for(i = 0;i < 10;i++){
printf("*(p + %d) = %d\n",i,*(p + i));
}
return 0;
}
なにがやりたいのかはわからんけど
>>883 solaris のスタックは後から定義した変数の方が低位アドレスだった気がする。
889 :
809 :2006/12/12(火) 16:52:26
>>796 とりあえず、学校で動作確認とかしたのですが、
void freeArea(char** ppArea)
{
int i;
for( i = 0; i < MAX_LINE; i++ )
if( ppArea[i] )
free( (void*)ppArea[i] );
free( (void*)ppArea );
}
のif( ppArea[i] )っていうのはミスでしょうか?
エラーは出なかったのですが、これだけだと意味をなさないですよね?
それと
free( (void*)ppArea[i] );
free( (void*)ppArea );
の部分は
free( ppArea[i] );
free( ppArea );
とすると、ちゃんと解放されないですか?
voidが付いてる理由が分からないので外してみたのですが。
それと、提出期限が明後日の朝11時00分までになりました。
>>889 >>796 じゃないが。
>のif( ppArea[i] )っていうのはミスでしょうか?
これはif( ppArea[i] != NULL)と同義。
>とすると、ちゃんと解放されないですか?
される。(void *)がついているのはおそらく暗黙の型変換を嫌ったからだろう。
>>889 while(1){...}
とかもよく使われる。
0は偽、0以外は真の意味がある。
893 :
デフォルトの名無しさん :2006/12/12(火) 17:46:35
>>892 スタックじゃなくヒープ?
いや、スタックでしょ。
>>880 の授業ではその後リターンアドレスの書き換えやバッファオーバーランによる
クラックについての解説が行われるんだよ
たぶん
895 :
デフォルトの名無しさん :2006/12/12(火) 17:55:08
>>892 cでは自動変数はスタックに確保される。
引数は、後ろから順にスタックに積まれる。
定義の際、int a,b,c;とした場合、後ろからスタックに積まれるためアドレスはcbaの順になる。
int a;
int b;
int c;
とした場合は、たぶんabcの順に積まれる。
そんな決まりは無い
897 :
853 :2006/12/12(火) 18:20:02
867さん、869さん、遅くなりましたがありがとうございます。 867さんのみたいなのを求めてました。題意分かりにくくてすみません。
>>705 は結局居なくなっちゃったなぁ。
恥ずかしくて出て来られなくなるのもわかるが。
まぁ面白かったからいいけど。
899 :
デフォルトの名無しさん :2006/12/12(火) 19:38:33
>>896 どれのこと言ってるの?
自動変数はスタックに積まれるでしょ。
可変長引数を持つ関数を呼び出した時、その関数が持つローカル変数と引数が必ず一定のアドレスだけ離れた形になるように、ローカル変数もスタックに後ろから積まれる。
そんな決まりは無い
901 :
900 :2006/12/12(火) 19:49:50
あ、ごめん、ぐぐったらあったわ。
903 :
π :2006/12/12(火) 19:53:05
[1] 授業単元:区分求積法 [2] 問題文(含コード&リンク): #include <stdio.h> #include <math.h> int main(void) { int k,n=100; double h,a=0,s,PAI,X,I,r=1; h=(r-a)/n; X=0; for(k=1; k<=n; k++) { X+=sqrt(pow(r,2)-pow(h*k,2)); } I=h*X; PAI=4*I/pow(r,2); printf("PAI=%lf。\n",PAI); return 0; } [3] 環境 [3.1] OS: Windows [3.2] borland [3.3] 言語: C [4] 期限: 今日中にお願い致します [5] その他の制限: scanfをつかってnの数値を変えて実行できるようにしたい。 πの近似値を求めるプログラムです。nの値を大きくしていけばπの値により近づきます。 nの値をintの所で一々変えて入力して結果を出力するのではなく、 scanfを使ってプログラムを作成したいのですがうまくいきません。 説明不足かもしれませんがお願いいたします。
>>903 自分が試した方法と、どううまくいかなかったのかを説明してくれ
905 :
π :2006/12/12(火) 20:07:47
#include <stdio.h> #include <math.h> int main(void) { int k,n; double h,a=0,s,PAI,X,I,r=1; h=(r-a)/n; X=0; while(k<=n) { scanf("%d,&n"); X+=sqrt(pow(r,2)-pow(h*k,2)); } I=h*X; PAI=4*I/pow(r,2); printf("PAI=%lf。\n",PAI); return 0; } while文のなかにscanfを入れてみてやってみたのですが、結果がPAI=0.00000となりできませんでした。 for文のときは値を入れてもその後は反応がありませんでした。
>>905 int k,n;
h=(r-a)/n; ←この段階でnは不定
nを使う前に読み込ませないと
変数宣言の後すぐにscanf
>>907 せめて全部のソートアルゴリズムのコードがないと
規模がでかすぎて誰もやる人いないと思うぞ。
全部のソートを自前で書き起こす時点ですごい面倒。
>907 データをよこせ まさか10万個のデータも作らせる気か?
[1] 授業単元: 数値計算
[2] 問題文(含コード&リンク):
sin(x)の値をマクローリン展開を利用して求めた式で計算するプログラムを作成せよ。
ここでは、ある項数n(ここでnはマクローリン展開後の式における項の数とする)に対して
0<=x<=6.28の範囲でxを変化させて計算を行うプログラムを作成すること。
また、nは1,2,3...20までそれぞれの場合について求める
参考:
ttp://yosshy.sansu.org/maclaurin.htm [3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 12/13 17:00まで
[5] その他の制限:特にありません
よろしくお願いします
[1] 授業単元: プログラミング言語 [2] 問題文(含コード&リンク): 0-255の範囲の乱数を20個生成して配列に格納し、配列中の指定範囲(開始 及び終端インデックスで指定)のみ大きい順に並び替え、当初の配列要素と 比較して出力するプログラムを作る。ただし、指定範囲内のみ並べ替えは 関数として用意し、引数にはポインタを利用すること。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 12/13 7:00まで [5] その他の制限:特にありません よろしくお願いします
913 :
デフォルトの名無しさん :2006/12/12(火) 21:15:14
[1] 授業単元:Cプログラミング演習 [2] 問題文:50個の整数データを読み込み、それらを小さい順に出力する cプログラムを作成せよ。バブル整列法は使ってはいけない。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: Cのみ [4] 期限: 2006年12月23日12:00まで よろしくお願いします。
>913 前スレにも書いた?
915 :
796 :2006/12/12(火) 21:22:36
>>889 free( (void*)p ) とか memset( (void*)p, 0x00, size ) とかの (void*) は付けなくても問題は無い。
しかし、warning を生じる環境も過去に存在したので脊髄反射的に付ける様になった。
言わば職業病。
ヘ_ヘ
917 :
888 :2006/12/12(火) 21:31:34
>>892-895 自動変数は定義した順にスタックへ積まれるが、アドレス低位→高位に積まれるか
アドレス高位→低位に積まれるかは環境依存。
solaris の場合は後者だったと記憶する。
linux では...バッファオーバーランのバグ追った事が無いので知らん。
引数が後ろから積まれるとは限らない。
Win3.1 の PASCAL 型関数の場合、前から積まれてた。
>>909 #include <stdio.h>
#include <stdlib.h>
#define MAX 100000
int main(){
int i; FILE *fp;
fp = fopen("data.txt","w");
srand(time(NULL));
for(i = 0;i < MAX;i++) fprintf(fp,"%d\n",rand());
return 0;}
やる気があるならこれでも使ってくれ
俺はソート全部はやる気にならんな
919 :
787 :2006/12/12(火) 21:43:49
>>846 >>847 昼間はお世話になりました。おかげで課題も間に合わせることが出来ました。
これから教えてもらった答えをよみなおしてみます。
ありがとうございました
どういたしまして。 がんばってね。
>912 start,endの範囲チェックは自分で足してね #include <stdio.h> #include <stdlib.h> #include <time.h> void f(int *a, int start, int end) { int i, j, l, temp, *p; l = end - start + 1; p = a + start; for(i=0; i<l-2; i++) { for(j=l-1; j>i; j--) { if(p[j] > p[j-1]) { temp = p[j]; p[j] = p[j-1]; p[j-1] = temp; }}}} int main(void){ int i, start, end,a[20]; srand(time(NULL)); scanf("%d", &start); scanf("%d", &end); for(i=0; i<20; i++) a[i] = rand() % 256; for(i=0; i<20; i++) printf("%3d ", a[i]); putchar('\n'); f(a, start, end); for(i=0; i<20; i++) printf("%3d ", a[i]); putchar('\n'); return 0; }
922 :
912 :2006/12/12(火) 22:19:36
>>921 ありがとうございました!
参考にさせていただきます。
924 :
889 :2006/12/12(火) 23:44:38
皆さん、レスありがとうございます。 if( ppArea[i] )とif( ppArea[i] != NULL)が同義だったのですか、初めて 知りました。 (void *)は付けなくても大丈夫なのですね。分かりました。 あと、 char** allocArea(void) { char** ppRet; int i; size_t tSize; tSize = sizeof( char* ) * MAX_LINE; ppRet = (char**)malloc( tSize ); if( ! ppRet ) return NULL; memset( (void*)ppRet, 0x00, tSize ); return ppRet; } の意味が全く解らない(他のは、意味は解りました。)ので、この関数を 外してコンパイルと実行をしてみたのですが、コンパイルも通って実行も 、まともに出来ました。 しかし、実行して辞書順に並び替わった後に「セグメントエラー」と表示さ れます。 これを入れると関数が一つ多くなる上に意味が全く解らなくてコメントや 説明が書けないので何とかしたいのですが何か良い方法は無いでしょうか? 例えば、メイン関数の中で1、2行で簡単な表現で表せたり。
ほほう、自動車を軽くしたいからエンジンを外すのか
>>918 をありがたく利用させてもらって書いてるけど、
Insertion sortでめげそう
10万個のソートってこんなに時間かかるのね
927 :
デフォルトの名無しさん :2006/12/13(水) 00:01:22
>>924 char** allocArea(void)
{
char** ppRet;
int i;
size_t tSize;
tSize = sizeof( char* ) * MAX_LINE;//割り当てるメモリのサイズを計算
ppRet = (char**)malloc( tSize );//メモリを割り当てる
if( ! ppRet )
return NULL;//割り当てに失敗したらNULLを返す
memset( (void*)ppRet, 0x00, tSize );//割り当てられた領域を0で埋める
return ppRet;//割り当てられた領域のポインタを返す
}
Cあんまり詳しくないけどこういう事?
>>864 の課題の記述にミスがありましたので、補正を加えて再貼りします。
[1] 授業単元:計算機演習2
[2] 問題文(含コード&リンク):上記のfor文で数を読み取る部分をscanfの型に直す。
今のままだと、getcharで取り込んだ数が不具合を起こして、入力した数が正常に表示されません。
このプログラムでは一回試行する毎にランダムの数が書き変わってしまいます。
数を言い当ててComplete!が表示されるまで、設定された数が書き変わらないようにしてください。
このプログラムは数字4桁の数当てゲームですが、ランダムに選択される数字は全て異なっていなければなりません。
今の状態だと数字が重なる場合があるのでそこを補正してください。
[3] 環境
[3.1] OS: Linux
[3.2] gcc -o
[3.3] 言語: C
[4] 期限: 2006.12.15
929 :
924 :2006/12/13(水) 00:16:00
>>927 レスありがとうございます。
この関数の一つ一つの行の意味が解らないっていうのもありますし、この
関数自体が何をするためにあるのかも解りません。
それと、問題に「6つの関数から構成する」って書いてあったので、これ
以外の関数だけで十分(説明しにくいのですが、本当は必要ないのにこれを
付け加えることによってプログラムとしてより優れた物にするような物)な
のかと思ってしまって。
930 :
デフォルトの名無しさん :2006/12/13(水) 00:23:38
長さ n を入力とし、整列算法を指定して、乱列の整列時間を求める。 Note586 でシャッフル列を発生させる。 Note585 の3つの単純整列算法を選択する。 Note432 で実行時間を計測する。 { //---- 宣言 //---- 初期化 乱数の初期化 while ( 1 ) { //---- 入力 算法の選択、長さの入力 switch ( 処理 ) { case 終了: { return 0; } case 入力: { 乱列入力; } case 生成: { 乱列生成; 乱列出力; } } //---- 計算 時間計測の開始 整列算法の実行 時間計測の終了 //---- 出力 時間と回数の出力 } っていう問題ですどう手を着けていいのやら おねがいします
932 :
デフォルトの名無しさん :2006/12/13(水) 00:31:18
[1] 授業単元:Cプログラミング演習 [2] 問題文:0 から n-1 まで長さ n ; n≧1 のシャッフル列を生成する処理 shuffle(arr, n) を再帰的に定義する。以下のような漸化式で考える。 事前処理 arr[n-1] に n-1 を代入 n=1 のとき そのまま返却 n≧2 のとき 再帰呼出 長さ n-1 のシャッフル列の生成 shuffle(arr, n-1) 事後処理 n 未満の整数乱数 r を発生 位置 r と n-1 の要素を交換 [3] 環境 [3.1] OS:windowsXP [3.2] コンパイラ名とバージョン: bcc32 [3.3] 言語: Cのみ [4] 期限: 2006年12月13日12:00まで よろしくお願いします。
>>236 サンクス
わからんから助けを求めにきたが先行者がいたか・・・
あいつの説明わかりにくいもんなぁ
>>929 簡単に言えばメモリ領域を確保して 0 で埋める作業をしている
これしないと国有地でバーベキューするみたいな感じだぞ(意味不明?)
ちゃんと自分の敷地くださいと言って国有地を分けてもらわないとバーベキューしたときに怒られます
935 :
929 :2006/12/13(水) 01:01:29
この関数をどうにか消そうと思ってたのですが、重要そうですし、教えて
下さってるので理解する方向で行こうと思います。
>>934 レスありがとうございます。つまりmallocの奴と同じメモリの動的確保
ってことですか?
でも、それだとしたら、
ファイルを読み込む関数
int readFile(char* sPath,char** ppArea )
{
int iLine = 0;
FILE* fp;
char sBuf[ MAX_LEN + 1 ];
fp = fopen( sPath, "rt" );
while( iLine < MAX_LINE && fgets( sBuf, MAX_LEN, fp ) ) {
ppArea[iLine] = (char*)malloc( strlen( sBuf ) + 1 );
if( ! ppArea[iLine] )
return -1;
strcpy( ppArea[iLine], sBuf );
iLine++;
}
fclose( fp );
return iLine;
}
の
ppArea[iLine] = (char*)malloc( strlen( sBuf ) + 1 );
でメモリの動的確保は行われていると思うのですが…。
936 :
デフォルトの名無しさん :2006/12/13(水) 01:06:37
>>924 >>927 の解説でOK。
もし、allocArea() を使いたくない場合は main() の ppArea を配列で定義するんだな。
memset() も習ってないなら
char** ppArea;
↓
int i;
char* ppArea[MAX_LINE];
for( i = 0; i < MAX_LINE; i++ )
ppArea[i] = 0x00;
これで ppArea の確保と初期化ができたので allocArea() は不要となる。
この場合、 freeArea() 内で free( (void*)ppArea ); を行うとセグメンテーションフォルトが生じるので削除する。
だけどよー、スタックに40Kbyteも積む下品なコード書きたくねぇよー。
>>937 static char *ppArea[MAX_LINE];
でおk。
memset()もいらなくなる。
939 :
デフォルトの名無しさん :2006/12/13(水) 01:18:43
>>913 何個か書いていただいたのですが
コンパイルはできるものの題意を満たすように
実行できません 間違いとか分からないんで
教えてください
システムコール習ってて // forkして親子に分かれる // ... // 親プロセスにて子の終了待ち while( wait( (int *)0 ) != pid); ってのがあったんですが waitの引数は子の状態情報を記憶しておくポインタを与えるもの と思ってたんですが (int *)0 ↑0へのポインタを渡すってどういうことでしょう? またwhileでwaitするのって意味あるんですか? wait関数が、子プロセスが終了するまで待つのなら いらないと思うのですが
//ポインタを保存する領域を確保 ppRet = (char**)malloc( tSize ); //データを入れる領域を確保してそのポインタを保存 ppArea[iLine] = (char*)malloc( strlen( sBuf ) + 1 ); 違い分かる?
>>940 man 2 wait
wait()にNULLを渡した場合は、「終了ステータスは別に要りませんよ」という
意味になり、wait()は単に子プロセスの終了を待つだけの動作をする。
while()でループしているのは、割り込みなどによってwait()が異常終了した
場合などを考慮しているのだろう。
が、今時wait()を使うこと自体が、本当は良いスタイルではないな。
せめてwaitpid()を使うべき。
>>935 熱心だから解説しちゃる。
readFile() での malloc() は読み込んだ一行を保存するための領域だ。
よって (char*) で確保する。
んだども、確保した領域のアドレスは何処に保存する?
allocArea() で確保してる (char**) x 10000 は 10000 行の (char*) を保存する為の領域だ。
つまり
ppArea[0][1][2][3][4]...[9999] のそれぞれに readFile() で確保したアドレスが格納される訳だ。
行数が10000 に満たない場合、ppArea の格納されなかった場所には初期値の NULL が入ってる。
よって、開放する時に
if( ppArea[i] ) free( (void*)ppArea[i] );
ちゅう判定が必要になる訳。
.
説明下手でスマソ。
ま、10000行決めうちの確保だから、わざわざmalloc()使って 動的に確保する必要はないんだけどな。 static配列で十分。
945 :
デフォルトの名無しさん :2006/12/13(水) 01:30:06
[1] 授業単元:データ構造とアルゴリズム [2] ファイルを読み込み、英字のみか、先頭が英字で二文字目以降が英字または数字である文字列を抽出し、 文字列の長さが長い順に並べ、その文字列の頻度と共に表示するプログラムを作成したい。 但し、文字列の長さが同じものに関しての順序は任意で良い。以下の設問にしたがって回答しなさい。 [3] 環境 [3.1] Windows XP [3.3] CかC++かJava [4] 期限: 2006年12月20日20:00まで [5] その他の制限: Windows の API は使用しないで作って下さい。
946 :
デフォルトの名無しさん :2006/12/13(水) 01:31:16
実行例 入力 #include <stdio.h> #include <ctype.h> int main(void){ int c0; char c1; b='\0'; while((c0=getchar())!=EOF){ if((!isalnum(c1))&&isalnum(c0)){ printf("\n"); } if(isalnum(c0)){ printf("%c",c0); } c1=c0; } return 0; }
947 :
デフォルトの名無しさん :2006/12/13(水) 01:32:03
出力
getchar:1
include:2
isalnum:3
printf:2
return:1
stdio:1
while:1
ctype:1
char:1
main:1
void:1
EOF:1
int:2
if:2
c1:4
c0:6
h:2
n:1
c:1
>>945-947 よろしくお願いします
>>938 静的領域の 0x00 って保障されてたっけ?
なんか環境依存の様な気が...手元にK&Rも無いので確認でけんけど。
JISならオンラインで読めたはずだが
0で初期化されるのは確かだけど、それがNULLとして有効かは知らない。 むしろ、厳密にはmemsetのほうがまずいような。
>>942 ありがとうございます
(int *)0 でNULLポインタになるんですね
初めて知りました
952 :
935 :2006/12/13(水) 01:40:29
>>937-938 レスありがとうございます。
>>941 >>943 レスありがとうございます。
メモリの動的確保って言ってもデータを入れるためのメモリとアドレスを
入れるためのメモリの違いってことだったのですか。
詳しい解説ありがとうございました。
>>948 staticなオブジェクトが0初期化されるのは立派にC言語の仕様であり
保障されているから心配無用。
どーしてもautoにしたいんなら
char *ppArea[MAX_LINE] = { 0 } ;
でよい。
NULL == 0 ではないが、0はNULLという仕様
callocなら領域確保と同時にゼロクリアされる。
JIS のページ探すの面倒くさい。
でも多数決で 0x00 は環境依存じゃないということで...
第一 static で取れば下品なコードじゃなくなるな。
>>952 ちゅことで
>>938 でOK。だけど freeArea() の一行削除は忘れるな。
>>950 ポインタ変数を全て 0 で埋めてそれが NULL にならないと言うことは...NULL って何?
\0でNULLになるんじゃないの?
959 :
952 :2006/12/13(水) 02:04:44
>>956 はい、分かりました。
色々とありがとうございました。
>>956 (void *)0はNULLだけど、NULLが全ビット0とは限らない。
961 :
デフォルトの名無しさん :2006/12/13(水) 02:08:12
↑へ?どんな処理系?
>>945 #include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
class symdata
{
public:
string name;
int cnt;
int len;
symdata() { cnt = 0; len = 0; }
symdata(const string& s, int n)
{ name = s; cnt = n; len = s.length(); }
};
bool cmp(symdata *a, symdata *b)
{
return (a->len > b->len);
}
>>962 のつづき。
main()
{
string s;
map<string, symdata> table;
vector<symdata*> v;
while (cin >> s) {
if (table.find(s) == table.end()) {
table[s] = symdata(s, 1);
v.push_back(&table[s]);
} else {
++table[s].cnt;
}
}
sort(v.begin(), v.end(), cmp);
for (vector<symdata*>::iterator i = v.begin(); i != v.end(); ++i)
cout << (*i)->name << ":" << (*i)->cnt << endl;
}
3vs3で開始する
966 :
デフォルトの名無しさん :2006/12/13(水) 02:13:40
>>959 教えていて気持ちがいいね。
熱心だしすぐ理解してくれるし。
でも毎回名前の番号が変わるからちょっと認識しにくかった。
まぁどうでもいいけど。
>>956 0をポインタに変換したらNULLに変換されるし
(NULLの内部表現が0でない環境ではコンパイラが変換コードを生成する必要がある)
NULL==0は NULL==(void *)0 と解釈されて1を返すけど
memsetはvoid *sの引数を*(unsigned char *)s=0見たいな感じで埋められるから
そこをchar *の値として参照してもNULLじゃないかもしれない
Randomized quick sortまで実装したけどあってるかどうかの判別がつかない・・・ orz
純粋に規格的な話だと、staticオブジェクトの初期化は大丈夫。 memset()はNGかな。 まぁ、NULLのビット表現が0でない処理系なんて、intが16bitだったり 文字セットがEBCDICだったりするような処理系より全然レアっつか 俺は見たことないし、ぶっちゃけ気にする必要はないけどな。 んな処理系で動かしたら、多分他の部分で問題山積みだぞw
>>967 signed bit の話なら立ってれば補数なので 0 なら立たないよ。
いや、俺が君の話を理解できないだけなんだけど。
まぁ疑問なら試せば良いと思う。
>>971 >>967 が言ってるのは全然そういう話ではない。
memset()は「ビット的に」ゼロにしてしまう。
だから、NULLが「ビット的に」ゼロで無い実装では、それを
「ポインタとして」解釈するとnull pointerではないということになる。
一方、ポインタへのゼロの代入は、たとえNULLが「ビット的に」ゼロでない
実装でも、いつでもnull pointerとして扱われる。
そうした実装の場合、staticなpointerオブジェクトに対しては、
null pointerをあらわすビット値が、おそらくCランタイムの
スタートアップコードによって書き込まれるはずだ。
規格に準拠するならば。
↑なるほど、言いたいことは理解した。
けど、不毛だよ。
>>956 で俺が書いた
> ポインタ変数を全て 0 で埋めてそれが NULL にならないと言うことは...NULL って何?
は『ビット的にゼロじゃないNULL』なんか無いだろって事。
君らは『ビット的に非ゼロなNULL』が存在しても良いって前提で話をしてるでしょ。
これは原理主義者と現実主義者の議論でしかないから....
俺はずっと memset() でポインタ初期化を続けるよ、まぁこれも memset() が個別代入より
早いっていう原理主義なんだけどね。
>>973 単に「規格的はどうか」という議論をしているのに「俺様脳内方針」を
ブチ挙げる君も、随分空気読めてない人だな。
勝手にすれば?としか。
ま、実際問題としてはそれでOKであることは否定しないだろ、誰も。
まぁまぁ。お二人とも。 宿題なんだから提出して採点者の前で動けばいいのだ。 じゃだめ?
今はそんな話ではない。黙ってろ。
じゃあ、俺はもう寝る
つうかstaticオブジェクトの初期化についても知らないわ サイズ固定の配列をわざわざmalloc()で確保するわ null pointerに関する規格上の定義も知らないわ しまいには俺は何がなんでもmemset()で初期化するんだとか逆切れか なんか面白いもん見せてもらったわw
↑お前バカ? 俺が書いたのは話が噛み合わない理由が ・俺は現実的な話をしてる ・俺以外は規格上の話をしてる 事を認めた上で不毛と書いただろ。 噛み合わない話を続けた非は認めるけどな。
なるほど、規格も知らないで 「現実的な話」かwwwww
981 :
979 :2006/12/13(水) 03:01:41
983 :
982 :2006/12/13(水) 03:48:18
命令実行回数とか数え間違えてるかもしれないからチェックがんばって orz なんかもう眠い
984 :
982 :2006/12/13(水) 03:55:50
あとSelection sortは教科書見て書き直さないとバレると思うぞ 連投スマソ
>>985 どうせWikiに各種ソートのプログラム置かなきゃいけないからついでだと思って。
地味に面倒だったけどやり始めたら止まらなくなった。
あとグローバル変数の宣言がおかしいところを発見したけど修正は自分でやってくれ
というかなんでこれコンパイルエラーにならないんだろ・・・
>932 void shuffle(int *arr, int n) { int r, t; arr[n-1] = n - 1; if(n==1) return; else { shuffle(arr, n-1); r = rand() % n; t = arr[n-1]; arr[n-1] = arr[r]; arr[r] = t; } }
988 :
デフォルトの名無しさん :2006/12/13(水) 07:20:24
[1] 授業単元:Cプログラミング [2] 問題文: BCDコードに変換する関数を作成しなさい。 IN :ASCIIコード(NULLストップ) OUT:BCDコード、桁数 [3] 環境 [3.1] OS: (Windows) [3.2] bcc [3.3] C言語 [4] 期限: 無期限 [5] その他の制限: 宜しくお願い致します。
>>988 BCDコードなんだから入力される文字列は0〜9で考えていいんだよな?
あと変換されたBCDコードはどうやって出力すりゃいいんだ?
@printfで出力?(画面に変換結果表示するだけ)
A戻り値をchar*にして返す?(受け取った方は不要になったらfreeする必要がある)
Bそれとも既に確保されてるメモリのポインタを受け取って
そっちに出力?(確保領域が溢れる場合が有る)
とりあえず簡単な@で書いとく。
#define B(c,n) (((c-0x30)>>n)&0x01)
void strtobcd(char* str)
{
printf("before:\n%s\n",str);
int i=0;
printf("after :\n");
while(str[i]){
if(str[i]<'0' || str[i]>'9'){printf("decode error\n");break;}
printf("%d%d%d%d ",B(str[i],3),B(str[i],2),B(str[i],1),B(str[i],0));
i++;
}
}
>>848 上2つのテキスト、内容まったく同じじゃね?
991 :
長岡 :2006/12/13(水) 10:16:17
長岡係数を求めるプログラムを早急に作成してください。。 お願いします
>>991 >>1 を読んでテンプレ守って書き直してね。
長岡係数って何?
その辺の説明も書こうね。
993 :
長岡 :2006/12/13(水) 10:23:54
自分もよくその辺もわからないんでそれも説明していただくとありがたいです。図々しくてすみません。。。
ABのスレできいてるやつか ここはBASICのスレじゃねえぞ
>>1 を読んで理解できないのなら日本語を勉強してくださいとしか…
998 :
長岡 :2006/12/13(水) 10:29:06
>>996 ググって出てくるくらいの情報はいいです
書けないんなら黙っていてください
999 :
992 :2006/12/13(水) 10:29:13
>>993 長岡係数とやらを理解して説明できるようになったらまたおいで。
プログラムの部分しか請け負わないよ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。