1 :
デフォルトの名無しさん :
2009/01/15(木) 23:21:27
2 :
デフォルトの名無しさん :2009/01/16(金) 00:52:45
皆様のおかげで無事単位を取得できました 本当にありがとうございます これからは人に頼らずできるかぎり自分の力で頑張っていきたいです
保守しといたらいいのかな ところで何で122題目じゃなくて122代目なの?
janeの隠し機能 1.書き込みウィンドウを出し半角入力に切り替える 2.Wキーを押しっぱなしにする 3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
3 は「コテハン記憶チェック」「最前面チェック」「末尾整形」「BE」「Proxy」のどのチェックを操作してもいけるな
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
11 :
デフォルトの名無しさん :2009/01/30(金) 10:50:17
wwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
異なる30個の数字をうんたらかんたらって課題は早稲田大学理工学部かな
wwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
17 :
デフォルトの名無しさん :2009/01/30(金) 21:32:00
うむ、たしかに変わった問題だ。
20 :
デフォルトの名無しさん :2009/01/30(金) 23:14:45
>>17 のレスだけを与えられて問題にたどり着けるかどうか試してみたら?
22 :
デフォルトの名無しさん :2009/01/30(金) 23:26:01
>>21 すみません、どうゆうことですか(><)?
24 :
デフォルトの名無しさん :2009/01/30(金) 23:39:40
>>23 私の問題はNo.8780ですが、どうしたらいいかわからないんです。。。
26 :
デフォルトの名無しさん :2009/01/30(金) 23:50:45
>>25 その問題なんですけど、問題の意味がわからないってことですか?
>>26 問題文が長いときはzipに入れとこうね。
28 :
デフォルトの名無しさん :2009/01/30(金) 23:59:04
>>27 すみません(><)やり方がいまいちわからなかったもんで。。。
ありがとうございます!!
>>24 オマエ以外の誰がそれを知ってんだよ、バカ
>>28 マルチったレッドで回答ついてるだろ。
死ね。
32 :
デフォルトの名無しさん :2009/01/31(土) 00:22:16
33 :
デフォルトの名無しさん :2009/01/31(土) 00:23:01
34 :
デフォルトの名無しさん :2009/01/31(土) 00:29:04
1万個以下の都市間の距離が記録されている。 近い都市どおしをまとめて、n個のグループに分ける。 これわかる人いますか?
ワーシャル・フロイト法?
>>34 スレタイと
>>1 嫁
まともに訊く気があるなら”近い都市どおしをまとめて”って辺りを詳しく
>>34 よく見ると、日本語でおkだ・・・
ねたか・・・
39 :
デフォルトの名無しさん :2009/01/31(土) 01:05:08
すみません。 都市は円形同サイズで、中心間の距離が記録されています。 2つにわれる場合は、同程度サイズになるようにします。 合併後の都市の中心から橋が離れすぎないようにします。
41 :
デフォルトの名無しさん :2009/01/31(土) 01:10:08
>>39 スレタイ嫁
あと、書いた文を人が読んで理解できるかどうかを考えて文を書け
3行目以下が意味不明
よく読むと微妙にスレタイ変わってるんだな
>>17 は結局何が悪かったのかに気づいてないんだろうな。
zipじゃなかったことについて怒られたんだと思ってるよきっと。
スレタイだけ読んだってしょうがないだろ テンプレも読ませないと
46 :
デフォルトの名無しさん :2009/01/31(土) 02:48:41
>>46 スパコン甲子園かと思ったら、パソコン甲子園なんだな・・・
>>47 高校生が20分掛けずに解くことになっている問題じゃねーか!
1問あたり20分?
>>49 予選の問題だろ?
180分で10問だってさ。
53 :
デフォルトの名無しさん :2009/01/31(土) 05:13:15
>>52 iostreamライブラリ関数(習っていない)を使わないで
入力もscanfをつかって表現できませんか?
実際、C言語習って3か月しかたってないので
基礎しかわかりません・・。
54 :
デフォルトの名無しさん :2009/01/31(土) 05:28:08
46>> main関数以外と最後に書いてありますが main関数も使って結構です。 要するに二つの関数を用いれば結構です。 たびたび、すみません
55 :
デフォルトの名無しさん :2009/01/31(土) 05:32:15
[1] 授業単元:while文 [2] 問題文:キーボードから入力された2以上の自然数nが素数であるかどうか繰り返し調べるプログラムを作ってみましょう。 1回終わるごとに「次の2以上の自然数を入力してください」と再入力 nに0以下の整数が入力された場合は 「0以下の整数が入力されました」 「次の2以上の自然数を入力してください」と再入力 nに1が入力されたら「終了します」として調べるのを終える [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:Borland C++ Compiler、bcc developer [3.3] 言語: C++ [4] 期限:2009年2月2日10:30まで [5] その他の制限:while(1)で無限ループとか、goto文使えばできるんですが授業で扱ってません。。
>>53 C++なのにiostreamやってないの?
Cなんじゃないの?
57 :
デフォルトの名無しさん :2009/01/31(土) 05:48:28
それは酷いな
問3は配列を使いたいね
>>63 やむを得まい、int main(void) { return0; } にするしかない。
>>46 面白い問題だ
制限時間内に全問正解できる自信がないぜw
67 :
デフォルトの名無しさん :2009/01/31(土) 15:34:18
>>46 プログラムとしてはどうか知らんが
数学的には未解決問題の上に賞金もかけられていたはず
>>59 本当にありがとうございます!
すっきりしててわかりやすいです!
70 :
デフォルトの名無しさん :2009/01/31(土) 15:58:37
>>68 与えられた数字より、小さい数字に出来ることを示せばいい。
たとえば、100から始めたら、99以下になる事を示す。
そうすれば数学的帰納法で全ての数字で成り立つ。
>>70 言ってることは尤もなんだが
数学者を馬鹿にしてるのかw
>>70 たしかICMで我々人類がこれらの問題を解決するにはまだ十分な準備ができていない発言があったはず
73 :
デフォルトの名無しさん :2009/01/31(土) 16:11:29
これって1から逆にたどったら、全ての数字が生成出来るのかな。 もし生成出来て、試行回数に応じた出現回数の上限が存在すれば解ける。
74 :
デフォルトの名無しさん :2009/01/31(土) 16:12:21
間違えた もし生成出来て、試行回数に応じた出現数字の上限が存在すれば解ける。
75 :
デフォルトの名無しさん :2009/01/31(土) 16:16:33
1から逆にたどったn回の試行で、f(n)以下の数字が全て生成出来る という関数f(n)が決定出来れば、解ける。
>>73 5 → 16
32 → 16
これを逆にたどるとすると枝が多すぎて解析不能
77 :
デフォルトの名無しさん :2009/01/31(土) 16:20:27
[1] 授業単元: C++ [2] 問題文(含コード&リンク): 自動販売機のオブジェクトを作成しないさい (商品はオレンジジュース、コーラ、サイダーの三つにする事)更に下記の条件を満たすこと <条件> 自動販売機で購入できる「商品」,「お金」,「自動販売機」は最低限クラス化すること。 「カプセル化」,「継承」,「多様性」を全て利用すること。 例外処理をすること(プログラムが頓挫した時点でNGとします)。 入出力は,下記のとおり行うこと。 【入力】 【出力】 ・お金(10円~1000円)の個数(枚数) ・つり銭(10円~100円)の個数(枚数)と総購入代金 ・購入商品選択(複数可) ・購入商品名(複数) 実現は,main()関数で「自動販売機」クラスのインスタンスを1つ作成し,そのクラスのbuy( )メンバ関数を呼び出したら全てが動作するようにする。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VB2005 [3.3] 言語: C++ [4] 期限: 2/1まで [5] その他の制限: 特になし。
78 :
デフォルトの名無しさん :2009/01/31(土) 16:25:12
n回の試行でlog_10(n)以下の数字が全て生成出来るは合ってるか?
>>76 だな
コラッツ予想の写像がN→Nへの全単射でないからな
どうにもならん
80 :
デフォルトの名無しさん :2009/01/31(土) 16:43:13
別に、分岐があってもいいんだ。 全ての数字が生成出来るなら1へたどり着けるからな。 n回試行でlog_10(n)以下の数字生成出来るを証明すれば解けるぞ。 この評価は間違ってはいないと思うが。 10^4 = 10000 回試行で4以下を生成すればいいという余裕と思われる評価。
81 :
デフォルトの名無しさん :2009/01/31(土) 16:50:01
2進数だと、シフト(2倍する)と1を加えるで、全ての数字が生成出来るが 同じような理屈でできないか?
83 :
デフォルトの名無しさん :2009/01/31(土) 17:27:03
ろだのPOSシステムの問題どなたかお願いします。
int isHamming(int n) { while(n % 2 == 0) n /= 2; while(n % 3 == 0) n /= 3; while(n % 5 == 0) n /= 5; return n == 1 ? 1 : 0; } この程度の関数で十分だろ
wwwwwwwwwwwwwwwwwwwwww
>>77 例外処理してない&動くかどうかしらんが、
class jusu{ public: virtual int p(){ return 0; } };
class orenji : public jusu{ public: int p(){ return 120; } };
class kora : public jusu{ public: int p(){ return 120; } };
class saida : public jusu{ public: int p(){ return 120; } };
class okane{ int _10, _50, _100, _500, _1000;
public: okane(){} okane(int a, int b, int c, int d, int e){ _10=a; _50=b; _100=c; _500=d; _1000=e; }
int p(){ return _10*10+_50*50+_100*100+_500*500+_1000*1000; }
};
class hanbaiki{ public: okane Buy(okane kane, int o, int k, int s, jusu *syohin){
int out=0;
for(int i=0; i<o; ++i, syohin[out++] = orenji());
for(int i=0; i<k; ++i, syohin[out++] = kora());
for(int i=0; i<s; ++i, syohin[out++] = saida());
int turi = kane.p()-o*orenji().p()+k*kora().p()+s*saida().p();
int _1000=turi/1000; turi-=_1000; int _500=turi/500; turi-=_500; int _100=turi/100; turi-=_100;
int _50=turi/50; turi-=_50; int _10=turi/10; turi-=_10;
return okane(_10, _50, _100, _500, _1000);
}};
int main(){ jusu syohin[100]; okane oturi = hanbaiki().Buy(okane(1,1,1,1,1), 1, 1, 1, syohin); return 0; };
ちょっとなおした。でも多分まだ間違ってる。でもやるきないのでこれで終わり。 class jusu{ public: virtual int p(){ return 0; } }; class orenji : public jusu{ public: int p(){ return 120; } }; class kora : public jusu{ public: int p(){ return 120; } }; class saida : public jusu{ public: int p(){ return 120; } }; class okane{ int _10, _50, _100, _500, _1000; public: okane(){} okane(int a, int b, int c, int d, int e){ _10=a; _50=b; _100=c; _500=d; _1000=e; } int p(){ return _10*10+_50*50+_100*100+_500*500+_1000*1000; } }; class hanbaiki{ public: okane Buy(okane kane, int o, int k, int s, jusu *syohin){ int out=0; for(int i=0; i<o; ++i, syohin[out++] = orenji()); for(int i=0; i<k; ++i, syohin[out++] = kora()); for(int i=0; i<s; ++i, syohin[out++] = saida()); int turi = kane.p()-o*orenji().p()+k*kora().p()+s*saida().p(); int _1000=turi/1000; turi-=_1000*1000; int _500=turi/500; turi-=_500*500; int _100=turi/100; turi-=_100*100; int _50=turi/50; turi-=_50*50; int _10=turi/10; turi-=_10*10; return okane(_10, _50, _100, _500, _1000); }}; int main(){ jusu syohin[100]; okane oturi = hanbaiki().Buy(okane(1,1,1,1,1), 1, 1, 1, syohin); return 0; };
90 :
デフォルトの名無しさん :2009/01/31(土) 20:30:39
0TEN
_10とかの変数名見てふと思ったんだけど、 Javaの変数名って日本語文字使えるのん?
使えない
使えるよw
試してみればいいよ
まじだ、JAVAのパーサはUNICODEで解釈するのか。
あ、やっぱりだめなのね。 わしの持ってる本にはウムラウトとかが許されるって書いてあるから 漢字もできるのかと思った。
あれw 使えるの? あはーん? Visual Studio 2008はJ++廃止されちゃったから試せない。
C#は使えるな
1] 授業単元:数値計算演習 [2] 問題文:次の二階微分方程式を解け。初期値は適当にとれ。 dv_x/dt=x/(x^2+y^2) , dx/dt=v_x dv_y/dt=y/(x^2+y^2) , dy/dt=v_y [3.1] OS: Windows [3.2] コンパイラ名:Borland C++ Compiler、bcc developer [3.3] 言語: C [4] 期限:2月2日 [5] その他の制限:常微分方程式のルンゲクッタでググって調べたんですが、 この問題は変数が多くて応用できませんでした。どなたかよろしくお願いします。
>>98 J++でできるからといってJAVAでできると言ってしまうのはひどい
逆にJAVAで可能なのかどうかを調べる為にJ++を使用するのもひどい
>>105 問1はmin=1000ぐらいにしとけ
それより問5が正常に動作していない件について
>>100 微分方程式の数値解としか言われてないならオイラー法で良かろう。一応1次のルンゲクッタだ。
>>105 問2
/* ヘッダとかdefineとか自分で考えてくれ。 */
int main(void){
char user_name[256];
int i,len;
puts("Input User Name");
scanf("%s",user_name);
len = strlen(user_name) - 1;
if( len > 8 || len <= 0 ) { printf("ユーザー名入力エラーです :: len=%d\n",len); exit(1); }
if( !isupper(user_name[0]) && !islower(user_name[0] ) { printf("ユーザー名の先頭文字が異常です :: %c\n", user_name[0]); exit(1);}
for(i=0;i<8;i++) if( !isalnum(user_name[i])) { printf("ユーザー名の一部が異常です :: %s\n", user_name); exit(1);}
sprintf(user_name,"メールアドレス : %s@%s",user_name,"helloworld.com");
puts(user_name);
reutrn 0;
}
if( !isupper(user_name[0]) && !islower(user_name[0] ) { if( !isalpha(user_name[0]) ) { for (i=0;i<8;i++) for (i=1;i<len;i++) sprintf(user_name, printf( puts(user_name);
>>105 問1に関して
maxとminを0で初期化するのは適切ではない
2個目のfor文の前で
max=a[0];
min=a[0];
のようにすべき
>>105 問4
#include <stdio.h>
#include <math.h>
void main(){
int a,b,c;
double x1,x2;
int D;
printf("a = ");scanf("%d",&a);
printf("b = ");scanf("%d",&b);
printf("c = ");scanf("%d",&c);
D = b*b - 4*a*c;
if(D > 0){
x1 = (-b - sqrt(D))/ 2*a;
x2 = (-b + sqrt(D))/ 2*a;
printf("二次方程式 %d x^2 + %d x+ %d = 0 は相異なる2つの実数解を持ち、解の値は%.2fと%.2fです。\n",a,b,c,x1,x2);
}
else if(D == 0){
x1 = -b / 2*a;
printf("二次方程式 %d x^2 + %d x+ %d = 0 は重解を持ち、解の値は%.2fです。\n",a,b,c,x1);
}
else{
printf("二次方程式 %d x^2 + %d x+ %d = 0 は実数解を持ちません。\n",a,b,c);
}
}
>>105 問5
#include <stdio.h>
void main(){
int i;
char str1[256];
char str2[256];
int count1 = 0;
int count2 = 0;
printf("文字列1:");fgets(str1,256,stdin);
printf("文字列2:");fgets(str2,256,stdin);
for(i = 0; str1[i] != '\0'; i++){if(str1[i] == ' ') count1++;}
for(i = 0; str2[i] != '\0'; i++){if(str2[i] == ' ') count2++;}
printf("文字列1中の英単語の数= %d\n",count1+1);
printf("文字列2中の英単語の数= %d\n",count2+1);
printf("英単語の数が多い方の文字列は 文字列%d です。\n",(count1 > count2) ? 1 : 2);
}
112 :
デフォルトの名無しさん :2009/02/01(日) 20:27:47
114 :
デフォルトの名無しさん :2009/02/01(日) 22:14:05
>>112 括弧を対応させる方法が思い出せない
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char b[256], *p = b;
double t(void){
double t = 0;
while(1){
if(isspace(*p)) p++;
else if(*p == '*'){ p++; t *= strtol(p, &p, 10);}
else if(*p == '/'){ p++; t /= strtol(p, &p, 10);}
else if(isdigit(*p)) t = strtol(p, &p, 10);
else return t;
}
}
double e(double r){
while(1){
if(isspace(*p)) p++;
else if(*p == '\0') return r;
else if(*p == '+'){ p++; r += t();}
else if(*p == '-'){ p++; r -= t();}
else r = t();
}
}
int main(int c, char *v[]){
FILE *in, *out;
if(c < 3 || (in = fopen(v[1], "r")) == NULL ||
(out = fopen(v[2], "w")) == NULL) return 1;
fscanf(in, "%255[^\n]", b);
fprintf(out, "%g\n", e(t()));
return fclose(in), fclose(out), 0;
}
117 :
116 :2009/02/01(日) 23:00:56
なお、以下のような、平均0、標準偏差1の場合に 下側累積確率、上側累積確率を求める関数を見つけたのですが、 どのように変更を加えて良いのかわかりませんでした。 ご教授お願いします。 #include <math.h> #define PI 3.14159265358979323846264 double p_nor(double z) /* 正規分布の下側累積確率 */ { int i; double z2, prev, p, t; z2 = z * z; t = p = z * exp(-0.5 * z2) / sqrt(2 * PI); for (i = 3; i < 200; i += 2) { prev = p; t *= z2 / i; p += t; if (p == prev) return 0.5 + p; } return (z > 0); } double q_nor(double z) /* 正規分布の上側累積確率 */ { return 1 - p_nor(z); }
118 :
デフォルトの名無しさん :2009/02/01(日) 23:48:49
>>107-111 ありがとうございます。
問5はできたのですがそれ以外ができません。
問1は
>>109 の通りにやったら最小値でました!ありがとうございます。
平均値はどのようにして出せばいいのでしょうか?
それではよろしくお願いします。
>>118 > 平均値はどのようにして出せばいいのでしょうか?
値を全部足して、それを値の個数で割る
>>118 >問5はできたのですがそれ以外ができません。
難しくて全く理解できないのか、自分で作ってバグがでるのか、何を求めているのか。
言われなきゃ分からんとはな。
121 :
デフォルトの名無しさん :2009/02/02(月) 00:12:12
>>119 >>120 ごめんなさい。質問する以前の問題でしたね・・・。
問1:全ての値の合計の仕方がわかりません。
問2:
>>107 を見てやってみたのですがバグが出てしまって、自分で直そうとしたんですが難しくて手のつけようが・・・。
問3:問2を少し弄れば出来そうな気はします
問4:バグがでます
あぁ、またsage忘れたorz
これはひどい
>>121 合計の出し方
sumを0に初期化
2個目のfor文の中でsum+=a[i];
エラーメッセージを貼るなりしてくれないと
どんなバグが出てるのかわからない
>>124 問2
>>107 を実行すると
1>.\11.cpp(8) : error C3861: 'strlen': 識別子が見つかりませんでした
1>.\11.cpp(9) : error C3861: 'exit': 識別子が見つかりませんでした
1>.\11.cpp(10) : error C3861: 'isupper': 識別子が見つかりませんでした
1>.\11.cpp(10) : error C3861: 'islower': 識別子が見つかりませんでした
1>.\11.cpp(10) : error C3861: 'exit': 識別子が見つかりませんでした
1>.\11.cpp(11) : error C3861: 'isalnum': 識別子が見つかりませんでした
1>.\11.cpp(11) : error C3861: 'exit': 識別子が見つかりませんでした
1>.\11.cpp(14) : error C2065: 'reutrn' : 定義されていない識別子です。
1>.\11.cpp(14) : error C2143: 構文エラー : ';' が '定数' の前にありません。
講義で習ってないものばかりで・・・。
>>108 は一体?
問4
>>110 を実行すると
1>.\11.cpp(12) : error C2668: 'sqrt' : オーバーロード関数の呼び出しを解決することができません。
1> D:\c++\VC\include\math.h(581): 'long double sqrt(long double)' の可能性があります。
1> D:\c++\VC\include\math.h(533): または 'float sqrt(float)'
1> D:\c++\VC\include\math.h(128): または 'double sqrt(double)'
1> 引数リスト '(int)' を一致させようとしているとき
1>.\11.cpp(13) : error C2668: 'sqrt' : オーバーロード関数の呼び出しを解決することができません。
1> D:\c++\VC\include\math.h(581): 'long double sqrt(long double)' の可能性があります。
1> D:\c++\VC\include\math.h(533): または 'float sqrt(float)'
1> D:\c++\VC\include\math.h(128): または 'double sqrt(double)'
1> 引数リスト '(int)' を一致させようとしているとき
126 :
107 :2009/02/02(月) 01:10:16
ヘッダ自分で調べるくらいできるだろう。 strlen , exit , isupper , islower , isalnum ググれ。 returnのタイプミスはすまないが、気付かない方も考えてない証拠かと。 return 0; を 「reutrn 0;」と書けば、reutrnを変数などの識別詞とみなすから 「INTMAX 0;」とか「1 0;」と同等に扱われる。 returnに直せば問題解消。無意味だが「reutrn; 0;」とすれば、警告は片方減る。
127 :
110 :2009/02/02(月) 01:15:20
>>125 VCでビルドしなかったのは俺のミスだ
sqrt(D)をsqrt((double)D)に直してくれ
128 :
デフォルトの名無しさん :2009/02/02(月) 01:19:33
>>125 >>108 は
>>107 の修正分を書いてる。
if( !isupper(user_name[0]) && !islower(user_name[0] ) {
を
if( !isalpha(user_name[0]) ) {
にする。
一行しかないものは削除
>>117 関数の引数を↓のようにして(muは平均sigmaは標準偏差)
double p_nor(double z, double mu, double sigma)
変数を宣言しているすぐ下に
z = (z-mu)/sigma;
を追加すればおk
131 :
116 :2009/02/02(月) 03:27:12
>>130 できました!
こんな夜中にありがとうございます!
t = p = z * exp(-0.5 * z2) / (sqrt(2 * PI) * sigma);
のように、ここにもsigmaをかけなければいけないと思ってて
3日間ほどずっと悩んでました。
ほんとありがとうございます!
fprintfとfscanfを同時に使用する場合、fopenのモードは何にすれば良いのでしょうか? 当方初心者でかなり無知ですがよろしくおねがいします。
自己解決したすまね。 fopenを別々ですね。
フローチャートくらい・・・ って思ってしまう俺は疲れてるのかな。
疲れているなら、風呂に入っちゃ~
一緒に入りませんか?
おれバイト&社会人でプログラム8年くらいやってるんだけど フローチャートって使ったことない。使うもんなの?
>>133 ふつうは "r+" とか "w+" だな
同時と言っても順序・タイミング考えないとぐちゃぐちゃになってしまうが
>>138 今はどうか知らんけど、パチンコやパチスロのソフトは認可通すのに必須だとか?
>>138 使う場合もあるしない場合もあるけど
ISOなんちゃらの監査の時に資料がいるので一応作っている
>>140-141 そういう使い方なのか・・・
フローチャート書けるってことは、論理がわかってるってことだから
結局同じ手間でソースかけるような気がするんだよね。
だからフローチャートの必要性がわからんかった。
143 :
デフォルトの名無しさん :2009/02/02(月) 13:30:04
144 :
デフォルトの名無しさん :2009/02/02(月) 13:47:15
[1] 授業単元:プログラミング応用
[2] 問題文(含コード&リンク):
ttp://beatguiter.xxxxxxxx.jp/text.html [3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: C
[4] 期限: ([2009年2月2日0:00まで]
[5] その他の制限: 特にないが構造体とファイル処理まで習いました。
>>145 追記です
よろしくお願いします。助けてください。
>>144 問1(exam01)を気まぐれにソースかいてみた。パーツに分けて書いた。
int main(void){
int Ary[5],i;
int Sum,Max,Min;
for(i=0;i<5;i++){ // 入力部
printf("Input Data Ary[%d] ?? ",i);
scanf("%d",Ary+i);
}
for(i=Sum=0;i<5;i++){ // 最大値計算部
Sum += Ary[i];
}
Max = Min = Ary[0]; // 0個目までの最小値最大値
for(i=1;i<5;i++){ // 1~4個目までの最小値最大値
if(Ary[i]>Max) Max = Ary[i];
if(Ary[i]<Min) Min = Ary[i];
}
// 結果出力
printf("\t合計値 = %5d (Sum)\n",Sum);
printf("\t最小値 = %5d (Min), 最大値 = %5d (Max)\n",Min,Max);
printf("逆順:");
for(i=4;i>=0;i--){ // 逆順(forのデクリメント使用)
printf("%+5d ",Ary[i]); // インクリメントが良ければ書き直してくれ
}
return 0;
}
148 :
デフォルトの名無しさん :2009/02/02(月) 15:17:00
>>147 課題1のすっごいわかりやすかったです!!!
ありがとうございます、助かりました!!!
@課題2・3誰か助けてください orz
>>144 ,148
課題2
#include<stdio.h>
void put_n(char c,int n){
while(n--)printf("%c",c);
printf("\n");
}
int main(void){
int i,n;
scanf("%d",&n);
while(n<=0){
printf("正の整数を入力してください。\n");
scanf("%d",&n);
}
for(i=1;i<=n;i++)put_n('*',i);
printf("\n");
for(i=n;i;i--)put_n('*',i);
return 0;
}
課題3.コメントアウトつけなかったけど、ま分かるだろう。 #include <stdio.h> #include <string.h> int count_char(const char* s, char c){ int i,length,count=0; length = strlen(s)-1; for(i=0;i<length;i++) if( s[i] == c) count++; return count; } int main(void){ int Size,i,tmpCount; char strBuff[5][256]; for(i=0;i<5;i++){ printf("Input String (%d) ?? ",i); scanf("%s",strBuff[i]); } for(i=0;i<5;i++){ tmpCount = count_char(strBuff[i],'a'); if(tmpCount == 0) continue; printf("文字列[%s]に含まれる'a'の個数は%2dです\n",strBuff[i],tmpCount); } return 0; }
>>149 課題提出に問題ないと思うけど
問題文の解釈は自分ではこうなるけど、、、
while(n<=0){
printf("Input n ?? ");
scanf("%d",&n);
if(n>0) break;
printf("正の整数を入力してください。\n"); //問題文から警告と読み取るとこの位置
}
for文と条件演算子使うと1行で(簡単なんだか難解なんだか)
// for(Size=0;Size<1;Size<1?puts("正の値を入力してください"):0 ) scanf("%d",&Size);
>>151 scanf("%d",&n);
while(n<=0){
printf("正の整数を入力してください。\n");
scanf("%d",&n);
}
入力部はこれでひと塊なんだ
153 :
デフォルトの名無しさん :2009/02/02(月) 16:48:57
>>144 です
>>150 を試してみましたが
色々入力してみて結果をみると
a が含まれてるのに表示されないのがあります
どう改善すればいいでしょうか;;;
155 :
デフォルトの名無しさん :2009/02/02(月) 17:03:33
>>154 fgets って言うのは習ってないので
どこに組み込めばいいか分からないです…。
>>152 自分でコンパイルしてなかった。すまん。
>>153 >>155 strlenが改行コード含むと思ってプログラムしてたから、自作関数の-1を消してもらえば大丈夫だと思う。
157 :
デフォルトの名無しさん :2009/02/02(月) 17:14:29
>>156 -1を消したらうまくできました!ありがとうございます^^
>>147 ,149,150,151,152,154,156
いい人が沢山居て本当に助かりました☆
皆さんありがとうございました!!!
(x^n) mod m
>>160 はええな
マジで?
おれより速い奴がいるなんて興奮して勃起しちゃった
>>160 質問者じゃないんだけど
y=1;z=x;
for(i=n;i>0;i>>=1){ ←i>>=1これどういう意味ですか?
if(i%2) y=(y*z)%m; ←これなんでiが偶数のときは処理しないんですか?
z=(z*z)%m;
}
return y;
>>163 >for(i=n;i>0;i>>=1){ ←i>>=1これどういう意味ですか?
iを右に一つシフトした結果をiに代入する。
結果、iが二分の一になる。
>>165 >結果、iが二分の一になる。
端数切捨てね。
5(101)→2(10)
ここって宿題じゃなくて単発の質問はいいのかな?
171 :
デフォルトの名無しさん :2009/02/02(月) 22:43:50
内容:[1] 授業単元: プログラミング [2] 問題文:Visual c++を使って大富豪を作りなさい。 ルールは、8切りのみです。ペア、階段等は無しにします。 CPUは1名とします。 カード枚数は10枚ずつで、ジョーカーは無しです。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: [3.3] 言語:Visual c++ [4] 期限: できれば早めに・・・・ [5] その他の制限: まだ基礎段階なので、なるべく簡単なプログラムがいいです。 画像の取り込みとかはせずに、文章で表示すればいいらしいです。 Visual c++がよくわからないので、よろしくお願いします
>>166 スレ違いなのに質問に答えてくれてありがとうございます
>>172 CPUとの1対1でいいのか?
ペアなしっていうのは、常に1枚ずつしかカード出せないってことでいい?
ていうかCPUの思考ルーチン作るのって基礎段階を大幅に超える気がするんだが
177 :
105 :2009/02/02(月) 23:33:50
問2をここまでやったのですが、どうも何かが違うようで7桁の数字を入力しても学番は7桁~のほうがでてしまうんです。 #include<stdio.h> #include<string.h> #include<stdlib.h> void main(){ char x[100]; int y,z; printf("学番を入力:"); gets(x); y=strlen(x); z=atoi(x); if(y==7 && z==7){ printf("g%s@yahho\n",x); } else{ printf("学番は7桁の数字で入力して下さい\n"); } } どこがいけないのでしょうか? 何度も住みませんが、よろしくお願いします。
>>175 バブルソート フローチャート
でググれ
>>177 Z==7がまずい
というかそれ、問3じゃないのか?
>>179 あ、ごめんなさい。問3でした
z==7がいけない、ということは
y==7 か z==7 どちらかしか使用してはいけないということなのでしょうか
文字数が7、尚且つ数字であるとき、という風にしたいのですが・・・
>>172 仕様を、常に自分からで敵は出せる最小を必ず出す、とすれば楽になる。
が、10行20行で分かりやすく纏めるのやファイルうpはめんどい。
流れの案だけ、書いとく。
全体 [シャッフル]->[配布]->[スタート(自分の番)]->[ループ&終了判定]->[終了時コメント]->end
ループ部分
自分の番:自分のカードを printf("%d:%d ",i%10,ME[i]);とかで表示
scanfでキーボードの1,2,3,...,9,0を選択。フラグ処理などしないと、同じカード捨てる事になる。
相手の番:場に出ている番号(初めは0)より大きい最小のカードのインデックスを計算
あればそのインデックス。無ければ自分の番に。
細かいシステム管理(枚数チェックとか、場のカードの数・切るとか)も必要だし、
[シャッフル]7行 [配布]2~5行 [ループ&終了判定]30行位[終了時コメント]3行
整理して、こんなもんかな?
>>180 言ってることとやってることがめちゃくちゃだぞ
数字かどうか判断するにはxに格納された文字が
'0'と'9'の間にあるかどうかを判断すべき
それと宿題程度ならいいと思うが
getsはなるべく使わない方がいい
>>182 よく使ってるscanfも曲者と聞きますし、fgets&sscanfが良いと聞きますが
宿題レベルでもでしょうか?実感ないのですが。
>>183 オーバーフローするような値を
敢えて入力するやつはいないと思うから
宿題レベルでとやかく言われることはないんじゃね?
でもリスクは少なくしておくべき
y=strlen(x); bool b = true; int i; for( i = 0; i < 7; ++i ){ if( x[i] < '0' || x[i] > '9' ) b = false; } if(y==7 && b ){ printf("g%s@yahho\n",x); } else{ printf("学番は7桁の数字で入力して下さい\n"); }
>>174 出せるカードの中で一番弱いカードを出す程度で十分。
商用ゲームですらこれのことあるし。
>>174 常に1枚だすので大丈夫です。よろしくお願いします。
189 :
デフォルトの名無しさん :2009/02/03(火) 00:17:01
C言語、プログラミング基礎の問題です。 整数型変数xに値16を代入文で直接代入する代わりに、ポインタ変数を用いて 間接的に行う方法を与えよ。 とても簡単だと思うのですがわからなくて。。。 お願いします
>>189 int x;
int *px;
px = &x;
*px = 16;
こういうことかな?
もしくは px[0] = 16 も。ポインタ理解できると→*(&px[1]-1)=16 でもできる事がわかる。
192 :
デフォルトの名無しさん :2009/02/03(火) 00:24:34
>>182 >>184 ありがとうございます。おかげさまで無事できました!
授業ではgets()しか習っていませんでしたが使わないほうがいいのですね。勉強になります。
193 :
181 :2009/02/03(火) 00:40:07
シャッフルだけ。 大富豪以外にもカードゲームボードゲームでも同じ事するはずだから、良いソース持ってる人いるだろうケド 山のシャッフルは、短絡的に実装しました。 バグさえなければ、大雑把にCARD_NUMの2乗オーダーの計算だと思うので 10000枚とかでなければ気にする事無いと思います。 #define CARD_NUM (13*4) int main(){ int cards[CARD_NUM];// カード番号とカードの数字を対応 int yama[CARD_NUM];// カードをシャッフルして代入 int i,j,ran; srand((unsigned) time(NULL)); for(i=0;i<CARD_NUM;i++){ cards[i]=i; yama[i]=-1; } for(i=0;i<CARD_NUM;i++){ ran = rand()%(CARD_NUM); if(yama[ran]==-1) yama[ran]=i; //トランプの数字にするには yama[ran] = i/4; else i--; //やり直し } /* シャッフル検査 */ for(i=0;i<4;i++){ for(j=0;j<13;j++) printf("%2d/",yama[i*13+j]); puts(""); } return 0; }
194 :
デフォルトの名無しさん :2009/02/03(火) 00:49:48
>>190 >>191 ありがとうございます!!
あと、while(条件){作業}
を、if文とdo-while文を使って表現すると、どうなるのでしょうか・・・
マルチポスト 224 名前:デフォルトの名無しさん[] 投稿日:2009/02/02(月) 22:46:51 while文をif文とdo-while文を使って表現せよ という問題なんですが…ifも使わなきゃいけないというところがわかりません どうすればよいのですか??
196 :
デフォルトの名無しさん :2009/02/03(火) 01:00:04
それでも前のスレで答えてくれている人がいるだろ。 チェックしてないのかよ。
198 :
デフォルトの名無しさん :2009/02/03(火) 01:03:38
見たけどあってるかわからなかったんで
じゃあこのスレで答えても同じことになるだろ。
200 :
デフォルトの名無しさん :2009/02/03(火) 01:08:58
答え2つあったんですけど、どっちがあってるかわかりますか このスレは答え教えてくれるんで
じゃあもう一個増やしてやるよ。 do{ if(!x){ break; } /*処理*/ }while(x);
202 :
デフォルトの名無しさん :2009/02/03(火) 01:27:04
暇人・・・ww
do { if(!x) break; /*処理*/ }while(1); でもよくね?
do { loop: if (!x) break; /* 処理 */ goto loop; } while (0);
あ~あ夜は暇だなっと。マジレスでもするか while(cnd){ /* ○処理 */ } if(cnd?"GO"[0|0]:0x0)do{ /* ○処理 */ }while("yoru"['-'-'-']?cnd:69);
207 :
デフォルトの名無しさん :2009/02/03(火) 06:57:53
>>206 問7
#include <stdio.h>
#define COUNT_OHAJIKI 32
#define MAX_JIRO 25
int main(){
int n;
scanf("%d",&n);
while(n!=0){
int i,rest=COUNT_OHAJIKI,jiro[MAX_JIRO];
for(i=0;i<n;i++)scanf("%d", jiro+i);
i=0;
while(rest!=0){
rest-=(rest-1)%5;
printf("%d\n", rest);
rest-=jiro[i];
if(rest<0)rest=0;
printf("%d\n", rest);
i=(i+1)%n;
}
scanf("%d",&n);
}
return 0;
}
211 :
デフォルトの名無しさん :2009/02/03(火) 10:13:29
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): ・2つの分数の分子と分母を入力すると,それらの和・差・積・商を 出力する.データは構造体で表現すること. ・分数計算では通分・約分には最大公約数が必要になる.通分には分母の最小公倍数が, 約分には最第公約数が必要である.したがってこれらを計算する関数をそれぞれ作る. ・最大公約数を求めるには,次のアルゴリズムを使うとよい(ユークリッドの互除法). ① mをnで割る (ただしm>n). ② ①の割る数を①の余りで割る. ③ ②の割る数を②の余りで割る. ④ 以下同様に,余りが0になるまで繰り返し,そのときの「割る数」が最大公約数になる. ・2つの数,m,nの最小公倍数は,m*n/(mとnの最大公約数)で求めることができる. (実行例) 1つめの分数の分子・分母の入力―>3 4 2つめの分数の分子・分母の入力―>1 6 和:11 / 12 差: 7 / 12 積: 1 / 8 商: 9 / 2 [3] 環境 [3.1] OS: Windows vista [3.2] コンパイラ名とバージョン: bcc [3.3] 言語: C [4] 期限: 今週中ぐらい [5] その他の制限: 繰り返し文、条件判断文、構造体を勉強しました。 初心者なので、初心者にもわかるようなプログラムをお願いします。
212 :
デフォルトの名無しさん :2009/02/03(火) 11:25:26
213 :
デフォルトの名無しさん :2009/02/03(火) 11:28:51
ノ
>>149 これ見てから考えな。あと、これくらい一つのファイルにまとめろ。
215 :
デフォルトの名無しさん :2009/02/03(火) 11:40:08
>>212 #include <stdio.h>
int main(void) {
int i, j, n;
printf("段数を入力してください: ");
scanf("%d", &n);
for(i = 0; i < n; i++) {
for(j = 0; j < i + 1; j++) printf("*");
printf("\n");
}
return 0;
}
>>211 構造体はどういう形で作ればいいんだ?
指定なし?
なしなら授業で作った構造体を1つ晒してくれ
217 :
デフォルトの名無しさん :2009/02/03(火) 11:42:41
>>213 #include <stdio.h>
int main(void) {
int i, j, n;
printf("段数を入力してください: ");
scanf("%d", &n);
for(i = 0; i < n; i++) {
for(j = 0; j < i; j++) printf(" ");
for(j = 0; j < (n - i) * 2 - 1; j++) printf("*");
printf("\n");
}
return 0;
}
>>211 どう?
#include <stdio.h>
typedef struct bunsu{int bunshi,bunbo;} BUNSU;
int main(){
BUNSU bunsu1,bunsu2;
printf("1つめの分数の分子・分母の入力->\n");scanf("%d%d",&(bunsu1.bunshi),&(bunsu1.bunbo));
printf("2つめの分数の分子・分母の入力->\n");scanf("%d%d",&(bunsu2.bunshi),&(bunsu2.bunbo));
int bunbo=bunsu1.bunbo*bunsu2.bunbo;int bunshi=bunsu1.bunshi*bunsu2.bunbo+bunsu2.bunshi*bunsu1.bunbo;
int GCD = gcd(bunshi,bunbo);
printf("和:%d / %d\n",bunshi/GCD,bunbo/GCD);
//
bunshi=bunshi=bunsu1.bunshi*bunsu2.bunbo-bunsu2.bunshi*bunsu1.bunbo;
GCD = gcd(bunshi,bunbo);
printf("差:%d / %d\n",bunshi/GCD,bunbo/GCD);
//
bunshi=bunshi=bunsu1.bunshi*bunsu2.bunshi;
GCD = gcd(bunshi,bunbo);
printf("積:%d / %d\n",bunshi/GCD,bunbo/GCD);
//
bunshi=bunshi=bunsu1.bunshi*bunsu2.bunbo;
bunbo=bunsu1.bunbo*bunsu2.bunshi;
GCD = gcd(bunshi,bunbo);
printf("商:%d / %d\n",bunshi/GCD,bunbo/GCD);
return 0;
}
int gcd(int m,int n){
if(m<n){int temp=m;m=n; n=temp;}
int amari;
while((amari=m%n)!=0){m=n;n=amari;}
return n;
}
全部bunではじめるなよ。 bunsu とbunsu1じゃ大違いだろ。int int1;と同じ。 編集してみた。 #include <stdio.h> typedef struct bunsu{int son,mom;} BUNSU; int main(){ BUNSU A,B; int new_mom,GCD; printf("1つめの分数の分子・分母の入力-> \t"); scanf("%d %d",&(A.son), &(A.mom)); printf("2つめの分数の分子・分母の入力-> \t"); scanf("%d %d",&(B.son), &(B.mom)); GCD = gcd(A.mom,B,mom); new_mom = (A.mom*B.mom)/GCD; // 通分 GCD = gcd(new_mom,A.son+B.son); printf("和:%d / %d\n",(A.son+B.son)/GCD,new_mom/GCD); GCD = gcd(new_mom,A.son-B.son); printf("差:%d / %d\n",(A.son-B.son)/GCD,new_mom/GCD); GCD = gcd(A.son*B.son,A.mom*B.mom); printf("積:%d / %d\n",(A.son*B.son)/GCD,(A.mom*B.mom)/GCD); GCD = gcd(A.son*B.mom,A.mom*B.son); printf("商:%d / %d\n",(A.son*B.mom)/GCD,(A.mom*B.son)/GCD); return 0; } int gcd(int m,int n){ if(m<n){int temp=m;m=n; n=temp;} int amari; while((amari=m%n)!=0){m=n;n=amari;} return n;
>>219 そんなのを気にするくらいなら
BUNSU bunsu_add(BUNSU a, BUNSU b);
的なのを作ったほうがよくないか?
>>218 をbun -> "空白"にWORDで置換してみると
文字数 896 -> 680。実にソースの24%がbun成分です。もはやネタソースだろ。
大文字の変数とかやめてよ。 しかも一文字
分子が息子で分母がお母さんかw
>>222 一文字変数にしてご満悦って、70年代の世界からでも来たのかよ?
>>219 通分が分からないって、ありえないだろ。
いじらなくても変数名だけ変えられたし。
227 :
219 :2009/02/03(火) 13:50:29
小さいプログラムや、ローカルな変数の場合、無駄に長い変数は望ましくないと考えるが。
a,c,i,xは基本の型で、行列や構造体等A,Ary,Array場合によるが大文字も使う。
特にVBとか別言語触れてからは、使い分けるようになった。
>>224 ソースコードで変な想像したら負け組(new_mom?A.mom*B.son:A.son*B.momとか)
>>227 バカだから、テストどころかコンパイルもしないで貼ってみたわけね・・・
計算しなければどうということはない
[1] 授業単元: アルゴリズムと数値計算 [2] ニュートン法とオイラー法で√2の近似値を計算するプログラムを作れ ただし、計算は50ステップ行い、それぞれの初期値とsqrt(2)との差を表示する事。 初期値は各々が定めてよい [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:VC2005EE [3.3] 言語:C [4] 期限:09/02/04迄 [5] その他の制限: 文字表示・繰り返し文・条件判断とオイラー法の計算は分かります
>>233 オイラー法ってこんなか?
#include <stdio.h>
#include <math.h>
double newton(){
double x=1.0;
int i;
for(i=0;i<50;i++){
x=x-(x*x-2)/(2*x);
}
return x;
}
double euler(){
int n=50;
double x=1.0,h=(double)(2-1)/n;
int i;
for(i=0;i<n;i++){
x=x+h/(2*x);
}
return x;
}
int main(){
double temp=newton();
printf("sqrt(2):%f,newton:%f,差:%f\n",sqrt(2),temp,sqrt(2)-temp);
temp=euler();
printf("sqrt(2):%f,euler:%f,差:%f\n",sqrt(2),temp,sqrt(2)-temp);
return 0;
}
>>234 ありがとうございます!
for文の中身1行で表せるんですね。
初期値表示と(double)(2-1)を2.0-1.0など軽く置き換えて完成しました。
だいたい、プログラム入れてみるとxln(x)が定数なしで自己相関関数に一致してるくらいだな。 つまり、O(NlnN)だな。でも、NlogNだと思ってて、N^2だったってよりよくない?
うん。
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 角度はラジアン単位(rad),度単位(degree)【°】で表される.さらに 度単位は 32.4°と10進小数表示する場合と 32度24分と度分秒で表示する場合がある.(60秒で1分, 60分で1度) ①2つの角度(度単位)を10進小数点2桁 でキーボードから入力し(例 69.21° と 33.73° ) それらを度分秒単位で 表示させるプログラムを作成しなさい. ②さらに度分秒単位で表示された2つの角度の差を求め,度分秒単位で表示しなさい. 計算は度分秒単位のまま引き算すること(60進法の引き算アルゴリズムを作成すること). [3] 環境 [3.1] OS: Windows Vista [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2009年2月4日 13:00 [5] その他の制限: よろしくお願いします
キーボードから入力し(例 69.21° と 33.73° ) 2バイト文字か?まずその入力ができるかが問題だ。 Alt+半角で全角打てるけど、(例 69.21 と 33.73)の間違えだと言ってくれ。
243 :
デフォルトの名無しさん :2009/02/03(火) 22:03:28
>>211 のものですが、
>>219 をコンパイルしたら
和と差が計算できなかったのですが、どうすれば
いいでしょうか?
どなたか教えてください。
A.son *= B.mom; B.son *= A.mom; A.mom=B.mom=(A.mom*B.mom); // 通分(約分せず) GCD = gcd(A.mom,A.son+B.son); printf("和:%d / %d\n",(A.son+B.son)/GCD,A.mom/GCD); GCD = gcd(A.mom,A.son-B.son); printf("差:%d / %d\n",(A.son-B.son)/GCD,A.mom/GCD);
分母: mom 分子: son っていうネーミングセンスが素敵だ
辞書片手に英語にしまくったら単語の意味を忘れて自分で読めないというのは聞かなくもないけれど、 日本語の一部を切り出して英語にするっていうのは新しい。
>>240 #include<stdio.h>
#include<math.h>
typedef struct { int deg, min, sec; } Degree;
void rad2deg(Degree *pdeg, double rad) {
pdeg->deg = (int)rad;
rad = (fabs(rad) - fabs(pdeg->deg)) * 60;
pdeg->min = (int)rad;
rad = (rad - pdeg->min) * 60;
pdeg->sec = (int)rad;
}
void print_deg(const Degree *pdeg) {
printf("%d度%02d分%02d秒\n", pdeg->deg, pdeg->min, pdeg->sec);
}
void degsub(Degree *pdiff, const Degree *pdeg1, const Degree *pdeg2) {
pdiff->sec = pdeg1->sec - pdeg2->sec;
pdiff->min = pdeg1->min - pdeg2->min;
pdiff->deg = pdeg1->deg - pdeg2->deg;
if (pdiff->sec < 0) { pdiff->sec += 60; pdiff->min --; }
if (pdiff->min < 0) { pdiff->min += 60; pdiff->deg --; }
}
int main() {
double rad1, rad2;
Degree deg1, deg2, degdiff;
printf("radian1="); scanf("%lf", &rad1);
printf("radian2="); scanf("%lf", &rad2);
rad2deg(°1, rad1); printf("degree1="); print_deg(°1);
rad2deg(°2, rad2); printf("degree2="); print_deg(°2);
degsub(°diff, °1, °2); printf("degree1-degree2="); print_deg(°diff);
return 0;
}
>>240 の人気に嫉妬
#include <stdio.h>
#include <math.h>
struct ds_t { int d; int m; int s;};
struct ds_t dec2ds(double dd){
struct ds_t ds;
ds.d = floor(dd);
ds.m = floor(60*(dd - ds.d) + 0.5/60);
ds.s = floor(3600*(dd - ds.d) - 60*ds.m + 0.5);
return ds;
}
void print_ds(struct ds_t *ds){
printf("%d.%d\'%d\"\n", ds->d, ds->m, ds->s);
}
struct ds_t sub_ds(struct ds_t *ds1, struct ds_t *ds2){
struct ds_t ds3;
ds3.d = ds1->d - ds2->d;
ds3.m = ds1->m - ds2->m;
ds3.s = ds1->s - ds2->s;
if(ds3.s < 0) ds3.s += 60, ds3.m--;
if(ds3.m < 0) ds3.m += 60, ds3.d--;
return ds3;
}
int main(void){
double dd1, dd2;
struct ds_t ds1, ds2, ds3;
scanf("%lf%lf", &dd1, &dd2);
ds1 = dec2ds(dd1); ds2 = dec2ds(dd2);
print_ds(&ds1); print_ds(&ds2);
ds3 = sub_ds(&ds1, &ds2);
return 0;
}
250 :
248 :2009/02/03(火) 22:57:35
degsubの符号の扱いが全然だめだった。
>>248 は取り下げます。
>>244 そこで上書きして残りの積と商をどうするツモリだ。
そうだよね。
>>253 は2/4拍子と3/6拍子の違いが分かってらっしゃる。
#include<stdio.h>
int main(){
int i,j,tmp,data[5+1];
for(i=0;i<10;i++){
printf("%d人目",i);
scanf("%d",&tmp);
data[tmp]++;
}
for(i=1;i<=5;i++){
printf("\n%d",i);
for(j=0;j<data[i];j++) printf("*");
}
return 0;
}
どなたか
>>134 をお願いいたします。ググってもわかりません。。。
>>256 一番上に書く名前が分かりません><
マジレスはお断りしておきます
>>247 degree[i][1] = (int)((input[i] - (int)input[i]) * 10) * 6;
degree[i][2] = (int)((input[i] * 10 - (int)(input[i] * 10)) * 10) * 6;
この計算式は何なのか、後でAAで提出するように。
5秒で答えにたどり着いたけど 134は馬鹿なの?死ぬの?
260 :
240 :2009/02/03(火) 23:28:32
>>256 フローチャートは詳しくないが日本語にそれらしく訳してくと
開始
ファイルをfpiに読み込む
ファイルの先頭からデータ数をnへ代入
ループ iをn回 配列xのi番目にi番目のデータを代入
ループ iをn-1回 (中身jループ)
/* */ ループ jをi+1からnまで
/* */ /* */ 分岐 x[i]>x[j] --YES--> x[i]とx[j]を交換 -->jループへ
/* */ /* */ --NO-->jループへ
ループ iをn回 iとx[i]を表示
終了
>>262 力作乙
だが、extention error だ
名前と実体が異なっている
>>263 そんな突っ込みは想定していない。
OpenOfficeの操作覚えようかな……。
>>252 #include <stdio.h>
int main(void)
{
int a[10], c[5], i, j;
for (i = 0; i < 9; ++i) scanf("%d,", &a[i]); scanf("%d", &a[9]);
for (i = 0; i < 5; ++i) c[i] = 0;
for (i = 0; i < 10; ++i) c[a[i] - 1]++;
for (i = 0; i < 5; ++i) {
printf("%d", 5 - i);
for (j = 0; j < c[4 - i]; ++j) printf("*");
printf("\n");
}
return 0;
}
>>172 コンソールアプリでいいんだよね?
言語はCとC++どっち?
>>266 >[5] その他の制限: まだ基礎段階なので、なるべく簡単なプログラムがいいです。 画像の取り込みとかはせずに、文章で表示すればいいらしいです。 Visual c++がよくわからないので、よろしくお願いします
C++のWindowアプリケーションを望んでいるようには見えない。
求めてるのは”なるべく簡単”でしょ。
void bitpart(int x) { char str[33]=""; for(b=31;b>=0;b--){ sprintf(str,"%s%d",(x>>b)&1); return str; } > jprintf(bit pattern=%s\n",bitpart(x,bit)); なんかちがう
すみません... 打ち間違いでした printf("bit pattern =%s\n", bitpart(x,bit)); です.すみません
>>268 char*bitpart(int x,char *bit)
{
int b;
bit[32] = '\0';
for(b=31;b>=0;b--){
sprintf(&bit[31-b],"%d",(x>>b)&1);
}
return bit;
}
>>271 早い返事ありがとうございます
助かりました
273 :
897 :2009/02/04(水) 17:01:19
>>273 void insert(int num, struct node *p)
{
struct node *n;
while (p->next != NULL && p->next->key < num) {
p = p->next;
}
n = (struct node *)malloc(sizeof *n);
n->key = num;
n->next = p->next;
p->next = n;
}
>>274 ありがとうございます!!
なんとかいけそうです
276 :
デフォルトの名無しさん :2009/02/04(水) 17:46:14
>>276 #include <stdio.h>
int main(void)
{
int kinshu[10] = { 10000, 5000, 2000, 1000, 500, 100, 50, 10, 5, 1 };
int i, j, c, n;
printf("金額を入力してください: "); scanf("%d", &n);
for (i = 0; i < 10; ++i) {
for (c = 0; n / kinshu[i]; ++c) n -= kinshu[i];
printf("%5d円: %d枚\n", kinshu[i], c);
}
return 0;
}
> for (c = 0; n / kinshu[i]; ++c) n -= kinshu[i]; c=n/kinshu[i]; n-= c*kinsyu[i];
>>280 int pop(void)
{
struct node *n = TOP.next;
if (n == NULL) {
fprintf(stderr, "no stack\n");
return 0;
}
else {
int num = n->key;
TOP.next = n->next;
free(n);
return num;
}
}
int main(void)
{
TOP.next = NULL;
push(21);
push(42);
printf("%d\n", pop());
printf("%d\n", pop());
return 0;
}
丸投げスレなんだから当然だろ? ってこれは・・・w
284 :
280 :2009/02/04(水) 19:46:00
>>281 ありがとうございます
助かりました!!
285 :
Rm :2009/02/05(木) 00:09:41
[1] 計算システム(C言語)
[2] N×Nの行列A,Bに大して、次のようなプログラムを作成せよ。
・A+B、A-B、A×Bを出力するプログラム
・Aの逆行列を出力するプログラム(ピボット選択法)
ただし
・Nはdefineで4と定義する。
・A,Bそれぞれの成分データはdouble型配列に保存する。
・行列A,Bの各成分のデータは時間に依存した種から与えられる疑似関数により自動生成する。
http://mathweb.sc.niigata-u.ac.jp/~yamada/system/wed/kadai.htm 実際ほかの課題もわかりません。1は出来ましたが。
[3] 環境
[3.1] OS:Windows
[3.2] gcc
[3.3] 言語: C
[4] 期限: 5日
よろしくお願いいたします。
>>281 さんの方から解答をいただいたのですが
main関数の所がいまいちわかりません
できたらもう一度お願いします.
>>287 わかりませんもなにも見たまんまpushしてpopしてるだけだと思うが
もう一度といわれてもこれ以外書きようがないと思うべ?
どこがどうわからないか考え直してきなさい
push(21); push(42); これがよくわかりません コンパイルしてもこれしかでないのですが・・・ mainは、任意個数の数字を入力させてそれをpushし、 EOFになったら逆にpopで値を取り出して画面に表示する みたいな感じにしたいのですが・・
>>289 >pushとpopが正常に動作をしているか確かめられるプログラムを作成してください
といわれて
>>289 の下半分の内容を読み取れなんてエスパーじゃない限り無理
int main(void)
{
TOP.next = NULL;
int d;
while(scanf("%d", &d)!=EOF) push(d);
while(TOP.next) printf("%d\n", pop());
return 0;
}
>>290 言葉足らずですみません
夜遅くわざわざありがとうございます
十分テストコードになってると思うんだけどな。
293 :
デフォルトの名無しさん :2009/02/05(木) 03:23:22
while(1) { wakeup; static int day; int time = wakeuptime(); while(1) { 2ch; if(time == Daytime()) { lunch; }; if(time == nighttime()) { supper; }; if( time == sleeptime();) { break; } time++; } day++; sleep; } こんな毎日、無限ループって怖いよな;;
295 :
285 :2009/02/05(木) 04:09:48
>>294 ありがとうございます。よろしければ逆行列プログラムもお願いします。
297 :
285 :2009/02/05(木) 05:24:02
>>296 このような時間帯にわざわざありがとうございます。
おかげ様で助かりました。
298 :
279 :2009/02/05(木) 06:58:42
>>282 >>283 確かにこれはひどいですよね…
1問でもいいのでお願いしたいです。
一応自分でもやっていますが、数学が苦手なもので…
>>167 です。
自己解決したので取り下げます。スレ汚し失礼しました。
>>301 #include <stdio.h>
int main(void)
{
int i, j, c;
char seq[] = "tion";
i = 0;
while ((c = getchar()) != EOF) {
if (c == seq[i]) {
i++;
if (i == sizeof(seq) - 1) {
break;
}
}
else {
for (j = 0; j < i; j++) {
putchar(seq[j]);
}
i = 0;
putchar(c);
}
}
return 0;
}
300 の問題って リダイレクトじゃだめなのか?
>>300 #define INPUT_FILE_NAME "foo.in"
#define OUTPUT_FILE_NAME "bar.out"
int main(void)
{
struct student A[Nmax];
double avg=0;
int i;
FILE *fin, *fout;
fin = fopen(INPUT_FILE_NAME, "r");
if (fin == NULL) { perror(INPUT_FILE_NAME); return 1; }
for( i=0; i<Nmax; i++){
fscanf (fin, "%d %d %d %s", &A[i].sc1,&A[i].sc2,&A[i].sc3,A[i].name);
}
fclose(fin);
fout = fopen(OUTPUT_FILE_NAME, "w");
if (fout == NULL) { perror(OUTPUT_FILE_NAME); return 1; }
fprintf(fout, "Score Name\n");
fprintf(fout, "-------------------------------------------\n");
for(i = 0;i <Nmax; i++){
A[i].total =(A[i].sc1+A[i].sc2)*0.4+A[i].sc3;
A[i].res =(A[i].total>=60)?"A": "F";
avg += A[i].total;
fprintf(fout, "%6.1f %s %s\n", A[i].total,A[i].res, A[i].name);
}
fprintf(fout, "---------------------------------------------\n");
fprintf(fout, "%6.1f (Avg)\n",avg/Nmax);
fclose(fout);
return 0;
}
306 :
◆g8eVFLrbyk :2009/02/05(木) 16:49:09
君は不可だ! 調査した上で厳正に処理するから首を洗っとれ
308 :
302 :2009/02/05(木) 17:09:27
スレチですいません。 今日面接でプログラミングの手書きのテストをやってきました。 テスト終わって家に帰ってから効率のいいコードの書き方を思い出しました。 テスト中は時間のことが気になって思い出せずとりあえず動くコードで書きました。 テストの場合は白紙や書き途中で提出するくらいなら、 とりあえず動くコードで書いておけば特に問題はないですよね?
宿題やテストの採点思想次第だわな
312 :
301 :2009/02/05(木) 20:15:18
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
データファイル(
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8827.txt ) には,1000 人の「学籍番号,科目A,科目B,科目C の各点数」が学籍番号順に並んでいる.
そのデータファイルを元に,キーボードから入力された学籍番号の学生の成績(含:3科目の合計点の順位)を表示するプログラムを作れ.
探索は二分探索を使い,ソートにはクイックソートを使うこと.
合計点が同じになる学生はいないということは既知とせよ.
学籍番号が存在しない場合は,”No data ”と表示するようにせよ.
表示は以下のようにせよ.
Input A Student Number: 14【Enter】
Ranking : #269 /*最高得点は1位とせよ.*/
Subject A : 86
Subject B : 59.1
Subject C : 220.42
Total : 365.52
[3] 環境
[3.1] OS:Win
[3.2] gcc
[3.3] C
[4] 2月6日23:59
おねがいします。
>>312 #include<stdio.h>
#include<string.h>
int main(void){
int c, i;
char history[4*2]="";
for(i=0;(c=getchar())!=EOF;i++){
history[i%4]=history[(i%4)+4]=c;
printf("%c", c);
if(strncmp(&history[(i+1)%4], "tion", 4)==0) break;
}
return 0;
}
315 :
305 :2009/02/05(木) 21:07:49
上のプログラムに、入力列としてt、i、o、nの並びが与えられた場合にも入力を終了する機能を追加せよ 例 This is important information for me! の場合 This is important informaと出力 This scene is romantic の場合 This scene is romantic (tionの並びでないのでそのまま出力) 上のプログラムに、入力列としてt、i、o、nの並びが与えられた場合にも入力を終了する機能を追加せよ 例 This is important information for me! の場合 This is important informationと出力 This scene is romantic の場合 This scene is romantic (tionの並びでないのでそのまま出力)
316 :
305 :2009/02/05(木) 23:50:36
>>314 その手があったか。参ったのでソース貼り付け。
#include<stdio.h>
#define LEN 4
char tion[LEN + 1] = "tion";
int main(void)
{
int c = '\0', k = 0;
while ((c = getchar()) != EOF && k < LEN) {
if (c == tion[0])
k = 1;
else if (k > 0) {
if (c == tion[k])
k++;
else
k = 0;
}
putchar(c);
}
return 0;
}
317 :
301 :2009/02/06(金) 00:46:55
皆さんありがとうございました
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): ニュートン法と二分法の両方を用いて,直線y = x + 1/2 と単位円 x2 + y2 = 1 の交点の座標の近似解(小数点以下第6位まで)を求めよ. 1つのプログラムに書くこと(ニュートン法と二分法に関する箇所はmain 関数から独立させよ) ニュートン法も二分法もともに何回で収束したかが分かるようせよ. 関数へのポインタは必ず使うこと. 表記は例えば以下のようにすること: Newton method: Lower part: count : ???? sol :( ?????, ????? ) Upper part: count : ???? sol :( ?????, ????? ) 二分法で用いる初期値は[a,b]= [-1,1]とせよ ニュートン法で用いる初期値は2つとも0とせよ。その際,1つの関数は 収束しない.収束しない場合は,求められないと分かった時点で計算を終了 するように工夫せよ.また,そのときは以下のように表記せよ. sol : Not converge 収束しない場合は,なぜ収束しないのかをコメントとして書くこと. [3] 環境 [3.1] OS: windows [3.2]gcc [3.3] 言語: C [4] 2月6日の夜まで 期限がせまっていて申し訳ありませんが自分でできなかったためよろしくおねがいします><
#include <stdio.h> #include <stdlib.h> #include <string.h> char *crypt(const char *key, const char *salt); #define MAXLEN 16 #define TRIPLEN 10 #define PATH "trip.out" typedef unsigned char uchar; int get_saltc_old(uchar c){ if(c < '.' || c > 'z') return '.'; if(c >= ':' && c <= '@') return c - ':' + 'A'; // :;<=>?@ - ABCDEFG if(c >= '[' && c <= '`') return c - '[' + 'a'; // [\]^_` - abcdef return c; } int gen_trip(uchar *o, int n, uchar *w){ uchar sal[3]; uchar *t; sal[0] = get_saltc_old(n > 1 ? w[1] : 'H'); sal[1] = get_saltc_old(n > 2 ? w[2] : '.'); sal[2] = '\0'; t = crypt(w, sal); strncpy(o, t + strlen(t) - TRIPLEN, TRIPLEN); return 0; }
int gen_combination(uchar *o, int n, int m, uchar *pos){ int i; for(i = 0; i < n; i++) o[i] = pos[i]; for(i = n - 1; i >= 0; i--){ if(pos[i] < m - 1){ pos[i]++; return 1; }else{ pos[i] = 0; } } return 0; } int gen_word_list(uchar *w, int n, int m, uchar *s){ static uchar *pos = NULL; int i; if(!pos){ pos = (uchar *)malloc(sizeof(uchar) * n); for(i = 0; i < n; i++) pos[i] = 0; } if(gen_combination(w, n, m, pos)){ for(i = 0; i < n; i++) w[i] = s[w[i]]; w[n] = '\0'; return 1; } if(pos){ free(pos); pos = NULL; } w[0] = '\0'; return 0; }
int sout(char *path, char *s, int f){ FILE *fp; if(f) if((fp = fopen(path, "ab+")) != NULL){ fprintf(fp, "%s\n", s); fclose(fp); } fprintf(stdout, "%s\n", s); return 0; } int scantrip(int n, int m, uchar *s, uchar *f){ uchar *w, *t; char buf[4096]; w = (uchar *)malloc(sizeof(uchar) * n + 1); w[n] = '\0'; t = (uchar *)malloc(sizeof(uchar) * TRIPLEN + 1); t[TRIPLEN] = '\0'; sprintf(buf, "'%s' in len %d", f, n); sout(PATH, buf, 1); while(gen_word_list(w, n, m, s)){ gen_trip(t, n, w); int b = n - 2; if(w[n - 1] == '.' && (w[b] == '.' || w[b] == 'U')){ sprintf(buf, "%4d #%s %s %s", n, w, "----------------------------------------", t); sout(PATH, buf, 0); } if(strstr(t, f)){ sprintf(buf, "%4d #%s %s", n, w, t); sout(PATH, buf, 1); } } if(t) free(t); if(w) free(w); return 0; }
int main(int ac, char *av[]){ uchar *s="./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; uchar *f="Linux"; int i; for(i = 1; i < MAXLEN; i++) scantrip(i, strlen(s), s, f); return 0; }
>>318 > 二分法で用いる初期値は[a,b]= [-1,1]とせよ
その間に、解が二つある気がする。
> ニュートン法で用いる初期値は2つとも0とせよ。その際,1つの関数は
> 収束しない.収束しない場合は,求められないと分かった時点で計算を終了
> するように工夫せよ.また,そのときは以下のように表記せよ.
> sol : Not converge
> 収束しない場合は,なぜ収束しないのかをコメントとして書くこと.
オレの知らないニュートン法?
8828.c をVCに掛けてみたらどうなる。
>>325 そのままかけてみたが正常に動作した
gccだと標準入力を促すところまで行くが
直後のsscanfでプログラムが終了してしまう
一応OSはXPです
327 :
318 :2009/02/06(金) 08:44:17
>>323 交差する点2つありますよね。両方とも求めるんだと思います。
二分法のアルゴリズムは
Step 1
f (a) < 0 かつf (b) > 0(または, f (a) > 0 かつf (b) < 0)を満たす
ような変数a, b の値を設定し,十分小さい正数ε を設定する.
Step 2
c = (a + b)/2 とし,
f (c) = 0 であれば,【Step 3】に移る.
f (c) > 0 であれば,b をc で置き換える.
f (c) < 0 であれば,a をc で置き換える.
|a-b| < 2ε であれば,【Step 3】に移る.
Step 3
c を解とする.
という感じらしいです。ニュートン法は反復の限界値を決めて(100回くらいに)
反復回数がそれを超えたら停止してほしいのですが・・。
>>324 sscanf(buf, "%d%lf%lf%lf",&(st[i].number),&(st[i].ascore),&(st[i].bscore),&(st[i].cscore));
で
"%d,%lf,%lf,%lf" に
>>327 > 二分法のアルゴリズムは
つまり、1セットの初期値からは、一つの解しか見つからないし・・・
xの式、f(x)=0になるxを探すワケだけど、f(a)とf(b)の符号が逆じゃなきゃいけないんだよね。
区間に二つ解があるということは、つまり、f(1)とf(-1)の符号はおんなじなわけだけど・・・?
> という感じらしいです。ニュートン法は反復の限界値を決めて(100回くらいに)
> 反復回数がそれを超えたら停止してほしいのですが・・。
初期値が二つといっているのだから、解の一つごとに初期値をおくように思うが、両方0にしろと言う。
オレの知っているニュートン法ではないようだ。
にぶんほう?
331 :
デフォルトの名無しさん :2009/02/06(金) 14:24:29
332 :
デフォルトの名無しさん :2009/02/06(金) 14:59:00
333 :
デフォルトの名無しさん :2009/02/06(金) 15:08:21
334 :
デフォルトの名無しさん :2009/02/06(金) 15:15:00
[1] 授業単元:数値解析 [2] 問題文(含コード&リンク) (1)区間演算ライブラリを作れ。(加減乗除のみでもOK) (2)Gaussの消去法のプログラムを作り、それを区間演算化せよ 以上ですが、ソースコードのみでもかまいません [3] 環境 [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限:明日20時まで [5] その他の制限: 特になし
>>334 > 以上ですが、ソースコードのみでもかまいません
ソースコード以外だと、何が付くの?
>>335 それだけじゃない
> [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
『等』・・・・こいつ相当のマニアか。
開発環境が書ききれないほど。ドンと来い。
> [3.3] 言語: (C/C++/どちらでも可 のいずれか)
pu-w
>>337 どうしようもない時以外に、goto使う奴は
どうしようもない奴だと思うぞ。
elseで全部つなげば解決じゃないですか。
342 :
338 :2009/02/06(金) 16:30:32
343 :
339 :2009/02/06(金) 16:31:29
問題勘違いした…。 アジア地区予選の問題やってたorz
344 :
デフォルトの名無しさん :2009/02/06(金) 16:40:36
345 :
デフォルトの名無しさん :2009/02/06(金) 17:31:56
ちょっと漏れがあったようなので;; [1] 授業単元:数値解析 [2] 問題文(含コード&リンク) (1)区間演算ライブラリを作れ。(加減乗除のみでもOK) (2)Gaussの消去法のプログラムを作り、それを区間演算化せよ [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語:どちらでも可 [4] 期限:明日20時まで [5] その他の制限: 特になし
346 :
313 :2009/02/06(金) 20:57:11
>>324 >>328 324さんのプログラムを328さんの言うように修正してみたところ
データを読み込み、表示されるところまではいくのですが全ての数値が0になってしまいます。
どうすればいいでしょうか。。。
>>327 ニュートン法で100回も反復するとか時間の無駄だからな
初期値が悪くてもせいぜい10回だ
350 :
325 :2009/02/07(土) 04:18:57
>>326 double total(Student st){
// return (st.ascore + st.bscore + st.cscore);
double a = (st.ascore + st.bscore + st.cscore);
return a;
}
>>346 // printf("%d%lf%lf%lf",&(st[i].number),&(st[i].ascore),&(st[i].bscore),&(st[i].cscore));
printf("%d%lf%lf%lf", (st[i].number), (st[i].ascore), (st[i].bscore), (st[i].cscore));
>>349 すごい短縮だな。(2階層くらいで関数化したら、もっと打ちやすかったんじゃ)
でも、元ファイルc++だろ?
>>331 はC指定かかってるよ。
>>351 C++ではないよ。-std=c99つけないとコンパイルできないけど。
>>352 「-std=c99つければ、gccでもコンパイルできるよ」かな?
354 :
325 :2009/02/07(土) 04:54:11
>>326 double a;
do{
while((a=total(st[pl])) > x) pl++;
while((a=total(st[pr])) < x) pr--;
>>346 悪い、間違えた。君の言うとおりだ。
355 :
325 :2009/02/07(土) 05:01:10
>>326 double a;
do{
pc = (pl + pr) / 2;
if((a=total(st[pc])) == key)
return pc;
else if((a=total(st[pc])) > key)
356 :
デフォルトの名無しさん :2009/02/07(土) 13:01:57
357 :
デフォルトの名無しさん :2009/02/07(土) 13:17:05
wwwwwwwwwwwwwwwwww
>>356 > なんかテストいけそうな気がする
ありえねー・・・
359 :
325 :2009/02/07(土) 14:50:36
>>326 gcc -O3 8828.c -o 8828.exe
??
詩吟?
364 :
326 :2009/02/07(土) 18:31:45
>>325 ありがとうございます。
Rankingの表示が出ないんですが簡単に治せますでしょうか。
365 :
326 :2009/02/07(土) 18:42:21
return plにしたらできました!ありがとうございます。
366 :
325 :2009/02/07(土) 18:55:07
え?return pl; って、何行目?参考までに。
367 :
326 :2009/02/07(土) 19:58:10
50行目ですかね。。あれ違いますか><
368 :
325 :2009/02/07(土) 20:17:42
Ranking#の値が、合ってれば良いけれど。
> Input A Student Number: 14【Enter】
> Ranking : #269 /*最高得点は1位とせよ.*/
尚こちらでは、
>>350 上)の修正で直った。
369 :
324 :2009/02/07(土) 20:24:17
こちらでも
>>350 の上の修正で
正常に動作することが確認できました
ちなみにどうして修正前では
正常に動作しなかったのか
理由は分かりますか?
370 :
325 :2009/02/07(土) 20:26:57
わからない。回避方法は、ステップ実行してて見つけた。
371 :
324 :2009/02/07(土) 20:32:53
そうですか お手数おかけしました ありがとうございました
372 :
326 :2009/02/07(土) 21:28:36
return pl;を入れてなくて終了してたのは、 スタック領域のオーバーフローでセグメンテーション違反。
375 :
326 :2009/02/07(土) 21:52:26
>>375 mark_sortが変。
クイックソートやりたいんだろうけどできてない。
xを基準にして大小をわけてるけど
xがその境界にきてないから変なことになる。
mark_sortやめてqsort使ったら
378 :
324 :2009/02/07(土) 23:54:41
>>376 pivotの選び方に欠陥があることは承知しているが
最も単純な方法でクイックソートを作ったつもり
qsortを使わなかったのは問題にクイックソートを
使うよう指定されていたのでアルゴリズムを理解していることを
示す必要があると思ったから
その必要がなかったら確かにqsort関数を使った方が
高速にできると思う
>>377 double total(Student st); で3個の数値を合計している所が違う(追加)。
>>378 バグ取りの報酬として、cmp_doubleを使わなくては駄目な理由を調べて教えてくれ(取れてなかったらゴメンナサイ…)。
int cmp_double(double x, double y)
{
return x > y ? 1 : x < y ? -1 : 0;
}
void mark_sort(Student *st, int left, int right){
int pl = left;
int pr = right;
double x = total(st[(pl + pr) / 2]);
while(1){
while(cmp_double(total(st[pl]), x) > 0) pl++;
while(cmp_double(total(st[pr]), x) < 0) pr--;
if(pl >= pr){
break;
}
swap(st, pl, pr);
pl++;
pr--;
}
if(left < pl - 1) mark_sort(st, left, pl -1);
if(pr + 1 < right) mark_sort(st, pr + 1, right);
}
>>379 ( ´_ゝ`)
381 :
379 :2009/02/08(日) 02:08:20
382 :
379 :2009/02/08(日) 02:18:25
報酬忘れてた。ヒント: // while(total(st[pl]) > x) pl++; while((total(st[pl]) > x) != ((a=total(st[pl])) > x)?printf("%d ",pl):printf(","), ((a=total(st[pl])) > x)) pl++;
>>381 一回呼び出し側の領域に入れると問題なしなのか!
384 :
326 :2009/02/08(日) 03:09:16
できました! 色々とみなさんありがとうございました。
>>382 よく分からんが、ebpレジスタ同士の比較じゃないと上手く動作しないってこと?
386 :
385 :2009/02/08(日) 03:35:07
このサイト前半おかしくね? 53*100=5299.9999999..になることだってあるだろ
>x86 特有のちょっとおもしろい現象
>>381 xに従ってplとprを移動しているループは、与えられた
st[left,right]を飛び出す可能性があるがその問題は放置?
392 :
sage :2009/02/08(日) 16:25:06
【質問テンプレ】 [1] 授業単元:プログラミング [2] 問題文(含コード&リンク):星型5角形(★)の面積を求めるプログラムを作成せよ。ただし、入力は*.txtファイルから行い、入力、計算は関数化すること。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:cygwin1.5.25-15 [3.3] 言語:C [4] 期限: ([2009年2月9日10:00まで] [5] その他の制限:特にありませんが、動的メモリ確保(malloc関数)の勉強をしていました。
392です。 口頭で問題を言われただけなので問題文がなく、自分で書いたため、少し問題文にミスがありましたため、補足させてもらいます。 入力のtxtファイルには、時計回りに5つ(もしくは、6つ[6つ目は開始地点と同じ座標])の座標を入力することが条件となっております。
394 :
デフォルトの名無しさん :2009/02/08(日) 16:43:14
以下の問題についてですが、どうやって解いたらいいのでしょうか? C言語 (問題) ファイル xy2data.dat には,カンマで区切られた2つの整数データ(値は0以上5以下)が並んだ行が 何行か格納されている. 各行の最初の整数値をx,次の整数値をyとしてx-y座標上の点(x.y)をファイルの行数個考える. これらの点と、点(4,4)との距離の2乗の値の度数分布を求め,頻度が3以上となる距離の2乗の値 をその値が小さいものから順にカンマで区切って出力するプログラムを作成せよ. ファイルは FILE *in_file; in_file = fopen("xy2data.dat","r"); としてopenし,このファイルからデータを読み出す時は, fscanf(in_file,"%d,%d",&x,&y); として読み出せばよい.(xとyは整数型変数とする) また,読み出しが終わったら, fclose(in_file); としてクローズすること.
>>392 星型の条件が分からん。
正確な五芒星なの?
正確な五芒星なら最初の2点分だけで面積判る罠
392です。 星型の条件とはどういうことでしょう?><; 頂点5つの座標は 4.00000 0.00000 -3.23607 -2.35114 1.23607 3.80423 1.23607 -3.80423 -3.23607 2.35114 です。 答えになっているでしょうか・・・?
400 :
デフォルトの名無しさん :2009/02/08(日) 20:37:04
以下の文で教えて欲しいです。
memcpy(&byteData ,pTimData ,2 ); /* pTimDataからbyteDataへコピー */
byteData = byteData & 0x7c00; /*15bit分のマスクを掛ける。*/
byteData = byteData >> 12; /*12bit移動*/
read(byteData, bmpData, sizeof(short));/*処理後のデータを格納*/
/*次の2byeを格納するためループ。全て格納し終えたらループから抜け出す*/
memcpyでpTimDataからbyteDataへ2byte分切り出した後
論理積でマスクをかけビットシフトしたあと、bmpDataに格納するというものなのですが
このままだと2byte分だけbmpDataに格納して処理を終了してしまいます。
処理後の全pTimDataのデータをbmpDataを入れたいのですが、どのようなループ文を書いたらいいのでしょうか?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8847.txt
>>401 申し訳ない。
まんま丸投げじゃないと駄目なんですね。
失礼しました。
403 :
デフォルトの名無しさん :2009/02/08(日) 21:01:55
>399さん 記載ありがとうございます。 大変もうしわけありませんが、アップしていただいたURLにアクセスできないので、 本文中に記載していただけないでしょうか?
405 :
399 :2009/02/08(日) 21:53:01
tp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8845.txt
392です。 404さんありがとうございます! ですが、コンパイルできるのですが、実行ができません><; & gcc ファイル名.c & a.exe input.txt でコンパイル&実行をしたのですが、これではだめなのでしょうか? ↓input.txtの中身 4.00000 0.00000 -3.23607 -2.35114 1.23607 3.80423 1.23607 -3.80423 -3.23607 2.35114
連投すみません。392です。 実行は & ./a.exe input.txt の間違いです。 「./」を書き入れるのを忘れました^^;
>>406 プログラムで指定されているファイル名は、in.txtだからねえ・・・
int main(){ を int main(int argc, char* argv){ read_points("in.txt",point); を read_points(argv[1],point); でいくと思う
int main(int argc, char* argv[]){ か。ごめん!
408さんありがとうございます><助かりました。
>>412 クソな課題だな。
int a[x]をmallocで確保してa[ key % x]++して
全部終わったらa[k]が2以上の数を数えてxを掛ける
これの繰り返し?上限は「入力されたうちの最大値+1」か?
>>414 それだとx=1が常に最適になるので、本当のクソになる。
a[k]の大きさも加味すべきだろう。
419 :
418 :2009/02/09(月) 00:23:02
[1]C言語中級 [2]問題文: UNIXなどのオペレーティングシステムで使用されているファイル名称慣用表示を正式表示に変換する。 標準入力から慣用表示を含む表記を正式表記に変換して標準出力に出力すること 先頭文字が.の場合はカレントディレクトリ下のファイル名とすること 例:カレントディレクトリ=/home/test /usr/bin/ls ===> /usr/bin/ls /usr/bin/local/sbin/tmp/../localls ==> /usr/bin/local/sbin/localls /usr/./tmp==>/usr/tmp ./program/source ==>/home/test/program/source ../../home/sample ==>/home/sample ../../../home/sample==>/home/sample .../test==>/test ./sample/test/...../test==>/test ./bin/../../../.. ==>/ [3] linux gcc (Windowsでも可) C言語 [4] ★木曜日の正午までに提出 ★標準的な書式(行内マルチステートメント禁止)で250行以内 ★再帰呼び出しは使用禁止 ★グローバル変数使用禁止 ★パス名の長さは制限無しとする 初級コースが満杯なので、中級コースをとって しまったら、課題レポートが自分には激ムズでした。 自分でやってみたら収拾がつかなくなってしまいました。 期限までわずかに時間はありますが、できれば一両日中に何と かお願いします。
>>420 .../test ==> /test
./sample/test/...../test==>/test
この2つは一般的な処理ではないので、仕様を出さないと分からん
* 「/\.{3,}/にマッチするものが出たらrootとみなす」と予想
* 因みに、UN*Xでは"..."(dot*3)というファイル名は有効
>>421-422 .hoge .foo/bar ..foo/bar ...foo/bar
foo/.bar foo/..bar foo/...bar
///foo/bar foo///bar
とかが一部おかしい
>>419 無事動作しました。ありがとうございました。
[1] 授業単元:並列プログラミング
[2] 問題文(含コード&リンク):
http://www.dotup.org/uploda/www.dotup.org26612.zip.html [3] 環境
[3.1] OS: マック
[3.3] 言語: c
[4] 期限: 2月9日23:59まで
[5] 補足:
すみません。。無茶苦茶難しい問題です。添付のサイトにあるプログラムはアイディーエルで
書かれたコードです。実行すると確かに凄い動画を再生出来ましたが、これを並列プログラミングで
書けという難題を出されて手が出せずに困っています。。こうなったら少しでも何か書いて提出したい
ので、少しでも何か動作すればいいというレベルなのですが、どなたかわかる方いらっしゃいます?
>>428 while(1){
int temp = floor(t*10);
int HH,MM,SS,MS;
HH=temp/36000;
temp%=36000;
MM=temp/600;
temp%=600;
SS=temp/10;
MS=temp%10;
//
printf("%02d:%02d:%02d:%01d00\r",HH,MM,SS,MS);
>>428 CPU 100%なので、Win32 App 作ってみた。
433 :
デフォルトの名無しさん :2009/02/09(月) 20:36:30
[1] 授業単元: ゲームPG [2] 問題文(含コード&リンク): 下のほうに詳しく [3] 環境 [3.1] OS:WindowsXP SP3 32bit [3.2] コンパイラ名とバージョン:VS2008 [3.3] 言語:C/C++/ [4] 期限 : 木曜日まで ランダムな値を取得する関数を作れと言われました 使い方 サイコロを振るなら int dice = getRandom(6) + 1; 20%の確立で if(getRandom(100) < 20) { } と言う感じに指示が出されました 宜しくお願いします
int getRandom(int n) { return rand() % n; }
>>433 int getRandom(int imax)
{ return rand()%imax; }
int getRandom(int imax)
{ return (int)((double)rand()*imax/(1.0+RAND_MAX)); }
お好きな方でどうぞ
>>433 これは罠だな
MT法を実装するのが求められてる答えと見た
438 :
デフォルトの名無しさん :2009/02/09(月) 21:37:14
1] 授業単元:プログラム [2] 問題文(含コード&リンク): 下記 [3] 環境 [3.1] OS:WindowsXP SP3 32bit [3.2] コンパイラ名とバージョン:VS2008 [3.3] 言語:C/C++/ [4] 期限 : 水曜日まで *問題文 二次元配列n×nにおいて「0」「1」3」の三種類の数字が入っている。 その中で「1」のみを検出するプログラムを作りたい。 条件:列において「1」は必ず連続している。 例: 「0」「3」「1」 「1」「0」「0」 「1」「1」「1」 一列目:○ 二列目:○ 三列目:× 条件では無いが、レスポンスの早いプログラムを意識して作ること。 という問題です。宜しく御願いします。
439 :
デフォルトの名無しさん :2009/02/09(月) 22:03:55
→ int i,j; の様に「→」が表示されるようになってしまったんですが これをなおすにはどうしたらいいですか?「→」は青っぽいやじるしです 表示の見栄えの問題なんですが これってどうやったら なおるの?
まず使っているエディタを言え
OSとかエディタも書いてくれないと分からん あとスレ違い
442 :
デフォルトの名無しさん :2009/02/09(月) 22:14:37
VS 2008です
>>438 nが不定なのに、行番号を漢数字で出すのは難しすぎだな
漢数字に変換するだけならそんなに難しくないような・・・
スレの意図とは微妙に違うのですが質問です 先日初めてプログラムの宿題がでましてその内容が簡単なグラフ描画をしてそれをプリントというものなのですが プログラムの宿題というものはソース提出ではなくプリント出力機能をを自分で搭載してそれを提出汁というものも結構あるのでしょうか?
そんなもん決まりはない。 教官に聞け。
447 :
420 :2009/02/10(火) 01:30:47
>>421-425 どうもありがとうございます。
参考にさせて頂くつもりですが、
マルチバイトキャラクターというんですか?それにも対応しなければ
ならないらしく、そのような場合はどうすればいいんでしょうか?
450 :
433 :2009/02/10(火) 07:36:03
ありがとうです
454 :
427 :2009/02/10(火) 14:42:20
すみません。やっぱりMPIはマニアックでしょうか。並列でなくても、シリアルでも構いません。 C言語でどなたかIDLと同じ内容のコードを書ける方どなたかお願いします
456 :
452 :2009/02/10(火) 15:40:41
同じ停留所の事なら、エラーにした。 > また、一度バスに乗車したら途中下車はしないものとします。同じ停 > 留所を乗車停留所、降車停留所に指定することはありません。 // その他 // 乗車する停留所と下車する停留所が同じ場合は、その停留所のみを出力する
457 :
452 :2009/02/10(火) 16:22:55
>>455 C++のソースは見てないが、左回りは禁止のはず。
[1] 授業単元:演習 [2] 問題文(含コード&リンク): 2X2行列が安定であるかどうかを判定する関数を作れ. 入力はdouble型の二次元配列とする. 安定条件は,行列の固有値の実部が負であるとき [3] 環境 [3.1] OS: LINUX [3.3] 言語: C [4] 期限: 2月10日24時
>>458 にわか勉強で書いてみた。
線型代数の素養がないもんだから、
入力と答えの関係が正しいのかどうにもわからん。
#include <stdio.h>
#include <math.h>
int isStable(double l[2][2]) {
double a = 1;
double b = (-l[0][0]) + (-l[1][1]);
double c = l[0][0]*l[1][1] - l[0][1]*l[1][0];
double d = pow(b, 2)-4*a*c;
int out = 0;
if (d > 0) {
if ( (0 > -b + sqrt(d)) && (0 > -b - sqrt(d)) ) {
out = 1;
}
} else {
if (0 > -b) {
out = 1;
}
}
return out;
}
int main() {
//入力
double l[2][2] = {{1, 0},
{0, 1}};
char *s = (isStable(l)?"stable":"unstable");
printf("%s", s);
return 1;
}
>>460 ぱっと見、合ってそうだけど
>if (0 > -b)
この書き方はねーよw
等価演算子ならたまに見るな
>>461 0<=b ってこと?
やー、気にはなったんだが、
解の公式の定義に従って書いたほうが可読性が高いかと
>>455 入力
8 7
出力
0 1 2 3 4 5 6 7
ってなる。
>>463 それでもいいけど -b < 0 じゃね?数直線的に考えて
あと正常終了なのにmainが1を返すのはおかしいな
このスレ的には二つともどうでもいいことだけど
>>463 なるほど!数直線的にか。確かにその方が良いな。
正常終了は0だっけか。C久々だから忘れてた。さんくす。
467 :
452 :2009/02/10(火) 22:55:10
// int busstop[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 5, 4, 3, 2, 1, 0}; int busstop[24] = {0,1,2,3,4,5,6,7,8,9,5,4,3,2,1,0,1,2,3,4,5,6,7,8}; 16 を 24 に全置換でオッケー。 ロジックが良いから?
>>449 問8 できるだけシンプルにしてみた。
#include <stdio.h>
void myfunc(int, int);
int main(){
int x, y;
scanf("%d %d", &x, &y);
myfunc(x, y);
}
void myfunc(int x, int y){
int t, i;
t = 1;
i = x;
if(i<=5)
t *= (x < y)? 1: -1;
putchar(i+'0');
while(i!=y){
i += t;
if(i==0)
t *= -1;
if(i==10){
i = 5;
t *= -1;
}
putchar(' ');
putchar(i+'0');
}
putchar('\n');
}
>455 入力 scanf 出力 printf に直せませんか?
直せますよ?
472 :
デフォルトの名無しさん :2009/02/11(水) 11:21:41
[1] 授業単元: [2] 問題文: n個の引き出しからなるタンスがある。最初各引き出しにはいくつかボールが入っている。 i番目の引き出しを開けるとそれまで入っていたボールのうち1つだけが音もなく1段下の引き出しに落ち、その後のボールの個数だけが見える。 開けた引き出しは次の引き出しを開ける前に閉める。 空の引き出しを開けてもボールは下に落ちない。 ただし最下段(0段)の引き出しに関しては、もともとあったボールの数が見える。 このたんすに最初に入っていたボールの個数を知るアルゴリズムを示せ。アルゴリズムがわからないものは日本語で説明してもかまわない。 (できるだけ引き出しを開ける回数が少ないもの) i番目の引き出しを開けたときに見えるボールの数はopen(i)という関数でわかるとする。 [4] 期限:2009年2月12日まで プログラミングというかアルゴリズムの問題なんだけど 誰かわかるひといる? お願いしますm(__)m
>>472 上から順に見ていって見えたボールの数の総和でおk
474 :
デフォルトの名無しさん :2009/02/11(水) 13:01:05
いやそれじゃだめだろ 1個しか入ってない段どうなんだよ
>>474 べつに1個の段があっても問題ないように思う。
数え間違う具体例出せる?
上から 1 1 1 0 と 0 0 0 3 見分けつかなくね?
>>474 >このたんすに最初に入っていたボールの個数
と言うのは、タンス全体で何個と言う意味に見えるが、
「最初に」と言うのは、暗に各段に入っていた数と言っているようにも思える。
ボールの総数を数えるなら、
>>473 の言うように上から開けていく事で全部の段を調べればわかる。
各段の個数と言うことになると、
一番下の段を開けて個数を確認、
一つ上の段を開けて個数を確認、
一つ以上のボールがあれば、元の数は+1。
0個なら、下の段を開けてボールが増えているか確認。
もう一つ上の段を開けて・・・
と繰り返してゆくのかな?
問題文の不備だな。 「それぞれの段に」が省略されたら全体でいくつかと考えるほうが自然に見える。 だがそれでは、出題の意味が無い。
479 :
デフォルトの名無しさん :2009/02/11(水) 14:55:36
最初に各引き出しごとに何個入っていたかを知るアルゴリズム みたいです。 説明不足すみません
答えはフローチャートに、書いて提出しても良いて書いてないか? > 0個なら、下の段を開けてボールが増えているか確認。 減っているか同じか、どっちかしかないだろう。 > もう一つ上の段を開けて・・・ 二つ上の段をあけて0個なら、下の段を開けたいところだが、0個に決まってる。
>>480 > 減っているか同じか、どっちかしかないだろう。
一番下の段は減らないから、これを使って再帰的に確認するんじゃね?
> 二つ上の段をあけて0個なら、下の段を開けたいところだが、0個に決まってる。
順繰りにあけて、一番下の段まで送る。
>>482 Record data[max_num];
ここでデフォルトコンストラクタを呼ぼうとしてるけど、
コンストラクタは Record(string ,int ,double ,double );
しかないので動かないということ
>>482 英語読めないの?
> 0128.cpp:44: error: no matching function for call to `Record::Record()'
とあるように、Record data[max_num]; のときに必要な Record::Record() が無いのが問題。
だから、特に何もしないデフォルトコンストラクタでも用意してやればいい。
それから、このスレは丸投げ専用なので質問は質問スレで。
485 :
480 :2009/02/11(水) 16:29:12
>>472 > 各段の個数と言うことになると、
1. 一番下の段を開けて個数を記録。(n=0)
2. 一つ上の段を開けて個数を確認。(n=n+1)
2.1. 一つ以上のボールがあれば、元の数は+1。 2. に戻る。
2.2. 0個なら、下の段を開ける。
2.2.1. 一番下の段なら、個数を確認して、2. に戻る。
2.2.2. 一つ以上のボールがあった段なら、個数を確認。 2. に戻る。
2.3.3. 0個の段だったら、2.2. に戻る。
3. 上の段が無いなら終了
2.2.1. 一番下の段で個数が増えていたら、2.2 ではもとは1個有った。
2.2.2. 途中の段で個数が同じだったら、2.2 ではもとは1個有った。
>>483 >>484 即レス感謝いたします。
では、丸投げいたしますのでどなたか完璧な回答をお願いいたします。
mainは変えないで、mainに沿ったクラスを作成するという問題です。
>>487 せっかく書いていただいたのですが、#include<utility>は使えないです。
お手数おかけします。
>>488 ・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。
491 :
デフォルトの名無しさん :2009/02/11(水) 23:51:45
[1] 授業単元: [2] 問題文(含コード&リンク): 西暦n 年がうるう年か、平年かを判別する。数値がうるう年だったら"leap year"、平 年だったら"ordinary year"と表示する。 数値は次の6つを用意する。int 型配列変数に格納しておくこと。 1740, 1950, 1984, 1998, 2000, 2008 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:Borland C++ [3.3] 言語:C [4] 期限: 2月14日 [5] その他の制限: #include<stdio.h>でお願いします。
>>491 #include <stdio.h>
int main()
{
int i,bLeap;
int nYear[6] = {1740,1950,1984,1998,2000,2008};
for( i=0; i< 6; ++i )
{
if( nYear[i] % 400 == 0){bLeap = 1;}
else if( nYear[i] % 100 == 0){bLeap = 0;}
else if( nYear[i] % 4 == 0){bLeap = 1;}
else{ bLeap = 0;}
if( bLeap == 1){printf("%d leap year\n",nYear[i]);}
else {printf("%d ordinary year\n",nYear[i]);}
return 0;
}
493 :
デフォルトの名無しさん :2009/02/12(木) 01:27:23
>>492 ありがとうございます。ですがbLeapというのを初めて見ました。
習っている範囲を書き忘れていてすいません;
変数、制御構造(while if for switch break等)、文字と文字列くらいまで勉強しました。
bLeapを使わないやり方も教えていただけないでしょうか。
手間をとらせてしまってすいません;
>>492 int main() (プ
int nYear[6] = {1740,1950,1984,1998,2000,2008}; (プ
for( i=0; i< 6; ++i ) (プ
そんなに屁こくなよ、臭いだろw
497 :
デフォルトの名無しさん :2009/02/12(木) 01:32:25
変数名に習うもなにもない
499 :
デフォルトの名無しさん :2009/02/12(木) 01:37:07
半分寝かけてて頭回ってませんでした; 変数名ですから何でもいいですもんね・・お騒がせしましたorz
[1] 授業単元: [2] 問題文(含コード&リンク): 指定された日時の月齢を計算し、その日の月の塑望の様子をグラフィック表示する。 [3] 環境 [3.1] OS: Windows / Linux [3.2] コンパイラ名とバージョン: 特になし [3.3] 言語: C [4] 期限: 2月14日 [5] その他の制限: png/jpeg等のファイルで出力するのではなく画面上に描画してください
501 :
デフォルトの名無しさん :2009/02/12(木) 01:55:31
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 最大8桁の整数を3つ入力させ、int型の配列にそれぞれ格納する。 入力終了後、3つの数値の和を求め出力するプログラムを作成。 ただし9桁以上の文字列が入力された場合は、先頭から8文字までを有効とし、9 文字目以降を無視する。また、負の数が入力された場合はエラーメッセージを表示しプログラムを終了する。 [3] 環境 [3.1] OS: Windows vista [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限: 今週中 [5] その他の制限: 負の数が入力された以外に、整数以外が入力された場合・改行のみの入力の場合もエラーと表示させる。
504 :
デフォルトの名無しさん :2009/02/12(木) 06:06:19
[1] 授業単元:プログラミング演習 [2] 問題文 データを2次元配列のデータを読み込んで ソート後別ファイルに保存すること だったのですが 以下のプログラムを提出したところ ポインタを使ったものも作るように言われました。 2次元配列とポインタの関係が分からないためお願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc,char* argv[]) { int i,j,k,n; double x0,y0; double v[10000][3],x[10000][3]; double t0,t,h,x1,X=0,Y=0; FILE *fp1,*fp2; double temp[3]; if((fp1 = fopen(argv[1],"r"))==0) { printf("ファイル %s をオープンできません。\n",argv[1]); exit(-1); }
505 :
デフォルトの名無しさん :2009/02/12(木) 06:07:28
for(i=0;i<10000;i++) { fscanf(fp1,"%lf",&x[i][0]); fscanf(fp1,"%lf",&x[i][1]); fscanf(fp1,"%lf",&x[i][2]); } fclose(fp1); for (i = 0; i < 10000; i++) { for (j = 9999 ; j > i; j--) { if (x[j - 1][2] > x[j][2]) { for(k=0; k<3;k++){ temp[k] = x[j][k]; x[j][k]= x[j - 1][k]; x[j - 1][k]= temp[k]; } } } }
506 :
デフォルトの名無しさん :2009/02/12(木) 06:07:50
if((fp2 = fopen(argv[2],"w"))==0) { printf("ファイル %s をオープンできません。\n",argv[2]); exit(-1); } for(i=0;i<10000;i++) { for(j=0;j<3;j++) { fprintf(fp2," %lf ",x[i][j]); } fprintf(fp2,"\n"); } fclose(fp2); return 0; } [3] 環境[3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C/ [4] 期限: 本日午後5時まで [5] その他の制限: ソートの方法はバブルソートを用いる
write = fopen("test.txt", "w"); if(read==NULL){ ←ここがへん 他にもあるかも知れないけど
>>507 間違い探しだな。w
問題文自体も
「バイナリファイル(unsigned short(2バイト)型の数値が4096*2個入)を、10進数でテキストファイルに書き出す。」
何通りか解釈出来てしまうような文章。w
#include <stdio.h>
#include <stdlib.h>
int main(int ac, char *av[]){
FILE *write = fopen("test.txt", "w");
FILE *read = fopen("08112801.L81", "rb");
while(!feof(read)){
int j;
for(j = 0; j < 4096; j++){
unsigned short ch1, ch2;
fread(&ch1, 2, 1, read);
fread(&ch2, 2, 1, read);
fprintf(write, "%d %d\n", ch1, ch2);
}
}
fclose(read);
fclose(write);
return 0;
}
fprintf(write, "%u %u\n", ch1, ch2);
>>508 ありがとうございます。
確かにその条件はへんですね、直します。
先輩がフォートランで同じようなプログラムを書いているのですが、
僕のcの結果と合わないんです。ボスケテ
512 :
デフォルトの名無しさん :2009/02/12(木) 09:10:55
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 最長10文字の文字列を2件入力し、char 型の配列にそれぞれ格納する。2つの文字列 を比較し、文字列が同じだったら「イコール 」を表示し、異なっていたら「ノットイコール 」を表示するプログラムを作成。 11文字以上の文字が入力された場合、先頭から10文字までを有効とし11文字目以降を無視すること。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: [3.3] 言語:C [4] 期限: [5] その他の制限:文字列あたりまで学習。よろしくお願いします。
514 :
デフォルトの名無しさん :2009/02/12(木) 09:29:54
>>492 491です。昨日あのまま寝てしまい質問し損ねたので再度お願いします。
回答してもらったもので実行したところ、1740 leap year としか表示されませんでしたので再度よろしくお願いします。
516 :
デフォルトの名無しさん :2009/02/12(木) 09:34:24
>>515 ありがとうございます、助かりました。」
>>518 大量に変換し、その後数値処理も行うためとりあえず一から
cでやりなさいということらしいです。
>>519 すみません、一応大学の課題なのでこちらだと判断し質問いたしました。
521 :
デフォルトの名無しさん :2009/02/12(木) 10:39:19
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): char型の配列、char str[ ] = "SAMPLE ex305.c"; を宣言する。strに格納された文字列を、アルファベットの小文字だったら大文字、大文字だったら小文字に書き換え て表示するプログラムを作成。 ただし、文字列の書き換えは、別の配列を用意するのではなく、配列str の要素を上書きすること。 [3] 環境 [3.1] OS:Windows xp [3.2] コンパイラ名とバージョン: [3.3] 言語:C [4] 期限: 明日まで [5] その他の制限:
522 :
デフォルトの名無しさん :2009/02/12(木) 10:51:08
>>521 #include <stdio.h>
#include <ctype.h>
char str[] = "SAMPLE ex305.c";
int main(void)
{
char *p = str;
while(*p != '\0'){
if(islower(*p)) *p = toupper(*p);
else if(isupper(*p)) *p = tolower(*p);
p++;
}
printf("%s\n", str);
return 0;
}
523 :
デフォルトの名無しさん :2009/02/12(木) 11:07:47
>>522 すいません、toupperは使わない方法でお願いします。
付け足しで申し訳ないですorz
524 :
デフォルトの名無しさん :2009/02/12(木) 11:24:51
#include <stdio.h> #include <ctype.h> char str[] = "SAMPLE ex305.c"; int main(void) { char *p = str; while(*p != '\0'){ if('a' <= *p && *p <= 'z') *p += 'A' - 'a'; else if('A' <= *p && *p <= 'Z') *p = 'a' - 'A'; p++; } printf("%s\n", str); return 0; }
525 :
デフォルトの名無しさん :2009/02/12(木) 11:25:49
間違えた。ごめん。 #include <stdio.h> char str[] = "SAMPLE ex305.c"; int main(void) { char *p = str; while(*p != '\0'){ if('a' <= *p && *p <= 'z') *p += 'A' - 'a'; else if('A' <= *p && *p <= 'Z') *p += 'a' - 'A'; p++; } printf("%s\n", str); return 0; }
526 :
デフォルトの名無しさん :2009/02/12(木) 11:48:06
>>525 ありがとうございました、なんとか間に合って助かりました。
>>512 の者ですが、期限が明日昼までを書き忘れてました。
どなたかよろしくお願いします。
>>525 521ですが、char *p の*pは単に変数名なんでしょうか?
もしくは*に何か意味があるのですか。よければ教えてもらいたいです。
529 :
デフォルトの名無しさん :2009/02/12(木) 12:15:20
528 いくら初心者でも それはないな
530 :
デフォルトの名無しさん :2009/02/12(木) 12:16:39
cを学習した月日はいくつだよ?
>>528 char *p → 変数名がp、データ型がchar*
532 :
デフォルトの名無しさん :2009/02/12(木) 12:24:52
説明して理解できるレベルに達してないだろ。初めて一か月よりわかってないな。
533 :
デフォルトの名無しさん :2009/02/12(木) 12:26:54
ポインタという単語すら知らなさそう
>>531 ありがとうございます。データ型について調べました。
勉強不足でした;
>>502 すいません、ctype.hは使わないやり方お願いします。
追記してなくて申し訳ないです
>>537 #include <ctype.h>
#include <string.h> ←消し忘れてた。要らない。
を消して、
if(!isdigit(*str))
を
if(*str < '0' || '9' < *str)
に変えてくれ
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 1から9までの数字を縦横方向に同じものが並ばないように下記の例のように並べる 並べ方が全部で何通りあるかとその並びをすべて列挙する [3] 環境 [3.1] OS:特になし [3.2] コンパイラ名とバージョン:ANSI C [3.3] 言語:C [4] 期限: 明日まで [5] その他の制限: 例 534681297 685293714 948367125 153472869 426538971 261759483 817945632 379126548 792814356
>>542 最初に
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
という配列を作っておいて
縦横方向にシャッフルしていけば医院で内科医?
この方法で出て来ない組み合わせってある?
544 :
デフォルトの名無しさん :2009/02/12(木) 16:46:25
123456789 245678913 356789124 467891235 578912346 689123457 791234568 812345679 923456781 こういうのは出せないと思う
546 :
デフォルトの名無しさん :2009/02/12(木) 17:07:02
再帰使えば。
>問題として成立する初期配置の数字の最少個数はまだ結論が出ていないが、 >対称形の問題では18個(初出・パズル通信ニコリ31号 1990年)、 >非対称の物では17個(初出・パズラー187号 1997年)のものが確認されている。 へー
なんて迷惑な奴
あんな小銭のために宿題にしてマルチとは…
>>542 一通りの並びに対して数字の入れ替えを考慮すると
最低でも 9! (362880) 個の解はあるわけだがそれも全部足すの?
>>552 もちろん足すんだろ
こいつは解答がいくつあるかそもそも知らないんだから簡単にそう言うはずだ
できた組み合わせを適当にパズル雑誌に送れば小遣いゲット
>>552 9!*8!=362,880*40,320=146,3132,1600 ひゃくよんじゅうろく億通り
>>552 9!*9^9=362,880*387,420,489=140,5871,4704,8320 が正解かも
556 :
デフォルトの名無しさん :2009/02/12(木) 18:26:25
一つ小さい枠との漸化式ができるとおもうよ。 たとえば書きながら考えるけど、4*4として、数字の総入れ替えをすれば 1行目は1234で固定していい。 1列目の残りの空きは、234 243 324 ・・の6とおり。 あとは、残りの数字で3*3の枠ができる。 K(n)をn*nの個数とすれば、 K(n) = n! * (n-1)! * K(n-1)かな。 違う?
558 :
デフォルトの名無しさん :2009/02/12(木) 18:32:38
数独ではないのだが。問題読んでるか?
559 :
デフォルトの名無しさん :2009/02/12(木) 18:35:26
556は勘違い 例で言うと3*3の枠にはせいやくがついている
560 :
デフォルトの名無しさん :2009/02/12(木) 18:43:49
4*4を書きながらもう一度やってみる。 1行目は、全交換を考慮して1234で固定。 1列目のこりは、3!とおり。 (2,2)は、残りの数字4-2通り。(2,3)は4-3通り。(2,4)は1通り。 (3,2)は、残りの数字4-3通り。(3,3)は1通り。(3,4)は1通り。 それ以降も1通り。 4! * 3! * (4-2)! *・・・ * 1! * (4-3)!*・・・ * 1!*・・・*1か。 nでは、 n! * (n-1)! * (n-2)! *・・・ * 1! * (n-3)!*・・・ * 1!*・・・*1か。
>>542 #include <stdio.h>
typedef struct tag_map_t{ int data[9][9], used[9]; }map_t;
int disp(map_t *map){
static int i, j, count;
if(map==NULL) return count;
count++;
printf("\n----- %d -----\n", count);
for(i=0;i<9;i++){
for(j=0;j<9;j++) printf("%d", map->data[i][j]);
printf("\n");
}
return -1;
}
void hoge(map_t *map, int flag, int num){
int i;
if(num%9==0) flag=0;
for(i=0;i<9;i++){
if((map->used[num%9]&(1<<i)) || (flag&(1<<i))) continue;
map->data[num/9][num%9]=i+1;
map->used[num%9]|=(1<<i);
if(num+1>=81) disp(map);
else hoge(map, flag|(1<<i), num+1);
map->used[num%9]^=(1<<i);
}
}
int main(void){
map_t map={{{1,2,3,4,5,6,7,8,9}},{1,2,4,8,16,32,64,128,256}};
hoge(&map, 0, 9);
printf("\nTotal:%d\n", disp(NULL));
return 0;
}
1~43までの数字の中から異なる6つの数字の組み合わせを選ぶロト6の 組み合わせの総数を求めるプログラムをきぼんぬ。 それを元に、1~nまでの数字の中から異なるn個以下の数字の組み合わせが 何通りあるか求めるプログラムに発展させるものをきぼんぬ。
>>563 43C6
nCm
だね?
あと テンプレ
発展:6つの内、3つ一致すると4等、4つで3等、5つで3等、5つ+ボーナス数字で2等、6つ全て揃うと1等 という条件で、各等の本数を調べよ。 ボーナス数字:6つの本数字とは別で、その6つの本数字と重複しない あっ、これ、宿題じゃなくただの気まぐれ課題だから。
ロト6の期待値ってどのくらいだっけ?
一等 8.19 % 二等 7.37 % 三等 8.85 % 四等 7.78 % 五等 12.75 %
>>565 6C3 * 37C3
6C4 * 37C2
6C5 * 37C1
6C5
6C6
>>561 これはマルチプロセス(MPI)で並列化しないといけないのかなあ。
マルチスレッド(pthreadとか)使っていいんだと楽だけど。
// calculate new data values in Tnew
for(i = 1; i < ly-1; i++){
for(j = 1; j < lx-1; j++){
Tnew[i][j] = T[i][j]+ z*(T[i][j+1] + T[i][j-1] + T[i+1][j] + T[i-1][j] -4.*T[i][j]);
}
}
この部分を並列化するには、上下左右のセルの値を参照するから、
マルチプロセス(MPI)で並列化すると、毎回計算結果を往復通信することになって、
通信量がでかくなりそう・・・。むずいなあ。
571 :
561 :2009/02/13(金) 02:18:29
>>570 MPIの授業なのでMPIでやる必要があります。。マスタープロセス(プロセス0)と
スレーブプロセスで通信をした後、更に上下左右の端のセルはゴーストセルといって
計算をするためにスレーブ間で送受信しないといけない?。。とかいっていました。
MPI_Cart_Create(だったと思います)を使えばいいとかも言っていましたが、自分には
サッパリです。。
[1] 授業単元: 演習 [2] 問題文(含コード&リンク): 2x2行列の固有値を求めるプログラムをかきなさい。 double型の配列とします。 [3] 環境 [3.1] OS:LINUX [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限: 明日まで [5] その他の制限:特になし
数学板の線形代数スレで聞いたほうがいいと思うぞ
>>573 2x2の固有値程度ならここでもいいでしょ
>>572 かなりてきとーに作った
#include<math.h>
#include<stdio.h>
int main()
{
double mat[2][2]={{1.0,3.0},{5.0,-4.0}};
double A=mat[0][0]+mat[1][1];
double B=mat[0][0]*mat[1][1]-mat[0][1]*mat[1][0];
double D=A*A-B;
double lh=A/2,rh=sqrt(fabs(D))/2;
if(D>=0)
printf("%.4f,%.4f\n",lh+rh,lh-rh);
else{
printf("%.4f+%.4fi,%.4f-%.4fi\n",lh,rh,lh,rh);
}
return 0;
}
>>575 #define a A
#define b B
#define d D
double d=a*a-4*b;
C言語の課題でフローチャートを書くものがあるんですが、フローチャートの回答もここで聞いていいんですか?
CやC++でフローチャート画像を表示するプログラムを作れとかいう課題ならOK
プログラムがあって、それをwordとかでフローチャートにしろっていう指示だったので違いますね; 失礼しました。
[1] 授業単元:趣味。 [2] 問題文(含コード&リンク): 自然数n与え、nを1以上の自然数の和で表す組み合わせを求め、配列に入れて返す関数をかけ 戻り値はstd::vector<std::vector<long> >とする (この組み合わせの総数のことを分割数と呼ぶ) 例えばn=4の場合 1 1 1 1 1 1 2 1 3 2 2 4 [3] 環境 [3.1] OS:WinXP [3.2] コンパイラ名とバージョン:VC7.1(Visual Studio2005付属) [3.3] 言語: C++ [4] 期限: なし [5] その他の制限:標準で使えるライブラリのみで(Boost等はなし) 分割数の個数を求める関数はこんな感じでかける long div(long n){ struct inner{ static long pnm(long n,long m){ if(n<=m){return !(n<m);} return pnm(n-m,m)+pnm(n,m+1); } }; return inner::pnm(n,1); } これを実際の和を求めるよう作り替えようとしてつまづいた。 よろしくお願い申す
Cでなら昔書いたな
>>581 #include<iostream>
#include<vector>
void divide_r(std::vector<std::vector<long> >& all, std::vector<long>& now, long n, long min) {
if (n >= min) {
for (long i = min; i <= n; i ++) {
now.push_back(i);
divide_r(all, now, n-i, i);
now.pop_back();
}
} else if (n == 0) all.push_back(now);
}
std::vector<std::vector<long> > divide(long n) {
std::vector<std::vector<long> > all;
std::vector<long> now;
divide_r(all, now, n, 1);
return all;
}
int main() {
long n;
std::cout << "n="; std::cin >> n;
std::vector<std::vector<long> > all = divide(n);
for (std::vector<std::vector<long> >::const_iterator it = all.begin(); it != all.end(); ++it) {
std::copy(it->begin(), it->end(), std::ostream_iterator<long>(std::cout, " "));
std::cout << std::endl;
}
return 0;
}
584 :
デフォルトの名無しさん :2009/02/14(土) 00:26:40
1] 授業単元: 演習 [2] 問題文:整数は約数(1は含むが、その整数自身は含めない)の和がその整数に等しいとき、完全数と呼ばれる。引数 number が完全数であるかどうかを判定する関数 int IsPerfect(int number)と約数判定関数 int IsDivisor(int dividend, int divisor)を作成しなさい。 そして、これらの関数を使って、2 から 10000 までの間にあるすべての完全数を出力するプログラムを作成しなさい。 [実行例] % ./a.out 完全数リストは下記の通りです: 6 28 496 8128 [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C
>>583 あなた最高。まさに俺が求めていた物がここにあるよ。ありがとう
>>584 #include<stdio.h>
int IsDivisor(int dividend, int divisor) {
return !(dividend % divisor);
}
int IsPerfect(int number) {
int i, sum = 0;
for (i = 1; i <= number/2; i ++) {
if (IsDivisor(number, i)) sum += i;
}
return sum == number;
}
int main() {
int i;
for (i = 1; i <= 10000; i ++) {
if (IsPerfect(i))
printf("%d\n", i);
}
return 0;
}
>>584 #include <stdio.h>
int IsDivisor(int dividend, int divisor){
return (dividend%divisor)==0;
}
int IsPerfect(int number){
int i, sum=0;
for(i=1;i<number;i++){
if(IsDivisor(number, i)) sum+=i;
}
return number==sum;
}
int main(void){
int result[]={6,28,496,8128,-1};
int i, j=0;
for(i=2;i<10000;i++){
if(i==result[j] && IsPerfect(result[j])) printf("%d\n", result[j++]);
}
return 0;
}
1] 授業単元: プログラミング言語Ⅰ [2] 以下のプログラムは、入力された10個の整数を引き算して その結果を表示するプログラムです。 9から11行目を別の関数(関数名はFuncDev)とし、修正しなさい。 ただしグローバル変数は使わないこと。 また、FuncDev内のローカル変数名は任意とする。 FuncDev関数は以下の定義とする。 int FuncDev(void); FuncDev関数の戻り値は、入力されたint型データとする。 #include<stdio.h> void main(void); void main(void) { int n1,n2; int nt; nt = 0; for(n1=0;n1<10;n1++){ printf("0-9の数値を入力せよ"); scanf(" %d",&n2); nt-=n2; } printf("結果は%dです。"); } [3.1] OS: windows xp [3.2] VC++ 6.0 [3.3] 言語: C [4] 期限:2/16 どうかよろしくお願いいたします
>>589 #include<stdio.h>
int FuncDev(void);
void main(void)
{
int n1;
int nt;
nt = 0;
for(n1=0;n1<10;n1++){
nt = FuncDev();
}
printf("結果は%dです。\n",nt);
}
int FuncDev(void)
{
static int count = 0;
static int sum = 0;
int n3;
printf("0-9の数値を入力せよ");
scanf("%d", &n3);
if(count == 9){
return sum - n3;
}
sum -= n3;
count++;
return n3;
}
>>589 #include<stdio.h>
void main(void);
int FuncDev(void);
void main(void)
{
int n1;
int nt;
nt = 0;
for(n1=0;n1<10;n1++){
nt-=FuncDev();
}
printf("結果は%dです。",nt);
}
int FuncDev(void)
{
int n;
printf("0-9の数値を入力せよ");
scanf("%d",&n);
return n;
}
[1] 情報処理 乱数1 [2] n個の任意のサイコロをコンピュータがふって目の和がOdd or Evenを当てるゲーム [3] 環境 [3.1] Windows [3.2] Borland C++ Compiler [3.3] C [4] 期限: 2月18日 [5] その他の制限:乱数をはじめて使う課題です。配列・ポインタ・ユーザ定義関数などは習いました。 よろしくお願いします。
593 :
584 :2009/02/14(土) 16:44:29
>>592 さいころの目は、一般的な1~6の立方体を想定?
[1] 授業単元:趣味。 [2] 問題文(含コード&リンク): 自然数n与え、nを1以上の自然数の積で表す組み合わせを求め、配列に入れて返す関数をかけ 戻り値はstd::vector<std::vector<long> >とする 例えばn=12の場合。出力順序は問わない 1 12(12 1でもOK) 2 2 3 2 6 4 3 [3] 環境 WinXP,C++,VC8(VS2005付属)またはgc3.4.4 [4] 期限: なし [5] その他の制限:標準で使えるライブラリのみで(Boost等はなし) 和に続いて積 参考:お手軽素因数分解のコード #include <iostream> #include <cmath> #include <vector> void factorize(long P,std::vector<long>& v){ for(long i=2;i<sqrt((double)P)+1;++i){ if(P%i==0){ v.push_back(i); P/=i; factorize(P,v); return; } } v.push_back(P); } ひとつよろしくお願いする
>>592 6面体、nは入力でつくった
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
int main()
{
int i, n, input, sum_dice;
srand((unsigned)time(NULL));
printf("n? ");
scanf("%d", &n);
printf("Odd(1) or Even(0)? ");
scanf("%d", &input);
sum_dice = 0;
for(i = 0; i < n; i++) sum_dice += rand() % 6;
if(sum_dice % 2) printf("result: %d Odd\n", sum_dice);
else printf("result: %d Even\n", sum_dice);
if(sum_dice % 2 == input) printf("Correct!\n");
else printf("Failed...\n");
return 0;
}
>>592 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
int i, n=0, t=0, r=0;
if(argc != 2) {
printf("Usage: .\\exe num");
return -1;
}
sscanf(argv[1], "%d", &n);
if(n < 1) return -2;
srand( (unsigned)time( NULL ) );
/* n 個の値を表示します。 */
for( i = 0; i < n; i++ ) {
r = (int)(rand()/((double)RAND_MAX+1)*6)+1;
printf( " %6d\n", r );
t += r;
}
if(t%2 == 0)
printf("Even\n");
else
printf("Odd\n");
return 0;
}
printf( " %6d\n", r ); t += r;
600 :
589 :2009/02/14(土) 18:38:54
601 :
デフォルトの名無しさん :2009/02/14(土) 18:41:03
授業単元: プログラミング言語Ⅱ 以下の仕様を満たす共用体を宣言しなさい。 もし構造体が必要ならば、任意の構造体名および変数名で宣言すること。 ・共用体名はTEST、共用体変数名はuntest。 ・全体のデータサイズは80バイトで、char型配列として扱う。変数名はszData ・最初の10バイトはchar型配列で、変数名をszCodeとする。 ・次のメンバは20バイトのchar型配列で変数名はszName [3.2] VC++ 6.0 [3.3] 言語: C [4] 期限:2/19 よろしくお願いいたします
>>601 union TEST {
char szData[80];
struct {
char szCode[10];
char szName[20];
} szAddr;
};
#ifndef DEBUG
main(){}
#else
#include <stdio.h>
#include <string.h>
#include <memory.h>
int main(void)
{
union TEST untest;
char work[21];
char *adr = "1234567890ABCD EFGH ABCD EFGHIABCD EFGHaaaaaaaaaaabbbbbbbbbbbbbbbccccccdddddddddeeeeeeeeee";
memset(untest.szData, 0, 80);
memcpy(untest.szData, adr, strlen(adr)<=80-1 ? strlen(adr) : 80-1);
printf("%s\n", untest.szData);
memset(work, 0, 11);
memcpy(work, untest.szAddr.szCode, 10);
printf("%s\n", work);
memset(work, 0, 21);
memcpy(work, untest.szAddr.szName, 20);
printf("%s\n", work);
return 0;
}
#endif
>>602 たぶんそのコードが正解だろうと思うんだけどさ、
・最初の10バイトはchar型配列で、変数名をszCodeとする。
・次のメンバは20バイトのchar型配列で変数名はszName
を満たしてないよね。両方ともszAddr.が付いちゃう。
601を文面どおり受け取ると memcpy(work, untest.szAddr.szCode, 10); ではなく memcpy(work, untest.szCode, 10); でアクセスできないといけない
>>607 szCodeはTESTのメンバであって構造体のメンバではない
といえばわかる?
>>606 これはすばらしい!
実は先ほど自分でも動作するものがかろうじて作れたんだが
頂いたコードのほうが4096倍ぐらい早く動作する
しかもコードがシンプルでわかりやすい
ただ、VCではlroundやらsqrtのオーバーロードやらでエラーがでたため
lround(...)をsqrt((double)n)に変更して検証
自作コードと2から30までの出力結果をdiffしてみたが
うまく動作してる模様、感謝
>>895 対レオナールデッキのAPTのマンティコアへの与ダメ比較
愛染:31(16)/ペガ:70(52)/アヌ:24(9)
レナス:36(21)/クロ:42(27)/パワーズ:36(21)
ペガサス入りの愛染デッキでもピンダメ除けば与ダメに大差ないんだが?
単体攻撃が1体多い分で通常攻撃分はトントンだろ。
それでも普通はレオナール相手でもピン落とし出来て普通な訳だ。
すまん。盛大に誤爆した・・・
612 :
デフォルトの名無しさん :2009/02/15(日) 18:08:27
刀、 , ヘ
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは
>>611 乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
614 :
デフォルトの名無しさん :2009/02/15(日) 22:54:20
5つの整数を入力しそれらの数字の最小値と最大値を求めるプログラムを作成せよ なお出力は最大値と最小値の両方を入力すること。また提出時には入力した5つの数字と出力結果の最大値と最小値をソースコードの最後にコメントとして添付して提出せよ 以上です
615 :
デフォルトの名無しさん :2009/02/15(日) 22:55:17
↑for ifを使ってお願いします…
>>613 元のプログラムをなるべく活かすとこんな感じか。
#include <stdio.h>
double f(double x){return x*x};// f(x) = x^2
#define a 2.0//始点 x = 2.0
#define b 3.0//終点 x = 3.0
#define N 4//座標の数
double menseki(double *vx, double *vy){
//もとのまま
}
int main(void)
{
double S;
double Vx[N];
double Vy[N];
int i; // 何番目の台形かを表す
for( i = 0; i< N; i++){
Vx[i] = a+ i*(b-a)/(N-1);
Vy[i] = f(Vx[i]);
}
S = menseki(Vx,Vy);
printf("S: %f\n",S);
return 0;
}
617 :
デフォルトの名無しさん :2009/02/15(日) 22:59:05
ネットワークのシュミレーションってCでも出来ますか? トラフィックの占有率とか確率分布を計算しろって言われて困ってます
618 :
デフォルトの名無しさん :2009/02/15(日) 23:03:38
完全に、ソフトウェアだけでやるのは、かなり詳しくないと無理では? 会社休みのときにでも、PC使ってテストすれば
シュミレーションシュミレーションシュミレーションシュミレーションシュミレーション
>>617 理論値でならできるかもしれないけど
多くても基本性能の60%くらいまでで見ておかないと
輻輳とか訳分からん要素が盛りだくさんw
621 :
デフォルトの名無しさん :2009/02/15(日) 23:22:48
ネットワークのシミュレータを作るのが宿題、研究ならばやるしかないが。
>>616 様ありがとうございます。
ですが、コンパイルすると
ファイル名: In function `f':
ファイル名:2: error: parse error before '}' token
と2行目にエラーが発生してしまいます><
cygwinではコンパイルだめなのでしょうか?
623 :
デフォルトの名無しさん :2009/02/15(日) 23:24:34
// ********** を削除
625 :
デフォルトの名無しさん :2009/02/15(日) 23:32:47
なるほど~ ns2使いこなせないから先生に相談したら 言語関係なく簡単なのでもいいからネットワークの失敗率とかプログラミングしろって言われたもんで・・・ Cはなんとかだけどtclがわかんないっす お礼はZIPでよければいくいらでもだから相談のってください!!
626 :
デフォルトの名無しさん :2009/02/15(日) 23:38:44
どんなネットワークか説明なしでは無理
627 :
デフォルトの名無しさん :2009/02/15(日) 23:40:21
P2P、クライアントサーバー、インターネットとかネットワークにはいろいろある。
628 :
デフォルトの名無しさん :2009/02/15(日) 23:57:09
629 :
デフォルトの名無しさん :2009/02/16(月) 00:04:29
こんな絵だけで、ネットワークシミュレータできません。 通信速度やトラフィックなどいろいろいります。
>>628 むしろプロキシに見える
ま、スレ違いだからどっか適当な場所に移動だね
632 :
デフォルトの名無しさん :2009/02/16(月) 00:39:48
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 連続な関数f(x)において,もしf(a)<0,f(b)>0だったら a<x<bの範囲で少なくとも1つf(x)=0をみたすようなxが必ず存在する. これを以下のような方法で求める. f(a) < 0, f(b) > 0 となるような a, b が与えられたとする(ただし a < b). <ループ開始> (1) b - a < e ならループを抜ける(e は適当に小さい値,0.00001とか) (2) c = (a + b) / 2; (3) もし, f(c) == 0 ならばループを抜ける もし,f(c) > 0 ならば b = c として(1)に戻る(a はそのまま) もし,f(c) < 0 ならば a = c として(1)に戻る(b はそのまま) <ループおわり> これは while ループで書ける.(1)をなくして回数指定のループにすることもできる. たとえば f(x) = x*x-2, a=1, b=2 として二分法を手計算してみよ. [3] 環境 [3.1] windows [3.2] gcc [3.3] c言語 [4] 期限:2月16日 10時 お願いします。
#include <stdio.h> //
>>613 >>616 を直した。
int N = 1; // 座標の個数、台形の個数は(N-1)個
double f(double x)
{return 3*x*x + 2*x - 20;} // f(x) = 3*x^2 + 2*x - 20
double menseki(double *vx, double *vy);
int main(int argc, char *argv[])
{
float a, b; // x 始点, x 終点
double S, *Vx, *Vy;
int i; // 何番目の台形かを表す
if(argc != 4) {
printf("Usage: .\\exe number start-point end-point\n");
return -1;
}
N = atoi(argv[1]);
sscanf(argv[2], "%f", &a);
sscanf(argv[3], "%f", &b);
Vx = malloc(N*sizeof(double));
if(Vx == 0) return -2;
Vy = malloc(N*sizeof(double));
if(Vy == 0) return -2;
for(i = 0; i < N; i++){
Vx[i] = a + (double)i*(b-a)/(N-1);
Vy[i] = f(Vx[i]);
printf("x=%f y=%f\n",Vx[i],Vy[i]);
}
S = menseki(Vx,Vy);
printf("S: %f\n",S);
free(Vx);
free(Vy);
return 0;
}
635 :
デフォルトの名無しさん :2009/02/16(月) 02:13:03
すいません、sageるのわすれてました・・・
>>635 4.
#include <stdio.h>
int main(void)
{
int i, j;
for(i=0; i<=26; i++) {
for(j=i; j<26; j++) putchar('a' + j);
for(j=0; j<i; j++) putchar('a' + j);
putchar('\n');
}
return 0;
}
>>635 3.
#include <stdio.h>
int main(void)
{
int n, ans = 0;
scanf("%d", &n);
while(n) {
ans = ans * 10 + n % 10;
n /= 10;
}
printf("%d", ans);
return 0;
}
2.
#include <stdio.h>
int main(void)
{
int n, ans = 0;
scanf("%d", &n);
while(n) {
ans += n % 10;
n /= 10;
}
printf("%d", ans);
return 0;
}
サブ関数使ってねーw
2も3もサブ関数使うのかw
サブ関数2 int f(int n) { int ret = 0; while(n) { ret += n % 10; n /= 10; } return ret; } サブ関数3 int f(int n) { int ret = 0; while(n) { ret = ret * 10 + n % 10; n /= 10; } return ret; } 共通メイン int main(void) { int n; scanf("%d", &n); printf("%d", f(n)); return 0; }
printf("値を入力してください:"); scanf("%d",&n); printf("演算結果!\n"); while(n!=1) { if(n%2==0) { n /= 2; ; printf("%d\n",n); } else { n = 3 * n + 1; printf("%d\n",n); } } printf("終了!\n"); return 0; } で、おそらくできたと思うのですが、これの発展問題で5桁の整数で1になるまでの 最も計算処理がかかる値を求め、その値と1になる経過を出力せよ。 というのが良くわかりません…。よろしくお願いします。
スレ汚し申し訳ないです。こんな短時間に本当にありがとうございます。大変あつかましいのですがこちらもできたらよろしくお願いします。 任意の整数nを偶数であればn/2を計算し、奇数であればn*3+1を計算する。 その演算結果を繰り返すと必ず1になるが、これを確かめるプログラムを作成せよ。 これは #include <stdio.h> int main() { int n=0; printf("値を入力してください:"); scanf("%d",&n); printf("演算結果!\n"); while(n!=1) { if(n%2==0) { n /= 2; ; printf("%d\n",n); } else { n = 3 * n + 1; printf("%d\n",n); } } printf("終了!\n"); return 0; }
#include <stdio.h> //計算回数を求める関数 int f(int n) { int ret = 0; while(n!=1) { if(n%2==0) n /= 2; else n = n * 3 + 1; ret++; } return ret; } int main(void) { int i, max = 1, max_cnt = 0, cnt; for(i=10000; i<100000; i++) { cnt = f(i); if(cnt > max_cnt) { max = i; max_cnt = cnt; } } printf("%d, %d回\n", max, max_cnt); return 0; }
646 :
デフォルトの名無しさん :2009/02/16(月) 04:12:29
>>614 #include <stdio.h>
#include <limits.h>
int main()
{
int i, max = INT_MIN, min = INT_MAX, tmp = 0;
for (i = 0; i < 5; ++i) {
scanf("%d", &tmp);
max = tmp > max ? tmp : max;
min = min > tmp ? tmp : min;
}
printf("max = %d, min = %d\n", max, min);
return 0;
}
/*
入力
1 2 4 9 0
出力
max = 9, min = 0
*/
>>614 #include <stdio.h>
#include <stdlib.h>
int compare(const int *n1, const int *n2){ return *n1 == *n2 ? 0 : *n1 < *n2 ? -1 : 1; }
void main()
{
int n[5], i;
for(i = 0; i < 5; i++) scanf("%d", &(n[i]));
qsort((void *)n, 5, sizeof(int), (int(*)(const void *, const void *))compare);
printf("max: %d, min: %d\n", n[4], n[0]);
}
訂正 #include <stdio.h> #include <stdlib.h> int compare(const char *s1[], const char *s2[]){ return atoi(*s1) - atoi(*s2); } void main(int argc, char *argv[]) { qsort((void *)&(argv[1]), argc - 1, sizeof(char *), (int(*)(const void *, const void *))compare); printf("max: %s, min: %s\n", argv[argc - 1], argv[1]); }
652 :
デフォルトの名無しさん :2009/02/16(月) 10:17:51
n次方程式の全ての極大値とその値を求めるプログラム。 一般の方程式でも可ですが、 double a1、a2、・・・anに対して x>0 での(1 + a1*x)・・・(1 + an*x)で極大値でいいです。
654 :
デフォルトの名無しさん :2009/02/16(月) 10:45:20
そうなんです。お忙しいとおもいますがおねがいします。
655 :
デフォルトの名無しさん :2009/02/16(月) 11:54:52
ポアソン乱数を発生させるプログラムをどなたかお願いします。
>>648 テンプレに従わなくても回答がつくんだから、従わないだろ
658 :
デフォルトの名無しさん :2009/02/16(月) 12:18:36
>>656 書き込み有難うございます。
ネットで調べてこのサイトは知っていたのですが、
これとは別にもっと簡単なプログラムはないでしょうか。
お願いします。
お前の言う簡単とはどういったものなんだ? その基準が示されないことにはどんなレスも無駄になる可能性がある。
ポアソンくらいならすぐ書いてやるぜーと思ったが
>>656 が難しいというなら手の施しようが無い…
661 :
デフォルトの名無しさん :2009/02/16(月) 16:43:34
662 :
デフォルトの名無しさん :2009/02/16(月) 17:13:27
>>652 は、待っていたら出来るかどうか教えて。 待っても無理なんですか?
>>661 最急降下法、共役勾配法等のいろいろな方法があるけどどうするよ
664 :
デフォルトの名無しさん :2009/02/16(月) 17:21:32
おねがいします!みじかいやつでおねがいします。 1000次が数秒ででればいいです。
と思ったけど一次元なのな
>>665 いや、n次って書いてあるし、
最後の行の式は、掛け算でしょ?
変数が1個だから一次元じゃん
微分が計算できるからニュートン法で導関数が0になるところ探していけばいいのかなぁ。 x=-1/a[i]の近くから探してけばどれかが最適解になるのかな。
それもあるけど、挟み込んでいってもできる ソースを書く気はしないけどな
[1] 授業単元: C言語 [2] 問題文(含コード&リンク):f(x)=x2条-5x+6=0の解を二分法を用いたプログラムで求めてみよ。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語:C++ [4] 期限: 2月18日 [5] その他の制限: よろしくお願いします
[1] 授業単元: C言語 [2] 問題文(含コード&リンク):f(x)=x2条-5x+6=0の解を二分法を用いたプログラムで求めてみよ。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語:C++ [4] 期限: 2月18日 [5] その他の制限: よろしくお願いします
>>674 はい、自分で適当な数字を入力して行なうので
先生は簡単だと仰ってたんですがチンプンカンプンで・・・
そんな細かいタイプミスで、レスするとは・・・・・ 数学相談系で、確立なんかつっこんでられないぞ!
678 :
674 :2009/02/17(火) 05:41:58
>>678 ありがとうございます!!
多分不都合はないと思います
本当にありがとうございました
681 :
デフォルトの名無しさん :2009/02/17(火) 11:49:22
>>681 Mathematicaでも使えばいいんでない?
683 :
デフォルトの名無しさん :2009/02/17(火) 13:03:02
684 :
デフォルトの名無しさん :2009/02/17(火) 13:03:59
>>659 >>660 656が難しいというか、2種類の違う方法で発生させて結果が同じになるか比較しないといけないので、
これとは違う方法はないでしょうか。
方法はいくらでもあるけどねぇ
[1] 授業単元: C言語
[2]
ttp://www.uploda.org/uporg2024643.zip.html パスつきです
たくさんありますがよろしくおねがいいたします。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:GNNコンパイラGCC(GNU Compiler Collection)
[3.3] 言語:Cだとおもいます
[4] 期限: 2月20日の朝までにお願いいたします。
無理な場合はできるところまででもお願いします。
[5] その他の制限: フローチャートも必要ですがそれは
多分プログラムを見れば自分でできますよね?
3番まではなんとかできましたので4番からお願いいたします。
>>686 問題4
#include <stdio.h>
#define N 7
int main(void)
{
#if N%3 == 0
puts("3で割り切れます。");
#elif N%2 == 0
puts("2で割り切れます。");
#else
puts("2で割り切れません。");
#endif
return 0;
}
テンプレに従わないのは無視しておけばいいのに
パスワード聞かれるけど。
制御文のif使った例。 4. #include<stdio.h> #define N 9 void main(){ int a = TEIGI; if(-1) (a%3)?(a%2)?puts("2で割り切れまません。"):puts("2で割り切れます。"):puts("3で割り切れます。"); }
なにこれ
694 :
692 :2009/02/17(火) 15:04:18
訂正 int a = TEIGI; → int a = N;
>>689 無視は可愛そうだからな
5.switch文
#include<stdio.h>
#define N 4
const char* msg[]={"春です。","夏です。","秋です。","冬です。","不正な値です。"};
void main(){
int a = N;
switch(a<1 || a>12){
case true: puts(msg[4]); break;
case false: (a<=2||a==12) ? puts(msg[3]) :
(a<=6) ? puts(msg[0]) :
(a<=8) ? puts(msg[1]) : puts(msg[2]);break;
default: break;
}
}
これ、問題があまりにひどくないか?w これって何の問題なんだ?
>>688 変数に代入してないからだめじゃないのか
>>695 東京コンピュータサービスの採用試験とか
大変失礼しました。 習ったのはC言語の「プログラミングの基礎」と 「条件分岐とアルゴリズム」と「ループとアルゴリズム」と 「配列とアルゴリズム」と「関数と変数」です。 標準ライブラリというのは聞いたことがありませんのでs 今調べます。
>>696 定義部分をNからNNにして、main1行目で int N = NN; ってところだね。
6.for文
#include<stdio.h>
#define N 15
void main(){
int i,j;
for(i=1;i<=N&&i<=20;i++,puts("")) for(j=0;j<i;j++,printf("%d",i));
}
これは、・・・普通? (問題の設定上)10以上おかしいけど。
>>686 >>695 という疑問を抱えつつ、問題9(スキャン0004を問題4と間違えた)
#include "stdio.h"
void main()
{
char *name = "yamada taro";
int list[] = { 0, 1, 4, 10 };
int i, pos;
printf( "文字列は %s\n", name );
for( i = 0; i < 4; i++ )
{
pos = list[i];
printf( "%2d 文字目=%c 領域アドレス=%08x\n", pos + 1, name[pos], name + pos );
}
}
701 :
デフォルトの名無しさん :2009/02/17(火) 15:15:24
>>686 6.
#define N 5
j;main(i){for(;i-1==N;exit(0));for(j=0;j<i;j++)printf("%d",i);puts("");main(++i);}
実行時に引数を与えないでください
>>686 Q.4
#include <stdio.h>
#define N 203
main(void){
int num = N;
if(num < 3) return -1;
if(num%3 == 0) {
puts("3で割り切れます。");
} else
if(num%2 == 0) {
puts("2で割り切れます。");
} else {
puts("2で割り切れません。");
}
return 0;
}
ま、後は自力で似たもんばっかだし。ってか、ソース理解してるの? ソースに対するつっこみもないところ見ると、ただ意味わからず貼り付けるだけか。
東京コンピュータサービスすごいな… とりあえず俺がこの会社を利用することはなさそうだ
707 :
デフォルトの名無しさん :2009/02/17(火) 15:53:14
東京コンピュータサービス - Wikipedia 1974年9月9日設立。クロレラ培養を始めた社長がそれを販売し一発儲けようと画策したが失敗し倒産、 その後も懲りずに味付け卵会社→シェービングクリームの会社を設立したがことごとく失敗したため、 数年後一念発起して立ち上げた会社が当時は珍しかった人貸しのIT企業。 売上高 351億円 (2005年度)
>>686 Q5:
#include <stdio.h>
#define N 4
main(void){
int num = N;
if(num < 1 || num > 12) {
puts("不正な値です。");
return -1;
}
switch(num) {
case 4:case 5:case 6:
puts("4月,5月,6月は春な。");
break;
case 7:case 8:
puts("7月,8月は夏な。");
break;
case 9:case 10:case 11:
puts("9月,10月,11月は秋な。");
break;
default:
puts("冬です。");
break;
}
return 0;
}
>>686 Q.6
#include <stdio.h>
#define N 9
main(void){
int num = N;
int i, j;
for(i=1; i<=num; i++) {
for(j=1; j<=i; j++) {
printf("%d", i);
}
puts("");
}
return 0;
}
>>686 Q.7
main(void){
int num = N;
int i, j;
i = 1;
while(i<=num) {
j = 1;
while(j<=i) {
printf("%d", i);
j++;
}
puts("");
i++;
}
return 0;
}
>>686 Q.8
main(void){
int num = N;
int i, j;
i = 1;
do {
j = 1;
do {
printf("%d", i);
j++;
} while(j<=i);
puts("");
i++;
} while(i<=num);
return 0;
}
wikiにあるカレンダーのアルゴリズム教えてくれ下さい
>>686 Q.9 残りと、Q.10
#include <stdio.h>
main(void)
{
char *pcPtr;
char acName[] = "yamada taro";
char list[] = "11001000001";
int i;
char acData[22+1];
strcpy(acData, "Tokyo Computer Service");
printf("%s\n", acData);
printf( "文字列は %s\n", acName );
for(i = 0, pcPtr = acName; *pcPtr; pcPtr++) {
if(list[i++] != '0')
printf( "%2d 文字目は%c 領域アドレスは0x%08x\n", i, *pcPtr, pcPtr );
}
printf("ポインタ変数のアドレスは0x%08x\n", &pcPtr);
}
713 :
デフォルトの名無しさん :2009/02/17(火) 18:42:39
fgetsを調べればわかると思うけど、stdinからEOFを読み込んだ時 もしくは読み込みに失敗した時
716 :
713 :2009/02/17(火) 19:01:40
>>686 Q.16 数字先頭空白は可
#include <stdio.h>
main(void)
{
int h, g, bmi=0, i;
float ave;
char buf[10];
do {
printf("身長(cm)を入力してください→"); scanf("%10s", buf);
sscanf(buf, "%d", &h);
} while(h<50 || h>300 || *buf<'1' || *buf>'9');
do {
printf("体重(kg)を入力してください→"); scanf("%10s", buf);
sscanf(buf, "%d", &g);
} while(g<1 || g>200 || *buf<'1' || *buf>'9');
ave = (float)g/(h*h)*10000;
if(ave < 22*0.7) bmi = 1; // < 15.4
else if(ave < 22*0.9) bmi = 2; // < 19.8
else if(ave >= 22*1.3) bmi = 5; // >= 28.6
else if(ave >= 22*1.1) bmi = 4; // >= 24.2
else bmi = 3;
printf("\nやせ |");for(i=0;i< 9;i++)
if(bmi==1) printf("*"); else printf("-"); puts("");
printf("やせ気味|");for(i=0;i<28;i++)
if(bmi==2) printf("*"); else printf("-"); puts("");
printf("標準 |");for(i=0;i<43;i++)
if(bmi==3) printf("*"); else printf("-"); puts("");
printf("太り気味|");for(i=0;i<12;i++)
if(bmi==4) printf("*"); else printf("-"); puts("");
printf("肥満 |");for(i=0;i< 8;i++)
if(bmi==5) printf("*"); else printf("-"); puts("");
}
[1]趣味 [2] 問題文(含コード&リンク): どう実装してもよいので比の連立方程式が与えられた時に それを満たす最小の自然数の組を求めるプログラムを作れ。 答えがない場合は「no answer」と表示する わかりにくいかもしれないので、問題文らしくしてみると 同じサイズで空でない配列a,b,c,dを考え、iを添え字とする a[i],b[i]の値はある集合Xの要素xjの添え字jを表す a[i]:b[i]=c[i]:d[i](つまり、b[i]*c[i]=a[i]*d[i])の関係式を与えられた時 全ての関係式を満たす最小の自然数xjの組e[i]を返せ (この問題の形式に従う必要は無い) 例1 a={1,2,3,4},b={2,3,4,5},c={10,3,2,7},d={3,5,5,12}の時 x1:x2=10:3 x2:x3=3:5 x3:x4=2:5 x4:x5=7:12 この解となる組の集合うち、全てが自然数で最小のものであるe={140,42,70,175,300}(={x1,x2,x3,x4})を出力する 例2 a={2,3,1,4},b={1,2,3,2},c={5,3,4,6},d={6,2,5,3} x2:x1=5:6 x3:x2=3:2 x1:x3=4:5 x4:x2=6:3 このときe={12:10:15:20}(={x1,x2,x3,x4})を出力する 例3 a={1,1,2} b={2,3,3} c={1,1,1} d={2,3,1}の時これを満たす自然数はないため「no answer」と表示する [3] 環境 WinXP,VC8.0(or gcc 3.4.4 with cygwin),C++、Cどちらでも可 [4] 期限: なし [5] その他の制限:標準以外のライブラリはなし(STLはOK,Boostはだめ) 特に「どうやってループを回すか」がわからない 例1みたいな直列につながった例なら何とか解ける気がするが 例2みたいになるとどうやって解いて良いのかわからずつまづいた よろしくお願いします
>>718 ここは、専門家が考えた課題を丸投げするスレです。
質問スレでもいけ
>>719 専門家って・・・・ただ連立方程式に直して剰余定理とか使ってくだけでしょう。
まぁ、ただ解が欲しいなら for(i) for(j) for(k) for(l) if( func(i,j,k,l)==true ) printf( あsdfgふじこ );
で、10000の4乗回くらい計算すればええんでない?大体1日位で終わるんでない?
最小の整数の組ってさ、普通何を指すのさ?
(1,9)と(2,3) とか。
4個とは限らないからもっと賢く実装しろって問題でしょ。
>>720 トウシロウの考えた駄文は、読むにも値しないってこと。
724 :
718 :2009/02/17(火) 23:54:01
なるほど、ここはそういう需要のスレなわけね 一応先ほどの問題には元ネタがあるんだが、 問題文が英語なので俺が駄訳すると状況はかわらんのでよそ行くわ
>a[i]:b[i]=c[i]:d[i](つまり、b[i]*c[i]=a[i]*d[i])の関係式を与えられた時 (゚Д゚)ハア? X_a[i] : X_b[i] = c[i] : d[i] だろ 駄訳というか根幹から間違ってんじゃねーかドアホ
ちなみにおそらく「連立方程式に書き直した時、ランクが行列の次元より1小さい」が答えと思われるがどうか
原文晒して欲しい
>>686 Q.14
#include <stdio.h>
#define BUF_SIZE 1024
main(void)
{
int count, work;
char buffer[BUF_SIZE];
FILE *fp1, *fp2;
if(!(fp1 = fopen("data1.txt", "r"))) {
fprintf(stderr, "File data1.txt open error!");
return -2;
}
if(!(fp2 = fopen("data2.txt", "a"))) {
fprintf(stderr, "File data2.txt open error!");
return -2;
}
do {
count = fread(buffer, 1, BUF_SIZE, fp1);
work = fwrite(buffer, 1, count, fp2);
} while (count == BUF_SIZE);
fclose(fp1);
fclose(fp2);
return 0;
}
>>686 Q.13と Q.13の残り
#include <stdio.h>
#define A1 20
#define A2 30
int add(int, int);
void mult2(int*, int);
void TelDataGet(char*);
main(void)
{
int a1 = A1;
int a2 = A2;
int add1, mult;
char acTelData[15];
TelDataGet(acTelData);
printf("TelNo=%s\n", acTelData);
add1 = add(a1, a2);
printf("%dと%dの和は%d\n", a2, a1, add1);
mult2(&mult, add1);
printf("%dの2倍は%d\n", add1, mult);
return 0;
}
int add(int a1, int a2)
{ return a1 + a2; }
void mult2(int *ma, int m1)
{ *ma = m1 * 2; }
void TelDataGet(char* tel)
{ tel[0] = '1'; tel[1] = '\0'; }
730 :
デフォルトの名無しさん :2009/02/18(水) 03:12:42
>>730 /* 空白の表示 */
for (loop=0;loop<week;loop++) {
// printf(" ") ;
printf(" ") ;
}
[1] 実践プログラミング2 [2] 問題文 C言語を用いたWindowsプログラミング課題 長方形の左上の頂点の座標(x1,y1) および右下の頂点の座標(x2,y2)の二点を与えたときに、 その長方形に外接する長方形を描画するプログラムを作成せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ:gcc(講義ではVisualStudio2008使用) [3.3] 言語:C [4] 2009年2月22日24:00まで [5] その他の制限: ウィンドウの大きさは自由、背景は白ということ以外は特に制限ありません。 何卒、よろしくお願いします。
横縦がそれぞれx軸y軸に平行な長方形じゃねぇの?とエスパー
適当に長方形を回転させながら外接させるのかね
741 :
738 :2009/02/18(水) 23:40:08
いやさ、作る長方形どころか基準となる長方形すらx軸平行とかじゃない可能性すらあるってこと。
そこは最大限好意的にRECT構造体と判断してやろうぜ
>>739 は出来た子や
743 :
デフォルトの名無しさん :2009/02/19(木) 01:31:37
744 :
737 :2009/02/19(木) 01:37:12
皆様ありがとうございます。混乱を招いてしまい申し訳ありません 長方形はx軸並行のものです。長方形の回転はありません。 講師に楕円は一意には定まりませんという質問を送ったのですが 「外接している楕円の中でx軸に平行な辺が長辺・・・ などの縛りを加えて、とにかく長方形に外接する楕円をひとつ描画していればよい」 という条件で解答してよいとのことでした。 長方形につきましてはスキャナ等が無く、図をあげられなかったので説明不足となってしまい、申し訳ありませんでした。 引き続き解答いただけましたら幸いです。 よろしくおねがいします。
楕円…?
長方形に外接する長方形だったらそのままでいいもんね。
mapmodeをANISOTROPICにして円を描けばいいのかね
748 :
737 :2009/02/19(木) 02:36:37
今さら問題文を書き間違えていたことに気が付きました。 特にすでに解答を考えてくださっていた方々、本当に申し訳ありませんでした。 以下が正しい問題文になります [1] 実践プログラミング2 [2] 問題文 C言語を用いたWindowsプログラミング課題 長方形の左上の頂点の座標(x1,y1) および右下の頂点の座標(x2,y2)の二点を与えたときに、 その長方形に外接する「楕円」を描画するプログラムを作成せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ:gcc(講義ではVisualStudio2008使用) [3.3] 言語:C [4] 2009年2月22日24:00まで [5] その他の制限: ウィンドウの大きさは自由、背景は白ということ以外は特に制限ありません。 本当に申し訳ありませんでした。 解答いただける方々、どうかよろしくお願いします。
751 :
749 :2009/02/19(木) 02:46:36
753 :
emi :2009/02/19(木) 03:09:43
javascriptやPHPの宿題掲示板はありますか? あったとして答えてくださるような方は おられるのでしょうか… (知識レベルではなくて、 スレを随時チェックしておられるのかということです。)
if( e[0] != 1000 ){ if( e[1] != 1000 ){ if( e[2] != 1000 ){ break; } else{ e[2] = 230; q[2] = m+8; } } else{ e[1] = 230; q[1] = m+8; } } else{ e[0] = 230; q[0] = m+8; } を簡単にfor文にすることはできるでしょうか?
for(i=0; i<3; i++) if(e[i]==1000) break; if(i < 3) e[i] = 230, q[i] = m + 8;
for(i=0; i<3; i++) if(e[i]==1000) {e[i] = 230, q[i] = m + 8; break;}
>>755 for ( i = 0; i <= 2; i++) {
if ( e[ i ] == 1000) {
e[ i ] = 230;
q[ i ] = m + 8;
}
}
break;
break;があるから前後に while(1) { // } でもあるのかと思ってね
>>760 それでも、元 break に流れる条件と異なるぜ?
if( e[0] == 1000 ) {e[0] = 230; q[0] = m+8;} else if( e[1] == 1000 ) {e[1] = 230; q[1] = m+8;} else if( e[2] == 1000 ) {e[2] = 230; q[2] = m+8;} else break; と書き直せば、 for(i=0;i<3;i++) if(e[i] == 1000) {e[i] = 230; q[i] = m+8;} break; どっか、違ってるかな?
>>763 分かったから、おとなしくIF文勉強し直してこいや、な?
breakの外のループから全部書いてもらわんとわからんわ
767 :
763 :2009/02/19(木) 17:53:54
>>764 人違い。この問題初投稿。
>>763 ホントだあほだった。
for(i=0;i<3;i++) if(e[i] == 1000) {e[i] = 230; q[i] = m+8; break;}
if(i==3) break;
これでどう?
if( e[0] == 1000 ) {e[0] = 230; q[0] = m+8;} else if( e[1] == 1000 ) {e[1] = 230; q[1] = m+8;} else if( e[2] == 1000 ) {e[2] = 230; q[2] = m+8;} else break; と書き直す。
770 :
755 :2009/02/19(木) 20:50:16
772 :
デフォルトの名無しさん :2009/02/20(金) 05:13:14
[1] 授業単元:ポインタ [2] 問題文(含コード&リンク): 二つの変数を入力し、その四則演算の結果を表示するプログラムex6_5を作成せよ。 プログラムの仕様は以下の通り。 ・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, /* 変数1の値 */ int 変数2, /* 変数2の値 */ int *足し算結果格納先, /* 足し算結果格納先のアドレス */ int *引き算結果格納先, /* 引き算結果格納先のアドレス */ int *掛け算結果格納先, /* 掛け算結果格納先のアドレス */ int *割り算結果格納先 /* 割り算結果格納先のアドレス */ ); 返却値: 0:正常終了 -1:エラー(ゼロ除算が発生する場合) ・ゼロ除算がある時には、割り算以外の結果は表示し、割り算結果はエラーが ある旨の表示を行う [3] 環境 [3.1] OS:windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限: なるべく早く。 お願いします。
774 :
デフォルトの名無しさん :2009/02/20(金) 11:28:10
<<773 ありがとう。
775 :
748 :2009/02/20(金) 15:43:39
>>771 様
迅速な解答どうもありがとうございました。
動作確認のためコンパイルしたところ、以下のエラーが出て実行できませんでした。
エラー 1 error C2440: '初期化中' : 'const char [11]' から 'TCHAR [100]' に変換できません。 c:\users\media\desktop\drawrect\drawrect.cpp 17行目
エラー 2 error C2440: '初期化中' : 'const char [9]' から 'TCHAR [100]' に変換できません。18行目
エラー 3 error C2731: 'WinMain' : 関数はオーバーロードできません。34行目
エラー 4 error C2664: 'CreateDialogParamA' : 2 番目の引数を 'LPWSTR' から 'LPCSTR' に変換できません。(新しい機能 ; ヘルプを参照) 161行目
可能でしたら、対応のほどよろしくお願いいたします。
全くソースも見てないけど文字列の扱いが悪い予感。 文字列をTEXT()でかこってみな
>>775 プロジェクトはWin32。誤ってプロジェクトをWin32コンソールにしてないか。
>>771 期待はしないほうがいいけど。
>>775 DrawRevt.cppの先頭に
#undef UNICODE
追加したら
779 :
777 :2009/02/20(金) 18:07:32
プロジェクト→プロパティ 構成プロパティ→全般→プロジェクトの既定値→文字セット→マルチバイト文字セットを使用する
>>771 円しか考え付かなかった。
Rectangle(hdc,lx,ly,rx,ry);
/*
int dx,dy;
dx = (rx - lx)/4;
dy = (ry - ly)/4;
lx -= dx;
rx += dx;
ly -= dy;
ry += dy;
if(lx > 0 && ly > 0)
Ellipse(hdc,lx,ly,rx,ry);
*/
double cx, cy, cr;
cx = lx + (rx - lx)/2; // 中心点のX座標
cy = ly + (ry - ly)/2; // 中心点のY座標
cr = sqrt((cx - lx)*(cx - lx) + (cy - ly)*(cy - ly));
Ellipse(hdc, (int)(cx - cr), (int)(cy - cr),
(int)(cx + cr), (int)(cy + cr));
781 :
777 :2009/02/21(土) 01:36:18
明日暇だから俺も修正してみるかな さすがに楕円一個じゃ寂しいだろう
長方形に外接する楕円って無限じゃないの?
いや、無限にあるな。
>>686 です
皆様のおかげで卒業できそうでございます。
ありがとうございました。
無事に第2新卒になれます。
787 :
749 :2009/02/21(土) 15:06:39
788 :
◆r7Y88Tobf2 :2009/02/21(土) 15:08:21
[1] 授業単元:プログラム設計 [2] 問題文(含コード&リンク): 1.0~100までの乱数axとayを作成し、これを点(ax,ay)とする。この点は、図の四角形の内部にある。 2.点(ax,ay)から点(50,50)までの距離を求める。 3.「2」で求めた距離が50未満であれば円の内側、50以上であれば円の外側とする。 4.「1」~「3」を繰り返す。 「1」~「4」を行い、円の内側になる点の数をn1、円の外側にある点の数をn2とするとき、n1+n2は点の総数となる。 四角形の面積は10000であり、円の面積は2500πである。 円の面積と点の数には関係があることから、数多くの点で試行することで、円周率πを求めることができる。 小数点以下6桁程度までの精度でπを求めること。小数点以下6桁程度の精度を持つ場合、小数点以下7桁目の数は変化しなくなるはずである。 ※乱数はrand関数を使う。可能であれば、srand関数による乱数シードの設定も行うこと。 ※小数点以下切り捨てを行うにはfloor関数を使う。 [3] 環境 [3.1] OS:Linux [3.3] 言語: c言語 [4] 期限: 2009年2月25日まで [5] その他の制限:この問題文の内容を守りさえすれば大丈夫だと思います。 授業の再レポートなのですが、わからなくて苦戦しております。皆さんの力を貸してください。
789 :
◆r7Y88Tobf2 :2009/02/21(土) 15:11:28
モンテカルロ法の基礎の基礎だね 普通は計算量的に原点と四分円でやるんだけど んで、「手伝うな」って宿題を手伝うのはOKだっけ?
>>790 > んで、「手伝うな」って宿題を手伝うのはOKだっけ?
基本的に、このスレの目的は一番バカな質問を受けつけることと、
他人の学習機会を妨害して、ボウフラの如き自称技術者を量産することだら、
いいんじゃねーの?
やってみたけど、なんか3.06位で収束してしまった どこか間違えたかなぁ
788です。携帯からですみません。 手伝うなと課題を丸投げすることを不快にさせてすみません。 モンテカルロ法についてですが、似たようなプログラムをいくつか見たのですが、どのプログラムも関数などが違っていてわからないことがありました。 よろしくお願いします
rand() % 101とかrand() / (RAND_MAX + 1.0) * 101とかにしてない?
いや、乱数はboostのライブラリ使って uniform_int<> dst(0, 100)ってやってたんだけど…まあ、いいかw
そのライブラリはわからないけど、100が出る確率が他の数字と同じならずれるよ。
ああ、そういえばそうですね。 ありがとう!
>>788 試行回数 nTryTimes を億のオーダーで試してみたけど5桁以降は結構ばらける
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char* argv[])
{
const int nTryTimes = 10000000;
int n1 = 0;
int n2 = 0;
//乱数の種をUNIX時刻で初期化
srand( time(NULL) );
int i;
for( i = 0; i < nTryTimes; ++i )
{
double dAx = 50.0 - ( ((double)rand() / (double)RAND_MAX) * 100.0);
double dAy = 50.0 - ( ((double)rand() / (double)RAND_MAX) * 100.0);
if( (dAx * dAx + dAy * dAy) < 2500.0 ){
++n1;
}else{
++n2;
}
}
printf("PI = %lf\n", ((double)n1/(double)(n1 + n2))*4.0);
return 0;
}
なんでnTryTimesで割らないでn1+n2で割ってるの?
確かにそうだwww
そのくらい良いじゃないか…
まぁその方がユニークで真似したと思われないということか 教官がスレを見てたらアウトだが
788です。 わかりやすいプログラムをありがとうございました。 ただいま、Linaxで起動させてみたところ、確認できました。 本当にありがとうございました。 あとは教官がこのスレを見ていないことを祈りますww
805 :
748 :2009/02/21(土) 18:01:07
>>771 様
>>777 様
ただ今無事動作確認しました。
自分ではどうしても外接楕円の求め方すら分かりませんでした。
回答および修正・アドバイス等ありがとうございました!
6桁程度の精度、とかあるからε-δを使った方が良いんじゃない?
ε-δって言ってみたかっただけか?使い慣れない言葉は良くないぞ。 1回の試行で変動する幅はその時点の試行回数の逆数に大体一致するから 6桁精度=変動量が10^-6以下=100万回の試行でOKだな ただし確度の保証はないが
n個の頂点を持つ多角形が、平面座標上にあるときの面積を求める プログラムを教えてください。 多角形の各頂点の座標は、右回りに(x0,y0),(x1,y1)…(xn-2,yn-2), (xn-1,yn-1)とする。 コードは簡単なもので構わないです。 お手数おかけしますが、何卒よろしくお願いいたします。
>>809 失礼いたしました。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
n個の頂点を持つ多角形が、平面座標上にあるときの面積を求める
プログラムを教えてください。
多角形の各頂点の座標は、右回りに(x0,y0),(x1,y1)…(xn-2,yn-2),
(xn-1,yn-1)とする。
[3] 環境
[3.1] OS: (Windows/Linux/等々) :Windows XP
[3.2] コンパイラ名とバージョン: -
[3.3] 言語: C
[4] 期限:来週中までに教えて貰えれば結構です。
[5] その他の制限: C言語並びにプログラミングを勉強し始めてまだ間もないので、
お力をお貸しください。
コンパイラについては、残念ながら普段は自宅のPCではなく、会社のPCで作業をしている為、
詳しい事がわかりません。
お手数お掛け致しますが、何卒よろしくお願いいたします。
>>810 そんなんで給料くれるんならオレと変わってくれよ
#include<stdio.h>
#define n 3
typedef struct tag_vector_t{double x, y;}vector_t;
vector_t vector_sub(vector_t a, vector_t b){
vector_t c;
c.x=a.x-b.x;
c.y=a.y-b.y;
return c;
}
double triangle(vector_t a, vector_t b){
return 0.0; // ここは自分で考えてね
}
int main(void){
vector_t point[n], a, b;
double result=0.0;
int i;
for(i=0;i+2<n;i++){
a=vector_sub(point[i+1], point[0]);
b=vector_sub(point[i+2], point[0]);
result+=triangle(a, b);
}
printf("%f\n", result);
return 0;
}
>>810 去年のスパコンの問題に類題があったな
ピックの定理を使う奴
#include <stdio.h> #include <stdlib.h> int main(void) { int i,j; double x[64],y[64],S=0.0; char buf[32]; FILE *fp; fp=fopen("coordinates.dat","r"); if(fp==NULL) { fprintf(stderr,"File open error.\n"); exit(1); } for(i=0;fgets(buf,32,fp);i++) { sscanf(buf,"%lf %lf",&x[i+1],&y[i+1]); } x[0]=x[i]; x[i+1]=x[1]; for(j=1;j<=i;j++) S+=(x[j-1]-x[j+1])*y[j]; printf("%lf\n",-0.5*S); fclose(fp); return 0; }
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8919.txt [3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2月23日中(できれば15時前までにお願いします。可能なら今日中に)
[5] その他の制限:
使用関数などの制限はありませんが、自分で理解してからの提出にしたいため、
なるべく簡単な手法で問題のアルゴリズムを実現しているプログラムにしてください。
プログラムの構造が冗長気味になっていても構いませんので、
if文とかfor文とか程度を複数使う感じだと助かります
問題文の各問題の※以降はプログラム自体には関係ないですが、
どういった結果になりそうかを教えてくださるとありがたいです
[1] 授業単元: プログラミング言語Ⅲ [2] 問題文(含コード&リンク): 次の記述を呼んで①~④の記述の妥当性について簡単に記述せよ システムに1つのカウンタ回路とカウントパルスを送り込むポートが用意されていて プログラムによりパルスのon/offを制御する仕組みになっている。 なお、マルチタスクOS上で複数のタスクと割り込み処理がこのカウンタを 制御する必要があるため、このカウンタへのパルスを発生するための関数を作ろうと思う。 ①この関数は再帰可能な記述にする必要がある ②この関数は再入可能な記述にする必要がある ③この関数はセマフォによる資源管理を行う必要がある。 ④この関数は割り込み禁止にする必要がある [3] 環境 [3.1] OS:Windows [3.3] 言語: C よろしくおねがいします
①がよく分かんない。 誰か優しく解説して。
①は無関係、が答えだろ
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 以下の問いに答えよ 同じ変数に異なる型名によるアクセスを可能にする仕組みをなんと呼ぶか? [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2月25日 学期末のレポート問題です。よろしくお願いします。
>>816 ありがとうございます。
残りの機能誰かできませんか??よろしくおねがいします。
822 :
816 :2009/02/23(月) 02:18:35
>>820 キャストのこと?
変数のオーバーロードは基本的にできないし。Cでは。
それともグローバル変数に対するローカル変数のことかな。
意味不明すぎる。
>>820 問題文の意味が分からない
共用体のことかな?
キャストかなあ。 型名によるアクセスっていうとなんか違う気もするが。
>>826 に書くの忘れたが、そのプログラムはディスク負荷が高めなので気をつけてくれ。
828 :
749 :2009/02/23(月) 08:34:58
>>749 課題1は何とか終わりましたので、課題2をどなたかよろしくお願いします。
829 :
816 :2009/02/23(月) 10:05:50
>>816 >>826 皆さんどうもありがとうございます。
マジで助かります。
自分の非力さを改めて痛感しました(^_^;)
832 :
817 :2009/02/23(月) 22:40:15
ごめんなさいまちがえました 817様じゃなく820です すいません
共用体なんじゃね?と思ったが、時すでに遅し
835 :
820 :2009/02/23(月) 23:36:28
>>834 様
ありがとうございます
ありがたいです
836 :
817 :2009/02/23(月) 23:37:36
[1] 授業単元: プログラミング言語Ⅲ [2] 問題文(含コード&リンク): 次の記述を呼んで①~④の記述の妥当性について簡単に記述せよ システムに1つのカウンタ回路とカウントパルスを送り込むポートが用意されていて プログラムによりパルスのon/offを制御する仕組みになっている。 なお、マルチタスクOS上で複数のタスクと割り込み処理がこのカウンタを 制御する必要があるため、このカウンタへのパルスを発生するための関数を作ろうと思う。 ①この関数は再帰可能な記述にする必要がある ②この関数は再入可能な記述にする必要がある ③この関数はセマフォによる資源管理を行う必要がある。 ④この関数は割り込み禁止にする必要がある [3] 環境 [3.1] OS:Windows [3.3] 言語: C どなたか助けてください おねがいします
>>836 自信なし。というかこれCの質問か?
カウンタの制御っていうのが具体的に何を指すのか曖昧だけど
①(゚Д゚)ハア?
②カウンタ読み出しは同時に出来る必要があるから再入可能であるべきだけど、
ここで作るのはカウントアップの関数なので、再入可能であってはいけないというか、不可能
③ここで考えてるポートは1つだろうから、同時アクセスができないので資源管理が必要。
セマフォの資源数が1ならOK。ただそれミューテックスじゃねとは思う。
④他人が使ってるポートを横取りは出来ないので割り込み禁止の必要がある。
838 :
836 :2009/02/24(火) 00:29:15
>>837 こんなに早く解答してくださって感謝の言葉もありません。
本当にありがとうございます
>>というかこれCの質問か?
c言語の授業の問題なんです・・・・・
839 :
デフォルトの名無しさん :2009/02/24(火) 01:01:10
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 振り子の運動方程式 y''+w^2*siny=0 w=(g/l)^1/2 はyが小さい時 y''+w^2*y=0 と近似でき この解はt=0のとき y=0,y'=0という条件でy=acos(wt)となり周期はT=2π/w 振り子の運動についてt=0からt=Tまで100等分し、それぞれの点に関して時刻t及び、 y=acos(wt)で計算した値と上記の近似していない微分方程式を ルゲン・クッタ法で計算した値の両方を標準出力へ出力するプログラムを作成せよ。 ここで、振り子の長さl、質量m、及びt=0のときのyの大きさは、 プログラム冒頭で#define指令によってマクロ名によってプログラム中での値を与えるようにせよ。 また、それぞれの値は、1.0(m)、1.0(kg)、及び3.14/4.0(rad)とせよ。 [3] 環境 [3.1] OS:Windows [3.3] 言語: C 丸投げですみません 返答してもらえると非常に助かります。
ルゲン・クッタ… それいつまでにやればいいの?
情報の課題で必ずといっていいほど出るけど ルンゲクッタってそんなに良いアルゴリズムなん?
>>841 ニュートン法の効率知ってる?
違うことやってはいるが、精度的にルンゲクッタ(4次)は上をいくのよ。
ルンゲクッタ10次くらいで、アポロ11号とか飛ばしてたってきいたけど
おれはユッケビビンバの方が好きだな
こういう、H=T+Vがまんま保存するような系では 明らかに良くないアルゴリズムだけどな 精度も悪いし時間もかかる
846 :
デフォルトの名無しさん :2009/02/24(火) 09:58:23
>>840 金曜までなんで早めにやってもらえると助かりますLOL
>>810 です。
遅くなりましたが、
>>811-813 の先生方多謝であります。
ただ、いくつか補足でお願いしたいことがあります。
まず、問題の多角形の面積を求めるコードですが難しいコードを使わず、多角形に補助線を引き、台形に何個か分けて面積を求め、その後に余白分の面積を求め最初に求めた面積から引いて、元の多角形の面積を求めるといったコードを「式と演算」を使って書きたいのです。
現時点で僕はまだCの基本と、入出力、式と演算くらいしか学べてないのでその範囲で出来る内容でお願いします。
もし、厳しいようなら、出来ない範囲は個人的に勉強するのでソースだけでも参考にさせてください。
宜しくお願いします。
あ、忘れてましたがコンパイラはどうやら MSC Ver.5.1でした。 あと上に書いた文章、 携帯からだったのでとても見づらいと思いますが 宜しくです。
850 :
849 :2009/02/24(火) 11:39:03
間違えた。 31行目 ×: for(i = 0; i < count; i++) ○: for(i = 1; i < count; i++)
852 :
849 :2009/02/24(火) 14:26:28
853 :
849 :2009/02/24(火) 14:35:49
>>851 入力
1 550 200 100 3
出力
3 0
ってなる。
856 :
デフォルトの名無しさん :2009/02/24(火) 19:18:10
[1] 授業単元:卒研
[2] 問題文:マルチスレッドによる並列処理に対応したプログラムを書きます
内容は二次元配列を平面空間に見立てての磁界計算です
[3] 環境
[3.1] OS:winXP
[3.2] VC2008 or 2005
[3.3] C++
[4] 2009年2月26日までに(できれば早い方が好ましいです)
[5] その他の制限: 自力で進めたのがあるのでできればそれに手を加える形にしてもらいたいです
自力でやったのはある程度形になってるのですが、実行するとエラーがでます
磁界の計算式は例えば、A点を測りたい場合はその四方の点の磁力を足して平均にするといった感じです
自力でやったソースはこれです
ttp://www1.axfc.net/uploader/He/so/199245.zip もう何がいけないのかわかりません
よろしくお願いします
ファイルのパスを忘れてました orz パスはworkです
>>863 ググってもあまり違いがわからなかったので・・・
えと、磁界を計算する回数が多いので計算する領域を分けて分散させてやりたいんです
ある程度、自分の中でどうして欲しいか固まったので
改めて書き直します
[1]プログラム
[2]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8929.txt [3]OS:XP
MSC Ver.5.1
言語:C言語
[4]期限:できれば今週中
[5]その他
うpろだにうpしたのが僕が書いたソースなんですが、このソースは5~22行の部分で
多角形ABCDEの座標を入力させ、その後台形の公式(上底+下底*高さ/2)を使い、
多角形ABCDEの面積を求めるといった感じでコードを書きたいと思ってます。
座標を入力させる部分までは何とか自力で出来たんですが、式を使って面積を求める
段階で詰んでしまってます;;
早く会社の教育係を唸らせてやりたいので、どなたかお力お貸しください
お願いします
なにした。
>>855 じゃないけど、
ウチではエラー出ないよ。
>>865 #include <stdio.h>
int main(void)
{
double x1,x2,x3,x4,x5;
double y1,y2,y3,y4,y5;
double S;
printf("多角形ABCDEの面積を求めます。\n");
printf("各頂点の座標を入力して下さい。\n");
printf("例 5,1 のように,(カンマ)を付けて入力すること。\n\n"); /*コンマを区切り文字にすると面倒だからパス*/
scanf("%lf %lf", &x1 ,&y1);
scanf("%lf %lf", &x2 ,&y2);
scanf("%lf %lf", &x3 ,&y3);
scanf("%lf %lf", &x4 ,&y4);
scanf("%lf %lf", &x5 ,&y5);
printf("\nAの座標x1 (%lf),y1 (%lf)が入力されました。", x1, y1);
printf("\nBの座標x2 (%lf),y2 (%lf)が入力されました。", x2, y2);
printf("\nCの座標x3 (%lf),y3 (%lf)が入力されました。", x3, y3);
printf("\nDの座標x4 (%lf),y4 (%lf)が入力されました。", x4, y4);
printf("\nEの座標x5 (%lf),y5 (%lf)が入力されました。", x5, y5);
S = (x1-x2)*(y1+y2)/2.0+(x2-x3)*(y2+y3)/2.0+(x3-x4)*(y3+y4)/2.0+(x4-x5)*(y4+y5)/2.0+(x5-x1)*(y5+y1)/2.0;
printf("\n\n 多角形ABCDEの面積は %lf です。\n", -S);
return 0;
}
>>865 そんな書式指定子使ってる段階で溜め息だよ
>>869 ありがとう先生!
先生のソースをこれから参考に頑張りたいと思います。
本当にありがとう。
>>870 そう言わないで下さい…
僕だって現時点のソースが最適だとは露とも思ってません。
とりあえず、一朝一石で言語マスターするということは考えず、
今は多くの本を読み、ソースをみて勉強することが一番なんじゃないかって思ってます。
>>839 http://pc-physics.com/rk1.html http://homepage1.nifty.com/gfk/furiko.htm 重要な、比較対照となる近似値は無い。
#include <stdio.h>
#include <math.h>
#define T 20.0 //計測時間(秒)
#define G 1.0 //重り(kg)
#define L 1.0 //紐長さ(m)
#define S 3.1415926/4.0 //角度(rad)初期値
double f1(double t,double x,double v);
double f2(double t,double x,double v);
--中略--
x=S; //位置の初期値
v=0.0; //速度の初期値
dt=T/100.; //刻み幅
tmax=T; //繰り返し最大回数
--中略--
double f1(double t,double x,double v){return v;}
double f2(double t,double x,double v){return (-G/L*sin(x));}
[1] 授業単元:プログラミング言語Ⅱ
[2] 問題文
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8932.txt Ⅰ、このプログラムは、起動時に指定された2つのテキストファイルを
比較して、違う行があればその行番号を表示するプログラムです。
①~⑤を埋めてプログラムを完成させなさい。
Ⅱ、ⅠのプログラムにおいてFunc_read関数はstrcmpを使用して
読み込んだ2つのレコードが同じかどうか判断しています。
これをmemcmpを利用したロジックに作り直せ。
[3.1] OS:Windows
[3.3] 言語:C
[4] 期限:2月26日まで
ソースコード長くてすみません
どうかよろしくお願いします
>>875 FILE *Fp2/*①*/;
nrtn = Func_open(argv[2]/*②*/,2);
fclose(Fp1/*③*/);
printf("<%s>エラー:%s",szfname,strerror(errno/*④*/));
if(nrtn!=0/*⑤*/)
あとmain( )関数本体の ; は削除ね
///関数宣言
int main(int argc,char *argv[]);
もいらないだろ
877 :
デフォルトの名無しさん :2009/02/25(水) 12:47:07
>>877 for(i = a;i < 5;){
i = a + i++;
これはひどい
i = aで初期化する意味がなくなってるし
未定義動作やってるし
配列というのを使うといいよ
double x[ 5 ] ,y[ 5 ];
>>875 72行目の
> if(prtn1==NULL||prtn2==NULL)
この条件式だと例えば
[ファイル1]
a
[EOF]
[ファイル2]
a
1
[EOF]
の比較をした時、誤認するんじゃね?
>>878 早めなご指摘ありがとうございます。
なるほど、配列ですか
その選択は思いつきませんでした・・・まだ勉強してない項目だったのもあって
これから勉強してみます!
>>879 コードありがとうございます。
ですが、式が若干変換されてて、うpしたソースの計算式と
計算結果が合いませんでした;;
んー配列時の演算コードについて勉強する必要があるようです
ちょっと勉強してもう一度トライしてみます
>>881 もしかして計算結果の正負が逆な感じ?
だとすれば絶対値を取れば大丈夫かも。
#include <math.h>を追加して
S += fabs((x[i % 5] - x[(i + 1) % 5]) * (y[i % 5] + y[(i + 1) % 5]) / 2.0);
に修正するとか。
>>882 いえ、どうやらそうではないようです
S = (x4-x5)*(y4+y5)/2.0+(x5-x1)*(y5+y1)/2.0+(x1-x2)*(y1+y2)/2.0
+(x2-x3)*(y2+y3)/2.0+(x3-x4)*(y3+y4)/2.0
という計算式を、
>>879 先生のコードで表したかったのですが、
式もスリム化されておりそれが原因なんじゃないかと・・
ちなみにS = (x4-x5)*(y4+y5)/2.0+(x5-x1)*(y5+y1)/2.0+
(x1-x2)*(y1+y2)/2.0+(x2-x3)*(y2+y3)/2.0+(x3-x4)*(y3+y4)/2.0
の式と、S+=fabs((x[i % 5]-x[(i+1)%5])*(y[i%5]+y[(i+1)%5])/2.0);は
同一の結果になるんでしょうか?
違うね、 S -= 。
885 :
884 :2009/02/25(水) 16:35:53
>>839 printf( "%f\t%f\t%f\n",t,x,S*cos(sqrt(G/L)*t));
>>884 出来ました
S -=ではなく、S =で記述してみたら式と結果が合致しました
まぐれかもしれませんが;;
>>869 の ↓ の式ってどういう風に面積を求めようとしてるの?
S = (x4-x5)*(y4+y5)/2.0+(x5-x1)*(y5+y1)/2.0+
(x1-x2)*(y1+y2)/2.0+(x2-x3)*(y2+y3)/2.0+(x3-x4)*(y3+y4)/2.0
>>888 こんな便利な公式があるなんて知りませんでした。
ご回答ありがとうございます。
890 :
875 :2009/02/25(水) 21:06:15
>>890 >if(prtn1==NULL||prtn2==NULL)
ここ本当に||?
&&じゃない?
893 :
890 :2009/02/25(水) 22:29:22
>>891 様
if(prtn1==NULL||prtn2==NULL)
となっています。
&&ではありません。
>>893 >nrtn = strcmp(szdat1,szdat2);
を
nrtn = memcmp(szdat1,szdat2,strlen(szdat1));
にしたらいけるはず
長さが違うファイルなのに、一致と判定するのか・・・
いけません
>>895 return(9)ってやってるのに、mainで対応してないのが悪い。
>>895 それを言うと一行に81字以上あると
動作がおかしくなるからな
そう言うプログラムだと思うしかない
899 :
749 :2009/02/26(木) 02:20:50
>>890 nrtn = strcmp(szdat1,szdat2);
を
if(strlen(szdat1) == strlen(szdat2))
nrtn = memcmp(szdat1,szdat2,strlen(szdat1));
else
ntrn = 100; /* 0以外の適当な値 */
に変えたらどうでしょ?
903 :
902 :2009/02/26(木) 10:18:12
凡ミス
>>901 // nrtn = strcmp(szdat1,szdat2);
if((nrtn=strlen(szdat1))==strlen(szdat2))
nrtn = memcmp(szdat1,szdat2,nrtn);
904 :
901 :2009/02/26(木) 11:13:53
>>902-903 ん?俺に言ってた?
俺は別にファイルの行数について言及してないよ。
strcmpをmemcmpに変えるとこを書いただけ。
907 :
902 :2009/02/26(木) 12:07:08
元要求が
>>875 だからな…
完全一致のファイルから、末尾に余計な行を追加しても ”同じ内容でした” と返す仕様だしね
909 :
デフォルトの名無しさん :2009/02/26(木) 14:31:04
コンパイラ通すとこんなエラーが出るんですが どう対処すればいいんですかね? Objaect Modules [.OBJ]:c- + Objaect Modules [.OBJ]:"sortbb.obj" /farcall Run File[c-.exe]:"c-.exe" /noi List File [NUL.MAP]: NUL Libraries [.LIB]: Definitions File [NUL.DEF] LINK : fatal error L1093: c-.obj : object not found
>>839 重力が抜けてた。
#define G 9.8
914 :
913 :2009/02/27(金) 01:53:24
[1] 授業単元: プログラミング言語Ⅳ [2] 問題文(含コード&リンク): 次の記述をよく読み、①~④で配列が得られる領域を説明し、それぞれの方法の 有効性や問題点について簡単に記述せよ。 マルチタスク環境のあるタスクで、プログラムの1時的な処理のために 大きな配列が必要になった。 ①配列を関数内で宣言して自動変数にする ②配列を関数内で宣言してstatic変数にする ③配列を関数外で宣言してグローバル変数にする ④malloc()関数を使って配列の領域を確保する [3.1] OS: Windows [3.3] 言語: c言語 [4] 期限: 2/28日18:00までにメールにて提出 よろしくおねがいいたします
マルチスレッドのことじゃないのか?? マルチスレッドっていう前提なら、 1、複数同時呼び出しで変数が競合することはないがメモリをその分食う。確保する領域は使用する大きさの中で知りうる最大を設定しないと目的を果たせない。 2、複数同時呼び出しをした時点で動作は未定義になり配列もめちゃくちゃになってしまう。 3、グローバルにすることを悪とする見方もある。2と同様に複数同時呼び出しした際に未定義の動作をする。 4、メモリを保持するポインタがstaticでないなら、1と同様だが、開放忘れがあると不具合の呼び水になる。その代わり可変長配列を実現できて時と場合によっては最良の解だと言える。
確保される領域についても書いておいた方が良いんじゃないかね
1. プログラム(スレッド)のスタックに、関数に入って宣言された時点で確保
2. プログラムの静的変数領域(ヒープの下)に、プログラム開始時に確保
3. 2. と同じ
4. ヒープ領域に、mallocを呼んだ時点で確保。
あと、C99だと配列の動的な確保が可能だから
>>916 の1は当てはまらない。制限多いけどな。他に
・スレッドの場合、スタックはスレッドごとに確保される。自動変数があまりでかいとスタックからはみ出てエラーになる可能性も
・mallocは他の変数確保に比べて確保にとてもとても時間がかかるのでほんの一時データをおくだけなら不向きかも
・マルチスレッドなら、staticやグローバルに値をいれるときにはクリティカルセクションになるので排他制御を行う必要がある
とでもかいとけ
たまにはメガネピッツァでも食べてみろ、な?美味しいぞ?
実際、2ch(匿名)で件の文章だけ見たら、「馬鹿なこと言ってら、こいつ」って思う内容でしょ? 本人に高いスキルがあっていろんな功績、貢献がある人物でも、個々の言動の評価はまた別。 ちなみに無知であること自体を非難するつもりは毛頭無いです。さすがに私もそこまで愚かじゃありません。 たぶん、malloc/reallocだけでの動的メモリ管理云々の文章を読んだことがあるということはその人のブログなりなんなりを見たことがあるんだと思うけど。
[1] 授業単元: プログラミング言語
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8939.cpp 授業の最終課題で簡単なゲームを作成しています
そこで自作の迷路プログラム(上文のtxt)に取り組んでいて、途中である◎を拾ってゴールしたいんですが
今のままだと◎を拾わなくても普通にゴール出来てしまいます
1.◎を拾った事をそのマスに着いたときに判定するプログラム
2.ゴールの際に◎を拾っていないでマスに到達したら「まだ拾ってません」と表示しゴールさせないプログラム
この2つがどうしてもプログラム上に組めなくて困っています
どなたかアドバイスお願いします
[3] 環境
[3.1] OS:Windows
[3.3] 言語: C
[4] 2009年3月2日までに
[5] その他の制限:
できれば上のtxtに手を加える形にしてもらいたいです
大学内でしかコマンドプロンプト、テラパッドを使用することができないので
作業は平日しかできません
>>920 フラグを一つ用意
◎がある座標Xを記憶。
移動するたびに現在地がXかどうかチェック。
XならフラグをON
ゴールしたときにフラグがONになってるかどうかチェック
[1]プログラミングⅡ [2] 現在の地域時間から15時間後の日時を表示するプログラムを作成せよ。 表示形式は日付と時間が表示されれば自由とする。 [3] 環境 [3.1] OS: Windows [3.3] 言語: C [4] 期限: 今週中 [5] その他の制限: 特にありません。どなたか助けてください。 よろしくお願いします。
>>920 手を加える形にしてます。
@@ -86 +86 @@
- k = getch();
+ k = getch(); if(k == 0xE0) continue;
@@ -107 +107 @@
- if (xs == 13 && ys == 10) {
+ if (xs == 3 && ys == 7) {
@@ -108,0 +109 @@
+ printf("宝");
@@ -111 +112,6 @@
- printf("脱出おめでとう");
+ if(gameover == 0) {
+ printf("出口です");
+ printf("宝を持ち帰っていないので、まだ出られません。戻ってください");
+ } else {
+ printf("脱出おめでとう");
+ }
@@ -114 +120 @@
- } while (k != 'c' && gameover == 0);
+ } while (k != 'c' && (gameover == 0 || xs != 13 || ys != 10));
宿題は自力でやるから意味がある。 間違えを恐れるな。 間違えてても先生は怒りません。 むしろ、こんな所に頼る方が怒られますよ。
>>925 //switch(now->tm_mon){
switch(now->tm_mon+1){
//if(now->tm_mon > 12){
if(now->tm_mon >= 12){
真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ
宿題は自力でやるべきではあるが 果たして教師が10年前にそれが出来た上で出している のかどうかは一考の価値がありそう
>>923 #include <stdio.h>
#include <time.h>
int main()
{
time_t t;
time(&t);
//printf("%s", ctime(&t));
t += 15 * 60 * 60;
printf("%s", ctime(&t));
return 0;
}
934 :
933 :2009/02/27(金) 17:47:37
おまけの一行目を修正するの忘れてた・・・
>>923 時刻を連続表示
#include <stdio.h>
#include <time.h>
int main()
{
time_t t;
do {
time(&t);
// printf("%s", ctime(&t));
t += (15+13) * 60 * 60;
printf("%s", ctime(&t));
} while(sleep(1),1);
return 0;
}
time_tの表現って未規定だよな?
938 :
936 :2009/02/27(金) 21:15:07
>>936 は、gccで、void sleep(seconds);
VC++ なら #include <windows.h> が必要で、void Sleep(milliseconds);
ところで、time_t は <time.h> で定義されている。
+= が可能な型である != 定義されている
>>938 time.hの中身は環境によって違うんじゃね?
#include <stdio.h> #include <time.h> int main() { time_t time1, time2; struct tm *times; time1 = time(NULL); times = localtime(&time1); times->tm_hour += 15; time2 = mktime(times); printf("現在: %s\n", ctime(&time1)); printf("15時間後: %s\n", ctime(&time2)); return 0; }
Cでは、time_tは数値型であることが保証されてるけど、時刻と値の対応は未規定
POSIXでは、time_tはUNIX時間を表す整数
で良かったっけ
だとすると、
>>923 を標準Cの範囲で解くには
>>925 みたいにするしかないのか
925のやり方するなら閏年の判定も必要になるな
944 :
941 :2009/02/27(金) 22:59:12
心配な点が数点 ・localtimeで得られたデータを別の変数とかにコピーせずに書き換えてよかったっけ? ・範囲外の値をmktimeに与えた場合の動作は保証されてたっけ?(ex. 0時70分→1時10分)
たかが時間操作。 されど時間操作。 奥が深いな
947 :
938 :2009/02/28(土) 01:56:02
>>923 mktime() を使わない方法
#ifdef WIN32
#define compiler 1 // 1:VC++, other:gcc
#define _USE_32BIT_TIME_T // VC++ .NET or later
#endif
#include <stdio.h>
#include <time.h>
#if compiler == 1
#include <windows.h>
#endif
int main()
{
time_t t; // sizeof is 4 bytes if defined _32BIT_, 8 bytes not define _32BIT_.
do {
time(&t);
t += 15 * 60 * 60;
printf("%s", ctime(&t));
}
#if compiler == 1
while (Sleep(1000),1);
#else
while (sleep(1),1);
#endif
return 0;
}
1]プログラミングⅡ [2] ポインタの有効性について例を挙げて説明しなさい。 [3] 環境 [3.1] OS: Windows [3.3] 言語: C [4] 期限: 今日 どうかよろしくお願いします
「ポインタ 有効性」でぐぐれw
有効性ってなんだ? 何が有効なんだ?
>>950 IsBadCodePtr が 0 を返すことかな
もしくは IsBadReadPtr/IsBadWritePtr あたり
main(){ int val=0; int *ptr=&val; //val=&val; val=(int)&val; //val=static_cast<int>(&val); val=reinterpret_cast<int>(&val); return *ptr; } ポインタが有ると便利やわ~
[1] 授業単元:自主的にやっています。
[2] 問題文(含コード&リンク):最終的にはババ抜きのシミュレータを作りたくてカードを配るところでてこずっています。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8945.c [3] 環境
[3.1] OS:Windows (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: VC 6.0 gcc4.3.2 MinGw
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限:無期限
[5] その他の制限:制限ではないですがVC6.0とgcc とMinGWとで挙動が違います。
gccの結果が一番理想に近いのですが、VC6.0 とMinGWはallcard[]という配列が途中で書き換えられてしまいます。
その原因が分からず困っています。
int allcard[53] allcard[53] = 99;
いろいろひどいな
>955 99ってのはジョーカーです。 >956 恥ずかしいの覚悟で聞いています。すいません。 コンパイラによって、挙動が違うって言うことはよくあることなんですか?
コンパイラが違うからじゃなくて、Cとして間違ってるw
>958 マジスカ。 どの辺りがどうですか? 書き直して出直してきます
Numerical Recipes in Cででも勉強したんだろうか こんなソースそれくらいでしか見たことない Fortranのようだ
配列の添え字が全く理解できてない
Fortran っぽいですか..。 fortranはみたことないんですが。 >955, 960 ありがとうございました 宣言で[53]しかしてないのに[53]に代入してるのがまずかったんですね。 分かりました >955~961のみなさん。 ありがとうございました。
>962 そのようでした。 ありがとうございます。 いままでソースが冷静になって見れて無かったです。
っていうか、これ実行して動くのか?
それが動いてたんですよ。 それっぽく。 配列の値を全部+1してもらえばちゃんと思ったとおりに動きました。 やっぱ[0]も使った方がいいんですかね? 何かとこんがらがりそうになって嫌なんですが。
なんつーか、もう少し小さなプログラムで基本を勉強してからのほうが……
もう見てないかもしれないが こうするとtestいらない allcard[53]=99; for(i=1;i<=53;i++){ j=rand()%53+1; temp=allcard[i]; allcard[i]=allcard[j]; allcard[j]=temp; }
それは偏るからダメ
↑それって、毎回1枚53回のカード移動、交換だよ?
allcard[53]=99; for(i=1;i<=53;i++){ j=i + rand()%(53 - i + 1); temp=allcard[i]; allcard[i]=allcard[j]; allcard[j]=temp; } でおk
もしくは j = rand() % i + 1; でもおk
スンマソン勉強になりました φ(.. )メモメモ
Fisher-Yatesでググれば詳しくわかるよ。
>>973 じゃあ、これもお願い。メモしといて。
for (i = 1; i <= 53/N_PLAYER+1; i++)
{
printf("[%2d]", i);
ck = 0; // 毎回クリア
for (j = 1; j <= N_PLAYER; j++)
card[j][i] = 0; // 領域クリア
for (j = 1; j <= N_PLAYER; j++) // player 1~4
{
m = rand() % 53+1; // 0~52
if(test[m] != 0) //test[m] はallcard[m]が使ったかどうかのスイッチ。
{
card[j][i] = m;
printf(" %2d%c m:%2d ck:%2d|", allcard[m], (m-1)/13+'A', m, ck);
test[m] = 0;
if(i == 53/N_PLAYER+1 && j == 53%N_PLAYER) // カードを配り終わった
break;
} else {
j--;
ck++; // 毎回+1
}
}
printf("\n");
}
976 :
954 :2009/03/01(日) 06:36:49
>975 使わせてもらいます。
ほどほどに簡単な宿題来いやーーー!
>>977 1)N個のさいころをすべて同じ目がでるまで投げ続け
N個のぞろ目がでるまでの回数と、理論的には何回目までにでるかを表示するプログラムを作りなさい。
N=2の場合の出力例
4回目でぞろ目になりました。理論的には6回投げて1回でます。
2)N個のさいころを投げて、すべてのさいころで0がでるまでの回数を求めるプログラムを作りなさい。
よろしくお願いします
[1] 授業単元: 暇潰し [2] 問題文(含コード&リンク): 3^1,000,000,000,000 mod 23を計算せよ [3] 環境 [3.1] OS: 自由 [3.2] コンパイラ名とバージョン: 自由 [3.3] 言語: 自由 [4] 期限: 無期限 [5] その他の制限:プログラムを作るだけでなく、何故そのプログラムで 答えが求められるのか説明する事
>>978 1)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define N 3
int get_dice(void){
int r;
do{
r=rand();
}while(r>=(RAND_MAX-RAND_MAX%6));
return r%6;
}
int main(void){
int i, j, dice;
srand(time(NULL));
for(i=1;;i++){
dice=get_dice();
for(j=1;j<N;j++){
if(dice!=get_dice()) break;
}
if(j>=N) break;
}
printf("%d回目でぞろ目になりました。理論的には%.0f回投げて1回でます。\n", i, pow(6,N-1));
return 0;
}
2) ってどんなサイコロ使うの?
>>979 #include<stdio.h>
int main(void){
int i, j, x=3, y=1;
for(j=0;j<12;j++){
for(i=0;i<10;i++){
y=(y*x)%23;
}
x=y;
}
printf("%d\n", y);
return 0;
}
あってるかどうか不明
考え中
>>979 64bit整数とフェルマーの小定理使えば3分で出来そうな課題だが
なんか深い意味があるのか?
985 :
981 :2009/03/01(日) 23:04:16
>>981 の理由
// 3^(10^12) = (((((((((((((3^10)^10)^10)^10)^10)^10)^10)^10)^10)^10)^10)^10)
// (x^n) mod 23 = ((x^(n-1) mod 23)*x) mod 23
>>977 Cで書いたプログラムをJavaに書き換えるプログラムお願い♪
>>981 を見ると、プログラム以外の素養って大事なんだなと感じる
3^22 %23 = 1 3^(1,000,000,000,000%22) %23を計算すればよくね?
990 :
981 :2009/03/01(日) 23:36:35
検算したら間違ってたorz
#include<stdio.h> int main(void){ int i, j, x=3, y=1; for(j=0;j<12;j++){ y=1; // これが必要だった for(i=0;i<10;i++){ y=(y*x)%23; } x=y; } printf("%d\n", y); return 0; }
たぶん、3?
3^1 mod 23 = 3 3^2 mod 23 = 9 3^3 mod 23 = 4 3^4 mod 23 = 12 3^5 mod 23 = 13 3^6 mod 23 = 16 3^7 mod 23 = 2 3^8 mod 23 = 6 3^9 mod 23 = 18 3^10 mod 23 = 8 3^11 mod 23 = 1
3^12 mod 23 = 3 3^13 mod 23 = 9 3^14 mod 23 = 4 3^15 mod 23 = 12 3^16 mod 23 = 13 3^17 mod 23 = 16 3^18 mod 23 = 2 3^19 mod 23 = 6 3^20 mod 23 = 18 3^21 mod 23 = 8 3^22 mod 23 = 1 3^23 mod 23 = 3 3^24 mod 23 = 9 以後ループ
10^12 mod 11 = 1 すなわち、3^1 mod 23 でおk?
以前張ったコードの指数を long long int 対応にしてみた 基数、指数、法の値によらずO(1) (高々64bits程度では効果は薄いが) int modexp(int x, long long int n, int p) { long long int i, y = 1; for(i = 1LL << 62; i > 0; i >>= 1) { y = (y * y) % p; if(n & i) y = (y * x) % p; } return (int)y; }
力づく、無駄な繰り返しを省く考え方も必要さ。
じゃ、 printf("answer = 3\n"); ということで。
どこに計算式があるの?
ある値を処理する計算式がなければ、答えが3となるプログラム という意味にしかならんが、それはそれで answer = 3 を表示する プログラム、と解釈されるだろう・・・
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。