1 :
デフォルトの名無しさん :
2008/05/17(土) 15:37:35 BE:284013656-2BP(417)
さて、未回答の問題はどれだ?
[1] 授業単元:オペレーティングシステム論 [2] 問題文 ?簡単なシェルを作れ ?fork、exec系、wait系のシステムコール(ライブラリ関数)を利用して作る ?最低限、以下の機能を実現する 1.プロンプトを出力する 2.ユーザに端末からコマンドを入力させる 3.新しくプロセスを生成し、そのプロセスが入力されたコマンドのプログラムを実行する 4.そのコマンドの実行(子プロセス)が終了するまでシェル(親プロセス)は、プロンプトを出さずに待つ 5.1に戻る [3] 環境 OS:Windows/Linux コンパイラ:gcc 言語: C [4] 期限: 2008年5/17 実行結果もお願いします 前スレから未解答っぽいののコピペ スルーされまくってる奴があるなwww
>2次元配列変数sampleの中身を表示し、sampleの4つの値の平均値をresultの1つの値とする >プログラムを作成せよ。 > >実行例 >sample >13 36 18 54 83 12 >25 62 19 78 21 5 >41 93 87 21 87 11 >61 81 68 46 35 98 > >result >34 42 30 >69 56 58 > >この問題みなさんはできるかな? 前スレ862行け
前スレ862より #include<stdio.h> int main(void) { int sample[4][6]={{13, 36, 18, 54, 83, 12}, {25, 62, 19, 78, 21, 5}, {41, 93, 87, 21, 87, 11}, {61, 81, 68, 46, 35, 98} }; int result[2][3]={0}, i, j; puts("sample"); for(i=0;i<4;i++) { for(j=0;j<6;j++) { printf("%d ", sample[i][j]); } puts(""); } result[0][0]=(sample[0][0]+sample[1][0]+sample[2][0]+sample[3][0]) / 4; result[0][1]=(sample[0][1]+sample[1][1]+sample[2][1]+sample[3][1]) / 4; result[0][2]=(sample[0][2]+sample[1][2]+sample[2][2]+sample[3][2]) / 4; result[1][0]=(sample[0][3]+sample[1][3]+sample[2][3]+sample[3][3]) / 4; result[1][1]=(sample[0][4]+sample[1][4]+sample[2][4]+sample[3][4]) / 4; result[1][2]=(sample[0][5]+sample[1][5]+sample[2][5]+sample[3][5]) / 4; puts("\nresult"); for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("%d ", result[i][j]); } puts(""); } return 0; }
Form1.cs(13,17): error CS0118: 'CircleInsidePolygon' は '名前空間' ですが、'型' のように使用されています。
C#も含めていいんじゃないか? JavaはダメだがC#はおkでいい。
>>8 互換性ない言語をまとめるのもどうかなあ。
それに、ウルトラ過疎ってるがC#宿題スレは既にある。
C++/CLIならともかくC#はスレ違いだろうな Javaの方が似てるくらいだし
$fuga(431)[/home/user0230/]cc -o 6586 6586.c $fuga(432)[/home/user0230/]./6586 > (null): not found Oh NO!!! segmentation fault core dumped! $fuga(433)[/home/user0230/]
[1] 授業単元:情報プログラム [2] 問題文(含コード&リンク): 4つの点p1,p2,p3,p4とその座標が与えられている。 その時p1とp2を通る直線とp3とp4を通る直線の交点座標を求めるプログラムをつくれ。 2直線が平行なときはその旨を表示せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限: 今日 [5] その他の制限: おねがいします。
float p1[2] , p2[2] , p3[2] , p4[2] , p12a , p12b , p34a , p34b , p5[2]; printf("p1の座標入力\n"); scanf("%f %f",p1,p1+1); printf("p2の座標入力\n"); scanf("%f %f",p2,p2+1); printf("p3の座標入力\n"); scanf("%f %f",p3,p3+1); printf("p4の座標入力\n"); scanf("%f %f",p4,p4+1); p12a = (p2[1]-p1[1])/(p2[0]-p1[0]); p12b = (0 - p1[0]) * p12a + p1[1]; p34a = (p4[1]-p3[1])/(p4[0]-p3[0]); p34b = (0 - p3[0]) * p34a + p3[1]; p5[0] = (p34b - p12b)/(p12a - p34a); p5[1] = (p5[0] * p12a) + p12b; if(p12a==p34a) { printf("二直線は平行\n"); return 0; } printf("二直線の交点の座標\n(%f , %f)\n",p5[0],p5[1]);
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 長さが32のビット列を入力し、 このビット列が表す実数値を出力するプログラムを作成せよ。 ただし、この実数表現はIEEE754によるものとする。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月19日 [5] その他の制限: pow関数は使用しないこと。
>>18 実行環境のfloatが32bitのIEEE754形式なら、これでいい。
#include<stdio.h>
int main()
{
char str[33];
unsigned long bits = 0;
int i;
printf("32ビットの2進数を入力してください\n:");
scanf("%32s", str);
for(i = 0; str[i]; i ++)
bits = bits * 2 + str[i] - '0';
for(i = 0; i < 32; i ++)
putchar('0' + ((bits>>(31-i)) & 1));
putchar('\n');
printf("= %g\n", (double)*((float*)&bits));
return 0;
}
21 :
18 :2008/05/18(日) 13:40:06
>>20 すいません、問題の注意事項をよく見たら
まず指数部と仮数部を求めてから実数値を求めなきゃいけなかったみたいです…。
>>17 どうも
>>19 不正な初期化(16行目)と出てコンパイルできないです
どうして最初から平面上の直線だってわかったのかな? 問題文じゃそんなこと書いて無いのに 空間の中の直線だったらどーすんだ?
24 :
19 :2008/05/18(日) 13:48:46
>>23 その場合、
平行か/交わるか
のほかに、
平行ではなくかつ交わらない(同一平面上にない)
が必要ですね。
27 :
19 :2008/05/18(日) 13:52:43
>>23 ・平行には言及しているのに、ねじれの位置関係に言及していないから
・題意を満たすには2次元で十分だから
かな
すまん、名前が残ってたw
上手いこと揚げ足とったつもりが逆にフルボッコw
空間上の4点p1,p2,p3,p4が与えられていても p1,p2を通る直線とp3,p4が通る直線が 交わるか 平行か(「交わる」場合もあれば、交わらない場合もある) ねじれ(交わらない) か、判定出来ないというのでつね(|)
バカ?
33 :
20 :2008/05/18(日) 15:17:13
34 :
18 :2008/05/18(日) 15:43:06
>>33 これなら大丈夫そうです。
本当にありがとうございました!
煽り目的の奴はどこにでもいる、スルーでおk
23みたいなヤツのことかw
>>36 23は煽りじゃないだろ
仕様が曖昧なのに勝手に問題を単純化してすぐにコードにしてしまう
癖はCプログラマに限らずプログラマの悪い癖(自分もそうかも)
しかも公開の場所にあげてしまうし...
今回のは平面だろうが空間だろうが、意匠とか著作権やら絡まないし
ましてや個人情報も含まれるわけでもない単純な数学問題だからいい
かも知れないが、それでは済まされない分野も相手にするのもまた
Cプログラミングの世界。そういったことも伝えるのも大事だと思うな。
38 :
13 :2008/05/18(日) 16:28:35
>>15 ありがとうございます。
ですが38行目のあたり
(int solve_sub( int *m0, int *m1, int *m2, int *m3))
でエラーが出てしまいます(__)
>>37 おまいが23でないとして...
クソ仕様にはクソコードで速攻応酬するしか自衛手段が無いんだよ。
クソ仕様しか作れないから質問(発注)するわけだからな。
>>38 >>1 > ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
43 :
13 :2008/05/18(日) 17:17:18
>>40 すいませんでした。
エラーメッセージ(?)なのかなぞなんですが
38: non-constant expression
と言う風に出ました。
>>43 int dup=0, pos, val=0+1+2+3+4, *m[4], i;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
みたいに書いたら?
>>30 >課題4 まず操作1◦ と操作2◦ のみで,例題1 が正しく解けることを確認
とりあいずここまでできた
#include <stdio.h>
#define X 4
#define Y 3
void view(double a[Y][X])
{
char *kuuhaku;
int i , j;
for(i=0;i<Y;i++){
for(j=0;j<X;j++){
kuuhaku = j==X-1 ? a[i][j]<0 ? " " : " " : "";
printf("%s%7.2lf ",kuuhaku,a[i][j]);
}
printf("\n");
}
printf("\n");
}
int main(void) { double a[Y][X]= {{4,6,2,4000}, {2,8,6,5000}, {6,4,4,4200}}; double seki; int target_gyou; int i , j , k; for(i=0;i<Y;i++){ printf("\n\n--------STEP %d--------\n\n",i+1); for(j=X-1;j>=0;j--){ a[i][j]/=a[i][i]; } view(a); for(j=1;j<=Y-1;j++){ target_gyou=(i+j+Y)%Y; seki=a[target_gyou][i]/a[i][i]; for(k=X-1;k>=0;k--){ a[target_gyou][k]=a[target_gyou][k]-a[i][k]*seki; } view(a); } } return 0; }
48 :
41 :2008/05/18(日) 18:06:06
エラー直して実行したら実行例通りにできました ありがとうござます。
49 :
30 :2008/05/18(日) 19:10:51
>>46 面倒な問題なのにありがとうございます。
課題4の前半まで確認できました。
50 :
デフォルトの名無しさん :2008/05/18(日) 19:27:13
[1] 授業単元: C言語〜基礎T〜 [2] 問題文(含コード&リンク): 最初に整数nを入力し、nの数だけ実数x1, x2, ... ,xnを読み込みその値の平均を求める。 (配列ではなくfor分にて読み込み、n回for分を回し、値は順次加算する。for分を抜け次第nの値で割り平均を求める。) また、入力した実数で大きい方から順次3つ表示する。 (大きいほうから順次3つというのは格納用の3つ変数を用意し大小関係を調べて変数の中身を入れ替える。) (実行例) n=5 8 1 2 6 3 平均=4 大きいほうから順に8,6,3です。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語 [4] 期限: 5/20 12:00までにお願いします。
>>50 #include<stdio.h>
#include<limits.h>
#define TOP 3
int main()
{
int n, i, j, t, sum = 0, top[TOP] = {INT_MIN, INT_MIN, INT_MIN};
printf("n=");
scanf("%d", &n);
for(i = 0; i < n; i ++) {
scanf("%d", &t);
sum += t;
if(t > top[TOP-1]) {
for(j = TOP-1; j > 0 && t > top[j-1]; j --)
top[j] = top[j-1];
top[j] = t;
}
}
printf("平均=%g\n", (double)sum/n);
printf("大きいほうから順に");
for(i = 0; i < TOP; i ++) {
if(i)
printf(",");
printf("%d", top[i]);
}
printf("です。\n");
return 0;
}
53 :
デフォルトの名無しさん :2008/05/18(日) 20:33:26
>>51 お早い回答ありがとうございます。
自分は格納用変数3つ作成ってところがよく分からなかったので、大変参考になります。
54 :
30です :2008/05/18(日) 20:46:17
>>52 本当にありがとうございます。質問なんですが、これは課題4の操作3゜まで完了したプログラムでしょうか・・
課題2の数値をこのプログラムに入れて実行した結果は多分正解でした。
>>54 >>30 操作3ですよ
完璧に丸ごと問題通りにできているのかは怪しいですね。。
56 :
30です :2008/05/18(日) 21:15:40
丸ごと問題通りじゃなくても大丈夫なんで課題4はokです。 課題5は課題4の操作3゜の部分を書き換えたら完成ですかね?
57 :
43 :2008/05/18(日) 22:01:05
>>44 ありがとうございました。エラーは解決しました!
ですが、実行結果が正しい値になりません...
58 :
452 :2008/05/18(日) 22:11:23
[1] 授業単元: 情報基礎2 [2] 問題文(含コード&リンク): 物理量xについて、初期値x=0とする。分岐点を設けそこで乱数関数を利用して0-1の値を生成する。 この値が0.5-1の場合はxに1を加え、0-0.5のときは1を引く。 この分岐を100回経たときのxの値を保存する。 これをn回繰り返し、一つのファイルにn個のxの値を書き込む。 そして、、同じxの値が何回現れたかを表示するプログラムを作成せよ。 【実行例】 1回目 -14 2回目 -8 3回目 2 ・ ・ ・ 100回目 14 x=0 4回 x=2 5回 x=10 1回 ・ ・ ・ x=20 2回 [3] 環境 [3.1] OS: Windows xp [3.2] コンパイラ名とバージョン:BCC Developer [3.3] 言語:できればC++で [4] 期限:08年5月19日 n回繰り返してファイルにn個のxの値を書き込むところまでは作成できたのですが、 同じxの値が何度現れたのか表示する部分をどうすればよいのかわかりません。 よろしくお願いします。
59 :
58 :2008/05/18(日) 22:13:15
>>58 の名前欄はミスです。
回数n=100とした場合の、途中までのプログラムを示します。
#include <iostream.h>
#include <stdlib.h>
int main (void)
{
int i,j;
const int N=100;
double a,n=0,ran;
double array[N];
srand((unsigned) time(NULL));
for(i=0; i<N; i++){
for(j=0; j<N; j++){
ran =rand()/(float)RAND_MAX;
a=ran;
if(a<=0.5)
n-=1;
else
n+=1;
array[j]=n;
}
cout <<i<< "=" << array[N-1]<<endl;
}
}
行数の関係で空白行を削除しています。よろしくお願いします。
60 :
15 :2008/05/18(日) 22:22:10
>>57 > 実行結果が正しい値になりません
入力例を示してもらえますか?
[2] 問題文(含コード&リンク):シグモイド関数の値を求めるプログラムを書け。 自分で考えて一応プログラムを作りました。 キーボードで数字を入力すると答えが出るようにしようと思いましたがうまくいきません。 #include<stdio.h> #include<math.h> int main(void) { double f=0,x=0; scanf("%f",&x); f=1.0/(1.0+exp(-x)); printf("%f",f); } [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: Microsoft Visual C++ 2005 [3.3] 言語:どちらでも可 [4] 期限: なるべく早くお願いします。 [5] その他の制限:特に制限はありませんがなるべく簡単というか簡潔にお願いします。
62 :
57 :2008/05/18(日) 22:32:52
>>60 各行を数字4文字で入力してください。
数字は1〜4、または0(空欄)です。(例:1034)
1行目:1004
2行目:0200
3行目:0010
4行目:2000
初期状態=
1 0 0 4
0 2 0 0
0 0 1 0
2 0 0 0
不定
1 0 0 4
0 2 0 0
0 0 1 0
2 0 0 0
本当ならば
1 3 2 4
4 2 3 1
3 4 1 2
2 1 4 3
の解が出なければならないのですが・・・
63 :
15 :2008/05/18(日) 22:35:49
>>62 今問題を見返して、ようやく問題文の言わんとしているところを理解した。
>>15 は頭が悪かった。
作り直すから、ちょっと待ってて。
64 :
57 :2008/05/18(日) 22:39:08
すいません、ありがとうございます。 お願いします(__)
1] 授業単元:プログラム演習 [2] 問題文(含コード&リンク):char 型の配列C[10] に10 個の文字を読み込み、 C[10] に格納された文字の中で英大文字だけを表示させるプロ グラムを作成せよ [3] 環境 [3.1] (Windows xp [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語 C++ borland ver2.31 [4] 期限: (来週の月曜日 5月27日 [5] その他の制限:2次元配列を学び終え,文字列に入ったところです。ポインタはまだ学習しておりません C[10]の配列に文字を格納した後に、どのようにして大文字小文字を判別しているのかが 理解できません、どうかご教示おねがいします。
67 :
15 :2008/05/18(日) 22:55:21
>>66 返答ありがとうございます!
つい先ほどif分の内容を変えてみたところ正常に動作しました。
お手数おかけしてもうしわけありませんでした
}
69 :
57 :2008/05/18(日) 23:37:24
>>67 はい!きちんと実行できました。
ほんとうにありがとうございました!
70 :
デフォルトの名無しさん :2008/05/18(日) 23:43:24
>>67 2*2を見る部分ってこれであってる?
多分題意では4*4を4分割した4つの2*2を表現してると思う。
なのでこうかなって。
c[m[(y/2)*2+0][(x/2)*2+0]] = 1; /* 2x2 */
c[m[(y/2)*2+0][(x/2)*2+1]] = 1;
c[m[(y/2)*2+1][(x/2)*2+0]] = 1;
c[m[(y/2)*2+1][(x/2)*2+1]] = 1;
高々定数にしかならないことが分かってるから固定長配列のほうが良いのでは? 普通の map だと O(n log n) になってオーダーの意味で悪化するけど
そう言われればそうだな。 nが小さくて、BRANCH_NUMが大きいときだけ、mapが有効ということで。
getlineでstringに読み込んだ後 partitionでより分けて 不要部分をeraseし そのままcoutへ。 ・・・char型配列使わないから反則負けだ。・3・
>>72 まさに望んていた動作です。
ofstream file("data.txt");
等の命令は私の知識不足でどういったものかわからないのですが、調べてみようと思います。
本当にありがとうございます。
>>58 map 使ってみた
#include<cstdio>
#include<cstdlib>
#include<map>
double uniform_rand(void){return (double)rand()/(RAND_MAX+1);} // [0,1) の乱数を返す
int main(void){
std::map<int,int> count;
const int n=100;
FILE *fp;
if(!(fp=fopen("data.txt", "w"))) return 1;
for(int i=0;i<n;i++){
int x=0;
for(int j=0;j<100;j++){
if(uniform_rand()<0.5) x--;
else x++;
}
fprintf(fp, "%d回目 %d\n", i+1, x);
count[x]++;
}
for(std::map<int,int>::const_iterator it=count.begin();it!=count.end();++it){
fprintf(fp, "x=%d %d回\n", it->first, it->second);
}
fclose(fp);
return 0;
}
半径が2.2cmの円の円周の長さを求めるプログラムをお願いいたします・・・ π=3.14でお願いします
>>78 #include<stdio.h>
int main(void){
float r = 2.2f, pi = 3.14f;
printf("%f", 2*pi*r);
return 0;
}
>>79 C習い始めたばかりで困っていました;
ありがとうございます
てっきり円周の長さを求められないのかと思った
おらっ、どうした、じゃんじゃん宿題を質問しチャイナと
俺明日出る宿題全部書くんだ
[1] 授業単元:応用プログラミング [2] 問題文:整数を入力して表示する。(入力/出力関数の作成) [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限: 5月21日 [5] その他の制限: 標準ライブラリ関数printfやputs、scanfやgets等を使用してはいけない! まるごと作成すること。入出力関数を作成する際にも標準ライブラリ 関数は使用してはいけない。 おまけ:発展課題としてmalloc/calloc関数を自作すること。 こちらの課題はmalloc/calloc関数以外の標準ライブラリ関数を 使用してよい。
86 :
84 :2008/05/19(月) 08:17:29
>>84 ○○ nyuuryoku(○○) { //全ての標準ライブラリ関数使用禁止 } ○○ print(○○) { //全ての標準ライブラリ関数使用禁止 } int main() { int a; nyuuryoku("%d",&a); //5と入力 print("a=%d\n",a); //a=5表示されればOK return 0; }
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク):() 平面上の凸多角形 P と Q が与えられる。 (それぞれ、頂点の座標が反時計回りの順で与えられる) このとき、 ・P と Q が共通部分をもつとき INTERSECT と表示せよ。 ・P と Q が共通部分をもたないとき DISJOINT と表示し、 さらに P と Q の接線をすべて表示せよ。 (接線は、接線の方程式 ax+by=c の a,b,c を出力) なお、P と Q の頂点数はどちらも 10000 以下としてよい。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc 4 [3.3] 言語: どちらでも可 [4] 期限: 2008/05/23 [5] その他の制限: 計算量を考慮すること よろしくおねがいします
>>84 インラインアセンブラで書けってことかな?
アーキテクチャはなんですか?
料理するって時に、肉、野菜を1から作ってやれといっているようなものだ。 そうなると、飲食店は菜園、家畜する施設が必要になるな・・・
86/87共に専門書読まなきゃ辛い問題で、宿題にでるわきゃない。
>>90 専門書読まないと辛いからといって、宿題に出ないとは限らない。
底辺の学校ならそうかもしれんがね。
>>88 UNIXの専門書読んでwrite,readなどの低レベル関数使ったり
書式設定文字列を自前で展開しろって奴?
フローチャート書かせたりはありえてもコンパイル可能なコード
にしろというわきゃない。
少なくとも
>>87 は「平面上の二つの凸多角形の接線の式を求めよ」になる
接線の本数で重なるかどうかの判定はできる
>>84 API使ってGUIで作ればいいんじゃね。
標準さえ使わなきゃいいんだろ、コンソールに表示しろとも書いてないし。
>>92 なるほど、アセンブラまで落とさなくても低レベル関数を使う段がありましたね。
可変個引数や書式文字列の展開を課題で行うのは大変だということで
整数の入出力という制限がついているのかも。
97 :
84 :2008/05/19(月) 09:14:55
追記です。 ※悪い例 ##include <stdio.h> void nyuuryoku(char *str , int *a){ scanf("%d",a); } void print(char *str , int *a) { int i; char numlist[10]={'0','1','2','3','4','5','6','7','8','9'}; char string[30]; for(i=0;str[i]!=NULL;i++){ string[i]=str[i]; } string[i++]=numlist[*a]; while(str[i]!=NULL){ string[i++]=str[i]; } string[i]='\0'; printf("%s",string); } int main() { int a; nyuuryoku("%d",&a); //5と入力 printf("a=%d\n",a); //a=5表示されればOK return 0; }malloc/calloc関数自作の方だけでも大丈夫です。
98 :
デフォルトの名無しさん :2008/05/19(月) 09:17:05
>>84 #include <stdlib.h>
#include <string.h>
void *malloc(size_t size)
{
return realloc(NULL,size);
}
void *calloc(size_t nmemb, size_t size)
{
void *p;
if(p=realloc(NULL,nmemb*size))
memset(p,0,nmemb*size);
return p;
}
/* おまけ */
void free(void *ptr)
{
realloc(ptr,0);
}
mallocの実装コードなんて、Linuxとかからのソースコードから持ってくる という強力なワザが取れる以上宿題に出す馬鹿講師はいないよ
printfはpucharを使ってなんとか実装できそう?w
101 :
デフォルトの名無しさん :2008/05/19(月) 09:21:43
>>100 おまけ以外は標準ライブラリは使用禁止だそうだ。
自分ができない問題に文句たれる人がいますね
103 :
4 :2008/05/19(月) 09:35:30
実行してみたんですが、resultの結果が違いました。 もう一度よろしくお願いします。
出来るとか以前に、言語をして指定してその標準ライブラリを用いないって 何を勉強してんの?見えない敵と(ryってなるぞw
105 :
84 :2008/05/19(月) 09:36:29
どうみても逃亡だな
>>103 resultの34を求める具体式を書いてみそ。
(13+25+41+61)/4なら、35だろ。
108 :
4 :2008/05/19(月) 10:18:11
>>107 ホントすみません。よく分からないのですが。
具体式をどこに書けば?
>>108 107みたいに、ここに書けばいいじゃん。
34、というのは間違いなんじゃないか?って事。
もしかして釣り?
for (i=0;i<2;++i){ for(j=0;j<3;++j){ result[i][j]= ( sample[2*i][2*j] + sample[2*i][2*j+1] + sample[2*i+1][2*j] + sample[2*i+1][2*j+1] ) /4; } }
>>107 (13+36+25+62)/4=34だろ
もう少し頭使えよ
>>111 一言余計だろ、お前みたいな罵倒レスや上から目線で偉そうにしているカスって
実社会じゃ役に立ってないから、こういう場でしか強がれない小物なんだろ?w
for (i=0;i<2;++i){
for(j=0;j<3;++j){
result[i][j]=
( sample[2*i][2*j] + sample[2*i][2*j+1]
+ sample[2*i+1][2*j] + sample[2*i+1][2*j+1] ) /4.0 + 0.5;
}
}
>>110 ヒントありがとう
出力フォーマットが奇妙なところで改行されているとは思っていたが。。 なんてこった。
>>110 ちょい修正.切り捨てられるから
for (i=0;i<2;++i)
for(j=0;j<3;++j)
result[i][j]=(2+sample[2*i][2*j]+sample[2*i][2*j+1]+sample[2*i+1][2*j]+sample[2*i+1][2*j+1])/4;
しかし、6*4が3*2になってるのに縦の平均と思う方が不思議
>>112 問題を誤読しといて釣りあつかいする107=109よりはマシだろw
>>116 なるほど集計前後の比率を見て、2*2ずつ切り出せばいいと推測する訳か。
まあでもパズルスレじゃないし、出題者が間違う場合もあるから
「4つ」の意味を明記すべきだとは思う。
自分で間違っといて出題者のせいにすんなw
>>84 #include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
size_t Strlen(char * NumStr)
{
size_t len = 0;
for(len = 0;NumStr[len];len++) return len;
}
void GetNum(char * NumStr,size_t len)
{
size_t i;
for(i=0; i < len; i++) putchar(NumStr[i]);
}
void *Malloc(char *NumStr, size_t size)
{ return realloc(NumStr, size); }
続き void *Memset(char *NumStr,int c, size_t n) { char *p = &NumStr[0]; while(n > 0){ *p = c; p++; n--; } return NumStr; } void *Calloc(char *NumStr,size_t nmemb,size_t size) { size_t n = nmemb*size; NumStr = (char *)Malloc(NumStr,n); Memset(NumStr,'\0',n); return NumStr; } int main() { char *NumStr=NULL; int limits=0,ch=0,rank=1; size_t len = 0; int Max = INT_MAX; for(;Max != 0;){ Max /= 10; rank++; } NumStr = (char *)Calloc(NumStr,sizeof(char),rank); for(limits= 0;ch != '\n'&& limits < rank-1;limits++){ ch = getchar(); if(ch != '\n') NumStr[limits] = (char)ch; } len = Strlen(NumStr); GetNum(NumStr,len); return 0; }
やっちゃったみたいね
84みたいな課題ってどんな意味があるんだろうな
>>120 putchar()使っていいの?
アセンブリでBIOSの機能使って文字表示とかならできるけどそれってCじゃないよな・・・
126 :
デフォルトの名無しさん :2008/05/19(月) 12:36:31
>>87 ベクトルの内積で、接触or交差の判定は出来るだろうけど接線が判らんな。
C++でstringクラスやvectorクラスを標準ライブラリで作れっていう課題なら。
130 :
デフォルトの名無しさん :2008/05/19(月) 13:51:31
131 :
デフォルトの名無しさん :2008/05/19(月) 13:52:53
>>124 お前、よく読めよ。
おまけの問題では「malloc/calloc関数以外の標準ライブラリ関数を使用してよい。」と書いてあるだろ。
132 :
121 :2008/05/19(月) 14:02:40
最後にfree(NumStr)付け加えるの忘れてた
133 :
デフォルトの名無しさん :2008/05/19(月) 15:19:05
宿題丸投げってキモいなw
134 :
121 :2008/05/19(月) 15:40:22
>>65 #include <stdio.h>
#define SIZE 10
int main()
{
char str[SIZE] = {'\0'};
int i;
for(i=0;i<SIZE;i++)
str[i] = getchar();
for(i=0;i<SIZE;i++){
if(str[i] >= 'A' && 'Z' >= str[i])
putchar(str[i]);
}
putchar('\n');
return 0;
}
135 :
デフォルトの名無しさん :2008/05/19(月) 16:51:08
136 :
92 :2008/05/19(月) 16:55:59
137 :
95 :2008/05/19(月) 16:57:14
92じゃなくて95ですた。スレ汚しごめんなさい
138 :
121 :2008/05/19(月) 17:16:27
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 一般の連立1次方程式の解法プログラムを作成しなさい [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2008/05/20 [5] その他の制限:連立四元一次方程式を解けるプログラムであること
140 :
30 :2008/05/19(月) 17:31:46
>>138 途中まででも頑張ってくれてありがとう。
>>139 未知数4に対して式が何個あるのかが分からないことには手がつけられん
>>139 一般の、と書いてあるから可能な限りたくさんなのかな。
んで、最低でも連立四元一次方程式がとければよい、かな。
n元なら最低でもn式必要なんでしたっけ?すっかり忘れてますが。。
>>141 説明不足ですいません。
未知数4の場合は式が4つだと思うんですが、未知数4で式が3だった場合、答えが出るのですか?
数学素人なんで変な事を言ってるかもしれません。
144 :
139 :2008/05/19(月) 17:55:52
>>142 可能な限り沢山なのかわかりませんが、連立五元や連立六元などは授業で扱ったことがないので
おそらく一元一次方程式から四元一次方程式まで解ければ問題ないはずです。
未知数の数に応じて行列式を計算してクラメルの公式で簡単に解けるけど, 3x3はまだいいとして4x4の行列式の計算をつらつら書くのが面倒くさすぎる
>>139 ,143
式3つ以下だと解が一意に決まらない。
式4つの場合、逆行列があれば解が求まる。
>>145 こんな公式があるんですねえ。
適当にループでくるくるしたらどうにかできないかな?
149 :
121 :2008/05/19(月) 18:18:03
[1] 授業単元: 多倍長整数の演算 [2] 問題文(含コード&リンク): 100桁以内の整数を2つ読み込み、その和・差・積・差をそれぞれ 出力するプログラムを作成せよ [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語 [4] 期限: 5月20日23:55まで [5] その他の制限: ヘッダは<stdio.h>、<math.h>しか習っていません。 main関数で整数2つを読み込み、和・差・積・商はそれぞれ違う関数内で 演算しろとの事です。 また、グローバル変数は極力使うなと言われました。 口頭での説明だった為、問題が曖昧ですいません。 前スレで全く同じ問題を質問した人がいたのですが、解答を見ても内容が 高度過ぎて全く理解できず、重複で申し訳ないと思いつつも質問させて もらいました。 整数を文字列としてchar型配列に格納し、それを-48してint型に変換(?) してから4bitずつ25個に振り分けて― ―といった風に教えて貰ったのですが、結局ほとんど意味が分からないという始末… 講師いわく最終的に200行以上になるとの事ですが、もしよろしければよろしくお願いします。
152 :
デフォルトの名無しさん :2008/05/19(月) 19:30:13
153 :
121 :2008/05/19(月) 20:30:14
154 :
側近中の側近 ◆0351148456 :2008/05/19(月) 21:18:10
>>145 (っ´▽`)っ
小行列式に分割するってのはどうなの?
再帰を使えばできるような気がするよ
>>150 前スレで解答出てるんならそのリンクも張って具体的にどこがどう分からないのかも書けよ
あと、「多倍長」でググレ
157 :
側近中の側近 ◆0351148456 :2008/05/19(月) 22:06:37
158 :
デフォルトの名無しさん :2008/05/19(月) 22:07:58
[1] コンピュータ言語V [2] 文字列sを先頭から順に1行に1文字ずつ表示する関数putvを作成せよ。 void putv(const char*s) [3] [3.1]Windows XP [3.3]C++ [4] 期限 5月20日の午後3時まで [5] 特になし よろしくお願いします
>>158 void putv(const char*s)
{
for(int i = 0 ; s[i] != '\0' ; i++)
{
printf("%c\n",s[i]);
}
}
>>158 #include <stdio.h>
#include <string.h>
void putv(const char*s)
{
size_t len = strlen(s);
size_t i;
for(i = 0; i < len; i++){
putchar(s[i]);
putchar('\n');
}
}
強烈に難しいです…できた人は神! 内容: [1] 授業単元: プログラミング概論第二 [2] 問題文(含コード&リンク): ANNという最近傍探索のアルゴリズムがある。 このアルゴリズムは以下のステップを用いる 1)n次元k個のデータ群からkd木を作成する 2)探したいあるn次元のクエリから、kd木に格納されている点を探す 3)クエリと探し出された点との距離をdとする 4)距離dの超球を書く 5)「超球に触れているすべてのkd木で作成されたbox」内にあるすべての点をリストアップする 6)リストアップされた点を元に最も距離の近い点を探す。 というものです。 1〜4までは作りましたが 5)がよくわかりません…解決できる方どうか助けてください! [3.1] OS:windows [3.2] visual studio 2007 [3.3] 言語: C [4] 期限: 2008年5月20日まで] [5] なし
162 :
161 :2008/05/19(月) 22:40:18
補足です。 (nlogn)の計算量を極力スポイルしないよう、(5)のステップに注意し作成せよ だそうです。
とりあえず1〜4をうp
164 :
側近中の側近 ◆0351148456 :2008/05/19(月) 22:57:25
(っ´▽`)っ #include <stdio.h> #include <stdlib.h> #define MATRIX_FACT(row, col) a[(row) * rowLength + (col)] #define PART_MATRIX_FACT(row, col) partMatrix[(row) * (rowLength - 1) + (col)] double getDeterminant(double *a, int rowLength, int colLength); int main(void){ double a[4][4] = {{1, 2, 3, 0}, {4, 5, 6, 0}, {7, 8, 9, 0}, {2, 4, 6, 8}}; //double a[4][4] = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}; int rowLength = 4; int colLength = 4; //double a[3][3] = {{0, -2, 0}, {-1, 3, 1}, {4, 2, 1}}; //int rowLength = 3; //int colLength = 3; double determinant = (double)0; determinant = getDeterminant((double *)a, rowLength, colLength); printf("determinant=%f\n", determinant); return 0; } (続く)
165 :
側近中の側近 ◆0351148456 :2008/05/19(月) 22:58:08
>>164 の続き
double getDeterminant(double *a, int rowLength, int colLength)
{
double determinant = (double)0;
double minorDeterminant = (double)0;
double *partMatrix = NULL;
int i = 0;
int j = 0;
int k = 0;
if(rowLength < 2 || colLength < 2 || rowLength != colLength){
goto catch;
}
if(rowLength == 2){
determinant = MATRIX_FACT(0, 0) * MATRIX_FACT(1, 1) - MATRIX_FACT(0, 1) * MATRIX_FACT(1, 0);
}
else{
for(i = 0; i < rowLength; i++){
partMatrix = (double *)malloc(sizeof(a[0]) * (rowLength - 1) * (colLength - 1));
for(j = 0; j < i; j++){
for(k = 0; k < colLength - 1; k++){
PART_MATRIX_FACT(j, k) = MATRIX_FACT(j, k + 1);
}
}
for(j = i; j < rowLength - 1; j++){
for(k = 0; k < colLength - 1; k++){
PART_MATRIX_FACT(j, k) = MATRIX_FACT(j + 1, k + 1);
}
}
(続く)
166 :
側近中の側近 ◆0351148456 :2008/05/19(月) 22:58:48
>>165 の続き
printf("partMatrix={");
for(j = 0; j < rowLength - 1; j++){
printf("{");
for(k = 0; k < colLength - 1; k++){
printf("%f,", PART_MATRIX_FACT(j, k));
}
printf("\b},");
}
printf("\b}\n");
minorDeterminant = getDeterminant(partMatrix, rowLength - 1, colLength - 1);
printf("minorDeterminant=%f\n", minorDeterminant);
free(partMatrix);
determinant += minorDeterminant * (i % 2 == 0 ? 1 : -1) * MATRIX_FACT(i, 0);
}
}
catch:
return determinant;
}
167 :
側近中の側近 ◆0351148456 :2008/05/19(月) 22:59:56
いいかげんうpろだの使い方くらい覚えてくれ
169 :
側近中の側近 ◆0351148456 :2008/05/19(月) 23:35:01
ああ、ここまで長くなっていると書き込む前に分かっているなら 不必要にスレが流れるのを考慮して、マナーとして使うべきだろ
171 :
側近中の側近 ◆0351148456 :2008/05/19(月) 23:36:07
[1] 授業単元:画像処理
[2] 問題文(含コード&リンク):
作成した「画像表示」のプログラムを、同じ画像を横に並べて
表示するように修正せよ(「画像表示」のボタンに対応するプログラムを修正)。
作成したプログラムはこちらです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6615.txt [3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン: visual studio 6.0
[3.3] 言語:C++
[4] 期限:20日正午まで
[5] その他の制限:
「画像表示」のボタンに対応するプログラムは下の通りです。
CWnd* myPICT=GetDlgItem(IDC_PICT);
CClientDC myDC(myPICT);
CRect myRECT;
my PICT->GetClientRect(myRECT);
int x,y;
for(y=0;y<height;y=y+1)
for(x=0;x<width;x=x;1)
myDC.SetPixel(x,y,RGB(r[y][x],g[y][x],b[y][x]));
よろしくお願いします。
>>161 質問です。
今、最近傍探索を調べているのですが、意味がよくわからないところがありますので、教えていただけますでしょうか。
1) k次元(ユークリッド)空間R^k 内にデータが n個散らばっている。
2) ここに、点P がある。
3) 点P にもっとも「近い」データを探し出したい。
というのが最近傍探索で、問題のアルゴリズムは、
4) , 3) でもっとも近いデータを探すのに「n 個のデータすべてについて距離を求め、一番距離が小さいものを求める」のは計算量が多くて大変!
5) そこで、とりあえず適当なデータQ と P との距離dを求め、
6) 辺の長さが 2d, 中心がP, 辺は座標軸に平行である k次元立方体 S を考え、
7) 領域探索アルゴリズムにて S 内にあるデータをすべて列挙し、
8) S 内のデータすべてと P との距離をそれぞれ求めて、一番距離小さいものを求める
ということでしょうか。
そうすると、5) の Q をとりあえず探す、というのが、非常に大事で、まかりまちがって P から遠い Q を選んでしまうと計算量を少なくできないですが、Q の選び方はどうすればよろしいのでしょうか?
以上の解釈でいいのでしょうか。
>>172 int x,y;
for(y=0;y<height;y=y+1)
for(x=0;x<width;x=x;1)
myDC.SetPixel(x,y,RGB(r[y][x],g[y][x],b[y][x]));
↓
int x,y,x2;
for(y=0,x2=0;y<height;y=y+1)
for(int i=0;i<2;i++)
for(x=0;x<width;x=x+1,x2++)
myDC.SetPixel(x2,y,RGB(r[y][x],g[y][x],b[y][x]));
>>158 #include <stdio.h>
#define MAX 11
void putv(const char *s) {
do { putchar(*s++); printf("\n");
}while( *s != NULL && *s!='\n');
}
int main(void) {
char str[MAX];
fgets(str,MAX,stdin);
putv(str);
return 0;
}
151ですがまだ終わってないぽいです・・・ やってくれるかたがいればおねがいします。
>>174 ありがとうございました。
言い忘れたんですけど画像と画像の間を少し空けて表示させたいんですけど
どうなるでしょうか?
>>158 のポログラムが簡単そうだったから僕もつくてみたよー。
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
void putv( const char* );
int main()
{
char s[] = "teststring";
putv( s );
}
void putv( const char* s )
{
string str( s );
copy( str.begin(), str.end(), ostream_iterator< char >( cout, "\n" ) );
}
どうすか、この華麗なるSTL。w
もはやC++にこだわる意味すらない課題に・・・
技巧に走るのは楽しいかもしれんが一人でやっててくれ
何やってんだかわかりにくいコードはキモい。
それはおまえだけ。
短くもなきゃ効率言い訳でもない上見た目も悪くて最悪だろw
お主ら、麻呂のクソースはいかがでおじゃる?1ソース100円でどうじゃ?
STL を使ったプログラミングはこんなもんだぞ? たとえばこの板でもおすすめの入門書 Accelareted C++ にもこういう構文が普通にでてくる。 「何やってんだかわかりにくい」ってのは STL の勉強不足だろ単に。
いや、だからそれすら必要の無い単純なライブラリの自作で 面倒な、処理時間が掛かるようなことをして何がしたいんだと?
Generic programming―STLによる汎用プログラミングでも似たようなコードがあったな。 しかし課題の趣旨にはあわんな。
C++の課題に<stdio.h>とか使ってる人のいるスレですから。 Effective C++くらい読もうよ。
void putv(const char *s) { do { printf("%c\n",*s++);}while( *s != NULL); } と比較したら、倍近く差が出るぞ?
/* ここから宗教論争 課題がCではなくあえてC++だってところがミソだな。 Cライクなコードは書くなってことだから 型安全性と拡張性を持たないライブラリ関数は いくら早くてもNGだろう。 ここまで */
// Cライクなコメントを書くな。w
どんな技術も使い手がヘボだと何の意味もないということがよくわかるな。 使いどころをわきまえてない。
>>190 > いくら早くても
日本語でおk。C++だろうとwhileは特定の言語のものじゃないんで、あしからず。
あと、C++って結局Cの拡張。何か別物と勘違いする奴って笑われるぞw
194 :
側近中の側近 ◆0351148456 :2008/05/20(火) 06:40:30
>>194 ちゃんとは見ていませんが、Cプログラムとしては
なかなか良い作品ではないかと思いまつ。
だけど一般次数の行列式の計算なんてC言語のプログラミング実習
の問題の適切な範疇を遥かに超えてしまった課題じゃないかと思います。
C言語の世界はシステム記述が中心で一般論を非常に重視する世界だと思
います。
数値計算は数学の教科書の一般論がなかなか適用できず、問題に応じて
適切な方法を選択(考案)しなければいけない世界です。相当、系統の
違う専門分野だと思います。(一般論は欲しいのですが...)
198 :
139 :2008/05/20(火) 07:43:59
>>164-166 169
早速ありがとうございます。実行して出力した結果がどういうものか分からないんですが、
partMatrixとminorDeterminateがなにを表しているのか教えてください
あとプログラムの使い方も教えてほしいです。
たとえば3x3の行列式
4x+6y+2z=4000,2x+8y+6z=5000,6x+4y+4Z=4200
の場合と4x4の行列式
2w+1x+4y+3z=5,3w+2x+5y+0z=0,4w+3x+2y+1z=3,5w+0x+3y+2z=0
の場合の解を求めるには
このプログラムをどのようにすればいいのでしょうか?
>>193 whileの話じゃない。詳しくはEffective C++参照。
200 :
173 :2008/05/20(火) 07:56:47
喧嘩すんな。コーディングの仕方なんぞ所詮宗教。 <stdio.h>が<cstdio>になり、<iostream>を使うよう推奨されても <stdio.h>を使う人間は使い続ける。
宗教じゃなくて 流儀 変数の命名の方法とか、所有権とか... デフォを決めとかないと、コードが大きくなってしまった 場合に急ぎの作業が入ったらキツクなるから 流儀が設定されることもある。 必要悪
C++標準で<stdio.h>が<cstdio>になったのは1998年だから C++プログラムで<stdio.h>を使う人は10年以上前にC++を習得した人。 つまりおっさんPG。
Cは1999年にC++標準の中のCとは互換性のないC99に改定されたので Cに関しても10年以上前に習得した人ってこと。 どう考えてもおっさんPG。
keep it simple.
新しきを学び、古きを捨てましょう。 「アジャイルプラクティス-達人プログラマに学ぶ現場開発者の習慣」より
>>194 C プログラムとしての指摘:
> double a[4][4] = ...
> getDeterminant((double)*a, ...)
これは多くの処理系で動くけれど、
ANSI Cの規格には従っていないことに注意。
アルゴリズムとしての指摘:
余因子展開で行列式を計算するのは O(n!) かかるので、非常に遅い。
ガウスの消去法などを用いると O(n^3) で計算できる。
新しい技術を学ぶときには、足を引っ張りかねない古い習慣を捨てなさい。 見出しだけだと誤解を招くよ
>>139 「行列式 (determinant)」という言葉を調べてこい。
4x+6y+2z=4000,2x+8y+6z=5000,6x+4y+4Z=4200 みたいなのは
行列式とは言わない。せいぜい 3×3連立方程式。
210 :
デフォルトの名無しさん :2008/05/20(火) 08:33:50
cstdioはしらねーよ iostreamは知ってる ウェブも本もcstdioはなかなかないのでは
それだけ馬鹿が多いと言うことでしょう。
それをバカと評価するあんたは何者だよ?w 現代において、自分が知っていることだけがすべてだと思う 思い上がりの方がバカを通り越した井の中の蛙だろ
かの相対性理論で有名なアインシュタイン、相対性理論と言えば 光に関しても関わってくる話ではあるが、光速度を知らなかったのだよ、 アインシュタインは。何が重要か?必要に応じて必要なものを 取り込む頭がない奴は、現代のような無駄な生活をしていても その無駄さえも 必要 という勘違いを始めるから困る。 または、無駄を省かない、省けない。誰かに指摘されるまでそうしている。
バカかどうかは別にして。 <cstdio>よりも<iostream>を使うことが推奨されているから <cstdio>を使っているC++の本は少ないだろうけど <stdio.h>を使っているC++の本は(多分もう)一冊もないだろうと思う。 古い本でも版を重ねると直しているくらいだし。 少なくともC++の宿題に今<stdio.h>を使ったら 歳の行った人に答えを聞きましたってばれちゃう。 学校でもC++の授業で<stdio.h>は教えないだろうから。
>>213 それは間違いだ。
アインシュタインの相対性理論は、光速度一定と言う仮定の上に成り立っている。
と言うことは、実際の速度がどれくらいかは兎も角光速度を知らないということにはならないな。
処で、馬鹿といわれて過剰に反応するのは何故だろう。余程、自覚があるのだろうか。
光の速度が時速100kmだろうと1000000kmだろうと一定は一定
<stdio.h>なんざincludeしやがったら チームメンバーから袋だろ。w 名前空間を汚染するなって。
>>202 その流儀に宗教が紛れ込みやすい。
というか完全に除去するのは不可能。
宗教は流儀に強い信頼性を与えるから
だろうけど。
修羅場で無くなった状態で、流儀が伝統
になってしまうとそこに潜む宗教という強い
力が全体を緩慢かつ堅固に拘束していくと
やっかい。
そんな話じゃないだろ 脱線すんな
<stdio.h>が<cstdio>になったのと C++標準にSTLが組み込まれたのは同時期だから いまだに<stdio.h>を使う人が STLを使ったコードを理解できなくても不思議はない。
ドッグイヤーどころかマウスイヤーといわれるITの世界で 10年以上前の規格を使い続けるやつなんて存在価値なし。
>>178 > どうすか、この華麗なるSTL。w
こいつだろ、さっきっから理解できない奴がいる、自分は知ってるみたいな
華麗とか、マジでそれ 糞 だからw
>>178 はあきらかに悪質なジョークだろ。
おまえら反応しすぎ。どこまでコンプレックスなんだ。
ttp://e-words.jp/w/STL.html ふぅ〜ん、もう10年以上前ってレベルじゃねーぞっ。んで、知っているからって何?
知らない奴を見つけて楽しんでいるわけ?ケツの穴が小せぇなぁ。性格悪ぅ〜〜。
知っている奴もいるが、何そんなに必死に知らない奴を探してんの?って思われるだけだぞw
iostream に printf 相当の書式指定が欲しい IOマニピュレータ面倒すぎ
>>224 いつものやつっぽいからそっとしておいてやれ
いちいち << とかめんどくさいよな . とかなら1回押すだけで良いのに
230 :
デフォルトの名無しさん :2008/05/20(火) 12:15:45
>>214 うちはC++の講義すら無い件。
Cの講義のみでひたすら<stdio.h>
231 :
デフォルトの名無しさん :2008/05/20(火) 12:46:13
[1] C++ [2] 体重と身長の値から算出される指数の1つに Body Mass Index(BMI)がある。 体重[kg]を身長[m]の2乗で割って計算し, 標準値は22.0とされている。 【問題】 キーボードから身長と体重を入力すると, BMIが画面に出力されるプログラムを作成しなさい。 [3] 環境 [3.1]Windows [3.2]VC?(よくわかりません) [3.3]C++ [4]5月27日 17時まで [5]特にありません。 よろしくお願いします!
//
>>231 // 「キーボードから入力」と「画面に出力」が標準入出力のことじゃないならしらね。
#include <iostream>
int main()
{
int height;
int weight;
std::cin >> height >> weight;
std::cout << weight / (height / 100.0 * height / 100.0);
return 0;
}
233 :
161 :2008/05/20(火) 14:45:22
すいません、寝落ちしていました。
えっと、ここにc++版があります。
http://www.cs.umd.edu/~mount/ANN/ 力不足なことに、私はc++を全く理解することができません。理解は時間があればできそうですが、時間が足りません(汗
>今、最近傍探索を調べているのですが、意味がよくわからないところがありますので、教えていただけますでしょうか。
>1) k次元(ユークリッド)空間R^k 内にデータが n個散らばっている。
>2) ここに、点P がある。
>3) 点P にもっとも「近い」データを探し出したい。
>というのが最近傍探索で、問題のアルゴリズムは、
>4) , 3) でもっとも近いデータを探すのに「n 個のデータすべてについて距離を求め、一番距離が小さいものを求める」のは計算量が多くて大変!
>5) そこで、とりあえず適当なデータQ と P との距離dを求め、
>6) 辺の長さが 2d, 中心がP, 辺は座標軸に平行である k次元立方体 S を考え、
>7) 領域探索アルゴリズムにて S 内にあるデータをすべて列挙し、
>8) S 内のデータすべてと P との距離をそれぞれ求めて、一番距離小さいものを求める
>ということでしょうか。
最近傍探索の考えはあっています。
ですが
5)まずkd木を探索して、点Pがどの立方体に所属するかどうかをさがし、その立方体の中に入っている点Q と P との距離dを求め超球を書く
6)超球に接している立方体、超球の中にある立方体をすべてリストアップする
7) 領域探索アルゴリズムにて 立方体群内にあるデータをすべて列挙し、
8) 立方体群内のデータすべてと P との距離をそれぞれ求めて、一番距離小さいものを求める
のうち領域探索アルゴリズムがわかりません。
どのようなアルゴリズムを組めば計算量が少なくて済むのか知恵を御借りしたいと考えて質問させていただきました。
[1] C++ [2] 以下の処理を順に行うプログラムを作成しなさい。 >232 ありがとうございました! まだ問題があったのでまたよろしくお願いします! 1. キーボードから整数を入力する。 2. 入力された整数が3の倍数のとき, 画面に「3の倍数です」と表示する。 [3] 環境 [3.1]Windows [3.2]VC [3.3]C++ [4]5月27日 17時まで [5]なし。
>>234 if ( 入力 % 3 == 0 )
{
出力 3の倍数です
}
>>232 の内容と組み合わせて作りな
[1] 授業単元:プログラミング実習 [2] 問題文(含コード&リンク): 各自で、カラー自然画像(出来れば画像中のオブジェクトが豊かな物)をみつけ、 kmeansによって画像中の要素を分類せよ。さらに、分類の数を変えながら、変化を観察せよ。(原文のまま) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限: 2008年5月23日 13:00まで [5] その他の制限: 制限は特にありません。 ppmフォーマットの画像を読み込んで分類する(クラスター分析?)プログラムと言われたのですが、さっぱりわからないです・・・orz どうかみなさんご協力おねがいしますm(_ _)m
237 :
161 :2008/05/20(火) 16:05:14
>173 ちなみに、233で書いたやつがANNという手法です。 ちなみに >4) , 3) でもっとも近いデータを探すのに「n 個のデータすべてについて距離を求め、一番距離が小さいものを求める」のは計算量が多くて大変! >5) そこで、とりあえず適当なデータQ と P との距離dを求め、 >6) 辺の長さが 2d, 中心がP, 辺は座標軸に平行である k次元立方体 S を考え、 >7) 領域探索アルゴリズムにて S 内にあるデータをすべて列挙し、 >8) S 内のデータすべてと P との距離をそれぞれ求めて、一番距離小さいものを求める にあるように、超球の中にある点すべてについて探索するというのでは、結局全点について距離を比較しないといけなくなるので、 結局n^2の話になってしまいます。 kd木のnlognをスポイルしたくないというのはここに絡んできます。 ANNのこの手法が理解できればいいのですが… ちなみに期限が延びましてあと2日になりました。 最悪223に書いたサイトからソース引っ張ってきてcで書いた私のソースとc++で書かれているソースをドッキングして性能を確かめることを考えていますが…
>>238 何その頭の悪そうな日本語もまともに書けていない問題。
おまけに、C++でお願いされる内容がC言語理解度確認って何さ。
挙句の果てに、「文字列変数」ってstd::stringじゃないのかよ。
Cには文字列変数はありません
正の値である間ループし、負になったらループを抜けるって0になったらどうすんだよw
正の0ならループして負の0ならループを抜けるんだろう。
>>243 問10の回答って再起呼び出し? LISP?
[1] 授業単元:C言語2 [2] 問題文int型変数x,yをキーボードから値を入力し、その大小を判定する関数funcを作成せよ [3] 環境 [3.1] OS: xp [3.2] コンパイラ名とバージョン: VC 6.0だと思います [3.3] 言語: C [4] 期限:今週中 [5] その他の制限: ポインタを使用する お願いしますm(_ _)m
その辺ってさすがに自分でやったほうがよくね? 包丁でたまねぎを半分に切るのはどうすれば?っていう、そんなかんじ。
>>246 int func(int* x, int* y){
if (*x > *y) {
return 1;
} else if (*x < *y) {
return -1;
}
return 0;
}
一応こんな感じで作ってみた。
まぁ
>>247 の言う通りこの位自分でやるべきだとは思ったけどもね
ってかもうマクロの世界だよな #define MAX_VAL(x,y) return(x>y?x:y) 初めて引数付きマクロ書いた 動くか分からん
int func(int* x, int* y){ if (*x > *y) { return 1; } else if (*x < *y) { return -1; } return 0; }
[1] 授業単元:C言語実習 [2] 問題文(含コード&リンク): 入力された数値を\とカンマ区切りに編集する関数YenConvertを作成せよ。 int YenConvert(int kingaku,int mode,char *buffer,int result); 引数1:編集用の数値(4桁以上でかつint型の範囲内の入力のみと仮定) 引数2:編集モード 1:引数1の先頭に\を付ける(1000→\1000) 2:引数1の先頭に\を付け、カンマを挿入(1000→\1,000) 引数3:数値編集の格納領域アドレス 引数4:引数3のアドレス先の領域サイズ 戻り値は正常:0 モード誤り:-1 編集用領域不足:-2 [3] 環境 [3.1] OS:XP(自宅) / Vista(実習室) [3.2] コンパイラ名とバージョン:VC6.0 [3.3] 言語: C言語 [4] 期限:(0時を挟むので)明日 午前2時頃 [5] その他の制限:特にありません。 春季基本情報合格祝いという名目で、ポインタなんて名前しか知らないのに課題が出ました…。 無茶と失礼は承知の上で、寝るまでの期限でお願い致します。
度々すいません、
>>252 です。
記述漏れとミスがあったので訂正します。
int YenConvert(int kingaku,int mode,char *buffer,int bufferlen)
[5] その他の制限:YenConvertでは編集のみ。mainで値から編集した文字列の出力も行なうこと。
254 :
デフォルトの名無しさん :2008/05/20(火) 22:23:17
[1] 授業単元:C言語実習 [2] 問題文(含コード&リンク):for文を使ってひし形の作成せよ。 [3] 環境 [3.1] OS:Windows vista [3.2] コンパイラ名とバージョン: 通常使用のPCがないのでわからないです。 [3.3] 言語:C [4] 期限: 金曜日まで [5] その他の制限:配列使用不可 少し考えてみたソースです。 下半分がどうもできません。 #include <stdio.h> void main(void) { int dan,j,k; for (dan=1; dan<=9; dan=dan+2){ for(j=1; j<=9-dan; j=j+2){ printf(" "); } for(k=1; k<=dan*2-1; k=k+2){ printf("*"); } printf("\n"); } }
>>254 #include <stdio.h>
#include <stdlib.h>
#define min(x, y) (x<y)? x : y
int tmp;
#define list(n, s) for( tmp=n; tmp-- >0; ){ printf("%s",s); };
int main(void) {
const int dan=9;
int i;
for( i=0; i<9; i++ ){
list((abs(dan/2-i))," ");
list((min(i,dan-i-1))*2+1,"*");
puts("");
}
return 0;
}
>>239 みたいなのが日本語も頭も悪そうに見えるんだが・・・
言動には注意した方が良いぞ。
257 :
デフォルトの名無しさん :2008/05/20(火) 22:49:38
>>255 ありがとうございました。
自分の説明不足なのですが、254のレスに書いた感じのソースで下半分作りたいのでそれと同じようなソースでお願いしたいのですが…。
258 :
側近中の側近 ◆0351148456 :2008/05/20(火) 22:54:35
>>196 (っ´▽`)っ サンクス☆(抱
>>198 (っ´▽`)っ
partMatrix:部分行列
minorDeterminate:小行列式
getDeterminantの第1引数に行列のポインタ、第2引数にその行列の行数、第3引数に列数を設定する。
行列式を求めるわけだから、第2引数と第3引数は同じでなければならない。
4x+6y+2z=4000,2x+8y+6z=5000,6x+4y+4Z=4200の解は、クラメルの公式より、
x=({{4000, 6, 2}, {5000, 8, 6}, {4200, 4, 4}}の行列式)/({{4, 6, 2}, {2, 8, 6}, {6, 4, 4}}の行列式)
y=({{4, 4000, 2}, {2, 5000, 6}, {6, 4200, 4}}の行列式)/({{4, 6, 2}, {2, 8, 6}, {6, 4, 4}}の行列式)
z=({{4, 6, 4000}, {2, 8, 5000}, {6, 4, 4200}}の行列式)/({{4, 6, 2}, {2, 8, 6}, {6, 4, 4}}の行列式)
2w+1x+4y+3z=5,3w+2x+5y+0z=0,4w+3x+2y+1z=3,5w+0x+3y+2z=0の解は、クラメルの公式より、
w=({{5, 1, 4, 3}, {0, 2, 5, 0}, {3, 3, 2, 1}, {0, 0, 3, 2}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
x=({{2, 5, 4, 3}, {3, 0, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
y=({{2, 1, 5, 3}, {3, 2, 0, 0}, {4, 3, 3, 1}, {5, 0, 0, 2}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
z=({{2, 1, 4, 5}, {3, 2, 5, 0}, {4, 3, 2, 3}, {5, 0, 3, 0}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
259 :
側近中の側近 ◆0351148456 :2008/05/20(火) 22:55:19
>>207 (っ´▽`)っ
ほうほう・・・もっと勉強しよっと☆ありがと♥(抱
菱形ってことだから、斜めに配置しないでこんなんでいいじゃん。 ********* ********* ********* ********* ********* ********* ********* ********* *********
261 :
139 :2008/05/20(火) 23:08:26
>>258 自分の説明不足みたいでごめんなさい。
一般の連立1次方程式の解法プログラムを作成しなさい
って問題なので、最終的に
2w+1x+4y+3z=5,3w+2x+5y+0z=0,4w+3x+2y+1z=3,5w+0x+3y+2z=0の解は、クラメルの公式より、
w=({{5, 1, 4, 3}, {0, 2, 5, 0}, {3, 3, 2, 1}, {0, 0, 3, 2}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
x=({{2, 5, 4, 3}, {3, 0, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
y=({{2, 1, 5, 3}, {3, 2, 0, 0}, {4, 3, 3, 1}, {5, 0, 0, 2}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
z=({{2, 1, 4, 5}, {3, 2, 5, 0}, {4, 3, 2, 3}, {5, 0, 3, 0}}の行列式)/({{2, 1, 4, 3}, {3, 2, 5, 0}, {4, 3, 2, 1}, {5, 0, 3, 2}}の行列式)
のような行列式を出力を期待しているのではんく、w=1,x=100,y=1000,z=10000などのように出力するのではないでしょうか?
せっかく作ってもらったのに文句言ってすいません。
[1] 授業単元: アルゴリズム [2] 問題文(含コード&リンク): "end"が入力されるまでキーボードから入力を受付け、入力されたらそれを入力の逆順に表示する。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2008年5月22日22:00まで [5] その他の制限:charのポインタを対象としたスタックを使う よろしくおねがいします。
264 :
デフォルトの名無しさん :2008/05/21(水) 00:04:45
>>264 #include<stdio.h>
#include<math.h>
#define PI 3.14159
int main(void){
int alpha, degree;
double theta;
printf("終了する角度を入力してください ");
scanf("%d", &alpha);
for(degree=0;degree<=alpha;degree+=5){
theta=PI*degree/180;
printf(" 角度θ= %d°sinθ= %.5f cosθ= %.5f\n", degree, sin(theta), cos(theta));
}
return 0;
}
267 :
266 :2008/05/21(水) 00:17:29
間違えた。言語指定C++じゃん
>>265 入力されたものをプッシュして、
endが入力されたらポップした順番に表示すればいいみたいです。
>>257 これで良いかな?
#include <stdio.h>
void main(void) {
int dan,j,k;
for (dan=1; dan<=9; dan=dan+2){
for(j=1; j<=9-dan; j=j+2){
printf(" ");
}
for(k=1; k<=dan*2-1; k=k+2){
printf("*");
}
printf("\n");
}
for (dan=7; dan>0; dan=dan-2){
for(j=1; j<=9-dan; j=j+2){
printf(" ");
}
for(k=1; k<=dan*2-1; k=k+2){
printf("*");
}
printf("\n");
}
}
>>264 #include <iostream>
#include <iomanip>
#include <cmath>
#define PI 3.14159
using namespace std;
int main(){
double alpha, r=5.0;
cout << "終了する角度を入力してください " ; cin >> alpha;
cout << showpoint << setprecision(5);
for(double i=0; i <= alpha ; i += r)
cout << "角度θ= "<< (int)i << " sinθ= " << sin(i*PI/180) << " cosθ= " << cos(i*PI/180) <<endl;
}
273 :
264 :2008/05/21(水) 01:09:19
>>252 とりあえずカンマ入れるモードだけ作った。
int YenConvert(int kingaku, int mode, char *buffer, int result)
{
int min_buf_size, tmp, sign, digit;
char *p;
/* */
if (!buffer) return -3;
/* mode check */
if (mode != 1 && mode != 2) return -1;
/** calc required buf size by kingaku **/
/* get sign */
sign = kingaku < 0 ? -1: 1;
/* abs */
kingaku = kingaku < 0 ? -kingaku : kingaku;
/* digit */
tmp = kingaku / 10;
digit = 1;
while(tmp > 0) {
digit++;
tmp /= 10;
}
/* buf size */
min_buf_size = 1; /* nul terminator */
if (sign == -1) min_buf_size++;
min_buf_size += digit + (digit-1)/3;
>>274 つづき
/* check buf size */
if (result < min_buf_size) return -1;
p = buffer + min_buf_size;
*(p--) = '\0';
tmp = 0;
while (1) {
*(p--) = (kingaku % 10) + '0';
kingaku /= 10;
digit--;
tmp++;
if (digit <= 0) break;
if ((tmp) % 3 == 0) (*p--) = ',';
};
*(p--) = '\\';
if (sign == -1) *(p--) = '-';
}
>>263 #include <stdio.h>
#include <string.h>
#define TRUE 1
int main(void);
int main(){
char s[100][100];
int i=0;
while(TRUE){
fgets(s[i],100,stdin);
if(strcmp(s[i],"end\n")==0){break;}
i++;
}
for(;i>=0;i--){
printf("%s",s[i]);
}
return 0;
}
>>263 スタックにつむならこうだろ常識的に考えて
#include <stdio.h>
int func()
{
char s[100];
fgets(s, 100, stdin);
if (strcmp(s, "end\n") == 0) return;
func();
printf("%s", s);
}
int main(void)
{
func();
}
>>252 int YenConvert(int kingaku,int mode,char *buffer,int result)
{
char work[20], *p=work;
char *fmt[][2]={{NULL, NULL}, {"%d", "%03d"}, {"%d", ",%03d"}};
int div, kingaku_abs;
if(mode!=1 && mode!=2) return -1;
kingaku_abs=abs(kingaku);
*p++='\\';
for(div=1;kingaku_abs/div>=1000;div*=1000);
p+=sprintf(p, fmt_set[mode][0], kingaku/div);
for(div/=1000;div>0;div/=1000) p+=sprintf(p, fmt[mode][1], (kingaku_abs/div)%1000);
if(strlen(work)+1>result) return -2;
strcpy(buffer, work);
return 0;
}
>>252 おっと、時間切れか?
int YenConvert(int kingaku, int mode, char *buffer, int result)
{
char work[30], *p0 = work, *p;
if(mode != 1 && mode != 2 ) return -1;
*p0++ = '\\';
if(kingaku < 0) {
*p0++ = '-';
kingaku = -kingaku;
}
sprintf(p0, "%d", kingaku);
if(mode == 2) {
for(p=p0+strlen(p0); p>p0+3; p-=3) {
memmove(p-2, p-3, strlen(p-3)+1);
p[-3] = ',';
}
}
if(strlen(work)+1 >= result) return -2;
strcpy(buffer, work);
return 0;
}
CやC++、PASCALやDelphiとかの構造化プログラミング言語流の スタックアーキテクチャーにあんまし慣れすぎないほうがいいと思うぞ 特に10代からCとかやってた奴は。5年はプログラムから離れて 適当に忘れたほうがいい。 (本来は30・40代から始めても遅くないというか、むしろ相応しい ものなんだけどね==>C言語)
>>284 なぜそう思うのか教えていただきたいです。
宿題に関係ないから出てけ
オブジェクト指向でコードが書けなくなっちゃうから、とか言い出しそうな 雰囲気だな。
あぁ、まぁ人それぞれだ。主観でモノを言っても話にならないんで 具体的にどういうことなのか?そんなのは扱ってみりゃ分かる
使えてれば何の問題もないと思うんだが。 それよりも他に気にすることはあるだろ。
i:::::::::::::i:::::::;:::::::::::::::::::::::::/i:::::/ i::::::::::::::::::::::| |::::::::::::|:::::/::::::::::;:::::::::/ /:::/ i::::::i:::::::::::::i たとえば『地球温暖化』だ。 |:::::::::::|:::::i:::::::/::::/ /:::/ |::::|:::::::::::/ CO2排出量増加による地球温暖化は常識だね? ∨:::::::|::::|:::::イ:::/ /:::/ |::::|:::::::::/ そう、常識だ。いや、常識だと多くの人々が思っている。 ∨:::::|:::| ̄ナナ=、 /::Zz=='"T:T|:::::::/ だが、実はCO2が地球温暖化の原因だという証拠は無いんだよ。 ∨:::|::|::ャ代戌ナ= // 弋戌テT:ァi::::::/ そもそも地球温暖化という現象は仮説に過ぎない。 ∨:::i:i/ i/ / i/./:::::/,_,, そう主張する人も少なくない。 rヤ::::|i. ! / /i::::::ハ Y ふっ、どうも私は口下手で困るよ。 ,,イrヤ::::|ゝ. i / ,イ::::< .〉 .ト、 つまり常識を疑えということだ。 rイ! レヤ:::|i .ゝ. _ _ .イ.|:::/ ソ ! ト‐、 >ー''フ/''| | ヤi::| i .|\ // |::/ / ト、 `ー、 / i i ャヤi j > 、 //./ |:i / | Y
そーゆー問題じゃなくて、Webアプリケーション化の流れは 速度は遅いが着実にそちらの方向に流れてるということだ。
ナイナイ
[1] 授業単元:プログラミング [2] 問題文ライフゲームを作成せよ [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語: ( [4] 期限: 今週中(できるだけ早めでお願いします) [5] その他の制限:特になし
↑言語はCでお願いします
地球おんかんばは天文学的な話にもなるかもしれん。まぁ、何が原因かはともかく 過去の気象データと比較して、平均気温が上がった場所、局地的に熱くなった あるいは寒くなった場所、今まで冬を越さなかった生き物が長々と生息して 生態系が変わるとか、色々とありますからね・・・何が自然か?まぁ俺の戯言はこの辺でw
>>295 ライフゲームって、人生ゲームみたいなテーブルゲームを文字ばかりで作れと?
Conway'sLifeGameだろ。JK
訂正。Conway's Game of Life だった。
>>295 仕様があいまいすぎwww
もっと担当者と要求仕様詰めてから出直せwwww
#include<stdio.h> #define JUMYOU 82 int main(void){ int age=0; char ch='\0'; printf("年齢%d歳:出生",age); age++; getchar(&ch); while(age<JUMYOU){ printf("現在の年齢%d歳",age); getchar(&ch); age++; } printf("年齢%d歳:ご臨終",age); puts("あなたは寿命を全うしました。"); return(0); }
303 :
デフォルトの名無しさん :2008/05/21(水) 12:09:04
>>303 #include <stdio.h>
int main(void){
int i, j, n;
printf("段数を入力してください:");
scanf("%d", &n);
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++) printf(" ");
for(j=0;j<i*2+1;j++) printf("*");
printf("\n");
}
return 0;
}
305 :
デフォルトの名無しさん :2008/05/21(水) 12:24:06
307 :
デフォルトの名無しさん :2008/05/21(水) 12:50:50
お願いしますm(._.)m 携帯からなので後ほど途中まで自分でやったものアップします。 [1] 授業単元:ファイルの入出力 [2] 問題文: in.txtに入力された文をout.txtに番号をつけて出力する 〜例〜 (in.txtの内容) 気になっていることがあるとなかなか眠れない 小さなことでイライラする 根に持つタイプだ (out.txt) 0001:気になっていることがあるとなかなか眠れない 0002:小さなことでイライラする 0003: 0004:根に持つタイプだ [3] 環境 [3.1] OS:WindowsVista [3.2] コンパイラ名とバージョン: [3.3] 言語:C++ [4] 期限:2008年5月21日23:00まで [5] その他の制限:
1〜N(入力した任意の数)まで数を数えるとき、3の倍数のときに気持ちよく 5の倍数で激しくなる(ry
>>307 #include <stdio.h>
int main(void)
{
FILE *in, *out;
char buff[256];
int i;
if((in=fopen("in.txt", "r"))==NULL) return 0;
if((out=fopen("out.txt", "w"))==NULL) return 0;
for(i=0; fgets(buff, sizeof buff, in); i++) fprintf(out, "%04d:%s", i, buff);
fclose(in);
fclose(out);
return 0;
}
311 :
デフォルトの名無しさん :2008/05/21(水) 14:04:28
[1] 授業単元:コンピュータ言語 [2] 問題文: ある文章を入力して、その中に含まれる「数字の個数」を求め、 戻り値で返す関数と、その関数を呼び出して下記のように表示する プログラムを作成せよ。 例えば、 aiueo12kakikukeko34 と打ち込むと、「数字の数:4」と表示する。 関数は、 int count(char*s) とする。 [3] 環境 [3.1] OS:WindowsXP [3.3] 言語:C++ [4] 期限:5月22日の午後4時まで よろしくお願いします
312 :
311 :2008/05/21(水) 14:06:01
追記として、 #include<cctype> #include<iostream> using namespace std; int strch_cnt(const char* s,char c) { int i=0; while (*s) { if(*s == c) i++; s++; } return i; } int main() { char s[40]; char c; cout << "文字列:"; cin >> s; cout << "\n"; cout << "カウントする文字:"; cin >> c; cout <<"\n"; cout << "文字数は:"<< strch_cnt(s,c) << "\n"; return 0; } ↑のプログラムを参考に作ればいいとのことですが、 どうやって数字の個数のみを求め、表示させればいいのかが分かりません
世の中のたいていのテクニック本には charよりもstringを使え ポインタ渡しではなく参照渡しできないかどうかもう一度考えろ って書いてあるのに どうして学校の授業はchar*とか普通に使いたがるのだ。
世に出ているテクニック本の怪しさときたら.... プログラミングの経験を積めば積む程そう感じるものなのだが....
>>311 #include <cctype>
#include <iostream>
using namespace std;
int count(char *s)
{
int i = 0;
while(*s)
{
if(isdigit(*s)) i++;
s++;
}
return i;
}
int main()
{
char s[40];
cout << "文字列:";
cin >> s;
cout << "\n";
cout << "数字の数:" << count(s) << "\n";
return 0;
}
>>314 ・3・) エェー セックスとデートのハウツー本は役にたつよな?
cin >> s; のところで1000文字くらい打ち込んでみようかな。
>>312 を参考にしろって言った出題者に文句言ってくれ
319 :
デフォルトの名無しさん :2008/05/21(水) 15:24:24
こうか? std::cin.getline(s, sizeof(s));
321 :
デフォルトの名無しさん :2008/05/21(水) 15:35:02
>>135 で依頼した者です。
>>149 のかた迅速な解答ありがとうございます。
実際に学校のPCで動作を確認したところ
セグメンテーション違反というエラーがでてしまいました。
どのようにすればよいでしょうか?
>>319 a,b,cをint型変数としてscanfでコンソール等から取得
( (a>0)&&(b>0)&&(c>0) )をチェック 満たされてない場合は
再取得するか、プログラムを終了しろ
( (a+b>c)&&(a+c>b)&&(c+b>a) )
これを満たしてないと三角形にはならないので、その旨表示して終了
((a==b)&&(b==c))
これが真の場合は正三角形だから正三角形と表示
((a==b)||(c==b)||(a==c))
これが真の場合は二等辺三角形だから二等辺三角形と表示
(正三角形と判定された場合、この条件の判定はしない)
( (a*a+b*b==c*c)||(a*a+c*c=b*b)||(c*c+b*b==a*a) )
これが真の場合は直角三角形だから直角三角形と表示
(直角二等辺三角形と表示したい場合はあと一工夫いる)
( ( a*a+b*b>c*c ) && (a*a+c*c>b*b) &&(b*b+c*c>a*a) )
これが真の場合は、鋭角のみで構成された三角形だから鋭角三角形と表示
これが真でない場合は、鈍角を持った三角形と表示する。
これをヒントに後は自分で書け
>>319 #include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(void){
int a[3], chk;
string s1, s2;
cin >> a[0] >> a[1] >> a[2];
sort(&a[0], &a[2+1]);
if(a[0]<=0 || a[2]>=a[0]+a[1]){
cout << "三角形として不可能な3辺の長さです" << endl;
return 0;
}
chk=a[2]*a[2]-(a[0]*a[0]+a[1]*a[1]);
if(chk==0) s1="直角";
else if(chk<0) s1="鋭角";
else s1="鈍角";
if(a[0]==a[2]) s2="正", s1="";
else if(a[0]==a[1] || a[1]==a[2]) s2="二等辺";
else s2="不等辺";
cout << s1 << s2 << "三角形" << endl;
return 0;
}
324 :
307 :2008/05/21(水) 16:43:06
>>310 ありがとうございます!!
ヒントで配られたプリントを参考にして作ってみましたのですが
ファイルを入力するところまでこれで合ってますか?
(10は行数で256は文字数です)
#include<fstream.h>
main()
{
char line[10][256];
ifstream fin("in.txt", ios::in);
if(!fin){
cerr << "error" << endl;
exit(1);
}
for(int i=0;i<10 ; i++){
while(!fin.eof()){
fin.getline(line[i], 256);
}
}
fin.close();
326 :
デフォルトの名無しさん :2008/05/21(水) 16:53:43
3PB2GBX エクスプレス \94,224 Inspiron Desktop 530s インテル(R) Core(TM) 2 Duo プロセッサー E6750(4MB L2 キャッシュ 2.66GHz 1333MHz FSB) Windows XP Pro Service Pack 2/OfficeProfessional 2007 4GB(1GBx4) 500GB DVD+/-RW ATI(R) RADEON(R) X1300 Pro 256MB DDR(DVI/TV-Out付) On Board Dell マウス(USB,オプティカル,2ボタン,ホイール付,ブラック)/19メディア対応カードリーダー/ライター 3YS2GBX エクスプレス \74,839 XPS Desktop 420 スタンダードシャーシ インテル(R) Core(TM) 2 Quad プロセッサー Q6600(8MB L2 キャッシュ 2.40GHz 1066MHz FSB) Windows Vista Home Premium 2GB(1GBx2) 500GB DVD+/-RW NVIDIA(R) GeForce(R) 8600 GTS 256MB DDR(DVIx2/TV-out付) On Board Dell プレミアムマウス(USB,オプティカル,4ボタン,ホイール付) 5YS2GBX エクスプレス \122,995 XPS Desktop 420 スタンダードシャーシ インテル(R) Core(TM) 2 Quad プロセッサー Q6600(8MB L2 キャッシュ 2.40GHz 1066MHz FSB) Windows Vista Home Premium/Office(Personal & PowerPoint) 2007 4GB(1GBx4) 500GB DVD+/-RW NVIDIA(R) GeForce(R) 8800 GT 512MB DDR(DVIx2/TV-out付) Sound Blaster(R) X-Fi Xtreme Music(D) PCIサウンドカード Dell プレミアムマウス(USB,オプティカル,4ボタン,ホイール付) 6VR2GBX エクスプレス \63,053 Vostro Desktop 200 スリムタワー インテル(R) Core(TM) 2 Duo プロセッサー E4500(2MB L2 キャッシュ 2.20GHz 800MHz FSB) Windows Vista Business 32ビット/OfficePersonal 2007 2GB(1GBx2) 250GB DVD/CD-RWコンボドライブ ATI(R) RADEON(R) HD 2400 Pro 256MB HyperMemory(TM)(DVI/TV-out付) On Board Dell マウス(USB,オプティカル,2ボタン,ホイール付,ブラック)/19メディア対応カードリーダー/ライター 9NG4GBX エクスプレス \134,611 XPS Desktop 420 スタンダードシャーシ インテル(R) Core(TM) 2 Quad プロセッサー Q6600(8MB L2 キャッシュ 2.40GHz 1066MHz FSB) Windows Vista Home Premium/OfficePersonal 2007 4GB(1GBx4) 500GB ブルーレイディスクドライブ NVIDIA(R) GeForce(R) 8800 GT 512MB DDR(DVIx2/TV-out付) On Board Dell プレミアムマウス(USB,オプティカル,4ボタン,ホイール付) CD85GBX エクスプレス \83,532 Vostro Desktop 200 スリムタワー インテル(R) Core(TM) 2 Duo プロセッサー E6550(4MB L2 キャッシュ 2.33GHz 1333MHz FSB) Windows Vista Ultimate 32ビット/OfficePersonal 2007 4GB(1GBx4) 160GB DVD+/-RW ATI(R) RADEON(R) XT 2400 256MB HyperMemory(TM)(DVI/TV-out付) On Board Dell マウス(USB,オプティカル,2ボタン,ホイール付,ブラック)
328 :
307 :2008/05/21(水) 16:54:54
>>325 やはり間違ってますか?
僕もこれで実行してみたけど出来ませんでした…。
プリントの変数など変えただけなんですが
>>327 うぉぉぉ Q6600 が安いぜぇぇぇぇ!
って、すでにQ6600を持ってるけどさ・・・。
DELLエクスプレスは安いけど
めったにディスコティップのいいのはでないのと
あらかじめ現金用意しとかないといけないのが難点だな。
>>307 #include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
int main(void){
ifstream in("in.txt");
ofstream out("out.txt");
string s;
int i;
for(i=1;;i++){
getline(in, s);
if(in.fail()) break;
out << setw(4) << setfill('0') << i << ":";
out << s << endl;
}
return 0;
}
>>326 直角でかつ二等辺三角形が直角二等辺三角形だよね。
がんばれー
332 :
307 :2008/05/21(水) 17:59:43
>>330 ありがとうございます
すごく参考になりますた。
>>332 ぜってえ理解してねえwww
参考になってないだろwww
336 :
307 :2008/05/21(水) 18:13:31
>>333 正直stringとかusing namespace とか習ってないす。爆
けど0001:の表示の仕方とかわかっただけでも充分です!
>>335 今使用してるのが「Visual C++ 6.0」なので
C++だとおもっていたんですが・・・・
もしかしてCだったんですかね?
勘違いさせてすみません.
人を刺しておいて手に持っているのが包丁だったので調理だと思ってましたと言ってるようなものだ
Visual C++ 6.0は for文内で定義したインデックス変数のスコープがfor文の外になっちゃったり maxやminのような一部ライブラリが使えなかったり 標準C++への準拠度が低いから すぐにでもVisual C++ 2008に移行したほうがいいよ。 どう考えてもそのレベルじゃMFCは使わないだろうか 無料のExpressエディションで十分だろうし。 あと、Cを勉強するのにC++は使わないほうがいい。 Cは現在第2版になっていて、C++とは互換性ないから。
>>334 ずいぶんと方針を変えたねw
いろんな入力を試して、望ましい結果が出てるならOKだとおもうよ。
あとは無駄なロジックを見つけて、省けるようになれば十分かな。
>>336 とりあえず得るものはあったのかw
ならおkww
>>323 は
sort(&a[0], &a[2+1]);
の一文がスマートだね。
あらかじめソートしておけば条件が探しやすい。
>>311 #include<iostream>
#include<string>
using namespace std;
int iGetNumInString(string str);
int main()
{
string str='\0';
//なんかstring型に文字列入力させるコードがあるのでそれ呼んで↓
//getline(cin,str);
int num=iGetNumInString(str);
cout << num << endl;
return(0);
}
int iGetNumInString(string str)
{
int num=0;
for(int i=0;str.c_str()[i]!='\0';i++){
if(str.c_str()[i]>='0'&&str.c_str()[i]<='9'){
num++;
}
}
return(num);
}
string型の初期化ミスった 自重する
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): nまでの自然数の平方の和の公式は, 1*1 + 2*2 + ... + n*n = n(n+1)(2n+1)/6である. まず, 要素が101の配列a[0],a[1], ..., a[100]のそれぞれに,各配列の添え字までの自然数の平方の和を計算し, 代入する. (a[1] = 1, a[2] = 5, ...などとする(a[0] = 0とする). 次に, 自然数mを1つ読込み, その平方の和がはじめてmを超えるような自然数x, すなわち, a[x]>mとなるような最小の自然数xと, その次の行にa[x]を出力するプログラムを作成しなさい.(自然数が入力されない場合は想定する必要はない.) [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C言語 [4] 期限:2008年05月22日18:00まで [5] その他の制限:配列・文字列まで習ってます。
>>344 #include <stdio.h>
int main(){
int a[101];
int i,num;
a[0] = 0;
for(i = 0;i < sizeof(a)/sizeof(a[0]);i++){
a[i+1] = a[i] + (i+1)*(i+1);
}
printf("m > ");
scanf("%d",&num);
for(i = 0;num >= a[i];i++){}
printf("%d\n%d",i,a[i]);
return 0;
}
[1] 授業単元:関係演算子 [2] 問題文(含コード&リンク): 関係演算子を使って5つの整数の最大値と最小値を求めよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: c [4] 期限: 2008/5/23 超初歩的な問題なんですが、かなり頭悪くて解けません。よろしくお願いします。
348 :
347 :2008/05/21(水) 21:00:54
あ、条件演算子でした
>>347 書き直し
5つの整数はどのように与えられるのか
最大値、最小値を求めたら表示などをするのか
>>347 #include<stdio.h>
int main(void){
int data[]={4,7,2,1,9};
int i, maximum, minimum;
maximum=minimum=data[0];
for(i=1;i<sizeof(data)/sizeof(data[0]);i++){
maximum=data[i]>maximum?data[i]:maximum;
minimum=data[i]<minimum?data[i]:minimum;
}
printf("max:%d min:%d\n", maximum, minimum);
return 0;
}
>>346 Cは関数の途中で変数宣言できないんじゃないのかな?
352 :
デフォルトの名無しさん :2008/05/21(水) 21:08:42
gets(); puts("");
>>349 5つの整数はscanfで読み取る形で、最大値と最小値は表示します。
>>350 for文は習っていません…。
>>352 #include<iostream>
#include<string>
using namespace std;
int main(void){
string str, str_new;
cout << "文字列を入力してください. ";
getline(cin, str);
cout << "文字列の長さは " << str.size() << " です." << endl;
for(int i=0;i<str.size();i++){
if(isupper(str[i])) str_new+=tolower(str[i]);
else if(islower(str[i])) str_new+=toupper(str[i]);
else if(isdigit(str[i])) str_new+=str[i];
}
cout << "変換された文字列: " << str_new << endl;
return 0;
}
>>351 関数の先頭ではなく、ブロックの先頭で宣言可能
358 :
347 :2008/05/21(水) 21:46:50
書き直しました。もう一度お願いします。 [1] 授業単元:プログラミング実習 [2] 問題文:if文の条件演算子(? , :)を使って、 scanfで読み取る5つの整数の最大値と最小値を表示せよ。 [3] 環境 [3.1] OS:WindowsXP [3.2]gcc [3.3] 言語:c [4] 期限:5月23日 [5]if文まで習いました。
>>311 #include <iostream>
#include <string>
using namespace std;
int iCountNum( string str );
int main()
{
string str = "\0";
cout << "文字列入力" << ends;
getline( cin, str );
int num = iCountNum( str );
cout << "数字の数:" << num << endl;
return( 0 );
}
int iCountNum( string str )
{
int count = 0;
for( int i = 0; str[ i ] != '\0'; i++ ){
if( str[ i ] >= '0' && str[ i ] <= '9' ){
count++;
}
}
return( count );
}
361 :
360 :2008/05/21(水) 21:51:33
はずすじゃなくてタブによるインデントをスペースによるインデントに 変更する、ですね。 viにおけるexpandtab
>>358 >[2] 問題文:if文の条件演算子(? , :)を使って、
三項演算子じゃね? ~~~~
364 :
347 :2008/05/21(水) 21:57:21
>>363 入門書に3項の演算子と記してあるのでたぶんそうだと思います。
>>347 ,358
int a,b,c,d,e;
/* 適当にabcdeを読み込む */
printf("max %d min %d\n",
(((a>=b?a:b)>=(c>=d?c:d)?(a>=b?a:b):(c>=d?c:d))>=e)?
((a>=b?a:b)>=(c>=d?c:d)?(a>=b?a:b):(c>=d?c:d)):e,
(((a<=b?a:b)<=(c<=d?c:d)?(a<=b?a:b):(c<=d?c:d))<=e)?
((a<=b?a:b)<=(c<=d?c:d)?(a<=b?a:b):(c<=d?c:d)):e
);
こういうことじゃなくて?
int max; max = a>=b?a:b; max = max>=c?max:c; max = max>=d?max:d; max = max>=e?max:e; printf( "%d",max); これでいいんじゃない? if文無いけど
>>365 コードの読みやすさなんて人それぞれだからもういいけどさ('A`)
for文を抜ける条件が見つからない><
ぎぶあっぷ
GNUスタイルで書かれてるしほんとにvimのソースなのかも?
あとタブサイズを8にすればインデント的には見やすく。 細切れ連投スマヌ
372 :
347 :2008/05/21(水) 22:16:11
373 :
352 :2008/05/21(水) 22:20:32
374 :
デフォルトの名無しさん :2008/05/21(水) 22:24:23
2次方程式ax^2+bx+c=0のabcを入力すると答えをだすプログラムを作成せよ って問題です。 実数の時は出来たのですが重解と虚数のときが上手くいきません。 どこがおかしいでしょうか。
375 :
デフォルトの名無しさん :2008/05/21(水) 22:25:06
>>374 の自分で作ってみたプログラミングは↓です
#include <stdio.h>
#include <math.h>
main(){
double a,b,c,D,x1,x2,x3,x4,x5;
printf("a=");
scanf("%lf",&a);
printf("b=");
scanf("%lf",&b);
printf("c=");
scanf("%lf",&c);
D=b*b-4*a*c;
printf("判別式=%lf\n",D);
if(D>0){
x1=(-b+sqrt(D))/2*a;
x2=(-b-sqrt(D))/2*a;
printf("実根:x=%lf,%lf\n",x1,x2);
}
else if(D=0){
x3=-b/2*a;
printf("重根:x=%lf\n",x3);
}
else{
x4=-b/2*a;
x5=sqrt(-D)/2*a;
printf("虚根:x=%lf+%lfi,x=%lf-%lfi\n",x4,x5,x4,x5);
}
}
>>375 else if(D=0)
これを
else if(D==0)
にすると?
377 :
デフォルトの名無しさん :2008/05/21(水) 22:27:42
a=3 b=1 c=3 と打つと D=-35 虚根:x=-1.5+-0.00000i,x=-1.5--0.00000i と出てきます。
b/2*a こういうのを b/2/a もしくは b/(2*a) にしてみては?
379 :
375 :2008/05/21(水) 22:31:06
>>376 ああああああああああああああああああああああ
初心者がしやすい間違いとか言う奴ですねw
重解のときは正解しましたw
380 :
375 :2008/05/21(水) 22:38:33
>>378 直したら虚根のときも出来るようになりました。
x5=sqrt(-D)/2*a
これは
どうやって計算してるんですか?
√D÷2×aとも違うような気がするんですが
>>380 hogeを2×aで割りたいのなら、
hogeを2で割った結果をさらにaで割る → hoge/2/a
か、
2×aを先に計算して、それで割る → hoge/(2*a)
という方法になる。
解の公式的には後者のほうが見やすいかも。
非常に惜しいところまでいっていたよw
383 :
375 :2008/05/21(水) 22:48:46
>>382 ありがとうございます。
ついでにaの場合を考慮しないとダメな時はどうやって付け加えれば良いのですか?
384 :
375 :2008/05/21(水) 22:54:22
これで良いんですかね? if(a==0){ x6=-c/b; printf("x=%lf\n",x6); } if(a!=0){ if(D>0){ x1=(-b+sqrt(D))/(2*a); x2=(-b-sqrt(D))/(2*a); printf("実根:x=%lf,%lf\n",x1,x2); } else if(D==0){ x3=-b/(2*a); printf("重根:x=%lf\n",x3); } else{ x4=-b/(2*a); x5=sqrt(-D)/(2*a); printf("虚根:x=%lf+%lfi,x=%lf-%lfi\n",x4,x5,x4,x5); } } }
386 :
デフォルトの名無しさん :2008/05/21(水) 23:02:41
>>271 私が考えたやり方と同じように作りなおして下さってありがとうございました。
今、環境がないので確認できませんがやってみます。
助かりました。
>>384 そう、それでいいよw
ここまで自力でできたのに何でできないんだろう?って思ってたw
あとはif(a!=0)をelseにしてもいいし、いろいろ書く事ができるんです。
人によっていろんな書き方があるので、丸写ししてる生徒が
いれば先生にはバレバレということです。
ちなみに解用の変数はx1x2の2個だけでもできるので、
そのように変えてみなさい、という宿題を出しときます。
>>385 フォローアップサンクス
388 :
375 :2008/05/21(水) 23:08:07
>>385 >>387 elseやifのなかにelseやifを入れても良いのですね
初心者すぎて知りませんでした><
389 :
346 :2008/05/21(水) 23:42:09
タブをスペースに変換してるのはなんとなく分かるのですが、 具体的な条件分岐が分からないのでだいたいでもいいのでよろしくお願いします
>>381 無理に transform して 2 pass になってるな。ぜんぜん華麗じゃない。
>>355 の方法は早いがメモリが2倍必要になる。
>>356 は間違ってる。
>>381 は2passで遅い。
しかし1passでやろうとすると各要素の操作と要素の削除が同時に発生する。
stringは要素の削除に時間がかかるから微妙なところだな。
392 :
デフォルトの名無しさん :2008/05/21(水) 23:52:05
[1] 授業単元 C言語 [2] 問題文 int array[]={30,29,69,-1454,22224,-23.65.23.66,77}をバブルソートを使って昇順しなさい [3] 環境 OS:XP 使用テテキストエディタ:MicrosoftVisualC++ 使用言語:C [4] 期限: 金曜日まで [5] その他の制限 プログラム中に #define FLAG_NUM 10 #define FLAG_OFF 0 #define FLAG_ON 1 を使う
393 :
デフォルトの名無しさん :2008/05/21(水) 23:53:37
ちなみに途中まで教えてもらったソースが #define DATA 10 #define FLAG_OFF 0 #define FLAG_ON 1 int array[]={30,29,69,-1454,22224,-23.65.23.66,77}; #include<stdio.h> int main(void) { int t,i=0,w=0,j=0.c=0 char flg; for(i=0;i<DATA-1;i++) { flg=FLAG_OFF; for(j=0;)j<DATA-1;j++) { までです。このFLAG_OFFとかを使う意味がよく分かりません 正解を少しみしてもらって記憶しているif(flg|=FLAF_ON)を使う意味とか if(flg|=FLAF_ON){ break; } の「break」が何をやっているのかがさっぱりです どうか教えてください;;
394 :
デフォルトの名無しさん :2008/05/21(水) 23:55:01
「FLAG_NUM」が「DATA」になってました すいません
395 :
デフォルトの名無しさん :2008/05/21(水) 23:56:11
[1] 授業単元: C++実習1 [2] 問題文(含コード&リンク): #include <windows.h> #include <stdio.h> int main() { RECT rc; SetRect(&rc, 0, 0, 640, 480); printf_s("(%d, %d) - (%d, %d)\n", rc.left, rc.top, rc.right, rc.bottom); SetRectEmpty(&rc); printf_s("(%d, %d) - (%d, %d)\n", rc.left, rc.top, rc.right, rc.bottom); return 0; } 上記のプログラムを、以下の説明にしたがって変更せよ。 クラスの名前は Rect に。 Rect クラスのメンバ変数 left、top、right、bottom は public で int 型に。 SetRect 関数と SetRectEmpty 関数は Rect クラスの public メンバ関数に。 上記メンバ関数の戻り値は void に。 上記メンバ関数の引数はメンバ関数として適切なものになるようにする。 作成したクラスをテストする main 関数を作成する。 これは RECT 構造体をテストした main 関数を同程度のもので良い。 入出力は IO ストリームを使う。windows.h と stdio.h のインクルードは無し [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語:C++ [4] 期限: なし [5] その他の制限:なし よろしくお願いします
>>395 #include<iostream>
class Rect{
public:
int left,top,right,bottom;
void Rect::SetRect(int left,int top,int right,int bottom){
this->left = left;
this->top = top;
this->right = right;
this->bottom = bottom;
}
void Rect::SetRectEmpty(void){
left = top = right = bottom = 0;
}
};
int main(void){
Rect rc;
rc.SetRect( 0, 0, 640, 480);
std::cout << "(" << rc.left << ", " << rc.top << ") - (" << rc.right << ", " << rc.bottom << ")" << std::endl;
rc.SetRectEmpty();
std::cout << "(" << rc.left << ", " << rc.top << ") - (" << rc.right << ", " << rc.bottom << ")" << std::endl;
return 0;
}
>>393 if(flg|=FLAF_ON){
break;
}
このコード毎回実行されると思うんだけど。つまり無意味な条件だと思うんだけど。
>>396 途中で移動させたから不要な「Rect::」がついてる orz
「void SetRect(」「void SetRectEmpty(」でおk
399 :
デフォルトの名無しさん :2008/05/22(木) 00:26:35
[1] 授業単元: C言語実習 [2] 問題文(含コード&リンク): #include <stdio.h> int main(void) { int age[10],cnt[5]; int i; //年齢データ age[0]=40; age[1]=41; age[2]=40; age[3]=43; age[4]=39; age[5]=43; age[6]=40; age[7]=41; age[8]=39; age[10]=43; cnt[0]=0; cnt[1]=0; cnt[2]=0; cnt[3]=0; cnt[4]=0; //ここからを変更 for(i=0;i<10;i++){ } //ここまでを変更 for(i=0;i<5;i++){ printf("%d歳の人数:%d人\n",i+39,cnt[i]); } return 0; } 問題文:ここから変更〜ここまで変更の中身を書いて各年齢の人数をカウントするプログラムを完成せよ。 [3] 環境 [3.1] OS: WindowsXP 言語:C [4] 期限: 5月23日まで どうかよろしくお願いします。
各年代じゃなくて?
401 :
デフォルトの名無しさん :2008/05/22(木) 00:33:32
>>400 各年齢らしいです
39歳が二人、40歳が三人…みたいに表示させるプログラムを組めとの事でした
>>399 //ここからを変更
for(i=0;i<10;i++){
cnt[age[i]-39]++;
}
//ここまでを変更
あと、age[10]=43; → age[9]=43;
しかしひどいプログラムだ。
>>402 >あと、age[10]=43; → age[9]=43;
あ、本当ですね…申し訳ないです
正常に動作したのを確認しました
迅速な解答有難うございます
>>392 バブルソートってのが何なのかはわかるんだよね?
普通はこんな風にフラグなんか使わずに終わると思うんだ。
#include <iostream>
using namespace std;
int main()
{
int array[]={ 30, 29, 69, -1454, 22224, -23, 65, 23, 66, 77 };
int size = sizeof( array ) / sizeof( int );
for( int i = 0; i < size; i++ ){
cout << array[ i ] << "," << ends;
}
cout << endl;
for( int i = size; i >= 0; i-- ){
for( int k = i - 1; k >= 0; k-- ){
if( array[ i ] < array[ k ] ){
int temp = array[ i ];
array[ i ] = array[ k ];
array[ k ] = temp;
}
}
}
for( int i = 0; i < size; i++ ){
cout << array[ i ] << "," << ends;
}
return( 0 );
}
407 :
393 :2008/05/22(木) 01:04:20
#define DATA_NUM 10 #define FLAG_OFF 0 #define FLAG_ON 1 int array[]={30,29,69,-1454,22224,-23.65.23.66,77}; #include<stdio.h> int main(void) { int tmp,i=0,w=0,j=0,counter=0; char chgflg; for(i=0;i<DATA_NUM-1;i++) { chgflg=FLAG_OFF; for(j=0;j<DATA_NUM-1;j++) { if(array[i]>array[i+1]) { tmp=array[i]; array[i]=array[i+1]; array[i+1]=tmp; chgflg=FLAG_ON; } } if(chgflg != FLAG_ON) { break; } }
C言語だったので書き直し #include <stdio.h> int main( void ) { int i = 0, temp = 0; int firstKey = 0, secondKey = 0; int array[]={ 30, 29, 69, -1454, 22224, -23, 65, 23, 66, 77 }; int size = sizeof( array ) / sizeof( int ); for( i = 0; i < size; i++ ){ printf( "%d, ",array[ i ] ); } puts(""); for( firstKey = size; firstKey >= 0; firstKey-- ){ for( int secondKey = firstKey - 1; secondKey >= 0; secondKey-- ){ if( array[ firstKey ] < array[ secondKey ] ){ temp = array[ firstKey ]; array[ firstKey ] = array[ secondKey ]; array[ secondKey ] = temp; } } } for( i = 0; i < size; i++ ){ printf( "%d, ",array[ i ] ); } return( 0 ); }
409 :
393 :2008/05/22(木) 01:07:31
ミスりましたごめ
>>407 せめて出題者なら自分でコンパイルしてよ
「小数点が多すぎる」ではじかれるでしょうよそれ
>>405 ぐっジョブ。理想的アルゴリズム。
消費メモリは少なく速度も速くstringの弱点も回避。
【質問テンプレ】 [1] 授業:プログラム演習 [2] 問題文: while文、do〜while文、for文をそれぞれ用いて、 1からnまでの偶数と奇数の合計をそれぞれ求めるプログラムを3通り作成せよ。 <実行例> 整数を入力してください。 10 偶数の合計:30 奇数の合計:25 [3] 環境 [3.1] Windows XP [3.2] gcc [3.3] C [4] 期限:2008年5月22日22:00まで [5] その他の制限:特になし よろしくお願いします。
>>412 実際にコンパイルして質問の例どおりに入力して味噌汁。
416 :
デフォルトの名無しさん :2008/05/22(木) 01:17:23
>>408 昇順できましたッ
本当にありがとうございました!!
>>412 「・その他ならば削除.」の仕様を満たしていない。
個人的にはstringの宣言も微妙。
420 :
デフォルトの名無しさん :2008/05/22(木) 03:10:44
【質問テンプレ】 [1] 授業単元: プログラミング基礎 [2] 問題文: 問題1実行すると大吉、吉、凶、大凶のどれかを表示するおみくじプログラムを作れ。 ただし、大凶があまり多いと精神衛生に悪いので、大凶の確率は5%とせよ。 問題2コンピュータが乱数で決めた数字(0から99までの間)を人間が当てるゲームを作れ。 人間が推測した数字を入れると、コンピュータはそれより大きいか小さいか答える。 例)% a.out 数字を当ててください? 50 それより大きいです。 数字を当ててください? 75 それより小さいです。 数字を当ててください? 62 当たりです。 問題3逆に人間が決めた数字(0から99までの間)をコンピュータが当てるゲームを作れ。 なるべく少ない回数で当てるようにすること。 大きいか小さいか当たりかは1, -1, 0を入力することで伝える。 例)% a.out その数字は50ですか? 1 その数字は75ですか? -1 その数字は62ですか? 0 当たった! [3] 環境 [3.1] OS: (mac) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C++) [4] 期限: 明日まで(5/23、21時まで) 本当に初心者で勉強してるのですが、さっぱりわからず、 しかしながら単位はとらないと留年しそうなので 本当によろしくおねがいいたします。
422 :
173 :2008/05/22(木) 04:56:55
>>161 ,233,237
遅くなりましたが、k-d tree による領域探索部分だけが完成いたしました。
5次元まで確認しています。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6641.txt これは、領域探索のテストプログラムとなっています。データを発生させて、直接チェックした結果と k-d tree を使用して探索した結果の両方を出力します。
#define K で次元をかえることができます。
main() の min, max で各座標軸の探索範囲を指定しています。
#define MAX はデータ数です。
動かしてみた感じでは、k-d tree の構築が重たいです。教科書によると、上に示した方法では、計算量はο(n log^2 n) のオーダーとのことです。
引き続き、作業いたします。
眠たい。
神降臨か?
>>420 ヒントね。
(1)
乱数を生成させてその値が0.05以下である確率は5%だ(建前は)
だからその値が0.05以下の時に大凶を出す。
残りの95%の3分の1の確率で大吉・吉・凶を出せばいいんだね。
ということは、その値が0.05より大きく0.95/3+0.05以下である時に
大吉、0.05+0.95/3より大きく0.05+0.95*2/3以下の時に吉
それ以外の時に凶を出せばいいんだ。
(2)
これは簡単だから自分でやれ。出来るまで留年しろ
(3)
2分探索でぐぐるんだ。
コンピュータが2分探索をする際に値を比較するが
その値を人間に答えさせるようにコードを改造するんだ。
なんか最近、妙な香具師が紛れこんでるな・・・ スレタイ、スレの趣旨が分かってない奴。 ソースで答える気がないならレスしなくて良いよ。 お前一人の存在なんて無くても問題ないから。
気に入らない質問やレスはスルーの方向で それなりの動作確認テストと冗長性を最適化したソースを 伴わないレスはご遠慮下さい
>>426 気に入る入らない以前にスレの趣旨に沿ってないから
ヒントなんて書かないで結構。丸投げで質問した奴が自分でやるかよw
429 :
側近中の側近 ◆0351148456 :2008/05/22(木) 07:16:20
>>420 (っ´▽`)っ
留年すればいいじゃない☆
ヒントを出すくらいなら、その内容を実行するコードを書いてくれ
普通、出来る友達の回答をメールで転送して提出するに決まってる じゃん。 今時ネットに丸投げする優秀な学生のほうが珍しいんとちゃうか?
自分で一切やろうともしないで丸投げの奴が多いよな
ちなみに俺大学講師で情報処理の講義やってるけど 宿題スレはチェックして丸写しのやつは評価半分にしてる。 さすがに不可にはしないけどな。
せっかく大学側が練習する時間を与えてくれてるのに・・・。 後になって困るのはサボった自分だって、想像力働かないのかね?
友達がいない可能性も。
もし俺が講師だったら、チェックだけでなく、わざわざ回答してあげる。 但し、バグも入れ、コンパイルも出来ないように工夫する。 自分のソースが提出されても、ABCD評価で A:バグ修正されてる B:バグは修正されてないが、コンパイルは通る C:コンパイルは通らないが、コードは自分で入力してる D:コードも自分の書いたものの、まんま だが、こういうのははっきり言って危険な楽しみで絶対にやっては ならないことだな。
>>420 問1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 変数宣言 */
int res, n = 0;
const char* omikuji[4] = {"大凶", "凶", "吉", "大吉"};
void main()
{
/* 実行時の時間で乱数を初期化して実行ごとに違う結果を得られるようにする */
srandom((unsigned int) time(NULL));
/* 0〜19の20通りの乱数を得る。20分率、5%刻み。 */
res = random() % 20;
if(res >= 18) /* 確率10%で大吉 */
++n;
if(res >= 15) /* 確率15%で吉 */
++n;
if(res >= 1) /* 確率70%で凶 */
++n;
puts(omikuji[n]); /* 確率 5%で大凶 */
}
おい!おまえらいい加減にしろよ! なんでC++の問題なのにCで回答よこすんだよ!
キニスンナ、数値計算の部分はそのままで、あとは適当に cin,coutに書き換えチャイナと
>>440 素直にC++知りませんって言ったらどうかな
また基地外STL野郎が必死になってるよ・・・
>>442 srandomで引っかかるだろうけど、それを直せば別にC++コンパイラでも通るかと
>>445 srandom以外にもrandomとvoid mainもあるな。
後者はg++とかだと駄目。
正直、糞ったれなコードすぎるんで、
意図的に変なコード書いてる気もするけど。
>>446 夜中の3時にも関わらず、1時間弱で催促してる
>>421 に切れたんじゃね?w
ざっくりC++に修正してみた
#include <cstdio>
#include <cstdlib>
#include <ctime>
/* 変数宣言 */
int n = 0;
const char* omikuji[4] = {"大凶", "凶", "吉", "大吉"};
int main()
{
/* 実行時の時間で乱数を初期化して実行ごとに違う結果を得られるようにする */
std::srand((unsigned int) std::time(NULL));
/* 0〜19の20通りの乱数を得る。20分率、5%刻み。 */
int res = std::rand() % 20;
if(res >= 18) /* 確率10%で大吉 */
++n;
if(res >= 15) /* 確率15%で吉 */
++n;
if(res >= 1) /* 確率70%で凶 */
++n;
std::puts(omikuji[n]); /* 確率 5%で大凶 */
return 0;
}
×1時間弱
○1時間強
そんなところより
>>420 に問題2と3があったのにいまさら気が付いたw
出勤までに暇があったらこれもC++に修正するか
くどいがうpロダ使ってくれ・・・ソース以外のレスで流れているし・・・
C++の課題にCライクなソースを書いても 間違いじゃないだろうけど減点されると思うぞ。 せっかくなんだからいい点取らせよう。
2chブラウザ使ってないの?
【質問テンプレ】 [1] 授業単元:プログラミング [2] 問題文(含コード&リンク) 身長 150 cm から 170 cm までの標準体重(BMI法で計算)によるの対応を 表示するプログラムを for 文を使って作成せよ。 標準体重は小数点以下を1桁だけ表示すること。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:特になし [5] その他の制限:特になし
つまんね
> double min=0.0,max=99.0; ここをmax=100.0にせにゃ、0〜99にならないことに気づいた
>>455 #include <stdio.h>
#include <string.h>
int main(void)
{
int i;
printf("身長(cm),BMIによる標準体重(kg)\n");
for(i = 150; i <= 170; i++)
{
#define calcIBWByBMI(Height) (Height * Height * 22.0l)
printf("%3d,%.1f\n", i, calcIBWByBMI(i/100.0l));
}
return 0;
}
また無害な罠をしかけてやがる。
>>420 必死すぎるw
パクリだろうがなんだろうが、内容を「自分の言葉」で説明できれば
それはOKだと思うがいかがか>講師の方々
自分の言葉で説明できるやつが丸投げなんかするかよw
>>457 ん。これはいい感じ。
メッセージは変数に格納して
内部では列挙型で判定するのとか。
だからといって丸受けもなんか見苦しいね。 プログラマらしからぬ無思慮って感じ
だから個人的な価値観、主観で〜は○×であるのが相応しいとか良いから。 こんなスレを覗いているお前も同じ穴の狢だし
468 :
346 :2008/05/22(木) 14:24:05
日本語→C/C++言語トランスレータ(最適化機能付き)さんに逆問題が与えられました
471 :
デフォルトの名無しさん :2008/05/22(木) 15:17:50
下記に示す日付の比較関数を作り、プログラム1を完成させよ。 関数の仕様 関数名 compare_date 日付の比較をする関数。 2個の日付(日付1,日付2と呼ぶ)を引数として受け取り、 日付1と日付2のどちらが早いか比較する。 日付1が早いときは 1 を、日付2が早いときは -1を、等しいときは 0 を返すとする 引数 int year1 日付1の年 int month1 日付1の月 int day1 日付1の日 int year2 日付2の年 int month2 日付2の月 int day2 日付2の日 戻り値 int 型で、日付1が早いときは 1 を、日付2が早いときは -1を、 等しいときは 0 を返す。
472 :
デフォルトの名無しさん :2008/05/22(木) 15:21:08
1] 授業単元:プログラミング [2] 問題文 縦、横、奥行きと重さを引数にとり、お急ぎ便でないときの料金を 計算する関数 calc_normal_fee() を作り、この関数を使って 計算をするように変更せよ。 プログラムはコーディング基準に合うよう記述 宅急便の料金が次の様に決まっているとき、 金額計算をするプログラムを作れ。 (何を入力、出力とするかは各自で考えること。 入力待ちの時には適切なメッセージを表示すること。) 縦横奥行きの合計が60cm以内で、かつ重量が 2kg 以下の時 800円 縦横奥行きの合計が80cm以内で、かつ重量が 5kg 以下の時 1100円 縦横奥行きの合計が120cm以内で、かつ重量が 15kg 以下の時 1500円 お急ぎ便の場合は 500円加算される。 [3] 環境 [3.1] OS:Windows visual studio [3.2] コンパイラ名とバージョン: [3.3] 言語:C [4] 期限:5/21 [5] その他の制限:特になし
473 :
デフォルトの名無しさん :2008/05/22(木) 15:22:30
1] 授業単元:c言語 [2] 問題文 西暦年を引数に取り、閏年かどうか判定する関数 is_leap_year() を作成し、 この関数を用いて西暦年を3回入力するとそれぞれが閏年かどうか 判定するプログラムを作れ。 [3] 環境 [3.1] OS:Windows visual studio [3.2] コンパイラ名とバージョン: [3.3] 言語:C [4] 期限:5/21 [5] その他の制限:特になし
>>471 int compare_date(int year1, int month1, int day1, int year2, int month2, int day2)
{
return year1 < year2 ? 1 : year1 > year2 ? -1 : month1 < month2 ? 1 : month1 > month2 ? -1 : day1 < day2 ? 1 : day1 > day2 ? -1 : 0;
}
>>471 int compare_date(int year1,int month1,int day1,int year2,int month2,int day2)
{
if(year1>year2) return 1;
if(year2>year1) return -1;
if(month1>month2) return 1;
if(month2>month1) return -1;
if(day1>day2) return 1;
if(day2>day1) return -1;
return 0;
}
>>472 // x=横,y=縦,z=奥,weight=重量,bl=お急ぎ便ならTRUE,規格外なら-1戻し
int calc_normal_fee(int x,int y,int z,int weight,BOOL bl)
{
int hurry = 0;
if(bl) hurry = 500;
if(x+y+z<=60 && wight<=2) return 800+hurry;
if(x+y+z<=80 && wight<=5) return 1100+hurry;
if(x+y+z<=120 && wight<=15) return 1500+hurry;
return -1;
}
>>473 // year=入力年,閏年なら1,違えば0戻し
int is_leap_year(int year)
{
if(year%4==0&&year%100!=4) return 1;
if(year%400==0) return 1;
return 0;
}
昔の宿題コピペして何がしたいの?
477 :
デフォルトの名無しさん :2008/05/22(木) 18:27:20
[1] 授業単元:コンピュータ言語V [2] 問題文: ある実数を入力して、その数字の「総桁数」・「小数点以下の桁数」を求め ポインタ引数が指す変数に返す関数と、その関数を呼び出して下記のように表示する 表示するプログラムを作成せよ。 例 314.15926 と打ち込むと、 総桁数:8 小数点以下の桁数:5 と表示される。 関数は、 void countno(cher*s,int*a,int*b) とする。 [3] 環境 [3.1] OS:WindowsXP [3.3] 言語:C++ [4] 期限:5月23日の午後2時まで どうかよろしくお願いします。
478 :
デフォルトの名無しさん :2008/05/22(木) 18:44:33
#include<stdio.h> #include<string.h> void countno(char *s, int *a, int *b) { int dot = (int) (strchr(s, '.') - s); int len = strlen(s); *a = len - 1; *b = *a - dot; return; } int main(void) { int fig, dec; char str[256]; fgets(str, 256, stdin); countno(str, &fig, &dec); printf("総桁数:%d\n小数点以下の桁数:%d\n", fig, dec); return 0; } 書いてから気づいたがC++だったのか テストしてないから動作は一切保障できん
>>477 入力に小数点は必ずあるの?
指数形式は考慮しなくていいの?
480 :
352 :2008/05/22(木) 19:18:10
481 :
352 :2008/05/22(木) 19:31:08
すいませんm(__)m。追記です
>>355 の方法とは別の方法でメモリの消費を少なくしたいのですが
>>481 メモリの消費を少なくと言うことは、iostreamの代わりにcstdioを使うと言うことでよろしいか。
483 :
352 :2008/05/22(木) 20:00:56
>>481 とりあえず、iostream を使わずに済むようにしたいんですが。
484 :
346 :2008/05/22(木) 21:01:18
簡単な説明でもかわいませんので
>>346 を解説して下さる方いないでしょうか?
タブを改行に変えるプログラムなのは分かるのですが、条件分岐などの内容が分かりません
>>477 bool countNum(string str, int &total, int &decimal){
int point=0;
total=decimal=0;
for(int i=0;str[i]!='\0';i++){
if(str[i]>='0'&&str[i]<='9'){
switch(point){
case 0:
total++;
break;
case 1:
decimal++;
break;
default:
return false;
}
}
else if(str[i]=='.'){
point++;
if(point>1){
return false;
}
else{
return false;
}
}
return true;
}
486 :
485 :2008/05/22(木) 21:08:07
>>477 インターフェースは見ての通り
str:string型入力させた文字列
total:int型総桁数、参照渡し
decimal:int型小数点以下桁数、参照渡し
あとはメインで呼んで表示させてくれ
#include <iostream> #include <string> using namespace std; void countno(string s, int *a, int *b){ int i, dot = -1, len = 0; for(i=0; s[i]!='\0'; i++){ len ++; if(s[i]=='.'){dot=i;} } switch(dot){ case -1: // dot not found *a = len; *b = 0; break; default: // dot found *a = len-1; *b = len-dot-1; } return; } int main(void){ int fig, dec; string str; while(1){ cout << "input:"; cin >> str; countno(str, &fig, &dec); cout << "総桁数:" << fig << endl; cout << "小数点以下の桁数:" << dec << endl; } return 0; }
最後のファイルの最後の文字読むまでずっとする コンバートするなら次の処理をする タブなら次のタブストップまでの隙間分スペース書く バックスペースなら一文字戻る 文字書く 終わり
490 :
488 :2008/05/22(木) 21:18:03
491 :
485 :2008/05/22(木) 21:21:27
自分で突っ込み
>>485 0000.00000
って入力されたらどうすんだ俺
>>489 apa.123.456
どうすんだ
まぁエラー処理くらい自分でやれと思うが
回答してる方々はよくスラスラ書けますね、書けない私はプログラマ失格だあああ
493 :
488 :2008/05/22(木) 21:23:09
494 :
346 :2008/05/22(木) 21:42:13
>>488 ,493
レスありがとうございます
まさにそのプログラムです
おかげさまで機能概要と処理の流れを理解できました
あとはモジュールインターフェース(引数、戻り値)と内部変数ですが
戻り値はintでいいんでしょうか?
残念ながら
>>485 ,487は
>>477 の要求仕様
void countno(cher*s,int*a,int*b)
を満たしていないぞ。
cher*ってなんだとか思ったりもするが。
>>494 ええええ引数と戻り値も分からないのに理解できたのかよ。。。
戻り値はintじゃないよ。
内部変数については下のような感じだと思います。
FILE *fp がInput stream.
int c がInput character, or EOF.
bool convertがperform translationsのフラグ
uintmax_t columnがColumn of next input character.
size_t tab_indexがIndex in TAB_LIST of next tab stop to examine.
uintmax_t next_tab_columnがColumn the next input tab stop is on.
>>495 重要な変数なのに変数名がa,bってので
そんなクソ要求満たしたくなくなる
498 :
346 :2008/05/22(木) 22:10:28
>>496 intじゃないんですか
内部変数の説明の英文が
>>496 にもありますが
ColumnがとTABLISTが分かりません
499 :
488 :2008/05/22(木) 22:24:39
>>498 > intじゃないんですか
はい、intではありません。
> 内部変数の説明の英文が
>>496 にもありますが
> ColumnがとTABLISTが分かりません
ColumnとTABLISTという内部変数はありません。
>>499 さすがにColumnとTAB_LISTが内部変数じゃないことぐらいは・・・・orz
英語の説明がうまく訳せないというかColumnが分からないんです
>>497 宿題なんだから満たせよw
ま、俺の宿題じゃないからどうでもいいが。
503 :
488 :2008/05/22(木) 23:31:17
>>501 columnは列番号をあらわしてます。0からカウントします。
見かけ上の位置が先頭から何文字目であるか、というものです。
以下の行があるとすると、columnが3の位置にaという文字があります。
expand
また、タブを[tab]と表記し、タブサイズが4である場合、以下の行について
aという文字は6バイト目に存在し、columnが11の位置にあるといえます。
[tab][tab]expand
タブサイズが8である場合は、6バイト目に存在し、columnが19の位置に
あるといえます。
また、重要な点として、タブサイズが4であり、
[tab]x[tab]expand
という行である場合、aという文字は、7バイト目に存在し、columnが11の
位置にあるということです。
処理の内容を理解されたということですので問題ないと思ってはいますが、参考までに。
また、TAB_LISTはグローバル変数のtab_listのことを指しています。
>>502 要求仕様を満たそうにもa、bの中に何を入れるのかが示されていない。
int *a, *b; double d; stringstream ss; string s; cin >> d; ss << d; s = ss.str(); countno( s.c_str(), a, b ) みたいにするか。 これなら 1.02e-2 とか 0000.0000 とか fool.800.fool とか 入力されても大丈夫。
>>503 ありがとうございます
ものすごく分かりやすいです
聞いてばっかりなのもなんなんで自力でちょっとやってみます
[1] 授業単元 C言語 [2] 問題文 キーボードから変数yearに入力された年号について、開催された年に第何回大会が開催(中止)されたか画面にその旨メッセージを出力すること。 [3] 環境 [3.1] Windows XP [3.2] microsoft visual studio 2005 [3.3] C [4] 期限 5月27日 [5] その他 1916年の第6回大会、1940年の第12回大会、1944年の第13回大会は世界大戦の影響で中止された。 ただし中止の場合も回数に数える。 1906年には、近代オリンピック制定10周年記念大会が開催された。 ただし特別大会のため、回数には数えない。 次回は2012年、第30回大会が開催予定。 お願いします。
すみません。問題文に誤りがありました。 [1] 授業単元 C言語 [2] 問題文 キーボードから変数yearに入力された年号について、開催された年に第何回大会が開催(中止)されたか 画面に表示するプログラムを作成しなさい。 またオリンピックイヤーでない場合は画面にその旨メッセージを出力すること。 [3] 環境 [3.1] Windows XP [3.2] microsoft visual studio 2005 [3.3] C [4] 期限 5月27日 [5] その他 1916年の第6回大会、1940年の第12回大会、1944年の第13回大会は世界大戦の影響で中止された。 ただし中止の場合も回数に数える。 1906年には、近代オリンピック制定10周年記念大会が開催された。 ただし特別大会のため、回数には数えない。 次回は2012年、第30回大会が開催予定。 お願いします。
何の第何回大会なのか問題文に記載されていない件
>>507 2008年以降は「開催されていません。」としたけどこれでいいのかな?
#include <stdio.h>
int main(void);
int main(){
int year;
int nopfg = 0;
printf("開催年:");
scanf("%d",&year);
if(year%4!=0 || year<1896 || year>2004){
printf("開催されていません。\n");
return 0;
}
if(year==1916 || year==1940 || year==1944){nopfg=1;}
printf("第%d回大会が%sされました。\n",(year-1892)/4,(nopfg? "中止":"開催"));
return 0;
}
510 :
507 :2008/05/23(金) 01:21:07
単純に与えられた年数を4で割って余りが0の時にオリンピックイヤーとするのは危険だ。 なぜなら、未来の予定はわからないし、 夏と冬で回数は違うし、1994年からは夏と冬は2年おきに交互に開催されるようになる。 プログラム中にマジックナンバーを書き込んで対処するよりも 年表を作って読み込ませ、過去の分と未来の予定とを分けて処理するプログラムに するべきのような気がする。 というわけで今から組むぞ。
514 :
507 :2008/05/23(金) 02:24:15
すみません。もう一問お願いします。
[1] 授業単元
C言語
[2] 問題文
>>507 と同様に、冬季オリンピックについても作成しなさい。
冬季オリンピックの開催年は夏季に比べて少し複雑である。
[3] 環境
[3.1] Windows XP
[3.2] microsoft visual studio 2005
[3.3] C
[4] 期限
5月27日
[5] その他
1924年の第1回大会以来、4年に一度開催されている。
1992年の第16回大会までは、夏季大会と同じ年に開催されたが、
1994年の第17回大会からは、夏季大会の2年後に開催されるようになった。
1940年、1944年は第二次世界大戦の影響で中止。
中止の場合は回数を数えない。
次回は2010年、第21回大会が開催予定。
516 :
422 :2008/05/23(金) 03:15:57
>>161 ,233,237
当方が確認した環境は WindowsXP/cygwin, 処理系は gcc 3.4.4 です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6653.txt これはテストプログラムです。各座標軸とも 0 〜 1000 である n 次元(変更可)のデータを多数(設定可) 発生させて、
中心点(500, 500, ...., 500) との距離が一番小さいデータを探索します。
「距離」は n 次元ユークリッドノルムです。
全数を直接計算して求めたものも表示させています。
で、結論は「全数計算にくらべてのメリットがぜんぜんありません。」
推察される原因は次のとおりです。
・k-d tree の設計がよろしくない。left ノードと right ノードにふりわける基準を中央値としたのがよくなかったと思います。座標成分が同一のデータの振り分けがいいかげんになってしまいました。
このために、「クエリが属する k-d tree 区分空間に属する点を2分探索で求める」というアルゴリズムの精度が悪くなってしまいました。
・次数が高くなると、ユークリッドノルムが大きくなりすぎて、n次元超球が往々にして定義域よりもおおきくなってしまいました。
ということで、私は楽しかったのですが、お役にはたてないことになってしまいました。
k-d tree のインプリメントを根本からかえないといけないでしょうね。
神様の言われることは良くわかりませんね。
>>514 #include <stdio.h>
int main(void);
int main(){
int year;
int times;
printf("開催年:");
scanf("%d",&year);
if(year<1924){
printf("開催されていません。\n");
return 0;
}else if(year==1940||year==1944){
printf("中止されました。\n");
return 0;
}else if(year<1940 && year%4==0){
times=(year-1920)/4;
}else if(year<=1992 && year%4==0){
times=(year-1920)/4-2;
}else if(year<2010 && year%4==2){
times=(year-1994)/4+17;
}else{
printf("開催されていません。\n");
return 0;
}
printf("第%d回大会が開催されました。\n",times);
return 0;
}
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): for文で1から任意の数まで表示するプログラムを作れ。 数字が1つ増えるたびに 終了しますか?y or nと表示し、yが入力されたときはプログラムを終了し、nが入力されたときは プログラムをせずループを続けるようにせよ [3] 環境 [3.1] OS: Win XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 明日 [5] その他の制限: なし
>>521 終了しますか?
どのタイミングで表示?
>>523 1
と表示したあとに表示してNなら
2を表示って事だとおもいます
>>521 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int i, n, exit;
char ss[]="";
printf("任意の数>>");
n = atoi(gets(ss));
for(i=1;i<=n;i++) {
printf("%d\n", i);
printf("終了しますか?y or n ");
if(strcmp(gets(ss), "y") == 0) break;
}
return 0;
}
変数exit消してね
ynの入力されないけど?
528 :
519 :2008/05/23(金) 19:26:54
>>520 その点は問題ありません。お気遣いありがとうございます
531 :
デフォルトの名無しさん :2008/05/23(金) 20:07:38
533 :
デフォルトの名無しさん :2008/05/23(金) 20:11:35
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6658.txt ↑問題文です。
途中まで考えてみました。
バブルソートでやろうかと思ってました。
変数が足りなかったら足して結構です。
#include <stdio.h>
void main(void)
{
int a[10]={25,56,65,80,73,53,68,87,36,78};
int i,j;
printf("整列前:");
for(i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
}
できれば今日中にお願いします。
537 :
デフォルトの名無しさん :2008/05/23(金) 20:26:16
>>536 ありがとうございます。
こっちの説明不足なのですが、Returnを使わない方法でお願いします。
int → void そこらへんは察しry
539 :
デフォルトの名無しさん :2008/05/23(金) 20:48:09
いろいろとやってみたが、 細かなミスがおおい… 俺ダメだ…
>>539 できた!
→コンパイル
→エラー修正
→コンパイル
→実行
→おかしい
→ソースと睨めっこ修正
→完成
こんな流れは良くある事だ
541 :
デフォルトの名無しさん :2008/05/23(金) 20:55:04
>> 519 #include<stdio.h> int main(){ int point[4][5]; int num[4],sum[4]; double ave[4]; int i,j; FILE *fp; fp = fopen("point.txt","r"); for(i=0;i<4;i++){ sum[i] = 0; ave[i] = 0; fscanf(fp,"%d %d %d %d %d %d",&num[i],&point[i][0],&point[i][1],&point[i][2] ,&point[i][3],&point[i][4]); for(j=0;j<5;j++){ sum[i] += point[i][j]; } ave[i] = sum[i] / 5.0; printf("%d sum = %d average = %f ",num[i],sum[i],ave[i]); if(ave[i]>=80.0) printf("Rank A¥n"); else if(ave[i]>=70.0) printf("Rank B¥n"); else if(ave[i]>=60.0) printf("Rank C¥n"); else printf("Rank D¥n"); } fclose(fp); return 0; }
542 :
541 :2008/05/23(金) 20:55:49
課題2 ソートは他見てやってくれ 無駄に2次元配列が…
543 :
541 :2008/05/23(金) 21:09:27
if(ave[i]>=80.0) rank[i] = 'A'; else if(ave[i]>=70.0) rank[i] = 'B'; else if(ave[i]>=60.0) rank[i] = 'C'; else rank[i] = 'D'; } fclose(fp); printf("-->"); scanf("%d",&number); while(number!=0){ if(number==9999) for(i=0;i<4;i++) printf("%d¥t%d¥t%d¥t%d¥t%d¥t%d¥t%d¥t%f¥t%c¥n", num[i],point[i][0],point[i][1],point[i][2],point[i][3] ,point[i][4],sum[i],ave[i],rank[i]); else{ i = number-1001; printf("%d¥t%d¥t%d¥t%d¥t%d¥t%d¥t%d¥t%f¥t%c¥n", num[i],point[i][0],point[i][1],point[i][2],point[i][3] ,point[i][4],sum[i],ave[i],rank[i]); } printf("-->"); scanf("%d",&number); } 課題2追加 ソースがきたねぇ…
544 :
541 :2008/05/23(金) 21:11:28
545 :
541 :2008/05/23(金) 21:24:09
課題3 やってしまった… #include<stdio.h> int gcd(int m,int n); int lcm(int m,int n); int main(){ int a,b; int res; scanf("%d",&a); scanf("%d",&b); printf("GCD = %d¥n",gcd(a,b)); printf("LCM = %d¥n",lcm(a,b)); return 0; } int gcd(int m,int n){ int tmp; while(m%n!=0){ tmp = n; n = m%n; m = tmp; } return n; } int lcm(int m,int n){ return (m*n / gcd(m,n)); }
546 :
519 :2008/05/23(金) 21:25:40
>541 ありがとうございましたm(_ _)m 催促がましくて申し訳ありませんが、残りがおわかりの方、どうかよろしくお願いします
[1] 授業単元:数値計算 [2] 問題文 電圧x 20 40 60 80 100 電流y 1.31 2.93 3.21 4.58 5.46 電圧と電流の筧が与えられた時、最小二乗法によりデータを y=ax+bの一 次関数で表すとき、定数a、bを求めよ。 [3] 環境 [3.1] OS: Windows [3.2] VC 6.0 [3.3] 言語:C++ [4] 期限: ([2008年05月26日08:30まで] [5] その他の制限: 特に無し どなたかよろしくお願いします。 正直教科書読んでも解りませんでした。
549 :
548 :2008/05/23(金) 21:52:48
550 :
519 :2008/05/23(金) 21:55:13
すいません 携帯で542以下が見えてませんでした ありがとうございました
551 :
547 :2008/05/23(金) 22:33:49
>>549 お早い解答有難う御座います。
今見てみました。
この式をどのようにプログラムを作っていくのかが全然解りません。
プログラムのソースも提出しなければいけない上、グラフも必要です。
今の自分の知識力では無理っぽいので、どうかお願いします。
>>525 ワロタ
たまには落ちないこともあるんかねw
>>552 落ちるん?何回やっても落ちないけど
WinXP SP3
Borland C++ 5.5.1
>>519 おいおい、神戸情報大学院大学では学生にルートで作業させているのか?
それとも、プロンプトを#に替える洒落でも流行しているのか?
おまけに、a.outで実行しているってことは、PATHに.を含めているってことか?
555 :
514 :2008/05/23(金) 23:48:21
>>553 落ちるかどうか以前に、ソースを見ればおかしいのが判るだろ。
>>519 課題1
#include <stdio.h>
#include <stdlib.h>
static int cmpa(const void*a,const void*b){ return*((int*)a)-*((int*)b);}
static int cmpd(const void*a,const void*b){ return cmpa(b,a);}
static int(*cmpfs[])(const void*,const void*) = { cmpa,cmpd };
int main(int argc,char**args){
FILE*fp;
if(fp=fopen("in.txt","r")){
char buf[ 2 ]="";
fprintf(stdout,"input sort method. 1.ascending,2.descending\n");
fgets(buf,sizeof(buf),stdin);
if(*buf=='1'||*buf=='2'){
int v,len=1,idx=0,*vals=NULL,m=*buf-'1';
while(fscanf(fp,"%d",&v)==1){
if(len==idx+1){
len <<=1;
if(!(vals=(int*)realloc(vals,len*sizeof(*vals))))exit(1);}
vals[idx++]=v;}
qsort(vals,idx,sizeof(*vals),*(cmpfs+m));
fclose(fp);
if(fp=fopen("out.txt","w"))for(v=0;v<idx;++v)fprintf(fp,"%d\n",*(vals+v));
fprintf(stdout,"write into %s\n","out.txt");
fclose(fp);free(vals);}}
return 0;
}
558 :
541 :2008/05/24(土) 00:22:16
>>547 できた
#include<stdio.h>
int main(){
double x[]={20.0,40.0,60.0,80.0,100.0};
double y[]={1.31,2.93,3.21,4.85,5.46};
double a,b;
int i,j,n;
double xk,yk,xy,x2;
FILE *fp;
xk=yk=xy=x2=0;
a = 0;
b = 0;
n=5;
fp = fopen("test.dat","w");
for(i=0;i<n;i++){
xk += x[i];
yk += y[i];
xy += x[i]*y[i];
x2 += x[i]*x[i];
fprintf(fp,"%f %f¥n",x[i],y[i]);
}
printf("%lf %lf %lf %lf¥n",xk,yk,xy,x2);
a = (n*xy - xk*yk)/(n*x2 - xk*xk);
b = (x2*yk - xy*xk)/(n*x2 - xk*xk);
printf("f(x) = %lf * x + %lf¥n",a,b);
return 0;
}
変数テキトーすぎたwww
559 :
541 :2008/05/24(土) 00:25:22
こんなのやってたらプログラマ育たねぇなぁ…
[1] 授業単元:Cプログラミング
[2] 問題文(含コード&リンク):()
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6659.txt [3] 環境
[3.1] OS: (Windows/Linux/等々)
linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
gcc
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
5月26日
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
構造体を習っているところです。よろしくお願いします。
561 :
541 :2008/05/24(土) 00:43:12
>>560 課題1
POINT getMiddlePoint(POINT p1,POINT p2){
POINT MiddlePoint;
MiddlePoint.x = (p1.x + p2.x) / 2;
MiddlePoint.y = (p1.y + p2.y) / 2;
return MiddlePoint;
}
562 :
541 :2008/05/24(土) 00:44:59
座標はintじゃなきゃだめなのか?
564 :
541 :2008/05/24(土) 01:11:15
>>560 一応やった
void rotatePoint(POINT *p1,int dt){
double rad = dt * M_PI / 180.0;
int x,y;
x = p1->x;
y = p1->y;
p1->x = x * cos(rad) - y * sin(rad);
p1->y = y * cos(rad) + x * sin(rad);
printf("(%d,%d)¥n",p1->x,p1->y);
return;
}
int型じゃ絶対あの結果でないよ…
先生は何を考えているんだ…
565 :
541 :2008/05/24(土) 01:22:59
課題3 #include <stdio.h> #include <stdlib.h> int *makeArray(int argc,char *argv[]) { int num; int *table; int i; if (argc < 2){ fprintf(stderr, "引数が指定されていない¥n"); exit(1); } num = argc -1; table = malloc(sizeof(int) * num); for(i=0;i<num;i++){ *(table + i) = atoi(argv[i+1]); } return table; } int main(int argc, char *argv[]){ int i, num; double sum = 0.0; int *table; table = makeArray(argc,argv); num = argc -1; for (i = 0; i < num; i++){ sum += (double)table[i]; } printf("%d 個の実数の平均値は %.2f です ¥n",num, sum / num); free(table); return 0; }
>>564 ありがとうございます。
では本来はどうするべきなのでしょうか?
567 :
547 :2008/05/24(土) 01:36:43
>>558 有難う御座います!!
素早い解答、お疲れ様でした。
>>554 黙ってれば無知はばれないんだからおとなしくしてろって
569 :
541 :2008/05/24(土) 01:47:24
>>566 座標の値を実数型にすればキレイにでるよ
>>566 これでどう?
round は四捨五入する関数 ( 関数プロトタイプmath.h double round(double); )
void rotatePoint(POINT *p1,int dt){
double rad = dt * M_PI / 180.0;
int x,y;
x = p1->x;
y = p1->y;
p1->x = round(x * cos(rad) - y * sin(rad));
p1->y = round(y * cos(rad) + x * sin(rad));
printf("(%d,%d)\n",p1->x,p1->y);
return;
}
>>569 >>571 ありがとうございます。
ところで、課題2のプログラムは不完全なプログラムだと思うのですが、完全なプログラムを書いていただけないでしょうか?
課題1のほうはなんとか自分で付け加えることができたのですが、課題2のほうは上手くいかなくて・・
ところで
>>565 における課題3のプログラムにおいて、
メモリ不足です云々の処理がなくなっているのはそういう仕様なのでしょうか?
いまいち課題3の意味がわからなくて・・
573 :
541 :2008/05/24(土) 02:14:17
>>572 さすがにそれくらいは自分でやろう
自分のためにならない
課題3は…めんどいから飛ばしただけですorz
>>574 >>554 じゃないんだけど、何がおかしいのか分からん。
rootではないユーザのデフォルトプロンプトが#なシェルがあるってこと?
PATHに.を含める事があまりにもひどい設定であったのはもう過去のことってこと?
>>575 >>574 じゃないけど、大学とかの課題では
暗黙的にシェルは#で表記する。ディレクトリ構成は人によって違うし。
後は、gccで指定せずコンパイルすれば
実行ファイルはa.outになる。
問題文になんらおかしな点はない。
577 :
519 :2008/05/24(土) 04:22:39
>>541 返事が遅くなってすいません
何から何までありがとうございましたm(_ _)m
>>575 だからレスしなきゃバレなかったのに・・・
>>580 ss[]="";
領域指定してないから問題無いでしょ
*limitsのMAX以上にならない限りって意味で
>>581 sizeof(ss)==1
'\0' を考慮して少なくとも領域の大きさとして 2 は必要
領域指定してない場合には必要最低限をコンパイラが自動計算するだけで
勝手に巨大な領域を割り当てたりはしない
583 :
側近中の側近 ◆0351148456 :2008/05/24(土) 08:58:59
(っ´▽`)っ char ss[]=""; n = atoi(gets(ss)); について (1) ssにリテラル文字列""を代入している。 よって、ssは静的領域を指すアドレスが設定されている。 静的領域を勝手に書き換えるなゴルァ! (2) さらに、ssが確保している領域のサイズは\0の1バイトのみ。 1バイトを超えたら記憶領域を壊す。 ってか、何らかの文字を入れた時点で\0と合わせて2バイト以上になるから、 確実にダメだね。
>>583 (1)は違う
配列を確保して "" で初期化している
585 :
側近中の側近 ◆0351148456 :2008/05/24(土) 09:02:51
>>584 (っ´ω`)っ
char *ss="";
と
char ss[]="";
は等価だと思ってたよ・・・いきててごめんね
586 :
側近中の側近 ◆0351148456 :2008/05/24(土) 09:10:43
(っ´ω`)っ char ss[]=""; は char ss[]={'\0'} と等価なのか・・・。
char ss[]="文字列"; これをよく見かけるからchar ss[]="";ってしたんじゃないかな L1の書き方も問題あるよね 後からそれ以上のサイズ書き込まれたらエラーなのに
589 :
側近中の側近 ◆0351148456 :2008/05/24(土) 09:24:55
(っ´▽`)っ で、ガウスの消去法を用いた逆行列算出プログラムを作ったんだが要るかい?
数独を解くプログラムなら見てみたい
1層に81マスの状態を保持するスタックを作ってバックトラッキングを繰り返せば解けるかな。
>>590 数独は真面目に解法を考えるよりも、闇雲に再帰で解いた方が手っ取り早い。
どうせ瞬時に解が得られるなら、工夫をするまでもないだろ。
人によっちゃ解読時間の差はすごい出ると思う 遅い例と早い例合わせて見てみたい気がする
594 :
560 :2008/05/24(土) 09:50:59
>>573 課題2はどうにかできました。ありがとうございます!
課題3はどうしても自分ではできないので、どなたか完全版を書いてくれないでしょうか?
よろしくお願いします。
>>560 の課題3です。。
595 :
側近中の側近 ◆0351148456 :2008/05/24(土) 10:00:13
>>594 (っ´▽`)っ
留年すればいいじゃない☆
どうして留年したくないの?
>>593 同じバックトラッキングでも、1マスずつ、1から9まで当てずっぽうでやったらものすごい計算量になるので
もちろん効率は大事。
1マスずつマメに可能性をチェックして潰していくことが大事
俺なら1マスを16ビットにするかな
4ビットを使って1〜9の数字にする。0を未確定の状態とする。
9ビットで、各数字が入る可能性の状態を保持。
残った3ビットは・・・未使用でも良いしなんかのフラグに使っても良いと思う。
これを81マス分+αでスタックの1層を構築。
で、
1スタックで推定→推定に伴う各マスの評価
を繰り返す。
矛盾が見つかればスタックを1つ前の状態に戻し、推定したマスの可能性を消す。
597 :
560 :2008/05/24(土) 10:19:13
>>595 授業料等が1年分かかるのはきついかと・・
1年分まるまる働けないことにもなるので、合計するとかなりの損失になりますし
また、就職活動において、留年というのは浪人よりもマイナスに見られるらしいです
自業自得だ
599 :
560 :2008/05/24(土) 10:34:39
Fランのゴミクズ低学歴生きてる資格無しのハゲなので留年はきついです・・orz すいませんバカで・
[1] 授業単元: あるゼミの命題 [2] 問題文(含コード&リンク):() ファイル入力でも、プログラム上のランダム作成でも方法は問わず定義された2次元上の4頂点で形成される矩形を最低30以上用い それらを最少面積で敷き詰める為の各矩形の座標を求めよ(最適解でOK) [3] 環境 [3.1] OS: Windows2000 [3.2] コンパイラ名とバージョン: Microsoft Visual C++ 6.0 アカデミック版 [3.3] 言語: C/C++/どちらでも可 [4] 期限: 2008年6月9日AM3:00まで [5] その他の制限: C/C++の標準的な機能以外(フリーのライブラリ等)の使用は禁止 プログラミングコンペのような物です。期限日に各々のプログラムで教授から受け取った矩形データを、一番最適配置出来た人間に、スーパーな特典が出ます。 SA法とか使うとか騒がれていますが、プログラムがサッパリです。お願いします。
601 :
600 :2008/05/24(土) 12:07:04
条件が一つ抜けていました。 矩形を敷き詰める空間は矩形です。(要は正方形) この正方形が最少で、その敷き詰めた各矩形の座標が出ていれば良いそうです。
>>576 ディレクトリ構成については気になんかいないよ。
#じゃなくて$のほうがよくね?って言ってるんだけど。
実行ファイルがa.outになるのは知ってるが、通常の環境で
a.outと入力して実行できるか?って話。
./a.outが普通だろ、と言っている。
>>578 お前のほうが無知だな。
>>597 ほぼ解答に近いものが提示されていて、それを手直しすればいいだけなのに
それすらもできない人を雇う会社の損失については考慮しないのですか?
604 :
560 :2008/05/24(土) 12:32:29
>>603 できないならできないと言え!
ここは宿題を片付けるスレだ!宿題を片付けられない奴が偉そうにレスをするな!
char s[]="ABC"; sは読み取り専用の場合が殆どです。マルチバイトコードの場合はバイトサイズを 間違った為に何の前触れもなく突然死する、深刻なバグが起こるので、読み取り専 用にされてます。それだけでも使いにくいです。プログラムテスター泣かせなコードです。 このコードはコンパイラの最適化能力が低かった為、上記手段で共通文字列を手動で 共有させなければならなかった古い時代の化石コードです。現在は最適化が行われ、 同一内容固定文字列は共有されたコードが出力されます。 ですので、上記sを使って共有させるのと同じことが #define s "ABC" で出来ます。 上記のようなchar s[]を使うのはやめましょう。 将来的に上記構文は廃止されるかもしれません。 それに対して char s[]={'A','B','C','¥0'};は書き込み可能なsを作ります. その代わりマルチバイトキャラクタコードの変更可能文字列変数への宣言時直接初期化は難しくな ってきてます
[1] 授業単元: C言語1 [2] 問題文: xのy乗を求めるPower関数の作成 [3] 環境 [3.1] OS: Windows XP SP2 [3.2] コンパイラ名とバージョン: Microsoft Visual Studio 2005 [3.3] 言語: C言語 [4] 期限: 今日中 [5] その他の制限: main関数はあらかじめ組みあがっていて変更できないです。なので省略しました。 #include <stdio.h> double Power(double x, int y) { int i; double tmp; tmp = 1.0; for(i=1; i<=y; i++){ tmp *= x; } return(tmp); } 実行結果例の x = 4.0 y = -3 x^y = 0.015625 これが導き出せません
>>604 元の処理とmakeArrayの処理を見比べろよ。
メモリ不足の判定処理がどれか分かるだろ?
コピーして貼れよ。それもできないのか?クズ。
期限までに土日2日もあるんだ。無い脳絞って本気で考えろ。
ダメなら日曜の夜にまた来い。で、その時点までの成果を見せろ。
>>554 が最後まで粘着していて無知を晒していてキモスギ
こんなもんできなくて専門の道行くなんて迷惑以外の何者でもないだろう…
最近の大学は専門でなくてもプログラミング初級が必須だったりするけどな
>>606 x^(-y)=1/(x^y) だから,y の符号みればおk
double Power(double x, int y){
int i, n = ( y < 0 ) ? -y : y;
double ret = 1.0;
for ( i = 0; i < n; ++i ) ret *= x
return ( n == y ) ? ret : 1.0 / ret;
}
実際には,これに x が 0 のときとか,ret が 0 になったときとか,
y が 0 か 1 のとき辺りの例外処理を入れれ
614 :
603 :2008/05/24(土) 13:07:22
>>606 抜粋ですが、以下のように変更すればよいです。
int i;
double tmp;
if (y < 0) {
return Power(1/x, -y);
}
tmp = 1.0;
京大と東大卒の教授の下で指導を受けた俺は、大規模な施設のある大学では UNIXを使用していたが、自分のところじゃ % で、a.out でも実行は出来た。 Linux系ではそうでないものもあるが、まぁとりあえず、言うだけ言っておいて 自分が知っていることだけで話をして、相手に無知だってことはないだろ。 俺はお前が無知だなんて言ってないが、お前が通常の環境だの普通だの #じゃなくて$の方が よくね? という個人的な主観でモノを言っている方が 無知丸出しに見えるんだが?自分の経験や知っていることだけがこの世のすべてだとでも? 対面交通じゃ、左側通行より右側通行が多いんだぜ、ベイビー? ジャポネーゼは島国だから、ちったぁ引きこもってねーで海外にでも旅行してみな。 考えが360度変わっちまうぜ。おっと、一周して戻っちまったぜ、ベイビー。
>>615 ごめん。あんまり無知無知言われるのでかっとなった。
ユーザプロンプトが%であるか$であるか、ではなくて、言いたいのは
少なくとも#ではないだろう、ということ。
カレントディレクトリがPATHに含まれているのがOS標準なのか、
/etc/profileに記述されているからなのか、ということ。
後者であればシステム管理者が行ってはいけない設定をしてるよね。
そういう話なんです。
また足りませんでした。 もしカレントディレクトリがPATHに含まれるようなUN*X系で存在するので あればわたしの知識不足でした。
黙ってれば
>>554 だとばれないんだからおとなしくしてろって
>>600 興味がありますが、いま一つ意味がわかりません。
具体的な例を示していただくとわかりやすいと思います。お願いいたします。
プログラムを書ける人!=数学的なアルゴリズムに長けている人 役に立ちそうな資料を載せとくと誰かががんばるかもしれないですよ?
海外旅行にいったら感化されて日本はこれだから駄目だとか言い出すアホを思い出した
624 :
600 :2008/05/24(土) 14:40:13
>>621 おお、ありがとうございます。
口頭で出た問題なので、私が説明不足でした。
30個以上の、様々な大きさの四角形を、正方形に敷き詰める
その正方形が小さければ小さい程良い、と言う問題です。
プログラム部分での、その様々な四角形の与え方は
四角形構造体の配列をランダム初期化で作っても
ファイルに定義してあって読み込んでも、何でも良いそうです。
コンペではCSVファイルで、1行に一矩形の情報(縦横の値、整数2つ)で、数は見てのお楽しみ(30以上は確定)だそうです
625 :
600 :2008/05/24(土) 15:01:06
[1] C++演習: [2] 問題文:キーボードからの、数値入力(制限あり) [3] 環境 [3.1] Windows XP SP/Fedora Linux Core 8 [3.2] VS2005 VC++/gcc++ [3.3] 言語: C/C++ [4] 期限: [5] STLはOKです、boostはちょっと・・・ キーボードから入力した数値を 一番目の数値をint xに、二番目の数値をint yに代入し、それ以降の数値は、 破棄したいのですがどのように書いたらイイデツカ 教えてくださいエロイヒト int main() { istream_iterator<int> iit( cin ); istream_iterator<int> iit_eof; while( iit != iit_eof ) { cout << *iit << endl; iit++; } return 0; }
int x, y; char ss[16]; gets(ss); //例:4278入力 x = atoi(ss[0]); //x = 4 y = atoi(ss[1]); //y = 2 -------------------------------- int i, tmp[16]; for(i=0;tmp[i] != 'e';i++) { scanf("%d", &tmp[i]); } x = tmp[0]; y = tmp[1]; --------------------------- 前者左から1桁目をXへ、2桁目をYへ 後者1文字ずつ入力し、1回目をXへ、2回目をYへ、eで終了
何を言ってるのかね
一番目の数値って数値の先頭の桁のことなのか?
>x = atoi(ss[0]); //x = 4 ひどすぎるw
ところでatoiってcharを渡してもいいんだっけ?
[1] 授業単元:C言語 [2] 問題文 合計で税込み500円以下の買い物をすることにした 消費税別の価格で100円、150円、170円、220円、240円、290円の商品がある この中から2つ選んで500円に一番近い組み合わせを表示しなさい ただし2つの商品は違う種類のものを選ぶこと [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語: C [4] 期限:今月中(できるだけ早めに解答していただけると助かります [5] その他の制限:大学3年レベル お願いします
正しくはconst char*。 なのでss[0]で可。
>>634 const char*にcharが渡せるの?
税抜き460円の組み合わせが最良に思うのだが 170 + 290 = 460、220 + 240 = 460と二つあるんだけれど、 どうしよ? あと、レジは2つまとめて税計算、端数切り捨てでよいの?
atoiが何の略か理解しようってことですよね、わかります。
640 :
側近中の側近 ◆0351148456 :2008/05/24(土) 17:35:31
>>640 priseは大学三年生レベルに合わせてあげてるのか?
642 :
側近中の側近 ◆0351148456 :2008/05/24(土) 17:38:46
(っ´▽`)っ 終わった・・・スペルミスだ (っ´ω`)っ しにたいよぅ
>>640 解答ありがとうございます
こんなに早く答えてもらえるとは思ってませんでした
644 :
側近中の側近 ◆0351148456 :2008/05/24(土) 17:40:52
>>643 (っ´▽`)っ
で、priseで提出するんだよね?当然
>>640 > ただし2つの商品は違う種類のものを選ぶこと
これを実装してないように思えるけどそこは残課題として頑張れって事かな
側近はいつも何かをあえて残しているように思う
とりあえず自分で実行してから発言するように 誰とは言わないが AtoI
実装されてた。死んでくるわw
648 :
側近中の側近 ◆0351148456 :2008/05/24(土) 17:47:07
AtoZですね わかります
651 :
側近中の側近 ◆0351148456 :2008/05/24(土) 17:50:45
(っ´ω`)っ とりあえずatoiを「あとい」と呼ぶ奴はダメだな☆
652 :
626 :2008/05/24(土) 17:56:24
>>626 だす、なんか長くなってシマイマスタ、scanf()は大人の事情で使いたくないので・・・・orz
#include <iostream>
#include <iterator>
#include <string>
#include <sstream>
#include <math.h>
using namespace std;
class Math {
div_t ires;
int iquot, irem;
public:
Math ():iquot(0), irem(0){}
~Math(){}
int HeadFigure(int n);
int Digit(int n);
};
int Math::HeadFigure(int n)
{
int digit = 10;
while( digit < 65535 ) {
ires = div(n, digit);
iquot = ires.quot; // 商
irem = ires.rem; // 余り
if (0 < iquot && iquot < 10)
return iquot;
if (iquot == 0)
return irem;
digit *= 10;
}
return -1;
}
>651 俺はだめプログラマーだたのか。
654 :
626 :2008/05/24(土) 17:57:20
int Math::Digit(int n) { int cou = 1; int digit = 10; while( digit < 65535 ) { ires = div(n, digit); iquot = ires.quot; // 商 irem = ires.rem; // 余り if (0 < iquot && iquot < 10) return cou; if (iquot == 0) return -1; digit *= 10; ++cou; } return -1; }
655 :
626 :2008/05/24(土) 17:57:57
int main() { Math math; int x, y, cou; double result; istream_iterator<int> iit( cin ); istream_iterator<int> iit_eof; while( iit != iit_eof ) { cou = math.Digit(*iit); if (cou == -1) cout << "二桁以上の整数を入力してください" << endl; x = math.HeadFigure(*iit); cout << x << endl; result = x * pow(10.0, (double)cou); y = math.HeadFigure(*iit - result); cout << y << endl; iit++; } }
長くなったならうpろだ使えって
課題内容からは予想できない規模だったようだ
658 :
626 :2008/05/24(土) 18:09:42
>>656 スマン
だめだしタノンマス
class Math
は、使い回しが出来そうなんでわざとクラスにシマスタ
template使ったら、intでもlongでも使えて(現実的にはありえんがw)
より汎用的になると思われるが、そこまでの実力はない・・・orz
intもlongも同じ32bitって環境は多いから凹まずがんばれ
ほんとに先頭二桁取りたいだけだったのか。 なぜこうも。。。そしてなぜ65535。。。
661 :
626 :2008/05/24(土) 18:22:38
>>660 そうそう(^^;
実は、ボードゲームを作っていて、駒を置く座標の入力を
X座標Y座標[enter]で入力したかっただけなんですw
具体的には
35enterってな感じっす
X座標[enter]
Y座標[enter]
ならcinで全然OKだったんだけど、少々意地になってシマイマスタ
>>661 各座標は1-9の範囲で十分ってこと?
string s;
getline(cin,s);
printf("%d %d\n", s[0]-'0', s[1]-'0');
上記のようなやり方では何がダメなの?
こだわるのはいいけれど、こだわりどころを間違えてはいけないと思うよ。
main関数が何も返さないのを直すとか、そういうもっと基本的な部分を
こだわってみようよ。
main関数とかこだわらなくていいだろ それよりもせっかくボードゲーム作るならAIとかにこだわれよ
9マス以内だとオセロか将棋か
665 :
626 :2008/05/24(土) 18:52:55
>>662 return 0;
が抜けてマスタ、コピペの失敗だす
こだわりその2は
istream_iteratorが使って見たかったッス
それから
printf("%d %d\n", s[0]-'0', s[1]-'0');
std::stringはCの配列[]をオーバーロードしてたんですよね、忘れてマスタ、これを忘れてたのは痛い
>>663 AIもおもろそうだけど、socketの実装が先に出来ているんで
サーバーを介して、人 vs 人の、対戦型ボードゲームを先に作ってその後で考えます
>>664 そんなところです
確かにゲーム作りには愛が必要だなぁ。
いや、金だろ
>>626 こんなんどう?
x:1-9 y:a-i
#include<iostream>
#include<string>
#include<cctype>
int main(void){
std::string s;
int x, y;
for(;;){
x=y=-1;
std::cout << "座標を入力してください ";
getline(std::cin, s);
if(s.size()!=2) continue;
for(int i=0;i<2;i++){
if(isupper(s[i])) y=s[i]-'A'+1;
if(islower(s[i])) y=s[i]-'a'+1;
if(isdigit(s[i])) x=s[i]-'1'+1;
}
if(x>=1 && x<=9 && y>=1 && y<=9) break;
}
std::cout << "x=" << x << " y=" << y << std::endl;
return 0;
}
669 :
668 :2008/05/24(土) 23:35:03
ちょっと修正した for(int i=0;i<2;i++){ if(isupper(s[i])) y=s[i]-'A'+1; if(islower(s[i])) y=s[i]-'a'+1; if(isdigit(s[i])) x=s[i]-'1'+1; } ↓ for(int i=0;i<2;i++){ if(isalpha(s[i])) y=toupper(s[i])-'A'+1; if(isdigit(s[i])) x=s[i]-'1'+1; }
[1] 授業単元: プログラミング実習(C) [2] 問題文(含コード&リンク): 共用体を用いた単精度実数型の値のバイトオーダーを変換する関数 (ビッグエンディアン→リトルエンディアン)を作成せよ [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2008年5月28日まで] [5] 以下のコードが与えられています union byteorder { (A) float fval; }; float conv_order_(float *f) { union byteorder buf; buf.fval = *f; (B) return buf.fval; }; (A)と(B)を埋める問題です。 よろしくお願いします。
>>670 union byteorder {
unsigned char bytes[4];
float fval;
};
float conv_order_( float* f )
{
union byteorder buf;
buf.fval = *f;
{
unsigned char temp;
temp = buf.bytes[0];
buf.bytes[0] = buf.bytes[3];
buf.bytes[3] = temp;
temp = buf.bytes[1];
buf.bytes[1] = buf.bytes[2];
buf.bytes[2] = temp;
}
return buf.fval;
}
#include<stdio.h> int main(){ double x[]={20.0,40.0,60.0,80.0,100.0}; double y[]={1.31,2.93,3.21,4.85,5.46}; double a,b; int i,j,n; double xk,yk,xy,x2; FILE *fp; xk=yk=xy=x2=0; a = 0; b = 0; n=5; fp = fopen("test.dat","w"); for(i=0;i<n;i++){ xk += x[i]; yk += y[i]; xy += x[i]*y[i]; x2 += x[i]*x[i]; fprintf(fp,"%f %f¥n",x[i],y[i]); } printf("%lf %lf %lf %lf¥n",xk,yk,xy,x2); a = (n*xy - xk*yk)/(n*x2 - xk*xk); b = (x2*yk - xy*xk)/(n*x2 - xk*xk); printf("f(x) = %lf * x + %lf¥n",a,b); return 0; } ここまでは教えて頂いたのですが、 実際に実行してみるとデバッグでエラーが発生しました。 上のプログラムのどこかを直せばいいのでしょうか?
673 :
670 :2008/05/25(日) 02:02:43
>>672 実際に実行するとエラーが出ずに終わりました。
675 :
1/2 :2008/05/25(日) 02:39:02
char *change(char *); main(){ char *ptr ="I'm"; char *x; x=change(ptr); printf("change()=%s\n",x); } char *change(char *ptr){ char *s; char t; int i,count=0; while(*ptr!='\0'){ ptr++; count++; } ptr-=count; for(i=0;i<=count;i++){ if(*(ptr+i)>=0x41 && *(ptr+i)<=0x5A){ t=*(ptr+i)+32; *(s+i)=t; }else if(*(ptr+i)>=0x61 && *(ptr+i)<=0x7A){ t=*(ptr+i)-32; *(s+i)=t; }else{ t=*(ptr+i); *(s+i)=t; } } *(s+count)='\0'; return s; } 半角英数字文字列の大文字を小文字に、小文字を大文字にするプログラムなんですがセグメンテーション違反を吐き出します。
676 :
2/2 :2008/05/25(日) 02:39:28
続き 簡略化してみたプログラムで main(){ char *ptr="strings"; char *s,t; int i,count=0; while(*ptr!='\0'){ ptr++; count++; } ptr-=count; for(i=0;i<count;i++){ if(*(ptr+i)>=0x41 && *(ptr+i)<=0x5A){ *(s+i)=*(ptr+i)+35; }else if(*(ptr+i)>=0x61 && *(ptr+i)<=0x7A){ *(s+i)=*(ptr+i)-29; }else{ *(s+i)=*(ptr+i); } printf("a"); } *(s+count)='\0'; printf("%s",s); } を作ってみたのですが文字列が4文字以上になるとセグメンテーション違反を吐き出します。 なぜでしょうか?
2/2の f(*(ptr+i)>=0x41 && *(ptr+i)<=0x5A){ *(s+i)=*(ptr+i)+35; }else if(*(ptr+i)>=0x61 && *(ptr+i)<=0x7A){ *(s+i)=*(ptr+i)-29; }else{ *(s+i)=*(ptr+i); } は f(*(ptr+i)>=0x41 && *(ptr+i)<=0x5A){ *(s+i)=*(ptr+i)+32; }else if(*(ptr+i)>=0x61 && *(ptr+i)<=0x7A){ *(s+i)=*(ptr+i)-32; }else{ *(s+i)=*(ptr+i); } です。
sってどこだよ
>>675 sは一体どこを指しているんだ。
初期化していない(どこか知らないテキトーなアドレスを指している)ポインタをアクセスしたら
落ちて当たり前。
4文字未満で落ちなかったのは偶然だ。
>>675 ポインタと変数のスコープの勉強をやり直し
681 :
675 :2008/05/25(日) 04:08:26
配列で解決しました。 ポインタでの問題も理解しました。 局所変数のアドレスを返してしまうスコープの問題も宣言で大域変数にすることで解決しました。 ありがとうございました。
682 :
633 :2008/05/25(日) 14:15:40
633です たびたびすいません もう少し簡単なプログラムはないでしょうか あと価格が290円ではなく390円でした おねがいします
>>682 290を390に書き換えろよ
ソース見れば理解できるだろ
>>683 sizeofを習っていないので使ってないプログラムを
お願いしたいのですが
元:sizeof(prise) / sizeof(prise[0]) 変:6
番兵を使ったほうが分かりやすいのかしら
688 :
デフォルトの名無しさん :2008/05/25(日) 14:40:51
[1] 授業単元:再帰呼び出し [2] 問題文:フィボナッチ数列とは(0,1,1,2,3,5,8,13,21…)のような数列で、n番目のフィボナッチ数Fnは、F0=0,F1=1, Fn+2=Fn+Fn+1(n≧0)で表すことができる。 n番目のフィボナッチ数を返す関数fiboを再帰関数で作成せよ。 [3] 環境 [3.1] OS:WindowsVista [3.2] コンパイラ名とバージョン: [3.3] 言語:C++ [4] 期限:2008年5月26日21:00まで [5] その他の制限: 小文字が出来なくて見にくくなってしまいましたが,よろしくお願いします!
なぁ n番目ってさ、最初は1番目、F1じゃねーのか? 最初のは0番目っていうのか?おかしくね?
[1] 授業単元:プログラミング入門 [2] 問題文:(キーボードから5つの数値を取得し、その合計を出力せよ。 ただし、変数は2つまでしか使えないとする。) [3] 環境 [3.1] OS: (Windows) [3.2] コンパイラ名とバージョン: (gcc) [3.3] 言語: (C) [4] 期限: 5/27 [5] その他の制限: (printf、四則演算、scanfを習いました) よろしくお願いします
>>688 int fibo(int n)
{
const int n_max = 46;
static int cache[n_max+1] = {0};
if(n < 0 || n > n_max) return -1;
if(n <= 1) return n;
if(cache[n]) return cache[n];
return cache[n] = fibo(n-2) + fibo(n-1);
}
>>690 #include<stdio.h>
int main()
{
int sum = 0, v;
scanf("%d", &v); sum += v;
scanf("%d", &v); sum += v;
scanf("%d", &v); sum += v;
scanf("%d", &v); sum += v;
scanf("%d", &v); sum += v;
printf("合計は%d\n", sum);
return 0;
}
690はコピペを推奨するよくない課題だな
コピペせずに頑張る(`・ω・´) #include<stdio.h> int main() { int sum_i = 0, v; for(; (sum_i & 7) < 5; sum_i ++) { scanf("%d", &v); sum_i += v * 8; } printf("合計は%d\n", (sum_i & ~7) / 8); return 0; }
>>692-694 回答ありがとうございます
授業ではなくてやっているものなので
先輩が課題を作っています
>>690 キーボードから取得する数値は、整数のみ?
>695 これって配列の変数1つとループ用の変数1つを使えって問題なんじゃ?
698 :
691 :2008/05/25(日) 15:56:26
>>688 改良しました。
//compile as C++
int fibo(int n){
static int *fibonatti_seq_table=NULL;
static int already_done=1;
if( (n<0) || (n>46) )return -1;
if(n<=1)return 1;
if(n<=already_done)return fibonatti_seq_table[n];
if(fibonatti_seq_table==NULL){
fibonatti_seq_table=new int[47];
for(int i=2;i<=46;i++){
fibonatti_seq_table[i]=fibo(i-1)+fibo(i-2);
already_done=i;
}
}
return fibo(n);
}
>>688 int fibo(int n) {
if (n == 0) return 1;
if (n == 1) return 1;
return fibo(n-1) + fibo(n-2);
}
再帰処理は禁止だな 何でもアリになっちまう。 再帰処理したいんだったっらLISPでもやれ
お前は何を言ってるんだ?
もうプログラマとしての再起不能、なんつって
691の698のコード、業務や宿題で提出したら ぶん殴られるな
>>700 末尾再帰は非再帰に置き換えられるが
アッカーマン関数のような再帰点が複数ある場合は
置き換え不可能
なぜ殴られるの?
>>705 コールスタックを自前で実現すれば見た目非再帰になるけれど?
#include <stdio.h> #include <stdbool.h> static unsigned long long fib(unsigned n) { if (n == 0) return 0; static unsigned long long a[94] = {0, 1, }; bool inRange = n < sizeof(a) / sizeof(* a); if (inRange && a[n] != 0) return a[n]; // if (fib(n - 1) > INT64_MAX) return UINT64_MAX; unsigned long long val = fib(n - 1) + fib(n - 2); if (inRange) a[n] = val; return val; } int main() { for (int n = 0; n <= 93; ++n) { // max fib with ulonglong printf("%d:%llu\n", n, fib(n)); } return 0; }
もうわかったからいいよ
>>698 =691
どうせするならここまでやれ
int fibo(int n){
static int *fib_tb=NULL;
if(n<0)
return -1;
if(n>46)
return -1;
if(n<=1)
return 1;
if(fib_tb)
return fib_tb[n];
fib_tb=new int[47];
fib_tb[0]=fib_tb[1]=1;
for(int i=2;i<=46;i++)
fib_tb[i]=fib_tb[i-1]+fib_tb[i-2];
return fibo(n);
}
712 :
691 :2008/05/25(日) 17:07:00
どうでもいいけど、698は私じゃないです。別人です。
もうわかったからいいよ
714 :
デフォルトの名無しさん :2008/05/25(日) 17:54:54
>>714 #include <stdio.h>
void main(void)
{
int a[10]={25,56,65,80,73,53,68,87,36,78};
int i,j,k;
printf("整列前:");
for(i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
for(i=9; i>=0; i--)
for(j=0; j<i; j++)
if(a[j]<a[j+1]) {
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
printf("整列後:");
for(i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
}
>>714 #include <stdio.h>
void main(void)
{
int a[10]={25,56,65,80,73,53,68,87,36,78};
int i,j,k;
printf("整列前:");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
for(i=0;i<10;i++)
for(j=i;j<10;j++)
if(a[i]<a[j]){
k=a[i]; a[i]=a[j]; a[j]=k;
}
printf("整列後:");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
717 :
デフォルトの名無しさん :2008/05/25(日) 18:15:50
お願いします。 [1] 授業単元:プログラミング基礎 [2] 問題文(含コード&リンク): ある自然数Nを入力し、N以下の3つの自然数a,b,cで、 aの2乗+bの2乗=c2乗 を満たすものを全て表示するプログラムを作りなさい。 ただし、 a<b となっているものだけを表示(a=3,b=4,c=5は表示するがa=4,b=3,c=5は表示しない)。 a,b,cが共通の素因数を持っているものは表示しない(a=6,b=8,c=10は表示しない)。 とすること。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限: ([2008年6月6日まで] [5] その他の制限:簡単な配列や関数までは習いました
>>605 ANSI準拠していない場合にはあり得るかも知れませんが、
それはどのコンパイラの話ですか?
#include<stdio.h>
#include<string.h>
void foo(void){
char s[]="foo Initialized!", *p;
puts("----------");
puts(s);
if((p=strchr(s, '!'))) *p='?';
puts(s);
}
void bar(void){
char *s="bar Initialized!", *p;
puts("----------");
puts(s);
if((p=strchr(s, '!'))) *p='?'; // 本当はやっちゃダメ
puts(s);
}
int main(void){
foo();
foo();
bar();
bar();
return 0;
}
>>718 #include <stdio.h>
int gcd(int a, int b) { return a % b ? gcd(b, a % b) : b; }
int main(void)
{
int a, b, c, n;
scanf("%d", &n);
for(c=1; c<=n; c++) {
for(a=1; a<=n; a++) {
for(b=a+1; b<=n; b++) {
if(c*c==a*a+b*b && gcd(a, b)==1) printf("a=%d b=%d c=%d\n", a, b, c);
}
}
}
return 0;
}
a<=n → a<=c、 b<=n → b<=c にしたほうがいいな
>>718 #include<stdio.h>
#include<math.h>
int gcd(int a, int b){
int c;
while((c=a%b)) a=b,b=c;
return b;
}
int gcd3(int a, int b, int c){
return gcd(a, gcd(b, c));
}
int main(void){
int a, b, c, N, chk;
scanf("%d", &N);
for(c=3;c<=N;c++){
for(b=sqrt(c*c/2)+1;b<c;b++){
a=sqrt(c*c-b*b-1)+1;
chk=c*c-b*b-a*a;
if(chk==0 && gcd3(a, b, c)==1) printf("a=%d b=%d c=%d\n", a, b, c);
}
}
return 0;
}
>>718 int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int main() {
int N, m, n;
scanf("%d", &N);
for (n = 1; n*n <= N; ++n)
for (m = n+1; m*m+n*n <= N; m+=2)
if (gcd(n, m) == 1)
printf("%d %d %d\n", m*m-n*n, 2*m*n, m*m+n*n);
return 0;
}
aとbが互いに素でc*c==a*a+b*bならaとc、bとcも互いに素だろ
726 :
718 :2008/05/25(日) 20:11:29
ありがとうございました。
おねがいします。 [1] 授業単元: Cプログラミング [2] 問題文(含コード&リンク): 1、学生10名の3科目 英語数学国語の成績表がある(値は任意で入力)。 個人別の合計、及び科目ごとの平均を計算するプログラムを、次の仕様に従って組みなさい。 (1)各学生の点数をキーボードから入力すること。 (2)合計、及び平均を求める箇所を関数とすること。 (3)結果をファイル(kekka.txtなど)に出力すること。 (学生名 英語 数学 国語 合計) 2、問題1で作成したプログラムを、合計点が大きい順にソートして出力するように変更しなさい。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VC2005 [3.3] 言語: C/C++どちらでも可 [4] 期限: [2008年5月26日14:30まで] [5] その他の制限:
728 :
デフォルトの名無しさん :2008/05/25(日) 21:09:47
[1] 授業単元:プログラム実験 [2] 問題文(含コード&リンク): 入力された値を2進数に変換せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:bcc [4] 期限: 5月26日まで [5] その他の制限:よろしくお願い致します。
>>729 #include<stdio.h>
int main(void){
int i, n;
scanf("%d", &n);
for(i=0;(n>>i) && i<32;i++);
for(i--;i>0;i--) printf("%d", (n>>i)&1);
printf("%d\n", n&1);
return 0;
}
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): キーボードから入力した数だけ、*(アスタリスク)を表示するプログラムを作れ。 ただし、*を10個表示させるたびに改行を入れよ。 [3] 環境 [3.1] OS: WindowsVista [3.2] コンパイラ名とバージョン:VisualStudio2008 [3.3] 言語:C言語 [4] 期限: [2008年5月28日00:00まで] [5] その他の制限:printf,scanf,for,while,do-while,if,switch文のみ使用可。 お願いします。 「*を入力された数だけ表示」というところはできましたが、10個ごとに改行するのができません。 #include <stdio.h> int main(void) { int x,n,m,y; printf("*(アスタリスク)を表示する数を入力してください:"); scanf("%d",&x); for(n=1;n<=x;n++){ printf("*"); y=n/10; for(m=1;m<=y;m=m+10){ printf("\n"); } } return 0; }
>>731 #include <stdio.h>
int main(void){
int x,n;
printf("*(アスタリスク)を表示する数を入力してください:");
scanf("%d",&x);
for(n=1;n<=x;n++){
printf("*%.*s", !(n%10), "\n");
}
return 0;
}
>>547 うはw同じクラスだww
これで課題間に合いそうだ、スレのおかげで助かったよ。
>>732 早いレスありがとうございます。
ありがたいのですが、
printf("*%.*s", !(n%10), "\n");
の部分について、式が3つあるようなprintf文は習っておらず、意味もわかりません。
申し訳ありませんが、再度お願いします。
>>734 #include <stdio.h>
int main(void){
int x,n,m;
printf("*(アスタリスク)を表示する数を入力してください:");
scanf("%d",&x);
for(n=0;x-n>10;n+=10){
for(m=0;m<10;m++) printf("*");
printf("\n");
}
for(;n<x;n++) printf("*");
printf("\n");
return 0;
}
>>735 本当にありがとうございます!
二度手間かけてすみませんでした。
737 :
◆wYUuBm6d7Q :2008/05/26(月) 01:13:32
>>737 当方の環境は Windows XP/cygwin 処理系は gcc 3.4.4 です。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define N 100000
#define T 100
int main()
{
int n, p, q, st, t, i;
time_t start_time, stop_time;
start_time = time(NULL);
for (i = 0; i < T; i++) {
for (p = 3, n = 1; p <= N; p += 2) {
st = sqrt(p);
for (q = 2; q <= st; q += (q == 2) ? 1 : 2) {
if ((t = p % q) == 0)
break;
}
if (t == 0)
continue;
n++;
}
if (i % 10 == 0)
printf("%d\n", i);
}
stop_time = time(NULL);
printf("n = %d, time: %.3fsec\n", n, (double)(stop_time - start_time) / T);
return 0;
Pentium3(1.0GHz)で 0.11 秒でした。
>>737 失敗しました。もう一度。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define N 100000
#define T 100
int main()
{
int n, p, q, st, t, i;
time_t start_time, stop_time;
start_time = time(NULL);
for (i = 0; i < T; i++) {
for (p = 3, n = 1; p <= N; p += 2) {
st = sqrt(p);
for (q = 2; q <= st; q += (q == 2) ? 1 : 2) {
if ((t = p % q) == 0)
break;
}
if (t == 0)
continue;
n++;
}
if (i % 10 == 0)
printf("%d\n", i);
}
stop_time = time(NULL);
printf("n = %d, time: %.3fsec\n", n, (double)(stop_time - start_time) / T);
return 0;
}
何個あった?
741 :
デフォルトの名無しさん :2008/05/26(月) 03:13:06
とりあえずsqrt(100000)個以下ならおk
>>739 のコードの
printf("%d\n", i);
を
printf("%d %d\n",i,n);
に置き換えて実行した結果
0 9592
10 9591
20 9591
30 9591
40 9591
50 9591
60 9591
70 9591
80 9591
90 9591
n = 9591, time: 0.080sec
744 :
742 :2008/05/26(月) 03:27:24
745 :
743 :2008/05/26(月) 03:44:21
VC6.0での結果(現象) BCC5.0でもやてみたら今度はすべからくn=9591 float(double)をintに置き換えるところ周りが原因なのだろけど VCの場合は、よくわからん。何で一番と二番目以降の結果が 違うんだろか. この謎の解明した人神
0.020sec
t=0 continue; じゃないの?
748 :
1/5 :2008/05/26(月) 04:11:44
>>727 // main.cpp
#include "Student_info.h"
#include "average.h"
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>
int main()
{
using namespace std;
// ifstream infile( "in.txt" );
ofstream outfile( "out.txt" );
Student_info s;
vector< Student_info > students;
// (1)各学生の点数をキーボードから入力すること。
cout << "成績を入力せよ(学生名 国語 英語 数学):" << endl;
copy( istream_iterator< Student_info >( cin ), istream_iterator< Student_info >(),
back_inserter( students ) );
// (2)合計、及び平均を求める箇所を関数とすること。
// (合計は Student_info クラスの メンバ関数)
// (3)結果をファイル(kekka.txtなど)に出力すること。
copy( students.begin(), students.end(), ostream_iterator< Student_info >( outfile, "\n" ) );
outfile << "英語平均:" << average( students, accum_english ) << endl;
outfile << "数学平均:" << average( students, accum_mathematic ) << endl;
outfile << "国語平均:" << average( students, accum_japanese ) << endl;
// 2、問題1で作成したプログラムを、合計点が大きい順にソートして出力するように変更しなさい。
sort( students.begin(), students.end(), compare_sum );
copy( students.begin(), students.end(), ostream_iterator< Student_info >( outfile, "\n" ) );
return 0;
}
749 :
748 :2008/05/26(月) 04:15:24
[1] 授業単元:C言語 [2] 問題文 文字列をキーボードから入力してから逆順にして返す関数を作れ また文字列が奇数と偶数の2通りの結果を出すこと 関数内がポインタの場合も作成せよ #include <stdio.h> void func(char cc[]) { 処理の記述(逆順) } int main(void) { char str[10]; printf("string ->"); 処理の記述(文字列入力) func(str); printf("逆順は%sです\n",str); return(0); } [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語: C [4] 期限今週中 [5] その他の制限:大学レベル お願いします
>>745 謎でもなんでもなくてただの初期化忘れ。
p = 3 を試すときに st = [sqrt(p)] = 1 なので
試し割りするループは回らない。
そのとき t がどうなってるか考えれば分かる。
753 :
752 :2008/05/26(月) 07:24:20
#define DATANUM 3を #define DATANUM 10にしといて
754 :
727 :2008/05/26(月) 07:26:28
755 :
727 :2008/05/26(月) 08:14:07
>>752 すいません、39行目
human[i].name = malloc(sizeof(char)*(strlen(BUFF)+1));
で error C2440: '=' : 'void *' から 'char *' に変換できません。
'void*' から非 'void' 型への変換には明示的なキャストが必要です。
と出るのですが、どこを修正すればよいのでしょうか。
>>737 すみません。不具合がありました。p = 3 のとき、t の値が定まっていないのにif(t == 0) と演算対象にしていたのが原因です。
私が寝ている間にバグを退治していただいて、感謝です。
>>751 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define N 100000
#define T 100
int main()
{
int n, p, q, st, t, i;
time_t start_time, stop_time;
start_time = time(NULL);
for (i = 0; i < T; i++) {
for (p = 3, n = 1; p <= N; p += 2) {
st = sqrt(p);
t = 1;
for (q = 2; q <= st; q += (q == 2) ? 1 : 2) {
if ((t = p % q) == 0)
break;
}
if (t == 0)
continue;
n++;
}
if (i % 10 == 0)
printf("%d\n", i);
}
stop_time = time(NULL);
printf("n = %d, time: %.3fsec\n", n, (double)(stop_time - start_time) / T);
return 0;
}
757 :
742 :2008/05/26(月) 09:30:31
758 :
750 :2008/05/26(月) 10:01:01
750です 期限が今日中になったので早めに解答してくださると助かります
void func(char cc[]) { char *p = cc; whille(*p) p++; while(--p > cc) { char temp = *p; *p = *cc; *cc++ = temp; } }
みなさま本当にありがとうございます!!今日中ということでかなり焦ってたけどたくさんの回答を見て時間内に仕上がりそうです。 本当に助かりました。ありがとうございます!
っつか、うpロダ使え・・・あっ、間違えたってまた書き直したり 一部を削除、追加とかマジうぜぇから
>>760 解答ありがとうございます
もう少し簡単なプログラムはないでしょうか
(defineを使わずにあくまで処理を指定されている部分のみの追加で)
あとポインタの解答もお願いします
>>757 を弄ってみた。アーキテクチャによっては低速化
#define BIT_SET(index) (furui[index/32]|=1<<(index&31))
#define BIT_GET(index) ((furui[index/32]>>(index&31))&1)
int sosuu_count(int max){
unsigned long *furui;
int search_max = sqrt(max);
int i, work, num_sosuu;
if ((furui = (unsigned long*)calloc((max/32 + 1), sizeof(*furui))) == NULL){
fprintf(stderr, "malloc error\n");
return -1;
}
/* 0と1は素数ではない */
BIT_SET(0);
BIT_SET(1);
/* 以降は奇数のみ吟味する */
/* 3, 5, 7… */
for (i = 3; i<=search_max; i+=2){
if (BIT_GET(i) == 0){
/* 3倍、5倍、7倍… */
for(work = i*3; work <= max; work+=i*2) BIT_SET(work);
}
}
num_sosuu=1;
for (i = 3; i<=max; i+=2) num_sosuu+=!BIT_GET(i);
free(furui);
return num_sosuu;
}
ポインタの場合は
>>759 で whille(*p) p++; の部分を while に訂正で
768 :
752 :2008/05/26(月) 12:16:07
>>755 malloc(sizeof(char)*(strlen(BUFF)+1));を
(char *)malloc(sizeof(char)*(strlen(BUFF)+1));
769 :
742 :2008/05/26(月) 12:20:37
>>764 いじくっていただきありがとうございます。
なんかいいチューニング方法が他に無いかなあと思ってました。
車輪の再開発かもしれないですが、おもしろいですね。
>>763 これもポインタを使ってるよ、ということを先生に説明すればいいのでは
>>765 たびたびすみません
fgetsやsizeofは習っていないのでもっと初心者用プログラムはありませんか?
あと関数がvoid func(char *cc)場合もお願いします
>>772 > fgetsやsizeofは習っていないのでもっと初心者用プログラムはありませんか?
初心者の基準が曖昧。授業で習った手法があるならそれを使え。
あとは逆順に並び替える関数にそのまんま渡してやりゃ済むこと。
あと char cc[] でも char *cc でも同じことだから。
777ゲトー!
[1] 授業単元:アルゴリズム [2] 問題文(含コード&リンク): @Dijkstraのアルゴリズム解法を実現するプログラムを作成し、コンパイルして実行せよ。このとき、グラフ中の指定頂点(ここでは頂点0)に対して、全ての頂点への最短経路コストと最短経路を標準出力に表示すること。 〜Graph〜 #define NC 9999 #define N 6 int edge[N][N] = { /* src: 0 1 2 3 4 5 ...dst */ /* 0 */ { 0, NC, NC, 8, 15, NC}, /* 1 */ { 10, 0, 24, NC, 8, NC}, /* 2 */ { NC, NC, 0, NC, NC, 6}, /* 3 */ { NC, NC, NC, 0, 5, NC}, /* 4 */ { NC, NC, 12, NC, 0, 7}, /* 5 */ { NC, NC, 3, NC, NC, 0} }; 〜Result Sample〜 Result (from 0) To 0 : --- To 1 : No Path To 2 : cost 23 : 2 <- 5 <- 4 <- 3 <- 0 To 3 : cost 8 : 3 <- 0 To 4 : cost 13 : 4 <- 3 <- 0 To 5 : cost 20 : 5 <- 4 <- 3 <- 0 ADijkstraのアルゴリズムと、Floydのアルゴリズムについて、空間計算量と時間計算量をオーダーで表現せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名: gcc [3.3] 言語: C [4] 期限: 2008/05/29(Thu) [5] その他の制限: 特にありません よろしくお願いします。
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
任意のコマンドライン引数の平均を計算
ただしmalloc関数で配列用にメモリを確保し、コマンドライン引数の値を格納する処理を
次の関数(int *makeArray(int argc,char *argv[]))として定義し、プログラムを作成し動作を確認せよ。
ただしmakeArray関数はint型の配列の先頭を返すものとし、コマンドライン引数では
整数を指定するようにint型の配列にする。
[3] 環境
[3.1] OS: Vista
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 明日の夜まで
[5] その他の制限:一応例題などを手本に自分で作成したのですが
コンパイル時にこのようにsyntax errorがでてしまいます
kadai8.c:32: error: syntax error before ']' token
32行目はmakeArray(argc1,&argv1[],*table1);です
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6679.txt これが自分で作成したものです
>>779 int *makeArray(int argc, char *argv[]) {
int i, *a = malloc(sizeof(int) * (argc - 1));
for (i = 0; i < argc; i++) {
a[i] = atoi(argv[i]);
}
return a;
}
int main(int argc,char **argv) {
int i, sum = 0, *a = makeArray(argc, argv);
for (i = 0; i < argc; i++) {
sum += a[i];
}
printf("%d", sum / (argc - 1));
return 0;
}
781 :
780 :2008/05/26(月) 18:09:53
782 :
531 :2008/05/26(月) 18:51:51
>>779 これはこれは。週末がんばったかね。
メモリ不足の処理を実装した上で壊しちゃったのかな。
ユーザー関数 calc は学生番号が偶数か奇数かのちがいによって sinθ と cosθ を使い分けるのにどうして引数が kakudo だけなのだ。 グローバル変数を使って関数内部から参照しろとかいう OOPをまるっきり無視したプログラムを組めってことかいな・・・。 それとも kakudo の中に学生番号の情報を埋め込むか。
>>784 深読みしすぎw
偶数、奇数それぞれ違う宿題出ただけ
ん?Cは元々OOP言語じゃないだろ しかし、そういうミスは出題ミスを指摘してOK メモリ解放ミスですよとかね それで優もらってたよ。
すみませんc言語でまちがえるとパソコン壊れることはありますか
ありますが、そうなってしまう事は少ないと思います。
これからはじめるにあたって不安なんでない?ってここ宿題スレか
なんだかんだいいつつ
>>757 のが速いな
>>764 はすごそうなんだけど、数えるためだけにもう一回ループしてる
ので結局速くないよね?
ふかいなあ
1] 授業単元:プログラミング [2] 問題文:txtファイルを読み込みして、入力したデータを部分一致検索するプログラム [3] 環境 [3.1] OS:(WindowsXP) [3.2] コンパイラ名とバージョン:Borland [3.3] 言語:C [4] 期限:5月27日 [5] その他の制限:特になし。 お願いします><
>>791 よければプラットホームを教えて欲しい
ちなみに
Core2Duo E6750 2.66GHz メモリ割当512MB
WindowsXP Pro on VMWarePlayer で
#define N 1000000
にした時
>>757 4.776[msec]
>>764 3.194[msec]
で 30% 程度
>>764 の方が高速だったけど?
797 :
796 :2008/05/26(月) 22:19:33
コンパイラ MinGW gcc 双方ともに -O2 オプション使用
798 :
793 :2008/05/26(月) 22:23:37
ファイルオープンしてそのファイルから検索するソースです。 日本語下手ですいません…
799 :
799 :2008/05/26(月) 22:26:47
すいません、まだおわってません
>>796 P4 2.8G コンパイラはVC、前者が
>>757 後者が
>>764 N=100000 最適化オプション無し
0.780 0.940
N=100000 -O2
0.460 0.310
N=1000000 最適化オプション無し
9.300 9.400
N=1000000 -O2
6.200 4.600
N=10000000 最適化オプション無し
284.300 170.300
Nが大きくなればなるほど
>>764 のほうが速くなるようでした。
最適化も
>>764 のほうがよく効くようでした。
お騒がせしますた。
>>793 だから問題が意味不明w
>txtファイルを読み込みして、入力したデータを部分一致検索するプログラム
>ファイルオープンしてそのファイルから検索するソースです。
入力したデータってなんなんだよ
部分一致ってどの位なんだよ
具体例くらい示せ
802 :
793 :2008/05/26(月) 23:00:21
>>801 例)
txtデータ
1 あいうえお
2 かきくけこ
3 さしすせそ
4 あかさたな
入力データ
えお
出力結果
1 あいうえお
例2)
例)
txtデータ
1 あいうえお
2 かきくけこ
3 さしすせそ
4 あかさたな
入力データ
か
出力結果
2 かきくけこ
4 あかさたな
こんな感じです
804 :
793 :2008/05/26(月) 23:13:41
>>803 具体例って言われたんでわかりやすく書いただけですが。
ついでに何様でもないですよ。
んでスレ違いになりそうなんで消えますね。
すいませんでした。
>具体例って言われたんでわかりやすく書いただけですが。 こういうのを何様っていうんだよw
[1] 授業単元:卒業研究 [2] 問題文(含コード&リンク):コンピュータとチャHしよ♪プログラム [3] 環境 [3.1] OS:Windows [3.2] VisualStudio2005 [3.3] C [4] 期限: [5] その他の制限: あのシーマンのように声を掛けるとその掛けた声に 対して返信するようなプログラム。ただしエッチ中のかけ声に対した返答で あること。また声で反応させるのは難しいので入力した文章に対して 返信すること。 例 自分の名前を入力> Taro 相手の名前を入力> Hana taro>どうだ?気持ちいか? taro:どうだ?気持ちいか? Hana: もうちょっと奥まで・・・ taro>そうか、これでどうだ! taro:そうか、これでどうだ! Hana: あぁぁあああん
807 :
デフォルトの名無しさん :2008/05/26(月) 23:26:37
横レスだが、意味わからん。 何様?って何だよ。 宿題解答者も提出者も対等な関係だろ。 気に食わないなら放置すりゃいいだろ。
だよね エサ与えてもらってる分際で何様だよホント
>>793 #include <stdio.h>
#include <string.h>
#define STR_MAX 256 // 一行読み込み最大
int main(int argc, char* argv[])
{
FILE *fpInput = NULL;
char string[STR_MAX] = {0};
if( argc < 3 ){
printf("実行ファイル 入力.txt 文字列\n");
return 1;
}
fopen_s( &fpInput, argv[1], "r" );
while( fgets( string, sizeof(string), fpInput ) != NULL ){
if( strstr( string, argv[2] ) != NULL )
puts( string );
}
fclose( fpInput );
return 0;
}
てけと。
出力はコンソールでよかったのかな…
>
>>807 は放置で
とか、いちいちスレの総論っぽく促してんじゃねーよw
別に・・・
だって「
>>807 を放置します」じゃ心細いんだもん・・
何様だろうと関係ねぇ、俺は俺様だが、何か?文句ある?
>>806 メッセージテーブル持つしかないんじゃない?
質問したいのですがアップローダーってどうやって使うのですか? それはアップできないファイルですと表示されるのでが 板違いの質問すみません
ここで使われてるアップローダなら 添付可能ファイル : TEXT, LHA, ZIP, C, CPP と書かれているが。 何アップロードしようとしてんの?
wordでアップしようとしてました
[1] 授業単元: C言語 [2] 問題文(含コード&リンク):() 数当て キーボードから何度か数字を入力して当てるゲームを作成しなさい。 ・入力のチャンスは五回までとする ・正解したら、「正解!」と出力して終了する ・不正解の場合は、大小関係や「惜しい!」などヒントを出力する ・五回とも不正解の場合は、正解と「残念!」などのメッセージを出力して終了する 【発展】 乱数生成の関数を使い、プログラムを実行するたびに コンピュータが自動的に正解を用意するように改良しなさい。 [3] 環境 [3.1] OS: (Windows/Linux/等々) Windows XP [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) Micro soft Visual Studio 2005 [3.3] 言語: (C/C++/どちらでも可 のいずれか) C [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 6月2日 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 途中まで書きました。 次のレスに貼ります。
824 :
823 :2008/05/27(火) 02:29:09
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a, i, w; srand((unsigned)time(NULL)); w = rand() % 51 + 1; for(i=5; i>=1; i--){ printf("数字を入力してください。1〜50(あと%d回)\n", i); scanf("%d", &a); if(a==w){ printf("正解!\n"); break; }else if(a == w+5) printf("惜しい! もっと小さい数字です。\n"); else if(a == w-5) printf("惜しい! もっと大きい数字です。\n"); else if(a > w) printf("不正解! もっと小さい数字です。\n"); else if(a < w) printf("不正解! もっと大きい数字です。\n"); } if(i==0) printf("残念!\n答えは%dです。\n", w); printf("終了します。\n"); return 0; } これが限界です。後お願いします。
825 :
デフォルトの名無しさん :2008/05/27(火) 02:42:36
>>823 「キーボードから何度か数字を入力して当てるゲームを作成しなさい。」でググったら90代目のスレで回答ありそうでワロタ
826 :
823 :2008/05/27(火) 02:52:19
824は1つ前のものでした。こっちが新しい方です。出来ればこれを修正して完成させてもらえるとありがたいです。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a, i, w; srand((unsigned)time(NULL)); w = rand() % 51 + 1; for(i=5; i>=1; i--){ printf("数字を入力してください。1〜50(あと%d回)\n", i); scanf("%d", &a); if(a==w){ printf("正解!\n"); break; }else if(a == w+5 || a == w+4 || a == w+3 || a == w+2 || a == w+1) printf("惜しい! もっと小さい数字です。\n"); else if(a == w-5 || a == w-4 || a == w-3 || a == w-2 || a == w-1) printf("惜しい! もっと大きい数字です。\n"); else if(a > w) printf("不正解! もっと小さい数字です。\n"); else if(a < w) printf("不正解! もっと大きい数字です。\n"); } if(i==0) printf("残念!\n答えは%dです。\n", w); printf("終了します。\n"); return 0; }
>>826 …。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int a, i, w;
srand((unsigned)time(NULL));
w = rand() % 51 + 1;
for(i=5; i>=1; i--){
printf("数字を入力してください。1〜50(あと%d回)\n", i);
scanf("%d", &a);
if(a==w){
printf("正解!\n");
break;
}
if(w+5>=a&&a>w)printf("惜しい! もっと小さい数字です。\n");
if(w>a&&w-5<=a)printf("惜しい! もっと大きい数字です。\n");
else if(a > w+5)
printf("不正解! もっと小さい数字です。\n");
else if(a < w-5)
printf("不正解! もっと大きい数字です。\n");
}
if(i==0)
printf("残念!\n答えは%dです。\n", w);
printf("終了します。\n");
return 0;
}
828 :
デフォルトの名無しさん :2008/05/27(火) 03:32:20
間違い探しなんていやだのぅ 試してないけどこんな感じ #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int i, ans, choice; srand((unsigned)time(NULL)); ans=(unsigned int)rand()%10; for(i=5; i>0; i--){ printf("0〜9までの数字を入力してください: "); scanf("%d", &choice); if(! (0<=choice && choice<=9)){ printf("入力は0〜9までの数字でお願いします\n"); continue; }else if(choice==ans){ printf("おめでとう,正解です\n"); return 0; }else if(choice<ans){ printf("もっと大きい!\n"); }else if(choice>ans){ printf("もっと小さい!\n"); } } printf("残念,正解は%dでした\n", ans); return 1; }
1〜50なら w = rand() % 50 + 1 だぜ
>>822 マクロにマルウェアを仕込めるようなフォーマットで、オフィススイートを持ってない人間には読めないようなもの、
アップロードしようと思う方がどうかしています。
ぶっちゃけ、zipにしてからうpすればいいんじゃね? とか思わなくも無い。
832 :
デフォルトの名無しさん :2008/05/27(火) 08:13:28
perror関数について質問です! perrorの説明を見てみると、以下のようにあります。 「関数 perror() は、システムコールやライブラリ関数の呼び出しにおいて、最後に発生したエラーに関する説明メッセージを生成し、標準エラー出力に出力する。」 標準エラー出力に出すだけだったら、fprintf(stderr,...)を使えばいいきがしますが、どのような違いがあるのでしょうか?
スレ違い。
テキストファイルを使ってアップしたいのですがたくさんあってわかりません 何かお勧めのフリーソフトをあったら教えてください 変な質問すいません
アップロードしたいテキストファイルがどれかわからない→ファイル検索ソフト
いっぱいテキストファイルをアップロードしたい→圧縮ソフト
うpろだがいっぱいあってどれを使えばいいかわからない→
>>1 さぁどれだ
837 :
823 :2008/05/27(火) 11:00:17
色々な解答ありがとうございます。 課題ではないのですが、入力された数字が1〜50以外の場合に、繰り返し入力させるようにするにはどうすればいいですか? 少し気になっただけなのでスルーしてもらっても構いません。
>>837 while(1){
printf("数字を入力してください。1〜50(あと%d回)\n", i);
scanf("%d", &a);
if(a>0&&a<=50)break;
printf("入力は1〜50の範囲でお願いします。\n");
}
839 :
デフォルトの名無しさん :2008/05/27(火) 11:14:55
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク) 与えられた非減少非負整数列がグラフ的であるかどうかを判定する 関数 isDegreeSequence を C言語を用いて作れ。関数仕様は次の 通りとする。 int isDegreeSeqence(int d[], int p) は、配列dに入った長さpの 非減少非負整数列を次数列としてもつようなp頂点単純グラフが 存在するときに、1を戻り値として返し、存在しないときに0を返す。 main 関数も作って,きちんと動くことが分かるプログラムにする。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 5月30日まで [5] その他の制限: よろしくお願いします。
840 :
デフォルトの名無しさん :2008/05/27(火) 13:02:16
[1] 授業単元: C++ [2] 問題文(含コード&リンク):() 2008年は閏年(うるうどし)である。 現在の暦において閏年は, 地球が太陽の周りを公転する周期が, 約365.24日であることに由来する調整法である。 閏年でない年は平年という。 キーボードから西暦を入力し 入力された年が閏年かどうか判定する プログラムを作成しなさい。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限: 6月3日 [5] その他の制限:
[1] 授業単元: C++ [2] 問題文(含コード&リンク):() 今年(2008年)はオリンピックイヤー (オリンピック開催年)である。 8月8日から24日までにかけて,中国の北京で 夏季オリンピック第29回大会が開かれる。 次の説明はオリンピックの開催年についての説明である。 キーボードから変数year に入力された年号について, 開催された年に第何回大会が開催(中止)されたか 画面に表示するプログラムを作成しなさい。 またオリンピックイヤーでない場合は、 画面にその旨メッセージを出力すること。 【説明】 ・1896年の第1回大会以来、4 年に1 度開催されている。 ・1916年の第6回大会,1940年の第12回大会,1944年の第13回大会は 世界大戦の影響で中止された。ただし中止の場合も回数は数える。 ・1906年には,近代オリンピック制定10周年記念大会が開催された。 ただし特別大会のため,回数には数えない。 ・次回は2012年、第30回大会がロンドンで開催予定。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限: 6月3日 [5] その他の制限: 2問ありますが、よろしくお願いします!
次数の和が偶数であるときグラフ的であるというのはわかったんだけど それが単純グラフであるのかどうかをチェックするにはどーしたらええねん。
受け取れない文字列拾うと暴走するようなscanfなんてわけもわからずに使わせるなよ。
それ以前に○産大未満の基地外が来るなよw
次数列の要素数がその最大次数よりも小さいとき ループまたは多重辺を含むと考えていいのかしらん? プログラムよりも数学の方が難しいぜ。あははん。
846 :
デフォルトの名無しさん :2008/05/27(火) 15:20:45
今、C言語の問題をやってますが難しくて分かりません。 どのようにやったら良いでしょうか? //------------------------------------------------------ // C言語基礎 問題 // 3人の学生の英数国理社のテストの点数データが // それぞれ配列にある // 学生それぞれの平均点と科目別に平均点を出せ //------------------------------------------------------ #include <stdio.h> #include <stdlib.h> void main(void) { // 英 数 国 理 社 static int seito1[]={41,93,64,88,33}; static int seito2[]={84,31,78,53,57}; static int seito3[]={54,34,59,46,58}; }
1] 授業単元: C++ [2] 問題文 キーボードから入力される2つの整数を変数a、bに格納し、 aの0乗からaのb乗までを順に出力するプログラムを作成せよ。 ただし変数bは0以上の整数が入力されるまで、入力を繰り返すものとする。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限: 6月10日 [5] その他の制限: [1] 授業単元: C++ [2] 問題文 キーボードから2以上の整数を入力し、その数が素数であるかどうかを判断するコードを記述せよ。 ただし入力される数値が2以上でない場合、繰り返し入力を求めること。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C++ [4] 期限: 6月10日 [5] その他の制限: よろしくお願いします。
>>846 #include <stdio.h>
#include <stdlib.h>
int main(void)
{
// 英 数 国 理 社
static int seito1[]={41,93,64,88,33};
static int seito2[]={84,31,78,53,57};
static int seito3[]={54,34,59,46,58};
static int average[]={0,0,0,0,0};
char str[5][10]={"english","math","japanese","science","society"};
int i;
float sum1=0,sum2=0,sum3=0;
for(i=0;i<5;i++){
sum1 += (float)seito1[i];
sum2 += (float)seito2[i];
sum3 += (float)seito3[i];
average[i] = seito1[i] + seito2[i] + seito3[i];
}
printf("生徒1の平均点:%.2f\n",sum1/5);
printf("生徒2の平均点:%.2f\n",sum2/5);
printf("生徒3の平均点:%.2f\n",sum3/5);
printf("科目平均\n");
for(i=0;i<5;i++) printf("%s:%.2f\n",str[i],(float)average[i]/3);
return 0;
}
力押し
>>848 ありがとうございます。
あと、この2つも分かりますか?
//--------------------------------------
// 半径 73cmの円の面積を求めよ
// だたし、円周率は3.14とする
//--------------------------------------
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
}
//------------------------------------
// 乱数(0~32767)を発生させ
// 30000以上が20回出たら終わる
// プログラムを作成せよ
// ただし、乱数列の開始点は30000とする
//------------------------------------
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
}
>>849 >1
int main()
{
printf("%gcm^2\n", 3.14 * 73 * 73);
return 0;
}
>>849 > // ただし、乱数列の開始点は30000とする
意味が分からん。
>>849 >>(2) 最初の30000が出るまで読み飛ばす、と見なした。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void);
int main(){
int i=0, cnt=0, count_start_fg=0, r;
srand((unsigned)time(NULL));
while(cnt < 20){
i++;
r = rand() % 32768;
if(r >= 30000){
if(r == 30000){count_start_fg = 1;}
if(count_start_fg == 1){
cnt++;
printf("%d番目の乱数=%d\n", i, r);
}
}
}
return 0;
}
>>840 int leap_check(int y){
#define chk(y,n,x) if(!(y%n)){return x;}
chk(y,400,y);
chk(y,100,0);
chk(y,4,y);
return 0;
}
>>847 こんな感じでどうかな?1つ目
#include <iostream>
using namespace std ;
void main(void)
{
long nRet = 1;
int a,b ;
cout << "一つ目の数" << endl ;
cin >> a ;
for(;;){
cout << "二つ目の数" << endl ;
cin >> b ;
if(b > 0) break ;
}
cout << "------------------" << endl ;
cout << "1" << endl ;
for(int i = 1; i <= b; i++){
nRet *= a ;
cout << nRet << endl ;
}
}
>>847 2つ目
void main(void)
{
long nRet = 1;
int a ;
for(;;) {
cout << "判定する数(2より大きい数)" << endl ;
cin >> a ; if(a > 2) break ;
}
for(int i = 0; i < a - 1; i++) {
nRet = nRet * 2 ;
}
if(nRet % a == 1) cout << "素数かな?" << endl ;
else cout << "素数じゃないかも" << endl ;
}
多分 r = rand() % 32768; は乱数にならない。
>>856 完全乱数は宿題の趣旨には無いと思うから、timeで揺らせば充分じゃね?
標準ライブラリでもっといいの有る?
>>836 問題を書くためのテキストファイルを探してます
笑った
862 :
デフォルトの名無しさん :2008/05/27(火) 19:31:56
[1] C [2] 1から9までの9つの数字が順番にならんでいる。数字の順番を変えずに全て用いて、途中に+を1個、−を2個入れると、 例えば次のような式ができる。 123−45−67+89=100 1234+5−6−789=444 同様の方法で 450,500,666を作る方法をすべて見つけなさい [3] [3.1] Linux [3.3] C [4] 5月29日
すいませんもう1つ [1]C [2] 以下は2以上の整数を素因数分解するプログラムである。 #include<stdio.h> #include<stdio.h> main(){ int d,n; do{ printf("2以上の整数を与えてください\n"); scanf("%d",&n); }while(n<2); printf("%d=1",n); while(n%2==0){ printf("*2"); n/2; } for(d=3;d*d<=n;d++,d++){ while(n%d==0){ printf("*%d",d); n/d; } } if(n!=1)printf("%d",n); puts(";"); } 2以上の整数で素数でないもののうち、K番目に小さいものをp[k]とすると、 小さなkについてp[k]を素因数分解したものは以下のようになる。 p[1]=4=1*2*2; p[2]=6=1*2*3; p[3]=8=1*2*2*2; p[4]=9=1*3*3; 問題:p[4000000],p[4500000],p[5000000],p[5500000]の値と、それぞれの素因数分解を示せ これを求めるにあたって、上記の素因数分解のプログラムを参考に、 素因数分解を行う関数を持ったプログラムを作ること。 プログラムでは変数nを定義して、n=2,3,4、、、と順に増やしながら、 nを素因数分解して素数か判定しなさい [3.1]Linux [3.3]C [4]5月29日
1は素数じゃないし、素因数として扱うのはどうかと・・・
1* は省いたほうがいいんですかね?… 全く答えが見えてこないので助けて下さい。お願いします。
866 :
863 :2008/05/27(火) 20:06:50
>>863 の
プログラム2行目の
#include<stdio.h> → #include<stblib.h>
です。
>>863 #include<stdio.h>
int hoge(long prime[], long value){ // 素因数分解
long i, j=0;
for(i=2;value/i>=i;i++){
if(value%i==0){
value/=i;
prime[j++]=i;
}
}
prime[j++]=value;
return j;
}
int main(void){
long i, j, prime[32], prime_num, index, index_list[]={1,2,3,4,4000000, 4500000, 5000000, 5500000, 0}, index_index;
for(i=2,index=1,index_index=0;;i++){
if((prime_num=hoge(prime, i))!=1){
if(index_list[index_index]==index){
printf("p[%ld]=%ld=%ld", index, i, prime[0]);
for(j=1;j<prime_num;j++) printf("*%ld", prime[j]);
printf("\n");
index_index++;
if(index>index_list[index_index]) break;
}
index++;
}
}
return 0;
}
868 :
531 :2008/05/27(火) 20:38:01
>>862-863 なかなかおもしろい課題を出す学校だねぇ
ありきたりじゃない感じ。
>>867 とりあえず、8が2*4になっちゃいますね。
870 :
863 :2008/05/27(火) 20:53:33
>>867 どうもありがとうございます。
実行してみます。本当にありがとうございます。
871 :
867 :2008/05/27(火) 20:55:15
[1] 授業単元:C言語 [2] 問題文 問題() 1〜nまでの数のうち、素数を出力させるプログラムを作成せよ。 問題(2) 10進整数(0-255)を2進数に変換するプログラムを作成せよ。 [3] 環境 [3.1] OS:windows [3.2] コンパイラ名とバージョン:Borland C [3.3] 言語: C [4] 期限今週中 [5] その他の制限:ありません
>>868 君の出席番号がわからないとどうしようもないよ
所詮○産大未満か、3流以下め。キモイ顔文字使うなw
>>874 ありがとうございます
(2)は自己解決しました
こういうことでした
↓
#include <stdio.h>
void bin(int n);
int main(void)
{
int i,k;
scanf("%d",&k);
printf(" 2進数:"), bin(k), printf("\n\n");
return 0;
}
void bin(int n)
{
int a[8], i;
for (i = 0; i < 8; i++, n /= 2)
a[i] = n % 2;
for (i = 7; i >= 0; i--)
printf("%d", a[i]);
}
877 :
868 :2008/05/27(火) 21:23:10
>>868 すいません記述し忘れましたm(__)m
番号は120でお願いします。(実行するときは20*2の値で)
麻呂のクソースは所詮、ナッパレベルさ。ベジータ(団子)さんよぉ、 もちっとエリートらしいイケメソースを書いて下さいな
[1] 授業単元:C言語 [2] 問題文 問題 1〜nまでの数のうち、素数を出力させるプログラムを作成せよ。 [3] 環境 [3.1] OS:windows [3.2] コンパイラ名とバージョン:Borland C [3.3] 言語: C [4] 期限今週中 [5] その他の制限:ありません すいません、どなたかもういちどおねがいします
>>883 マインスイーパのように自動で開ける限り開く機能はいらないのかね?
>>884 なんかしらんけどあちこちのWebサイトに勝ったなwおめwww
>>886 かなりの確率で一回で場所が分かっちゃうよw
>>884 どうして配列使わずに解けるのか、おじさん一瞬よくわからなかったよ。
>>886 Phaseに入れた数字分動くプログラムでお願いします
>>888 自動で開ける限り開くマインスイーパでも一回ではクリアできないよ><
892 :
883 :2008/05/27(火) 21:59:09
883です 訂正がありました。すいません Input : e6(入力) GET!!(宝を見つけたら表示される) Phase = 4(ゲーム回数) Treasures left = 7(宝の残り) a b c d e f g h i j 0 + + + + + + + + + + 0 1 + + + + + + + + + + 1 2 + + + + + + + + + + 2 3 + + + 0 + + + + + + 3 4 + + + + + + + + + + 4 5 + + + + + + + + + + 5 6 + + + 1 $ + + + + + 6 7 + + + + + + + + + + 7 8 + + + + + + + + + + 8 9 + + + + + + + + + + 9 a b c d e f g h i j 宝をGETしたときに宝の残りの数をへらすのを忘れてました m<_ _>m
>>891 ちょっと試してみた
10x10盤に爆弾が7個以上あれば一回で解けることは少なかった
6個以下の場合は一回で解ける可能性大だった
>>893 なんということ。
確かにマインスイーパ初級が10x10で爆弾10個だった。
少ないと全部あいちゃうのね。適当なこといって酢マンコ
[1] 授業単元: [2] 問題文: You are writing firmware for an exercise machine. Each second, a routine in your firmware is called which decides whether it should display the percentage of the workout completed. The display does not have any ability to show decimal points, so the routine should only display a percentage if the second it is called results in a whole percentage of the total workout. Given a string time representing how long the workout lasts, in the format "hours:minutes:seconds", return the number of times a percentage will be displayed by the routine. The machine should never display 0% or 100%. CONSTRAINTS -time will be a string formatted as "HH:MM:SS", HH = hours, MM = minutes, SS = seconds. -The hours portion of time will be an integer with exactly two digits, with a value between 00 and 23, inclusive. -The minutes portion of time will be an integer with exactly two digits, with a value between 00 and 59, inclusive. -The seconds portion of time will be an integer with exactly two digits, with a value between 00 and 59, inclusive -time will not be "00:00:00". [3] 環境 [3.1] OS: Linux [3.2] gcc [3.3] 言語: C++ [4] 期限:今週中 [5] その他の制限:習ってるのはポインタ、配列、関数の初歩程度です。
>>894 全部あくんじゃなくて全部の爆弾の場所が分かるだけ
[2] 問題文
16kHz、16bitで録音しwav形式で保存されたファイル
を読み込み、波のデータのみをwave.datという名前のファイルに出力するプログラムを作成せよ
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名:gcc
[3.3] 言語: C言語
[4] 期限:5/31
[5] その他制限:
wave.datの中身は
1
2
3
15
4
7
:
:のようにgnuplotですぐに読み込めるような形にする。というものです
http://www.kk.iij4u.or.jp/~kondo/wave/ のサイトを参考にしているのですがわかりません。
よろしくお願いします
900 :
868 :2008/05/27(火) 22:33:58
868に追加で [5] その他の制限:学籍番号120でお願いします。
おまえらマインスイーパスレへ行け。
>>895 トータルの時間はどうやって指定すればいいの?
903 :
デフォルトの名無しさん :2008/05/27(火) 22:45:14
>>895 #include<stdio.h>
void display(long whole_time, long left_time){
long rate;
rate=(left_time-1)*100/whole_time+1;
if(whole_time*rate/100==left_time && left_time!=0 && left_time!=whole_time){
printf("%2ld%%\n", rate);
}else{
printf("%02ld:%02ld:%02ld\n", left_time/3600, (left_time/60)%60, left_time%60);
}
}
int main(void){
long whole_time, left_time;
whole_time=333; // second
for(left_time=whole_time;left_time>0;left_time--){
display(whole_time, left_time);
}
return 0;
}
905 :
904 :2008/05/27(火) 22:51:57
スマン、C++指定だった C++はパスです
俺、第二外国語はスペイン語だったんで、英語は読めないんだ。ははは。
第一外国語は日本語に決まってるだろ。
>>892 爆弾じゃないところ指定したときの仕様がわからん。
0,1 となってるが、2,3,4と行くのか?
2桁になったら、隣の数字とくっついてみにくくなりそうだが。
/*
>>903 */
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <math.h>
int main(void) {
int a[10];
int sum = 0;
int n_max = INT_MIN;
int n_min = INT_MAX;
char buf[80];
int i;
for (i = 0; i < 10; i++) {
printf("データ[No. %d]を入力してください:", i+1);
a[i] = atoi(fgets(buf, sizeof(buf), stdin));
n_max = MAX(n_max, a[i]);
n_min = MIN(n_min, a[i]);
sum += a[i];
}
puts("データ一覧を表示します");
for (i = 0; i < 10; i++) printf("[%d] %d", i+1, a[i]);
putchar('\n')
printf("合計値: %d", sum);
printf("平均値: %.2f", (double)sum / 10.0);
printf("最大値: %d", n_max);
printf("最小値: %d", n_min);
return EXIT_SUCCESS;
}
911 :
904 :2008/05/27(火) 23:09:25
>>895 whole_time < 100 の時に正しく表示されなかったので
>>904 の訂正
void display(long whole_time, long left_time){
long rate;
int is_percentage=0;
rate=left_time*100/whole_time;
if(whole_time*rate/100==left_time) is_percentage=1;
if(whole_time*(rate+1)/100==left_time) rate++,is_percentage=1;
if(is_percentage && left_time!=0 && left_time!=whole_time){
printf("%2ld%%\n", rate);
}else{
printf("%02ld:%02ld:%02ld\n", left_time/3600, (left_time/60)%60, left_time%60);
}
}
912 :
デフォルトの名無しさん :2008/05/27(火) 23:12:28
/* ミスった */ #include <stdio.h> #include <stdlib.h> #include <stddef.h> int main(void) { int a[10]; int sum = 0; int n_max = INT_MIN, i_max; int n_min = INT_MAX, i_min; char buf[1024]; int i; for (i = 0; i < 10; i++) { printf("データ[No.%2d]を入力してください:", i+1); array[i] = atoi(fgets(buf, sizeof(buf), stdin)); if (n_max < a[i]) { i_max = i+1; n_max = a[i]; } else if (a[i] < n_min) { i_min = i+1; n_min = a[i]; } sum += a[i]; } puts("データ一覧を表示します"); for (i = 0; i < 10; i++) printf("[%d] %d", i+1, a[i]); printf("\n合計値: %d", sum); printf("平均値: %.2f", (double)sum / 10.0); printf("最大値: %d(No.%d)", n_max, i_max); printf("最小値: %d(No.%d)", n_min, i_min); return EXIT_SUCCESS; }
>>909 0や1はその周り(八方)に宝(爆弾)が0個もしくは1個ありますよっていう表示です
書き方がわかりにくくてごめんなさい
あーそうか、まんまマインスイーパーの仕様か。
916 :
◆FbQrKbwE2g :2008/05/27(火) 23:35:05
あの、本当にくだらなすぎてテンプレに全くあてはまらない質問なのですが・・・ プログラムは自分で考えますのであつかましいのですが考え方を教えて頂ければと・・・。 windowsのC++で、期限は三日ほどです。 初心者レベルだと思います。実験機器の制御に使います。 機器に繰り返し計測させる事で増加していく出力値が、ある値で増加をやめた際に、その値だけを出力したいとなれば、どうすればよろしいのでしょうか。 一つ前の値と現在の値の差がほぼゼロになった時の値を出力させれば良いのだろうか等と考えてはいるのですが、これをどうすればいいかわかりません。
>>916 なにかしらの型 ひとつ前の値を保存する変数( Aとする )
なにかしらの型 現在の値を保存する関数 ( Bとする )
if ( A - B < ほぼゼロ )
出力 B
ほぼゼロっていうんだから整数ではないんだろうけど…
内容さらせないなら先輩にでも聞けよ
>>900 #define PI 3.14159 // π
#define STUDENT_ID 120 // 学籍番号
enum { SIN, COS }TRI_FUNC;
int main(void)
{
}
double calc(const double Degree, const TRI_FUNC SINorCOS)
{
double Radian = 0;
Radian = Degree / ( 180 * PI );
if( SINorCOS == SIN ){
return sin(Radian);
}else{
return cos(Radian);
}
}
テンプレートに従ってやるとなんか悲しいので
関数部だけ…
for(初期値から増加やめるまで){ 計測 出力 }
>>916 ピークは一箇所だけ?
それとも正弦波のように何度も上下のピークができてその度に記録が必要?
921 :
◆FbQrKbwE2g :2008/05/27(火) 23:48:53
>>917 すいません、晒す内容自体ない感じで・・・
なにかしらの型 ひとつ前の値を保存する変数( Aとする )
なにかしらの型 現在の値を保存する関数 ( Bとする )
これがよく分からないんです。どうやってひとつ前と現在を分けて保存させるんですか?
922 :
◆FbQrKbwE2g :2008/05/27(火) 23:49:56
>>920 返答ありがとうございます。ピークは一箇所だけです。
923 :
863 :2008/05/27(火) 23:55:55
>>869 今更返信ですが、そう言ってもらえると行ってるかいがあります
でもレポート1回も全部解けて出せたことないですが…
>>871 了解しました
ありがとうございます
>>921 int before=0,now=0;
while(INPUT(now) < before) before = now;
intは適当に、INPUTは装置からデータ取ってくる。
1.データをnowに代入したら、前回の値と比べる。
2.前回の値より小さければ、前回の値に今回の値を代入。
3.再びデータを取ってくる(1に戻る)。
926 :
900 :2008/05/28(水) 00:00:29
>>918 いえいえ、関数部だけでも十分すぎるくらいですよ(^^ゞ
お手数かけてすみませんでしたm(__)m。
ありがとうございます。
>>911 トータル時間が与えられたときにパーセント表示する回数を求めよって問題じゃね?
928 :
◆FbQrKbwE2g :2008/05/28(水) 00:17:14
>>924 ありがとうございます。
最初どっちもゼロにしといて、ゼロよりnowが大きければbeforeにnowを入れる(出発)、またnowを取って来て、beforeよりnowが大きければbeforeにnowを・・・
って感じと取らせていただいたのですがよろしいでしょうか?
いや全く思いつきませんでした・・・
>>928 それでおk
ただ、ごめん・・・そのwhileの条件式だと、
初めにnowが絶対値をとってこないとループから出てしまう。
そこは微調整してがんばってくれ
あと、ところどころにボムとかBOMって言葉が出てくるけど、宝と同義だと思ってくれ。
932 :
◆FbQrKbwE2g :2008/05/28(水) 00:30:28
>>929 分かりました!ありがとうございました。
>>865 >>858 問題文が書かれたファイルをアップロードしたい
→ワード形式のファイルなのでできない
→よく分からないけどTEXTとやらにすればOKらしい
→ググってみたらそれらしいフリーソフトがいっぱいあった
→どれ使ったらいいの?
という事か?メモ帳でいいんじゃね
>>930 解答ありがとうございます
#define MASK_BOM 0x0001 /* 宝 */
#define MASK_HIDE 0x0002 /* まだオープンしてない */
#define MASK_AROUND 0xFF00 /* 周囲の宝の数は、この位置に保存 */
この部分はまだ習ってないのでもっと簡単なやりかたはありませんか?
わがまま言ってすいません
それ変えると、方式自体を変えなきゃいけないから まったくの別プログラムになるだろうな。 ようは、各セルの情報をどうやって持つかなんだが。 既に指定されている前半部コードを見ると、どうしてもtakara配列の中に情報を詰め込みたくなる。 そうすると、自然とこういう方法になると思うんだが・・・。
[1] 授業単元:C言語論 [2] 問題文(含コード&リンク):() C言語では再帰呼び出しは、セキュアなコードとは言えない。この理由を100字以内で述べよ [3] 環境 [3.1] OS: Unix準拠(Windowsを含む)他 [3.2] コンパイラ名とバージョン: ANSI-C,ISO-C準拠 [3.3] 言語: C [4] 期限: 2008/05/30 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) C言語の規格は一通り学びました。 ヒントとしては、メモリクラスがどーのこーのという話でした。 おねがいしますです。(|)
938 :
デフォルトの名無しさん :2008/05/28(水) 01:00:02
>>913 動かない…だと…?
haii1.c: In function `main':
haii1.c:7: `INT_MIN' undeclared (first use in this function)
haii1.c:7: (Each undeclared identifier is reported only once
haii1.c:7: for each function it appears in.)
haii1.c:8: `INT_MAX' undeclared (first use in this function)
haii1.c:13: `array' undeclared (first use in this function)
haii1.c:23: warning: unknown escape sequence: `\' followed by char code 0x8e
haii1.c:30: parse error at end of input
>>936 そうですか…直接アドレスいれるプログラム見たのはじめてなので混乱してます
>>862 途中まで(式-->値)は作ったけど、式を生成する部分が判らん。
例:char s[]="123-45-67+89"
expr2val(s) --> 100
int expr2val(char *s){
int i, sum=0, tmp=0, sign=1;
char c;
printf("%s\n",s);
loop(i, strlen(s)){
c=s[i];
if((c<'0')||('9'<c)){
sum+=(tmp*sign);
tmp=0;
sign=((c=='+')? 1:-1);
}
else{ // numeric
tmp*=10;
tmp+=(c-'0');
}
}
sum+=(tmp*sign);
return sum;
}
アドレスじゃなく、ビットマスクだ。まぁ頑張れ。
942 :
デフォルトの名無しさん :2008/05/28(水) 01:09:40
【質問内容】 char strの配列に入っているIPアドレス("10.20.30.40"とか)を ネットワークバイトオーダーに変換して、unsigned char ipaddr[4]に 格納したいのですが、とりあえず以下のプログラムでアドレス不正せずに 表示ができています。ポインタの使い方とかおかしい箇所はありますでしょうか? 動作環境はUbuntu8.04(x86)でIntel Core2DuoのノートPCです。 【プログラム内容】 int i; unsigned char *ip; unsigned char ipaddr[4]; long long val; char str[] = "10.20.30.40"; /* ネットワークバイトオーダー変換前 */ val = inet_addr(str); ip = (unsigned char *) &val; for(i = 0; i < 4; i++){ ipaddr[i] = ip[i]; } printf("変換前 : %d %d %d %d\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); /* ネットワークバイトオーダー変換後 */ val = htonl(val); ip = (unsigned char *) &val; for(i = 0; i < 4; i++){ ipaddr[i] = ip[i]; } printf("変換後 : %d %d %d %d\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); 【表示結果】 変換前 : 10.20.30.40 変換後 : 40.30.20.10
>>942 スレ違いの気もするが、とりあえずlong longが4バイトかどうか確認した方がいいと思う
というかinet_addrってlong longを返すんだっけ?
944 :
942 :2008/05/28(水) 03:29:00
>>943 sizeof(long long)=8バイトとなりました。unsigned char *でキャストすると
4バイトしか取られないので駄目ですね。
あとinet_addrの戻り値はin_addr_t(unsigned int)でした。
long longの変数に代入しても一応大丈夫そうですが…。
指摘も考慮して以下のように修正してみました。
どうでしょうか?
【修正内容】
int i;
long nval;
struct in_addr addr;
unsigned char ipaddr[4];
unsigned char *ip;
char str[] = "10.20.30.40";
inet_pton(AF_INET, str, &addr);
nval = htonl(addr.s_addr);
ip = (unsigned char *) &nval;
for(i = 0; i < 4; i++){
ipaddr[i] = ip[i];
}
printf("%d %d %d %d\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
【出力結果】
40 30 20 10
>>862 #include<stdio.h>
int expr2val(const char *s){
int sum=0, value, n;
while(sscanf(s, "%d%n", &value, &n)>=1) sum+=value,s+=n;
return sum;
}
int main(void)
{
char base[]="123456789", buf[9+3+1];
int i, j, k, l, result;
for(i=1;i<9;i++)
for(j=i+1;j<9;j++)
for(k=j+1;k<9;k++)
for(l=0;l<3;l++){
char sign[]="---";
sign[l]='+';
sprintf(buf, "%.*s%c%.*s%c%.*s%c%s", i, &base[0], sign[0], j-i, &base[i], sign[1], k-j, &base[j], sign[2], &base[k]);
result=expr2val(buf);
if(result==450 || result==500 || result==666) printf("%s=%d\n", buf, result);
}
return 0;
}
>>934 間違ってんじゃね?
・完全なパーセンテージを表示できるときだけ表示
・小数点以下は表示できない
って条件だから、32%ぴったりのときとかだけ表示する仕様だと思ふ。
948 :
デフォルトの名無しさん :2008/05/28(水) 08:34:19
あの・・・ 〉〉839 をお願いしたいのですが。
>>947 そう読めたんだけど、それだと殆ど表示が更新されない場合がある気がして。
こうやって勝手に解釈されたら困るよな、プログラマに
勝手に解釈されて文句垂れるんならここで質問すんな
勝手に解釈して書く奴はプログラマとしてやっていくには難しいぞ
このスレで「プログラマとして」とか言われても困るけどな
仕様書をちゃんと書け、文句はそれからだ
あまり再帰が深くなるとスタック破壊すっからだろ
>>947 いやいや、
・小数点以下は表示できないので、整数部が変わったときだけ表示する
って話じゃね?
>>839 グラフ的な数列とはどんな条件を満たせばよいの?
>>958 グラフの各頂点の次数(隣接する頂点の数)をソートした結果になっていること。
Havel-Hakimi の定理などでアルゴリズミックに判定可能。過去スレにもある。
>>839 #include<stdio.h>
#include<stdlib.h>
int cmp(const int *a, const int *b){
return *b-*a;
}
int isDegreeSequence(int d[], int p){
int i;
for(;p>0;p--,d++){
qsort(d, p, sizeof(d[0]), cmp);
if(d[0]<0 || d[0]>=p) return 0;
for(i=1;i<=d[0];i++) d[i]--;
}
return 1;
}
int main(void){
int test_data[][10]={
{1,1,1,1,1,1,1,1,1,5},
{1,2,3,4,5,6,7,8,9,10},
{2,2,3,4,6,5,7,8,9,6},
};
int i;
for(i=0;i<sizeof(test_data)/sizeof(test_data[0]);i++)
if(isDegreeSequence(test_data[i], 10)==1) printf("%d は単純グラフ的\n", i);
return 0;
}
>>959 thx Havel-Hakimi でググったら106代目がヒットしたw
[1] 授業単元:オペレーティングシステム [2] 問題文(含コード&リンク): シェルに定義されている環境変数の一覧表を表示するプログラムを作れ。 サンプルプログラムを参考にして作成すること。必ず子プロセスに実行させること。 ///サンプルプログラム/// #include <stdio.h> int main(int argc, char *argv[], char *envp[]) { int i; for (i=0; envp[i]!=NULL; i++) printf("%s\n", envp[i]); exit (0); } [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:6月2日 [5] その他の制限: よろしくお願いします。
おいっ、どうした?ほれ、もっと俺が解答できるような簡単な宿題を質問せぇ? ソート、文字列比較、リスト、構造体、素数、フィボナッチェ、再帰。
963 :
デフォルトの名無しさん :2008/05/28(水) 17:02:15
>>963 >標準ライブラリは使用不可.
printfすら駄目ってことになるぞ
Win32 APIで画面起こしてテキストコントロールにGetWindowTextを使って読めと?
965 :
デフォルトの名無しさん :2008/05/28(水) 17:21:44
>>964 よくわからずに発言してしまったみたいです.すみません.
標準ライブラリ使ってください.
966 :
883 :2008/05/28(水) 18:00:20
>>966 takaraに加えて、以下の2配列を追加してみては?
・オープンしているかどうかの配列
・周囲の宝の数を格納する配列
んで、それぞれの処理はそれぞれの配列を参照するように変更。
>>937 ,955
素のままでは、スタックあふれを逐次チェックする機構がない、
てことでしょうか?
これは MS-DOS などの仮想メモリ空間を準備できない環境での
話だと思っていましたが、unix や NT でもだめでしたっけ?わかりません。
>>967 どう書けばよいのでしょうか?
無知ですいません…
このままじゃ今のソース説明しろって言われたらボロが出るし、簡単な 手法への変換ができないままだと疑われるし! 部屋の隅で単位落とすかもしれないと思って涙目で震えてる学生を助けろよ!
>>970 できもしない奴に単位が取れる可能性を与えただけで十分だろ
オレは面白い問題が解ければそれでいい 後でどうなろうと知ったこっちゃ無い
単位落としたなら来年取ればいいじゃない?そういうシステムだろ?
974 :
778 :2008/05/28(水) 19:38:05
再度書き込み失礼しますm(__)m [1] 授業単元:アルゴリズム [2] 問題文(含コード&リンク): @Dijkstraのアルゴリズム解法を実現するプログラムを作成し、コンパイルして実行せよ。 このとき、グラフ中の指定頂点(ここでは頂点0)に対して、全ての頂点への最短経路コストと最短経路を標準出力に表示すること。 〜Graph〜 #define NC 9999 #define N 6 int edge[N][N] = { /* src: 0 1 2 3 4 5 ...dst */ /* 0 */ { 0, NC, NC, 8, 15, NC}, /* 1 */ { 10, 0, 24, NC, 8, NC}, /* 2 */ { NC, NC, 0, NC, NC, 6}, /* 3 */ { NC, NC, NC, 0, 5, NC}, /* 4 */ { NC, NC, 12, NC, 0, 7}, /* 5 */ { NC, NC, 3, NC, NC, 0} }; 〜Result Sample〜 Result (from 0) To 0 : --- To 1 : No Path To 2 : cost 23 : 2 <- 5 <- 4 <- 3 <- 0 To 3 : cost 8 : 3 <- 0 To 4 : cost 13 : 4 <- 3 <- 0 To 5 : cost 20 : 5 <- 4 <- 3 <- 0 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名: gcc [3.3] 言語: C [4] 期限: 2008/05/29(Thu) [5] その他の制限: 特にありません よろしくお願いします。
他人の力を借りないとプログラム組めない奴なんて
どうせ無理して卒業して社会に出ても使えないゴミなんだから退学しちゃえよ
とか思うけどな。まあ人のことだからどうでもいいけど。
>>972 こんなんで面白いって言ってるようじゃ(ry
刺激が欲しいなら「トリッキーなプログラム」の過去スレ漁ってみ?
その人にとって社会に出てからは必要の無い知識だとしたら? 単位取得のタメ・必修過程終了するため お前ら視野狭すぎる
977 :
デフォルトの名無しさん :2008/05/28(水) 20:56:41
>>976 そんな個人的な事情はお父さんかお母さんくらいの身近な人と話してください
プログラムの授業が必修であるような学校を自分で選んだんでしょ?
必要ないならそれが必修ではない学校を選べばいいだけじゃん。
何のために大学とか行ってんの?そこで何を学ぶかも知らずに行ったの?
学校を選び間違えたなら他を受けなおすとかいくらでも道はあるよ。
>>976 お前は考えが幼すぎる。
>>978 お前の考えの方が幼すぎる。っつか異常。ただの妬み、僻みだろ、低学歴
980 :
デフォルトの名無しさん :2008/05/28(水) 21:19:45
>>979 高校以降、欲する知識が得られ、欲さない知識を得なくてすむ学校に
行き、今はその知識を活用する職につき、不自由の無い収入を得ています。
982 :
デフォルトの名無しさん :2008/05/28(水) 21:22:07
後付で条件増やすな。 とそれ解いてくれた人なら怒る。
C++ほとんど知らないんだけど、iostream使わない場合の入出力関数ってどんなのがあるの? fgetsとかつかえる?
放置推奨
987 :
982&352 :2008/05/28(水) 21:46:43
>>987 fgets 使えるんだ。
んじゃ、fprintf も使える?
989 :
982&352 :2008/05/28(水) 21:49:59
>>988 fprintは使ったことがないのでわかりませんが、たぶん使えるかと。
>>989 へえ!そうなんだ!
今回、iostreamを使わなくすると発生する問題は入出力部分のみかな?
993 :
982&352 :2008/05/28(水) 21:59:31
>>990 はい。
先生からは実行(入出力時)するときに必要になるメモリの関係上で
実行できない時があるのが駄目だと言われまして、
>>993 じゃあfgetsとfprintfを使えばいいね!
君はまるで目の前にステーキとナイフとフォークが差し出されたにも関わらず、
それを一口サイズに切って、口に運んでもらわないと食べられないよ!
って言っているわがままなおぼっちゃんのようだ!
>>994 suck
何で外人風?なのか分からんが、まあ、気持ちは分からんでもないw
次スレたってるよ
>>992 なんかおかしい?
うめ(´・ω・`)うめ
うめ(´・ω・`)うめ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。