STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
そのテンプレはいただけない。
宿題━キョロ━(゚∀゚≡゚∀゚)━キョロ━マダ━?
6 :
デフォルトの名無しさん :2007/10/10(水) 06:02:23
1] 授業単元: プログラミング [2] 問題文:5人の名前(文字の1or2次元変数)とその年齢(1次元変数)を 入力し、それぞれの名前と年齢の文だけ「誕生日おめでとう」と表示する。 5人の名前と年齢は、『東郷=1歳』,『猛田=2歳』,『友沢=3歳』,『六道=4歳』,『矢部=5歳』にします (表示例) ○○さん、 誕生日おめでとう 誕生日おめでとう △△さん、 誕生日おめでとう [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月11日まで] [5] その他の制限: for,if,caseなどは習いました。 PADも書かないといけないのでできるだけ簡単なのでお願いします。
読解にしばらく時間を要したぞ。 年齢の数と同じ回数だけ「誕生日おめでとう」と表示するんだな。
>>6 #include <stdio.h>
#define NIN 5
#define LEN 4
int main(void)
{
char Name[LEN+1][NIN];
int i, j, Age[NIN];
for(i=0; i!=NIN; i++)
{
puts("名前を入力しなさい.");
scanf("%s", Name[i]);
puts("年齢を入力しなさい.");
scanf("%d", &Age[i]);
}
for(i=0; i!=NIN; i++)
{
printf("%sさん、\n", Name[i]);
for(j=0; j!=Age[i]; j++)
{
puts("誕生日おめでとう");
}
}
return 0;
}
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 与えられた整数値の階乗を計算する関数を作成しなさい。 ただし整数値はint型で受け取るものとし、結果は文字列としてchar型配列で返すこと。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: 任意 [3.3] 言語: C [4] 期限: 無期限 [5] 備考:いや、宿題じゃないんだけどね。 暇つぶしにどうぞ。
書き忘れ 分かると思うけど、結果がintの範囲を越える場合も考慮してください
うちのパソコン4bitCPUだからなー
12 :
デフォルトの名無しさん :2007/10/10(水) 11:18:02
多倍長計算かあ。C++で多倍長計算クラスを使えば一発なんだが。 Cでもライブラリがそこら辺にゴロゴロしてるけど
13 :
9 :2007/10/10(水) 11:24:24
標準ライブラリ内で
掛け算だけなら簡単かと思いきや、10進数文字列にすんのめんどくせー
>>16 あっ、ごめ。階乗って 1 * 2 * 3 * ... だった・・・orz
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): 1から10までの和や1から100までの和を表示させるプログラムを作成せよ [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C++ [4] 期限: 10月10日まで [5] その他の制限:宜しくお願いします
>>9 (・∀・)つ
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5042.txt 掛け算を足し算のループで・・・ださっw
$ time ./a.exe
value: 123
123! = 1214630436702532967576624324188129585545421708848338231532891816182923589
23621676688311569606126402021707358352212940477825910915704116514721860295199062
61646730733907419814952960000000000000000000000000000
real 0m3.146s
user 0m1.483s
sys 0m0.030s
>>18 >>16 が、ちょうど階乗を間違って 1 + 2 + 3 ... + n として作ったプログラムです。
21 :
18 :2007/10/10(水) 14:20:45
.c 35: Warning: function 'memmove_ol' undefined -- assumed to be int 8.c 85: Warning: function 'snprintf' undefined -- assumed to be int このようなエラーが出ました。
>>18 #include <iostream>
int main()
{
int n, sum = 0;
std::cin >> n;
while(n) sum += n--;
std::cout << sum;
return 0;
}
>>21 階乗と勘違いして作ったやつなので、関数名とか変えないと頭が弱い子だと思われちゃうよw
コンパイルエラーの件は、これでなんとかなるはず。
--- g.c.orig 2007-10-10 14:28:53.265625000 +0900
+++ g.c 2007-10-10 14:28:54.937500000 +0900
@@ -8,7 +8,7 @@
/*
* なぜか私の環境では memmove でオーバラップしたメモリの転送ができなかったので自作
*/
-inline void memmove_ol(char *s1, char* s2, size_t n) {
+static void memmove_ol(char *s1, char* s2, size_t n) {
int i;
for (i = n; i >= 0; i--) s2[i] = s1[i];
s1[0] = ' ';
@@ -54,7 +54,7 @@
big_integer_t current, result = { "0" };
for (i = 1; i <= value; i++) {
- snprintf(current.value, sizeof(current.value), "%d", i);
+ sprintf(current.value, "%d", i);
result = add_big_integer(¤t, &result);
でも授業単元はC言語になってんだよな。 よくこうなってるの見るけど、大学側がバカなのか本人がバカなのかどっちなんだろ。
多倍長演算はアセンブラで書くと効率よく書けるんだが、 C言語で書くとCPUのキャリーフラグを扱えないので一工夫必要だし 効率も少し悪くなるな。
>>19 の実装はほんと遅いですw
検算のために ruby で階乗させたら圧倒的に速かった・・・orz
28 :
デフォルトの名無しさん :2007/10/10(水) 15:00:43
SPICEのコード(C言語)読んだことありますか?
29 :
デフォルトの名無しさん :2007/10/10(水) 15:03:38
だれが速いか勝負しようぜ! 関数は char* f(int n){} でたのむ
30 :
デフォルトの名無しさん :2007/10/10(水) 15:19:59
かけ算ルーチンだけど a = 123456789 と b = (2の12乗 *17 ) をかける場合 aに17を掛けて12ビットシフトする様にしたら速いかなあ
>>29 n の取りうる範囲は INT_MAX ?
33 :
29 :2007/10/10(水) 15:36:28
引数は0 〜 2の32乗 -1 で
34 :
◆JdKMFRogo6 :2007/10/10(水) 16:12:04
[1] 授業単元:C++ [2] 問題文(含コード&リンク): 処理の前後で clock() の値を保存しておき、その差をとり、プログラムの実行時間を求めよ。 [3] 環境 [3.1] OS: Windows XP [3.2] VC [3.3] 言語: C++ [4] 期限: 10月14日 [5] その他の制限: include<time.h>を用いる。 int t1, t2, t0; t1 =??? 処理 (この部分は何でもかまいません) t2 =??? t0 = t2 - t1; ???(結果表示の文、できれば秒単位で少数の2,3桁まで) 制限というかイメージ的には、こんな感じかなぁとは思うのですが式がわかりませんでした。 大変お手数ですが、よろしくお願いいたします 。
100!= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 3262, 1544, 3944, 1526, 8169, 9238, 8562, 6670, 490, 71 59, 6826, 4381, 6214, 6859, 2963, 8952, 1759, 9993, 2299, 1560, 8941, 4639, 7615 , 6518, 2862, 5369, 7920, 8272, 2375, 8251, 1852, 1091, 6864, 0, 0, 0, 0, 0, 0}
200!= {0, 0, 0, 0, 0, 0, 788, 6578, 6736, 4790, 5035, 5236, 3213, 9321, 8506, 2295, 1359, 7768, 7173, 2632, 9474, 2533, 2443, 5944, 9963, 4033, 4292, 304, 2840, 1198, 4623, 9041, 7721, 2138, 9196, 3883, 257, 6427, 9024, 2637, 1050, 6192, 6624, 9528, 2993, 1113, 4628, 5727, 763, 3172, 3739, 6988, 9439, 2244, 5621, 4516, 6424, 254, 332, 9186, 4131, 2274, 2829, 4853, 2775, 2424, 2407, 5739, 324, 321, 2574, 557, 9568, 6602, 2603, 1904, 1703, 2406, 2351, 7008, 5879, 6178, 9222, 2278, 9623, 7038, 9737, 4720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
速度は道なんだよ
まあ多分一瞬 内部的に10000進数表現をunsigned intの配列にして保持してるから, 基本的にO(log(n))くらいか?
>>38 投稿
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5043.zip gcc integer.c test.c -o a
a 200
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ........................................................................................................
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7
88, 6578, 6736, 4790, 5035, 5236, 3213, 9321, 8506, 2295, 1359, 7768, 7173, 2632
, 9474, 2533, 2443, 5944, 9963, 4033, 4292, 304, 2840, 1198, 4623, 9041, 7721, 2
138, 9196, 3883, 257, 6427, 9024, 2637, 1050, 6192, 6624, 9528, 2993, 1113, 4628
, 5727, 763, 3172, 3739, 6988, 9439, 2244, 5621, 4516, 6424, 254, 332, 9186, 413
1, 2274, 2829, 4853, 2775, 2424, 2407, 5739, 324, 321, 2574, 557, 9568, 6602, 26
03, 1904, 1703, 2406, 2351, 7008, 5879, 6178, 9222, 2278, 9623, 7038, 9737, 4720
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
>>34 #include <time.h>
#include <stdio.h>
int main() {
int i;
clock_t c = clock();
for (i = 0; i < 1000000000; i++)
continue;
printf("%.3f", (double)(clock() - c) / CLOCKS_PER_SEC);
return 0;
}
43 :
9 :2007/10/10(水) 16:58:57
>>19 >>41 宿題でもないものにわざわざお付き合いいただきありがとうございます!
ソース読んで勉強させていただきます。
>>43 こちらこそ暇を持て余しておりましたので、楽しかったです。
また、お題を下さい。
45 :
デフォルトの名無しさん :2007/10/10(水) 18:07:28
前スレの
>>968 ですが一部まだ詰まっているのでお願いします
[1] 授業単元:
[2] 問題文(含コード&リンク):
全角半角混合の文字列に含まれる半角文字を全角文字に変換せよ.
[3] 環境
[3.1] OS: XP sp2
[3.2] コンパイラ名とバージョン: VC++ 6.0
[3.3] 言語: C++
[4] 期限: 改めて明日
[1] 授業単元:C言語 [2] 問題文(含コード&リンク):int a[]={-2,-3,0,1,5,3}という配列がある。この配列から正の数(0は含まない)のみを小さい順に取り出せ。また、どこから取り出したかわかるように取り出したところには変わりに0を入れよ。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:BCC5.5 [3.3] 言語:C言語 [4] 期限:明日まで [5] その他の制限: 実行例 数:-2,-3,0,1,5,3 1を取り出しました 数:-2,-3,0,0,5,3 3を取り出しました 数:-2,-3,0,0,5,0 5を取り出しました 数:-2,-3,0,0,0,0 もう正の数はありません。
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 各辺が確率的に結ばれるグラフ(ランダムグラフ)を確率ごとに100個ずつ作りファイルに入れ、それが連結か否かを判定するプログラミングを作りなさい [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0) [3.3] 言語:C [4] 期限: 2007年10月22日12時まで [5] その他の制限: 制限なし
>>48 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define POINT_NUM 2
int main(void){
FILE *fp;
int i, j, r;
char filename[FILENAME_MAX+1];
srand(time(NULL));
for(r=0;r<100;r++){
sprintf(filename, "out%03d.txt", r);
fp=fopen(filename, "w");
if(fp==NULL) return 1;
for(i=0;i<POINT_NUM;i++)
for(j=i+1;j<POINT_NUM;j++)
if((rand()%100)<r){
fprintf(fp, "%d - %d\n", i, j);
printf("%s : 連結\n", filename); // <- ガンバレ
}
fclose(fp);
}
return 0;
}
>>47 #include <stdio.h>
int main(void)
{
int a[] = {-2,-3,0,1,5,3};
int i, size = sizeof a / sizeof *a, min, index;
while(1) {
printf("数:%d", a[0]);
for(i=1; i<size; i++) printf(",%d", a[i]);
putchar('\n');
min = 0;
for(i=0; i<size; i++) {
if(a[i] > 0) break;
}
if(i==size) break;
min = a[i];
index = i;
for(i++; i<size; i++) {
if(a[i]> 0 && a[i] < min) {
min = a[i];
index = i;
}
}
a[index] = 0;
printf("%dを取り出しました\n", min);
}
printf("もう正の数はありません。\n");
return 0;
}
51 :
◆JdKMFRogo6 :2007/10/10(水) 20:20:41
>>42 ありがとうございます!
ソース等よく読んで理解できるようになるよう頑張ります。
前スレの話でアレだけど、>981の解答の>984、>991って 永久ループ使ってないからダメなんじゃ?
このスレでは17歳教信者をどのように扱うかは決まりましたか?
俺の嫁。
56 :
デフォルトの名無しさん :2007/10/10(水) 22:45:15
【質問テンプレ】 [1] 授業単元:C言語 [2] 問題文(含コード&リンク): キーボードから次元Nを入力したあと、N*N行列AとN次元ベクトルxのデータを要素ごとにキーボードから入力し、Axを計算するプログラムを完成させよ。 [3] 環境 [3.1] OS:UNIX系端末 [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年10月11日21:00まで [5] その他の制限:ポインタと関数malloc()を使う。
>>56 前スレ 316 に下記を追加でおk
int main(void){
matrix_t *A, *x, *Ax;
int N, col, row;
printf("Size N:");
scanf("%d", &N);
A=matrix_alloc(N, N);
x=matrix_alloc(N, 1);
for(col=0;col<N;col++)
for(row=0;row<N;row++){
printf("Matrix A[%d][%d]=", col, row);
scanf("%lf", &A->data[col][row]);
}
for(col=0;col<N;col++){
printf("Vector x[%d]=", col);
scanf("%lf", &x->data[col][0]);
}
Ax=matrix_mul(A, x);
printf("\n");
for(col=0;col<N;col++) printf(" %f", Ax->data[col][0]);
return 0;
}
60 :
デフォルトの名無しさん :2007/10/10(水) 23:38:43
中性子移動プログラムお願いします。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 相異なるM個の要素からなる要素から N 個選んだ組合せをすべて表示し場合の数も表示する関数をつくれ。 ただしM≧Nである。MとNは自分で入力する。 for文などを用いず、関数の再帰を使う方法で回答せよ 4個の要素(1 2 3 4)から3つ選んだ場合の例 (1 2 3) (1 2 4) (1 3 4) (2 3 4) 4 [3] 環境 [3.1] OS: Win [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限: 明後日 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) お願いします
グラフ理論がまるで分からん。 情報系の人たちはどんな授業を受け、どういうふうに勉強してんの?
[1] 授業単元:C言語プログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5045.txt ↑このソースに続けて、下記のようにソートする関数を作成しなさい。
@「書籍のアルファベット順(a→b→c…)」
A「ISBNコードの番号が若い順」
B「価格の安い順」
但し、「どの方法でソートしますか?」と問う文言を入れ、@〜Bから選べるようにすること。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: CPad for Borland C++Compiler 2.31
[3.3] 言語: C/C++/どちらでも可
[4] 期限: 10月12日まで
[5] その他の制限: 上記のソースがしょぼい出来で申し訳ありませんが、よろしくお願いいたします。
65 :
デフォルトの名無しさん :2007/10/11(木) 00:19:12
[1] 授業単元:プログラミング [2] 問題文:A(1)からA(50)にランダムな数値が入っている。昇順でソート。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン: [3.3] 言語:C
>>65 ソートするのはいいがその後は自由ってのは気に入らんな
表示でもするのかね
>>62 「異なるM個の要素」は、1からMまでの連番でいいのかな?
>>64 やってみる。15分くれ。
68 :
65 :2007/10/11(木) 00:30:42
表示でお願いします
69 :
デフォルトの名無しさん :2007/10/11(木) 00:31:25
>>66 そうでした…スミマセン!!!!!
そのあとにソート結果を表示します。
>>67 ソート語、ソート結果を表示します。
お手数ですが、よろしくお願いいたします。
>>62 #include <stdio.h>
#define M 128
static int data[M], tmp[M], m, n;
void comb_r(int data_index, int tmp_index)
{
int i;
if(tmp_index == n){
for(i = 0; i < n; i++) printf("%d ", tmp[i]);
printf("\n");
return;
}
for(i = data_index; i < m; i++){
tmp[tmp_index] = data[i];
hoge_r(i + 1, tmp_index + 1);
}
}
int main(void)
{
int i;
while(m < M && scanf("%d", &data[m]) == 1) // cntl + z等で終了
m++;
scanf("%d", &n);
comb_r(0, 0);
return 0;
}
73 :
64 :2007/10/11(木) 01:00:53
>>70 すすすごい
ありがとうございました!!
非常に助かりました
カウントするの忘れた。 if(tmp_index == n){ 内に大局変数のカウンタを増やして、mainで表示してください。
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 6人の学生が3科目を受験し、各学生の科目ごとの特典を入力し、学生ごとまたは科 目ごとの得点合計および全得点合計を、配列により求めるプログラムである。プログ ラム中の「 」に正しい答えを入れて、プログラムを完成させなさい。 void main(void) { int ten[][4] = {{0,0,0,0},{0},{0},{0},{0},{0},{0}}, int i, j; printf("得点を入力してください\n"); for(i = 1; i <= 6; i++) { for(j = i; j <= 3; j++) scanf("%d",「 @ 」 ); } /* 得点の集計 */ for(i = i; i <= 6; i++) { for(j = i; j <= 3; j++) { 「 A 」 += 「 B 」; 「 C 」 += 「 B 」; } } 「 D 」; for(j = 1; j <= 3; j++) { 「 E 」 += 「 B 」; } } 4.朝まで。 5.多次元配列ってとこやっております・・・。/* 得点の集計 */が下に続くのですが省略><
[1] 授業単元:C言語演習 [2] 問題文(含コード&リンク): 氏名(型はchar)、郵便番号(型はchar)、番号(型はint)を表す3つの配列 simei、yuubin、bangouで構成し、以下の条件を満たす住所録を作成しなさい。 1:新規追加が可能。引数は順に氏名、郵便番号、番号とするような データ項目を住所録に追加する関数。void tuika(char *, char *, int) 2:指定されたデータの削除が可能で、削除されたデータ項目は登録が ない状態とする。ここで、登録がないデータ項目とは、氏名と郵便番号に ついてはヌル文字、番号については0が格納されていることとする。 また、一度削除されたデータ項目は、以降の新規追加で再利用可能であること。 引数で指定されたデータ項目と合致する個人データを住所録から削除する関数。 void Dsimei(char *)、void Dyuubin(char *)、void Dbangou(int) 例えばDsimei()は、引数で指定された文字列を名前とするような個人データを 住所録から削除する。Dyuubin()、Dbangou()も同様。 3:引数で指定されたデータ項目を住所録から検索する関数。 void Fsimei(char *)、void Fyuubin(char *)、void Fbangou(int) 例えばFsimei()は、引数で指定された文字列を名前とするようなデータ項目を 住所録から検索する。Fyuubin()、Fbangou()も同様。 これらの関数は合致する全ての個人データを表示するものとする。 ※最大3名分のデータを管理できる。 ※文字列の一致判定にはstrcmpを用いる。 ※データを格納する配列simei、yuubin、bangouはグローバル変数で確保する。 ※データの入出力は凝らず(ユーザとの対話的入出力は必要ない)に 呼び出す側でそのまま渡して良い。つまり、main関数で void tuika(yamada, 123456, 16)などとすること。 ※構造体を用いずに2次元配列を用いること。
俺の朝は10時くらいなんだが、それでもいいならやっておこうか?
78 :
76 :2007/10/11(木) 01:14:46
続きです。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 金曜日の13時までです。 [5] その他の制限: 基礎的な内容は、一通り習ってます。ただ、本当に 基礎的な内容なので、基礎的な内容で回答頂けると助かります。 よろしくお願いします。
79 :
デフォルトの名無しさん :2007/10/11(木) 01:41:13
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):ASCIIコードで名前を入力し、その名前を出力し、その後入力した名前を大文字で表示する。入力終了はEOFで行う。 [3.1] OS:windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C++ [4] 期限:10月11日22時 [5] その他の制限:int変数に入力してそのASCIIコードの文字をchar型配列に順に代入すること とりあえずプログラムをつくったのですが2カ所あるch[i]の所でエラーが出ます。その理由がよくわかりません。どこを修正すればいいか教えてください。 #include<iostream> #include<iomanip> using namespace std; int main(){ int i=0; char ch; cout << "Input ASCII code -->"; while(cin >> hex >> ch[i]) { cout << "Input ASCII code -->"; i++; } ch[i]="\0"; cout << endl; cout << "Your name -->" << ch; cout << endl; if('a'<=ch && ch<='z') { ch=ch-'a'+'A'; } cout << "Uppercase name -->" << ch; cout << endl; return 0; }
なんでch[i]が出来ると思うんだ
>>75 問題が腐ってるので穴埋めしても完成しない。
やる価値無し。
>>75 というかやたらミスが多い問題文だな
講師は事前にデバッグとかしないのかよ
i=i;て何やねん
>>75 というかやたらミスが多い問題文だな
講師は事前にデバッグとかしないのかよ
i=i;て何やねん
私は私 あなたはあなた
=iは75の写し間違いだとは思うけど、そこ除いてもひどいコードなのは間違いない。
>>75 main(void)
{
int ten[][4] = {{0,0,0,0},{0},{0},{0},{0},{0},{0}};
int i, j;
printf("得点を入力してください\n");
for(i = 1; i <= 6; i++)
for(j = 1; j <= 3; j++){
scanf("%d",@&ten[i][j]);
}
/* 得点の集計 */
for(i = 1; i <= 6; i++){
for(j = 1; j <= 3; j++){
Aten[0][j] += Bten[i][j];
Cten[i][0] += Bten[i][j];
}
}
Di=0;
for(j = 1; j <= 3; j++){
Eten[0][0] += Bten[i][j];
}
}
for文の初期値を修正して埋めてみた。AとCは順不同。
>>48 #include<stdio.h>
#include<stdlib.h>
#define POINT_NUM 20
#define SAMPLE_NUM 100
int main(void){
FILE *fp;
int i, j, k, r, cnt;
char filename[FILENAME_MAX+1];
int point[POINT_NUM], max_p, min_p;
for(r=0;r<=20;r+=2){ // 2点間を接続する確率 %
for(cnt=0;cnt<SAMPLE_NUM;cnt++){
sprintf(filename, "%03d%%-%02d.txt", r, cnt);
fp=fopen(filename, "w");
if(fp==NULL) return 1;
for(i=0;i<POINT_NUM;i++) point[i]=i;
for(i=0;i<POINT_NUM;i++)
for(j=i+1;j<POINT_NUM;j++)
if((rand()%100)<r){
fprintf(fp, "%d - %d\n", i, j);
if(point[i]>point[j]) max_p=point[i], min_p=point[j];
else max_p=point[j], min_p=point[i];
for(k=0;k<POINT_NUM;k++) if(point[k]==max_p) point[k]=min_p;
}
for(i=0;i<POINT_NUM;i++) if(point[i]!=0) break;
if(i>=POINT_NUM) printf("%s : 連結\n", filename);
fclose(fp);
}
}
return 0;
}
89 :
62 :2007/10/11(木) 08:32:53
>>72 関数の再帰だけで書かないといけないんですが・・・
90 :
デフォルトの名無しさん :2007/10/11(木) 13:15:45
[1] 授業単元: 画像処理
[2] 問題文(含コード&リンク): RGB値を使い、2値化を行う 芝生の緑の部分を取り出す
(芝生の部分はrgbというテキストファイルにRGB値の範囲が載っています
また、zipではjpgファイルになってますが容量オーバーのため本来はbmpファイルを使用しています)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5047.zip [3] 環境
[3.1] OS: (Windows/Linux/等々) Windows
[3.2] コンパイラ名とバージョン: よくわかりません
[3.3] 言語: (C/C++/どちらでも可 のいずれか) VisualC++2005
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 明日の11時まで
[5] その他の制限: 環境のコンパイラ名とバージョンというのがよくわかりません
説明不足な点があると思いますがよろしくお願いします
>>90 これだけでいいのかな?
int is_grass(int r, int g, int b){
return ((100<=r && r<=140) && (140<=g && g<=170) && (70<=b && b<=100));
}
92 :
90 :2007/10/11(木) 14:07:13
>>91 これを加えるとこういったエラーが出てきたのですが・・・
○○\kadai.cpp(301) : error C3872: '0x3000': この文字を識別子で使用することはできません
○○\kadai.cpp(301) : error C3872: '0x3000': この文字を識別子で使用することはできません
○○\kadai.cpp(301) : error C3872: '0x3000': この文字を識別子で使用することはできません
○○\kadai.cpp(301) : error C3861: ' return': 識別子が見つかりませんでした
○○のところは私の名前などが入っているため隠しています
>>92 なんでやねん!
int is_grass(int r, int g, int b){
return ((100<=r && r<=140) && (140<=g && g<=170) && (70<=b && b<=100));
}
void BMPtoGrassBin(
unsigned char dest[Y_SIZE][X_SIZE],
const unsigned char src[Y_SIZE][X_SIZE][3] )
{
int y, x;
for (y=0; y<(int)biHeight; y++)
for (x=0; x<(int)biWidth; x++) {
dest[y][x]=is_grass(src[y][x][0], src[y][x][1], src[y][x][2])?HIGH:LOW;
}
}
95 :
デフォルトの名無しさん :2007/10/11(木) 14:32:51
[2] 問題文:ランダムに文字列(アルファベット26文字)を生成し、生成された文字列をAから順番に並べる [3] 環境 [3.1] OS:WindowsXP [3.2] BorlandC++ [3.3] C++
>>95 文字列をランダムに生成するのにどうしてAが必ず先頭にくるのか説明したまえ
97 :
95 :2007/10/11(木) 14:43:57
アルファベット26文字生成だからです aからと書いたほうがよかったですかね。
なんか問題文が説明不足じゃね? 文字列の文字数とか文字列自体の数とかはどうなってんの?
>>97 だから問題文の説明が不足してるって言ってるの。
A〜Zのランダム文字列を生成してからそれを整列して改めて表示するの?
100 :
90 :2007/10/11(木) 15:22:49
>>94 ありがとうございます
先ほどこの問題で先生に聞きに行ったところ
原画像を白黒にせずに原画像から直接RGB値を用いて
2値化の画像を生成するのが今回の課題と先生は言ってました
実行操作のところでこういうプログラムを作ってみましたが上手くできませんでした
//画像処理3:RGB値から2値化
is_grass(intensity, image_bw);
BWto24BMP(image_bw, image_out);
printf("RGBからの2値化出力画像ファイル名(*.bmp):"); scanf("%s", output);
writeBMP(image_out, output);
>>100 あなたが他人のソースコードをうpしたということはよく分かった
なんか先生がかわいそうになってきた
カンニングについては諦めているだろうから
くだらない質問で迷惑かけるなよと言いたい
103 :
デフォルトの名無しさん :2007/10/11(木) 15:59:17
>>7 >>8 返事が遅れてすみません。考えていただきありがとうございます。
しかし、LEN,NIN,putsは習っていません。
もうちょっと詳しく書くべきでした。すみませんでした。
>>6 に付け足しで、『if』,『if-else』,『while』,『do-while』,『switch』,『for』を習いました。
あと『int』,『char』,『double』でもう一度お願いできませんか?
お願いします
>>103 小学生じゃないんだから、習ってないもの使ったって問題ないよ。
むしろ評価する人はよく調べてるなと思うだろう。
105 :
デフォルトの名無しさん :2007/10/11(木) 17:22:58
>>104 完璧に使いこなせたら、ちょっと危なくなるから。
こっちの都合なんですけど・・・。
お願いします。
>>103 #include<stdio.h>
int main(void)
{
int i,j;
char name[5][32] = { "東郷", "猛田", "友沢", "六道", "矢部" };
int age[5] = { 1, 2, 3, 4, 5};
for(i=0;i<5;i++){
printf("%sさん、\n",name[i]);
for(j=0;j<age[i];j++){
printf("誕生日おめでとう\n");
}
}
return 0;
}
>>105 お前が何を習ったのか、どこまで知ってるのかを考慮してプログラムするのは難しい
108 :
デフォルトの名無しさん :2007/10/11(木) 17:50:07
>>103 ありがとうございました。明日学校でやってみます。
>>107 制限がなかったらこんなこと言われなくて済むんですけどね。
未熟者ですみません。
109 :
75 :2007/10/11(木) 18:48:03
>>87 ありがとうございました!何とか間に合いました。
^^
[1] 授業単元: アルゴリズム [2] 問題文(含コード&リンク): @100000以下の素数の数nを求め、サイズnの配列に素数を小さい順に格納する。 A@で求めた配列から、5つの整数を選び(その中の一つは必ず12345であること)素因数分解し、 次のような書式で出力するプログラムを作成せよ。 ex)整数 は p1のn乗、p2のn乗・・・・の積であらわされる。 (p:素数) @とAを一つのプログラムにまとめて作成すること。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC6 [3.3] 言語:C [4] 期限:10/13 [5] その他の制限: 素数の数までは完成したのですが、素因数分解が出来ません。 まだ授業が進んでいないので、効率の悪い方法で構いません。 よろしくお願いします
[1] 授業単元:アルゴリズムとデータ構造 [2] 問題文(含コード&リンク):コインを半物ずつ重さを比べて贋コインを探すという問題です [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: djgpp [3.3] 言語: C [4] 期限:10/17 [5] その他の制限: #include <stdio.h> main(){ int n,m,i,i0,w[20]; n=12; //コインの個数 printf("にせ金の番号は?"); scanf("%d",&m); printf("\n"); //改行 for(i=1;i<=n;i++){ if(i==m) w[i]=9; else w[i]=10; printf("i=%d,weight=%d\n",i,w[i]); } ↓↓↓ここから↓↓↓ for(i=1;i<=n-1;i+=2){ if(w[i]>w[i+1]){i0=i+1;break;} else if(w[i]<w[i+1]){i0=i;break;} } ↑↑↑ここまで↑↑↑ printf("\n"); printf("にせ金 %d, 重さ %d\n",i0,w[i0]); return 0; } 2枚ずつ比較して探すプログラムがあるのでこれの矢印で囲んだ部分を改変させて作って欲しいです お願いします
>>111 半物ずつって何?
こういうパズルって比較する回数を限定するんじゃないの?
>>112 すみません説明不足でした
このプログラムの場合だと12枚あるコインを6枚6枚で比較して
偽物の入ってる方を3枚3枚で比較して・・・・・って感じです
回数の指定は特にないみたいですが、なるべく少ない回数でやるみたいなのと
講義内で半分ずつ比較するのが一番良いやり方だと言っていたので半分の方法でやろうと思いまして
>>110 1で求めた配列って素数しか入ってないんじゃない?
1で求めた配列を使って、12345を含むランダムで選んだ整数を素因数分解するってこと?
すいません、どなたか解答頂けないでしょうか?
>>114 すいません、その通りです。問題読み間違えてました・・・・
A訂正
@の配列を使って、12345を含む任意の整数を素因数分解せよ。です
入りきらないから、素因数分解の関数だけ void factorization(int n, int *prime) { int i; printf("%d = ", n); for(i=0; prime[i]*prime[i]<=n; i++) { int cnt = 0; while(n % prime[i] == 0) { cnt++; n /= prime[i]; } if(cnt==1) printf("%d%s", prime[i], n==1?"": " * "); else if(cnt> 1) printf("%d^%d%s", prime[i], cnt, n==1?"":" * "); } printf("%.0d\n", n==1 ? 0 : n); }
メインもつけて、ちょっと修正 #include <stdio.h> #include <stdlib.h> #include <time.h> void factorization(int n, int *prime) { int i, cnt; printf("%d = ", n); for(i=0; prime[i]*prime[i]<=n; i++) { for(cnt=0; n%prime[i]==0; cnt++) n /= prime[i]; if(n==1) { printf("%d^%d\n", prime[i], cnt); return; } if(cnt==1) printf("%d * ", prime[i]); else if(cnt> 1) printf("%d^%d * ", prime[i], cnt); } printf("%d\n", n); } int main(void) { int i, j, a[5] = {12345}, prime[10000] = {2}, cnt = 1; srand(time(NULL)); for(i=3; i<=100000; i+=2) { for(j=0; j<cnt; j++) if(i % prime[j] == 0) break; if(j==cnt) prime[cnt++] = i; } for(i=1; i<5; i++) a[i] = rand(); for(i=0; i<5; i++) factorization(a[i], prime); return 0; }
前にデータベースを頼んだものですが、このままでは危険が危ないのでなんとかお願いします。
>>119 何だそのtypoはw
最初釣りかと思ったじゃないか……
頭痛が痛いよ、まったく
121 :
デフォルトの名無しさん :2007/10/12(金) 09:46:59
[1] 授業単元:C [2] 問題文:HIT and BLOWの解き方 @候補の数列を作成するkouho[][](配列に置く) ・決まった桁数 ・使った数字に重複のないこと A候補として残すかどうか判断するためチェック用配列chk[]を作成する。 ・候補の数列と構造体にしても可 ・最初はすべての数列を候補とする B残っている候補の数列のなかから適当なものを予想する ・候補の配列の先頭でも良いし、乱数を使っても良い。 C入力されたhitとblowにしたがって候補を捨てていく(チェック用の配列にフラグをたてる) [3] 環境 [3.1] OS: (Windows) [3.2] コンパイラ名とバージョン: (bcc.5.5) [3.3] 言語: (C++) int i2,n1,n2,n3,n4,kouho; for( i=0, n1=1; n1<=9; n1++) for(n2=1; n2<=9; n2++) for(n3=1; n3<=9; n3++) for(n4=1; n4<=9; n4++){ kouho[0]=n1; kouho[1]=n2; kouho[2]=n3; kouho[3]=n4; i++;} こんな感じで作りましたがいまいちわかりませんおよろしく願いします。
>>120 typo?「危険が危ない」はちょっと古いですが普通に使われる正しい日本語なんですが…。
ドラえもんだっけ?
124 :
121 :2007/10/12(金) 10:16:59
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i2,n1,n2,n3,n4,kouho[9*9*9*9][3]; for( i2=0, n1=1; n1<=9; n1++) for(n2=1; n2<=9; n2++) for(n3=1; n3<=9; n3++) for(n4=1; n4<=9; n4++){ kouho[i2][0]=n1; kouho[i2][1]=n2; kouho[i2][2]=n3; kouho[i2][3]=n4; i2++; } return 0; } 訂正。
>>122 危険(なこと)は確かに危ないけど、「危険が危ない」は正しい日本語とは言えないね。
126 :
デフォルトの名無しさん :2007/10/12(金) 11:10:47
[1] 授業単元: C言語U
[2] 問題文(含コード&リンク):
mem1に入っているプログラムで
data2に入っているsimulation_dataを読み込んで、モデル化するプログラムを作っているのですが、
うまく読み込めてないようなんです。実行されるとdata6_arspecの中のresult4bに結果が入力されます。
/*simulation_dataを読み込む文です間違いありかもしれません*/
FILE *fp1;
fp1=fopen("..\\data2\\simulation_data","r");
for(j=0;j<n;j++){
fscanf(fp1,"%15.5f \n",&raw_16ch[0][j]);
}
for ( j=0; j<n; j++ ) {
printf("%15.5f \n",raw_16ch[0][j]);
}
fp1=fopen("sim1_","w");
fprintf(fp1,"sim1_ \n");
for(j=0;j<n;j++){
fprintf(fp1,"%15.5f \n",raw_16ch[0][j]);
}
fclose(fp1);
この文が間違っているんだと思います。実行時に入力するのは、
@..\data2\simulation_data A2500 B..\data6_arspec\ Cresult4b\ D1 E64 F25 G1.0 H1
の順です。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0
[3.3] 言語: C
[4] 期限: 10月13日13時まで
[5] その他の制限:よろしくお願いしますm(_ _)m
UP先はこちらです。
http://www.dotup.org/uploda/www.dotup.org6676.zip.html
>>125 いえ、重言ではありますが似た意味の表現を重ねて重要さや意味を強める、
畳語に近い正しい日本語の用法なんですが…。
失礼ですが、どちらの大学をご卒業ですか?
私ゃ頭が頭痛で痛いよ。
>>126 ・printf()系とscanf()系のフォーマット指定子は互換性がない。従って、そのフォーマット指定子は見直す必要があるかもしれない。
・simulation_dataを読み込んだ後、クローズしていない。
・zipなんか怖くて見てられるか。
130 :
デフォルトの名無しさん :2007/10/12(金) 12:28:19
[1] 授業単元: プログラミング [2] 問題文:文字の2次元変数をa[4][5]として適当に文字を入力し、表示させる [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月12日13時まで] [5] その他の制限: for,if,caseなどは習いました。 #include<stdio.h> void main(){ int i,j; char a[4][5]; a[0][0]='た';a[0][1]='さ';a[0][2]='か';a[0][3]='あ'; a[1][0]='ち';a[1][1]='し';a[1][2]='き';a[1][3]='い'; a[2][0]='つ';a[2][1]='す';a[2][2]='く';a[2][3]='う'; a[3][0]='て';a[3][1]='せ';a[3][2]='け';a[3][3]='え'; a[4][0]='と';a[4][1]='そ';a[4][2]='こ';a[4][3]='お'; for(i=0;i<4;i++){ for(j=0;j<5;j++){ printf("%c",a[i][j]); } printf("\n"); } } 全角が表示されなくて困ってます
私は頭が割れるように痒いですよ。
>>130 char ではなくて wchar_tでしょう。
133 :
120 :2007/10/12(金) 12:35:28
>>122 あ、そういう表現あるの?
こりゃ失礼
だけど
>>129 は「期限が危ない」のtypoだろう
134 :
120 :2007/10/12(金) 12:36:53
135 :
デフォルトの名無しさん :2007/10/12(金) 12:41:51
136 :
デフォルトの名無しさん :2007/10/12(金) 13:07:42
>>130 数字が間違っていたんでできなくて当たり前でした
恥ずかしいです・・・
>>122 はふざけてるだけか。知識はあってもそれを生かせない可哀想な子
って、下らないレスしてる俺も可哀想な子だな。可哀想な俺に問題を恵んでください。
>>119 期限が危ない問題はどれですか?
ぶっちゃけそんなんどうでもいいから、 宿題プリーズ
[1] 授業単元: C/C++の宿題を片付けます 97代目 [2] 問題文:くだらない喧嘩を止めさせ、結果を表示させる [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: なるべく早く [5] その他の制限: 特になし
>>140 #include <stdio.h>
int main() {
puts("\n"
" ∧_∧ / ̄ ̄ ̄ ̄ ̄ \n"
" ( ) < マターリは… \n"
" ( ) \_____ \n"
" │ │ │ \n"
" (_(__) \n"
"\n"
"\n"
" ∧_∧ / ̄ ̄ ̄ ̄ ̄ \n"
" ( ・∀・ ) ミ < 義務だよ! \n"
" ⊂ 9 \_____ \n"
" クルッ ( ヽノ \n"
" し(_)\n"
);
return 0;
}
144 :
111 :2007/10/12(金) 17:40:26
時間だ、答えを聞こう
またお前か。 騙るのは勝手だけど明日の昼まで待てないのか
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 1から9までの数字から重複を許さず4個とる(1234〜6789)。入れ替えや括弧を任意につけても良いとして、4個の数字に加減乗除を施し、 結果が12になるものを、その演算方法と共に列挙するプログラムを作成せよ たとえば、 1 2 3 4 ---> 1 2 4 * + 3 + (=1 + 2 * 4 +3) などと表示されていれば良い。矢印の右は左から順にスタックに積む、あるいはポップして計算するという操作を表す。 もし12にできないものがあれば、矢印の右にNGを表示せよ。12になる計算式は唯一とは限らないから、そのうち一つを 表示すればよい。 [3] 環境 [3.1] OS: WinXp [3.2] コンパイラ名とバージョン: Borland [3.3] 言語: C [4] 期限: 明後日 [5] その他の制限:ポインタは使わないで書いてほしいです お願いします!
>>138 もう期限過ぎちゃいましたからいいです。
出来てるところまで提出しなさいと言われたので空のファイルを提出しました。
コレに懲りたら二度とくんじゃねえぞ ( ´ー`)y─┛~~
>>46 ( ´∀`)つ
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5052.zip やっとアクセス規制が解除された・・・
問題が難しいものだったので、C では正直しんどいので C++ で書いてみました。
データ構造を Graph, Node, Edge により構成し、経路を Path として表現してます。
出力形式は、graphviz というフリーソフトの dot ファイルという形式です。
出力したファイルを graph.sh で処理すると、添付した gif 画像を自動生成できます。
ろだのファイルサイズの制限上、数経路分のみ画像を添付しています。
g++3.4.4 + cygwin 1.5.24 + graphviz 2.14.1 という環境で動作確認しました。
久しぶりにハマってしまったよ・・・(´;ω;`)
こんな難しい課題が出ちゃうのですか?情報系の学科かな?
私は今までこんな課題もらったことないなぁ・・・
155 :
デフォルトの名無しさん :2007/10/12(金) 21:57:13
test
>>154 23: 不正な初期化(関数 calc )って出てコンパイルできません・・・・
>>156 その23行とやらをコピペしてみてくれ。
>>157 node n = {tail, '\0', 0};
です
あと構造体を使わないでかけますか?
ポインタを使わないとな。俺の力では無理だょ…。ほかの誰か頼んだ!
やっぱりポインタを使わないときついですか・・・・
>>159 違う違う
変数を使って初期化できるのはC99ってだけ
162 :
161 :2007/10/12(金) 22:36:46
変なことを書いてしまったようだ
>>158 gccでは警告だけでコンパイルできる。
それが通らないとは一体どんなコンパイラだ?
一応こう書き換えれば通ると思うが。
--
node n;
n.tail = tail;
n.c = '\0';
n.value = 0;
--
しかし、問題は他にもあって、環境によっては
--
fprintf(stderr, "\nFIND:");
--
をprintf()にしないと表示がぐずぐずになる。
また、割り切れない除算を強行するので例えば、1 2 / 3 + 4 *が得られている。
と言うことで、誰かが書き直すのを待った方がいいかも知らん。
node n; n.tail = tail; みたいに分ければいけるかも
165 :
149 :2007/10/12(金) 22:40:35
>>163 コンパイルとおりました。
しかし、問題の要件を満たしてないです・・・
入れ替えや括弧までって言うと結構面倒なんだよね。私ゃパスだ。
167 :
149 :2007/10/12(金) 22:51:20
>>166 そうですね。
9C4=126通りの組合せに対してそれをやらないといけないですね
括弧は入れ替えの一種だから考慮しなくていいんじゃね?
169 :
153 :2007/10/12(金) 23:02:31
再帰使えばポインタも構造体も使わずに解けるはず。
やべ、calc(..., 1, ...)じゃなくてcalc(..., number - 1, ...) だったわ…。 ポインタ使うなってのは配列をスタックにしてやれってことなんだろうけど。
つかいろいろ間違ってた…鬱
>>173 どうもありがとうございます。
。でも数字を自分で入力するんじゃなく、9個の数字から4つ選ぶ9C4=126通りの組合せそれぞれに対して
12になるのが一つだせればいいんです。もし一つもなければNGを出すんですが・・・
>>173 ポインタ使わずに頑張ったところ悪いが、
1 3 / 9 * 4 *
↑こんなんが出ない
>>175 まずい?浮動小数点数になおすべきなんかな
>>174 longjmp使っていいならやるお
13/が0になっていいわけないだろw
> 9 7 2 1 ---> 9 7 2 / + 1 * 本当にわかってんの?
>>179 tmpもdoubleにするか、キャストしないと、
端数切り捨てられますよ、っと
しかしポインタ使うなと言われて関数ポインタ使うとはw
がんばれ。
>>149 >>183 ポインタなしでどうやってんのかと見てみたら、関数の仮引数を int a[] みたいな書式でやってるのな、痛々しいw
もっとみんな人に優しく
>>186 の67行目と68行目の間に追加
if(!is_12) printf("%d %d %d %d ---> NG\n", num[0], num[1], num[2], num[3]);
>> 186
もう気づいてるかもだが、
>>183 では 1789 ---> 98*71-/ になってるとこが
NG になるお。 9*8/(7-1) の括弧に対応してないのかな
括弧の事なんて忘れてたさ
カッコ悪い
191 :
111 :2007/10/13(土) 08:06:53
>>184 配列わずにポインタ使えって言うから例題みたら*(array+i)とかよくあること。
193 :
149 :2007/10/13(土) 09:39:26
>>183 >>186 おお!すごい。ありがとうございます。186と183の結果違いますね。
アルゴリズム的にはどういう感じですか?
186も改造して 1789にも対応しようと思うんですが
[1] 授業単元: C言語U
[2] 問題文(含コード&リンク):
mem1に入っているプログラムで
data2に入っているsimulation_dataを読み込んで、モデル化するプログラムを作っているのですが、
うまく読み込めてないようなんです。実行されるとdata6_arspecの中のresult4bに結果が入力されます。
/*simulation_dataを読み込む文です間違いありかもしれません*/
FILE *fp1;
fp1=fopen("..\\data2\\simulation_data","r");
for(j=0;j<n;j++){
fscanf(fp1,"%15.5f \n",&raw_16ch[0][j]);
}
for ( j=0; j<n; j++ ) {
printf("%15.5f \n",raw_16ch[0][j]);
}
fp1=fopen("sim1_","w");
fprintf(fp1,"sim1_ \n");
for(j=0;j<n;j++){
fprintf(fp1,"%15.5f \n",raw_16ch[0][j]);
}
fclose(fp1);
この文が間違っているんだと思います。実行時に入力するのは、
@..\data2\simulation_data A2500 B..\data6_arspec\ Cresult4b\ D1 E64 F25 G1.0 H1
の順です。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0
[3.3] 言語: C
[4] 期限: 10月15日10時まで
[5] その他の制限:よろしくお願いしますm(_ _)m
UP先はこちらです。
http://www.dotup.org/uploda/www.dotup.org6676.zip.html
脊髄反射でscanが%15.5lfと予測
>>194 どっかで色々指摘したと思うのだが、完全無視か?
15.5fが怪しいな
>>146 今日、出しに行ったら何とか受け付けてくれました。
ありがとうございました。
宿題マダァ?(・∀・ )っ/凵⌒☆チンチン
>>203 のシャッフル方法は一般に使われてるもんなんでしょうか?
混ぜ具合の要求レベルによるんだろうってことはわかるんですけど。
一般的でもないだろう
完全にシャッフルされていることを証明するのってどうすればいいの? 高卒の俺に教えてください。
209 :
111 :2007/10/13(土) 14:23:50
seed をきちんと選べば、それなりにシャッフルされると思ったのですが・・・ あ、seed(time(0)); はめんどくさくて端折りました。
srand(time(0)); だった・・・かるく自殺してくる。
>>208 53枚のカードから一発でババを引き当てることが出来る状態のことを
完全シャッフル状態といいます。
前半と後半(乱数)の入れ替えだから後半に動かないカードが多少出るね。
どちらかといえば
>>203 のほうがいいと思うんだ、うん。
>>208 農学部卒の俺の答え
今回の例だったら 52x52 のカウンタの配列作って、数万回試行、カウンタとって
標準偏差とってほかの方法と比べる、みたいなんじゃないか?証明はムリ
シャッフルについては95代目で議論があった。 for(i=0;i<N;i++){ r=(int)(rand() / (RAND_MAX + 1.0) * (i+1)); temp=array[i]; array[i]=array[r]; array[r]=temp; } みたいするといい感じに混ざるらしい。 詳しくは510からの議論を参照されたし
>>203 のは後半に動かないカードが多少出るどころじゃないだろ。
1から25までに入ってる奴は自分より小さい番号のところに絶対入らない糞仕様だぞ
あ、書こうと思ったら先越された
>>218 均一に混ぜるなら
>>218 の方法だけど、
リアルに似せるなら多少不均一でもいいかもね。よくないか。
なるほどねぇ。
>>204 いまさら指摘すると、分数を使う必要はない
1/3*6 = 2 ができなくても 6*1/3 のように並び替えで同じ解が得られるから
カードシャッフルのチート対策版 メモリ内を覗かれても、カードが配られる時まで 次に配られるカードが何であるか分からない #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int card[52], i, idx, temp; srand(time(NULL); for(i=0;i<52;i++) card[i]=i; for(i=0;i<52;i++){ idx=rand()%(52-i); temp=card[i]; card[i]=card[i+idx]; card[i+idx]=temp; } for(i=0;i<52;i++) printf("%d\n", card[i]); return 0; } ※上記の表現は誇張しています。頑張れば次のカードを調べることは可能です
ちょっと聞きたいんだけどLoad Imageってvoid文でもいけたよね? void mywindow_init2() { int i; HDC hdc = GetDC(mywin[0]); for(i=0;i<MDC_MAX;i++){ mdc[i]=CreateCompatibleDC(hdc); } bmp[0]=CreateCompatibleBitmap(hdc,WINX,WINY); bmp[1]=LoadImage(myinst,"bitmap1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); bmp[2]=CreateBitmap(WINX,WINY,1,1,NULL); bmp[3]=LoadImage(myinst,"title.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); bmp[4]=LoadImage(myinst,"gameover.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); bmp[5]=LoadImage(myinst,"ending.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(mdc[0],bmp[0]); PatBlt(mdc[0],0,0,WINX,WINY,WHITENESS); SelectObject(mdc[1],bmp[1]); SelectObject(mdc[2],bmp[2]); SelectObject(mdc[3],bmp[3]); SelectObject(mdc[4],bmp[4]); SelectObject(mdc[5],bmp[5]); COLORREF c; c=GetPixel(mdc[1],0,0); BitBlt(mdc[2],0,0,640,371,mdc[1],0,0,SRCCOPY); BitBlt(mdc[1],0,0,640,371,mdc[2],0,0,SRCINVERT); ReleaseDC(mywin[0],hdc); } で、ビットマップが変換できないってエラーでて困ってるんだけど
225 :
149 :2007/10/13(土) 19:30:02
完全な回答だれかできませんか? 183は組合せが1234から始まってないので・・・ あとプログラムのアルゴリズムに対して考察もしないといけないので・・・
その書き方だと「できます」ってだけのやつが出てくるぞ 催促するならはっきり書かなきゃ
考察したら自分で完全版作れるんじゃない?
228 :
149 :2007/10/13(土) 19:36:02
>>226 はい。では仕様を満たすプログラムを作ってください。
お願いします。。。
1234から始めたいだけなら for(i=1; i<=6; i++) { for(j=i+1; j<=7; j++) { for(k=j+1; k<=8; k++) { for(l=k+1; l<=9; l++) { //チェック用の関数 }}}} ってやればよくね?
>>229 チェック用の関数がどこにあたるかわからないです。。。
>>183 のプログラムが理解できなくて・・・
>>186 ならなんとか理解できそうなんですが
理解できるんなら、それを自分で変えればいいだけだろ。
233 :
149 :2007/10/13(土) 20:48:59
>>231 やっぱり理解できなかったです。
122行目の
temp=work[index], work[index]=work[i], work[i]=temp; の構文がよくわからないです。なんでセミコロンじゃなくてコンマなんですか?
temp=work[index]; work[index]=work[i]; work[i]=temp; と同じ。 ただ、そういう書き方もできるだけ。
235 :
149 :2007/10/13(土) 21:04:24
236 :
149 :2007/10/13(土) 21:05:09
途中で送信してしまいました。
>>186 の方がまだいるならば完全版をお願いしたいです。
1〜9の数字を重複せずに選んで、入力した数nを計算できる数式を全て列挙せよ
>>186 の人は立ち上がってポインタを解禁して欲しそうにしている
解禁しますか?はいかイエスで答えて下さい
ニア はい
イエス
>>149 こんなん簡単だろ
まず f ( a b c d) 数字abcdをそのままの順序でつかって計算可能な式すべてを計算する を作る
○は加減乗算とする
可能性として a b ○ c ○ d ○ または a b ○ c d ○○ の形しかない
これで関数fはつくれるだろ
240 :
149 :2007/10/13(土) 21:33:04
>>239 a b c * + d - (b*c)+a-d
みたいな感じもありえますよね?
すまん まちがえた
3つなら a b○c○ a bc○○ のみ 4つなら a b○c○d○ a bc○○d○ と a bcd○○○ でいいか?
a b○c○d○ a bc○○d○ a bcd○○○ a b○cd○○ だな
>>243 ab○c○d○ は dcab○○○ と等価
順番はかえないっていってるだろ
任意の個数のときは、全部を後方に置くか、、一カ所区切りをいれる というのを再帰して求めれば全ての配置が決まるな
(1〜9から重複せず4個選ぶ組み合わせ)×(+-*/から重複を許して3個選ぶ組み合わせ)×(8個の物を並べる順列)
249 :
248 :2007/10/13(土) 22:27:59
あー 9/(8-5)*4=12 が抜けとる 思ったよりめんどいな
なぜ抜けている事がわかった?
251 :
248 :2007/10/13(土) 22:36:35
割り算が可換じゃないことを思い出したから
というか
>>183 じゃ駄目なのか?
俺は試してないから知らないけど
あー酔っ払った。とりあえず宿題くれ。
254 :
183 :2007/10/14(日) 03:26:47
ああ俺のは組み合わせの順序が4321〜9786… (組み合わせの結果を逆順に配列に入れてるだけ)になるからダメなんだな…。 直してあげたいが2日間飯食ってなくて辛いんだ。すまない。
表示のところで逆からにすればいいだけじゃね?
>>254 そんな貴方の生活習慣を直してあげたい。
は、はやく宿題を!
どど、どうしたんだ急に!
259 :
149 :2007/10/14(日) 12:16:01
>>259 計算の順番は固定じゃないんだから、4321を1234って風に逆順にすればいいだけだろ?
>>257 は宿題をやらないと禁断症状が出る病気だと思われる。
>>257 に宿題
>>223 を考察せよ。
(1)本当にチート対策されているのか?
(2)均一にシャッフルされているか?
(3)その他気付いた点
解いてほしかったら問題補足以外にはしゃべらないほうがいい。
[1] 授業単元:暇TSUBUSIX [2] 問題文(含コード&リンク): 簡単なアーカイバーを作れ。プログラムのインターフェイスや ファイルのフォーマットなどは自由である。 ただし、最低でも以下の操作が行えること: ・書庫へのファイルの追加 ・書庫に含まれるファイルのリストの出力 ・書庫に含まれるファイルのうち、指定されたものの内容を出力 [3] 環境 [3.1] OS: Write once, run anywhere [3.2] コンパイラ名とバージョン: YES! [3.3] 言語: C/C++ [4] 期限: 2007年10月27日12時30分 [5] その他の制限: 暇TSUBUSIX あんまおもしろくないかな?ファイルが関わってくると色々面倒だよね。
一気にLEVEL上がってるYO!初心者には辛いYO! Javaじゃないんだから”Write once, run anywhere ”なんて ヒントくれYO!
書庫ってもLHAやらZIPやらで圧縮しなくてもいいよ。単にファイルの収納/取り出しが出来るだけで。 余裕があるのならRUN-LENGTH圧縮くらいやっても。
ferror←フェラー
ここはもはや何スレか分からんなw 暇つぶしスレとか、 初心者がレベルアップに問題こなしてくスレとか、 そんな感じじゃねえかw
まあ最初からそうじゃないの。楽しくも無いのに他人の宿題を黙々と解くなんてどこのインベーダーだよ。
おお、これは大作だな。 ただ要求を大きく見誤ってるぞ・・・。4つの数字は組み合わせで与えないと。
なんだと……?
そろそろ俺のターンでok?
ずっと牛のターン
277 :
牛 :2007/10/14(日) 16:19:24
278 :
牛 :2007/10/14(日) 16:23:55
>>277 って、1789対応してねえ... orz
279 :
牛 :2007/10/14(日) 16:31:10
280 :
牛 :2007/10/14(日) 16:43:59
,,,すまんかった、牛のターン終了で頼む。
全部の数式をチェックするのは最終手段っぽいな。なんか良いやり方ないかな 宿題のくせにむずいぞ
全部の数式チェックすればいいだけ 簡単だろが
a b○c○d○ a bc○○d○ a bcd○○○ a b○cd○○ のところへ+-*/をいれて総当たり abcdは、9C4 × 4! だけいれかえろ
せっかく頑張って
>>152 書いたのにレスがないのはちと寂しい・・・
>>46 氏はもうどこかへ旅立たれたのだろうか。
>>288 ただこれ、
1 2 3 4 ---> 1 2 4 * + 3 +
まではでるけど
1 2 3 4 ---> 1 2 4 * + 3 + (=1 + 2 * 4 +3)
はでないんだ。
というか後置記法だったら、
1 2 3 4 ---> 1 2 4 * + 3 + (= 2 * 4 + 1 + 3)
なんじゃないかと小一時間(ry
ちなみに、逆ポーランド記法で、交換などで同一の式はどう判断すればいいですか?
それも宿題の一部?面倒くさいから総当りでやっちゃったけど、いい方法思いつかんよ・・・。
295 :
◆Q0rf/h.OAE :2007/10/14(日) 22:26:51
[1] 授業単元:プログラミング1 [2] 問題文(含コード&リンク): 【※1】のプログラムを、入力した整数が3と7の公倍数か評価する部分と、 1〜100の範囲外であるか評価する部分を別関数としてプログラムを作成すること。 但し、関数との値の受け渡しは、引数や戻り値を用いること。 ※1のプログラム… include <stdio.h> int main(void) { int n; do { printf("1〜100の整数を入力してください。\n"); scanf("%d", &n); if(n<1||n> 100) { printf("その旨"); return 0; } }while(n%21); printf("入力した整数は、3と7の公倍数です。\n"); return 0; } [3] 環境 [3.1] OS: Windows [3.3] 言語: C言語 [4] 期限: 2007年10月14日22時58分迄 [5] その他の制限: brakeを用いていただけると助かります。
296 :
149 :2007/10/14(日) 22:47:58
>>295 #include <stdio.h>
int is_range(int n){
return (1<=n && n<=100);
}
int brake(int n){
return ((n%3)==0 && (n%7)==0);
}
int main(void)
{
int n;
while(1) {
printf("1〜100の整数を入力してください。\n");
scanf("%d", &n);
if(!is_range(n)) {
printf("その旨");
return 0;
}
if(brake(n)) break;
}
printf("入力した整数は、3と7の公倍数です。\n");
return 0;
}
298 :
◆Q0rf/h.OAE :2007/10/14(日) 22:59:14
ありがとうございます。
299 :
◆Q0rf/h.OAE :2007/10/14(日) 23:08:18
[1] 授業単元:プログラミング1 [2] 問題文(含コード&リンク): >297のプログラムを、関数との値の受け渡しと引数や戻り値を使用せずに、 変数のスコープを用いるプログラムを作成すること。 [3] 環境 [3.1] OS: Windows [3.3] 言語: C言語 [4] 期限: 2007年10月14日23時40分迄 [5] その他の制限:特にありません 宜しくお願いします。
301 :
デフォルトの名無しさん :2007/10/14(日) 23:25:52
というより質問者がキモい
>>301 課題1(do文)
#include <stdio.h>
int main(void)
{
int no_min, no_max, sum;
printf("整数を入力してください:");
scanf("%d", &no_min);
printf("整数を入力してください:");
scanf("%d", &no_max);
if(no_min>no_max) no_min^=no_max,no_max^=no_min,no_min^=no_max;
do{
sum=(no_max+no_min)*(no_max-no_min+1)/2;
}while(0);
printf("%d から %d までを足した値は %d です。\n", no_min, no_max, sum);
return 0;
}
>>301 課題2(while文)
#include <stdio.h>
int main(void)
{
int no;
puts("============================");
puts(" 読み込んだ整数の個数だけ*を連続表示 " );
puts("============================");
printf("正の整数を入力してください:");
scanf("%d", &no);
while (no-- > 0) puts("*");
return(0);
}
>>301 課題3(for文)
#include <stdio.h>
int main(void)
{
int no, sum;
puts("============================");
puts(" 1から5までの和を求めて表示(複合代入演算子+後置増分演算子)" );
puts("============================");
for(no=1,sum=0;no<=5;sum+=no++);
printf("1から5までを足した値は%dです。 \n", sum);
return (0);
}
>>301 課題4(多次元配列)
#include <stdio.h>
int main(void){
int i, j;
int A[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }, KA[2][3];
double K;
char buf[50+1];
puts("============================");
puts(" 2行3列の行列を加算する");
puts("============================");
printf("実数を入力してください:");
fscanf(stdin, "%50s", buf);
sscanf(buf, "%lf", &K);
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
KA[i][j] = A[i][j] * K;
}
}
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
printf(" %3d", KA[i][j]);
}
putchar('\n');
}
return(0);
}
308 :
デフォルトの名無しさん :2007/10/15(月) 00:07:22
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 部分ピボット選択付きガウスの消去法を実現するプログラムを作成せよ。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語のみ [4] 期限: 2007年10月18日午後7時まで [5] その他の制限: 数学関数を用いる。
309 :
デフォルトの名無しさん :2007/10/15(月) 00:21:59
おいらも149やってんだがうまくいかん。
>>287 のはどうやってんだ?
きっと
>>149 が考察を書いてうpしてくれるさ
>>308 教科書もしかして「線型代数とその応用」?
ピポットなんて概念その本でしかみたことない。
ピポットの概念の説明も書いたほうがレスつきやすい希ガス。
>>308 #include <stdio.h>
#include <math.h>
#define N 128
#define swap(type, x, y) do{type tmp = x; x = y; y = tmp;}while(0)
int main(void){
double a[N][N], b[N], mul;
int i, j, k, n;
scanf("%d", &n);
for(i = 0; i < n; i++){
for(j = 0; j < n; j++) scanf("%lf", &a[i][j]);
scanf("%lf", &b[i]);
}
for(i = 0; i < n; i++){
for(j = i, k = i + 1; k < n; k++)
if(fabs(a[j][j]) < fabs(a[k][k]))
j = k;
for(k = 0; k < n; k++) swap(double, a[i][k], a[j][k]);
swap(double, b[i], b[j]);
if((mul = a[i][i]) == 0) return fprintf(stderr, "解なし\n"), 1;
for(j = 0; j < n; j++) a[i][j] /= mul;
b[i] /= mul;
for(j = 0; j < n; j++)
if(j != i){
mul = a[j][i]/a[i][i];
for(k = 0; k < n; k++) a[j][k] -= mul*a[i][k];
b[j] -= mul*b[i];
}
}
for(i = 0; i < n; i++) printf("%g\n", b[i]);
return 0;
}
int x=128; while(1){ int a = getch(); if(a == 0x71) break; //qを押されたら終了 a &= 0xff; int k = atoi((char *)&a); //文字を数値へ変換 if(k==4{ if(x>0){ x--; } }else if(k==8){ if(x<239){ x++; } } } 上記の文章は4を押したら128から-1 8を押したら128から+1するというプログラムなのですが if(k==4{ if(x>0){ x--; } }else if(k==8){ if(x<239){ x++; } } の部分を x=に変換したいのですが x= ((k==4)&&(x>0)x--) || ((k==8)&&(x<239)x++); みたいにやってみたのですが上手くいきません 一文で複数条件つけて上手く書く方法お願いしますorz
int x=128; while(1){ int a = getch(); if(a == 0x71) break; //qを押されたら終了 a &= 0xff; int k = atoi((char *)&a); //文字を数値へ変換 if(k==4{ if(x>0){ x--; } }else if(k==8){ if(x<239){ x++; } } } 上記の文章は4を押したら128から-1 8を押したら128から+1するというプログラムなのですが if(k==4{ if(x>0){ x--; } }else if(k==8){ if(x<239){ x++; } } の部分を x=に変換したいのですが x= ((k==4)&&(x>0)x--) || ((k==8)&&(x<239)x++); みたいにやってみたのですが上手くいきません 一文で複数条件つけて上手く書く方法お願いしますorz
なぜか左に詰められるなorz
x = x - (x > 0) * (k == 4) + (x < 239) * (k == 8);
掛け算はねーな x = x - (k == 4 && x > 0) + (k == 8 && x < 239); のほうがいいか。 どっちにしろ、無理に一文にまとめても、効率悪くなるだけで意味ないと思うが。
それよりint k = atoi((char *)&a); の挙動が気になる
求める数字になるか、0になるかは環境依存
>>317 専用ブラウザでみてると、ちゃんとインデントされてるよ。
それは専用ブラウザの種類による
回答thxです いや、このスレ通りそういう風にするという宿題だったんです 効率はともかく・・・ アルゴリズムの勉強だったんですかね? とにかくありがとうございます
x = k==4 && x > 0 ? x - 1 : k==8 && x < 239 ? x + 1 : x; の方が、題意に沿ってるかもな こういう書き方は好きじゃないが
>>325 条件演算子とかいう奴でしたっけ?
そういう書き方もできるのか…あんまり使わないですが覚えておきます
x+=(k==8)-(k==4),x=(x<0)?0:(x>239)?239:x;
x=min(max(0,x+(k==8)-(k==4)),239);
329 :
デフォルトの名無しさん :2007/10/15(月) 10:00:31
分を入力するプログラムを作成しなさい 実行画面 分入力=>2000 33時間20分です
330 :
デフォルトの名無しさん :2007/10/15(月) 10:09:32
上底、下底及び高さを入力するように変更しなさい 実行画面 上底、下底及び高さ入力=>3 4 5 面積=17.50
>>329 #include <stdio.h>
int main(void)
{
int m;
printf("分入力=>");
scanf("%d", &m);
printf("%d時間%d分です\n", m / 60 , m % 60);
return 0;
}
>>330 #include <stdio.h>
int main(void)
{
int a, b, h;
printf("上底、下底及び高さ入力=>");
scanf("%d%d%d", &a, &b, &h);
printf("面積=%.2f\n", (double)(a + b) * h / 2);
return 0;
}
5枚の画像(a.jpg、b.jpg、・・・、e.jpg)ファイルがあります 最初にa.jpgを表示し、xキーを押すと次の画像(b.jpg)を表示します yキーを押すと前の画像(a.jpg)を表示します これのアルゴリズムが分かりません for文を使って書きたいです
そうですか では、がんばってください
334 :
デフォルトの名無しさん :2007/10/15(月) 11:06:05
休み期間中に108問ある問題を終らせるには、毎日平均何問解けばよいか計算するプログラムを作成しなさい int day=29; 実行画面 3問:8日 4問:21日
>>334 #include <stdio.h>
#define NumofProblems 108
int main(void)
{
int n, d, day = 29;
n = NumofProblems / day;
d = NumofProblems % day;
printf("%d問:%d日\n", n, day - d);
if(d) printf("%d問:%d日\n", n + 1, d);
return 0;
}
>>336 %s/NumofProblems/NUM_OF_PROBLEMS/
いや、ただ単に俺の趣味の問題だがね。
338 :
デフォルトの名無しさん :2007/10/15(月) 17:59:24
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 性能の異なる機械が5台ある。そこに、2種類の製品A・Bの発注がくる。 毎日、発注の有無に関わらずスケジューリングをし、製品の発注があった場合、いつ完成するかを出すプログラムを書きなさい。 ただし、毎日発注があるとは限らない。発注がない場合にはそのスケジューリングは無かったものとし、あった場合にのみ、各機械に仕事が割り当てなれる。 製品Aは機械1(6)⇒機械2(4)⇒機械3(5)⇒機械4(8)⇒機械5(10) 製品Bは機械5(8)⇒機械4(2)⇒機械3(10)⇒機械2(5)⇒機械1(7)の順に加工される。 ()内は加工時間、単位:時間 終了条件は、100日 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:BCC5.5 [3.3] 言語:C言語 [4] 期限:10/16正午 [5] その他の制限: よろしくお願いします。
なんだそりゃ?以前の発注から、最適なスケジューリングをするプログラム?
340 :
338 :2007/10/15(月) 18:21:59
>339 違います。問題文書き直します。 性能の異なる機械が5台ある。そこに、2種類の製品A・Bの発注がくる。 毎日、発注の有無に関わらずスケジューリングをし、いつ製品が完成するかを出すプログラムを作成しなさい。 ただし、発注間隔はランダムで、毎日発注があるとは限らない。発注がない場合にはそのスケジューリングは無かったものとし、あった場合にのみ、各機械に仕事が割り当てなれる。 製品Aは機械1(6)⇒機械2(4)⇒機械3(5)⇒機械4(8)⇒機械5(10) 製品Bは機械5(8)⇒機械4(2)⇒機械3(10)⇒機械2(5)⇒機械1(7)の順に加工される。 ()内は加工時間、単位:時間 終了条件は、100日。 発注が毎日来た場合には、機械がすでに使用されているから、完成するまでの時間がかかるし、 発注があまりない場合には、直ぐに完成する。っていうプログラムを作れって事だと思うんですけど・・・ よろしくお願いします
やっぱわかんねえ。入力と出力の例を書くとか、なんか工夫してくれ。 それともおれだけ理解できないのか?
なんとなく理解できた
とりあえず勤務時間と福利厚生についてkwsk
[1] 授業単元: [2] 問題文(含コード&リンク): 通知勧告を促すプログラムを作りなさい 例) << 何回通告しますか? >> 5 << #1 締め切りは12月31日です << #2 締め切りは12月31日です << #3 締め切りは12月31日です << #4 締め切りは12月31日です << #5 締め切りは12月31日です [3] 環境 [3.1] OS: (Windows [3.2] コンパイラ名とバージョン: VC++ [3.3] 言語: C++ [4] 期限: 早めで [5] その他の制限:なし よろしくお願いします
345 :
デフォルトの名無しさん :2007/10/15(月) 21:02:03
学校の課題です。キーボードから数値を入力して「正」「負」「0」を表示する。ピリオド「.」が入力されたら終了。 //全体の流れ //無限ループ //数値の入力、失敗したらピリオドであるかを判定。 //ピリオドなら終了if(getchar)=='.')break; //ピリオドでなかったら入力間違いのメッセージを出して再入力。fflush(stdin); //if文で正負0を判定して表示 //以上を繰り返す。 main() { int a; printf("数値aを入力してください"); while(scanf("%d",&a)!='.'){ ????????????????????? if(getchar()=='.'){ break; } ????????????????????? if(a>0){ printf("PLUS\n"); }else if(a<0){ printf("MINUS\n"); }else if(a==0){ printf("ZERO\n"); } } } 2箇所、分かりません。よろしくお願いします。
347 :
◆vLIz8KOkPM :2007/10/15(月) 21:23:27
[1] 授業単元: プログラミング演習 動的なメモリ確保 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc GNONE2.[3.3] 言語: C言語 [4] 期限: 明日午前9時まで [5] その他の制限: 関数、構造体、ポインタまで習いました。 初心者なので、理解しやすい、できるだけ簡単なプログラムでお願いします。 [2] 問題文 標準入力から複数の数字を読み込み,読み込んだ数字を逆順にしたものを,out.txt に 書き出しなさい.また,その数の合計した値を out.txt の最後に書き出しなさい. 標準入力から読み込む書式は,最初の数字にはデータの個数,2つ目以降の数字は実際 に処理する数字とする.具体的には, 4 12 -45 56 3 と入力した場合,最初の 4 はこれから読み込む数字の個数を表し,残りの 12 -45 56 3 は out.txt に書き出す数字である.out.txt には 3 56 -45 12 26 と書き出すことになる.最後の 26 は,4つの数字の合計である. 読み込まれる数の個数は毎回変更するため,動的にデータの個数分のメモリを確保(malloc() 関数を使う)すること. ***** ヒント ***** ※ 最初の数字を読み込んだ後に malloc()関数で個数分のint型の領域を確保する.malloc() 関数の返り値はint型の配列として扱うことが出来る. ※ 標準入力からの読み込みは scanf() 関数が使える.また,読み込みが終了した場合 scanf() 関数は EOF を返す.つまり, while(scanf("%d", &value) != EOF) { 処理 } のような形で読み込み処理は記述できる.上記の処理で,数字を保存しておく. ※ int型の領域の後ろから out.txt に値を出力し,最後に合計値を出力する.
テンプレって強制だっけ?
>>345 無限ループってかいてあるじゃない。
ループはwhile(1)かfor(;;)が正解
でその後
if(scanf("%d", &a) != 1) {
if(getchar() == '.') break;
puts("なめんな");
fflash(stdin);
continue;
}
scanfって途中で失敗したら読み込んだ内容をストリームに返すっけ…?
s/fflash/fflush/ 最近ActionScriptに凝ってるもんで<(^_^;)
>>348 いや、while(scanf("%d",&a)!='.')はちゃんと無限ループになると思いますよw
確かにw
【質問テンプレ】 [1] 授業単元: プログラミング [2] 問題文: 次のニ次元配列の第二要素を第一要素の小さい順に出力せよ。 a[5][2] = { {11,1}, {5,2}, {15,3}, {3,4}, {8,5} } 出力例:4 2 5 1 2 注:第一要素の値を比べた過程は必ず含むこと。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 16日9:00まで [5] その他の制限: 特になし よろしくお願いしますm(__)m
あ・・・例が間違ってました 出力例:4 2 5 1 3 に訂正します
>>347 #include<stdio.h>
main()
{
int *a,b=0,value;
FILE *fp;
if((fp=fopen("out.txt","w"))==NULL){
printf("file can't open.\n");
exit(1);
}
scanf("%d",&value);
a=(int *)malloc((sizeof(int*))*value);
while(scanf("%d",a)!=EOF){
b+=*a++;
}
while(--value>=0){
fprintf(fp,"%d ",*a--);
}
fprintf(fp,"%d",b);
fclose(fp);
}
fprintf(fp,"%d ",*a--);はfprintf(fp,"%d ",*--a);の間違いなので訂正。
C言語でなかなかポインタやリスト構造のプログラムが自由に書けません。 図で説明はできるので理解はできているつもりです(理解できていないのかもしれませんが)。 皆さんはどうやってポインタ関連を克服しましたか?
ひたすら実践あるのみ
358 :
デフォルトの名無しさん :2007/10/15(月) 22:28:47
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 性能の異なる機械が5台ある。そこに、2種類の製品A・Bの発注がくる。 毎日、発注の有無に関わらずスケジューリングをし、いつ製品が完成するかを出すプログラムを作成しなさい。 ただし、発注間隔はランダムで、毎日発注があるとは限らない。発注がない場合にはそのスケジューリングは無かったものとし、あった場合にのみ、各機械に仕事が割り当てなれる。 製品Aは機械1(6)⇒機械2(4)⇒機械3(5)⇒機械4(8)⇒機械5(10) 製品Bは機械5(8)⇒機械4(2)⇒機械3(10)⇒機械2(5)⇒機械1(7)の順に加工される。 ()内は加工時間、単位:時間 終了条件は、100日。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:BCC5.5 [3.3] 言語:C言語 [4] 期限:10/16正午 [5] その他の制限: よろしくお願いします。
>>352 #include<stdio.h>
main()
{
int a[5][2]={{11,1},{5,2},{15,3},{3,4},{8,5}};
int i,j,tmp1,tmp2;
for(i=0;i<5;i++)
for(j=4;j>i;j--)
if(a[j-1][0]>a[j][0]){
tmp1=a[j][0];
tmp2=a[j][1];
a[j][0]=a[j-1][0];
a[j][1]=a[j-1][1];
a[j-1][0]=tmp1;
a[j-1][1]=tmp2;
}
for(i=0;i<5;i++)
printf("%d ",a[i][1]);
printf("\n");
}
整列にバブルソートを使用。ソート部分を関数化すれば他のソートにも変更可能。
>>358 一日の発注数の最大とかは決まってないの?
363 :
358 :2007/10/15(月) 23:11:59
>362 発注量は一定です。 よろしくお願いします
365 :
◆vLIz8KOkPM :2007/10/15(月) 23:14:00
>354 ありがとうございましたm(__)m助かりました☆
>>352 qsortを使って…
#include<stdio.h>
#include<stdlib.h>
int compare_int(const int *a,const int *b)
{
return *a - *b;
}
main()
{
int i,*ptr;
int a[5][2] = { {11,1},{5,2},{15,3},{3,4},{8,5} };
int buffer = mallco(sizeof(int)*10);
ptr = buffer;
for(i=0;i<5;i++){
*buffer++=a[i][0];*buffer++=a[i][1];
}
qsort(data,5,sizeof(int)*2,(int(*)(const void*,const void*))compare_int);
for(i=0;i<5;i++){
++buffer;printf("%d,",*buffer++);
}
}
368 :
714 :2007/10/16(火) 01:06:25
369 :
デフォルトの名無しさん :2007/10/16(火) 01:42:58
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 以下のプログラムは変数a,bの値を表示した後 値の入れ替えを行って再度表示するプログラムであるが誤りを含んでいる。 それを、ポインタ変数を使って正しく変更せよ。 以下のプログラム↓ #inlude <stdio.h> void swap(int x,int y){ int temp; temp=x; x=y; y=temp; } int main(void) { int a=10,b=30; printf("a=%d b=%d\n",a,b); swap(a,b); printf("a=%d b=%d\n",a,b); return 0; } [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:BCC5.5 [3.3] 言語:C言語 [4] 期限:10/16の10時 [5] その他の制限: よろしくお願します。
>>369 void swap(int *x,int *y){
int temp;
temp=*x;
*x=*y;
*y=temp;
}
swap(&a,&b);
確認してないから間違ってるかも
371 :
369 :2007/10/16(火) 02:45:30
あ、BCC を持ってないので gcc3.4/cygwin で動作確認しました。
>>373 の 57 行目を
switch (rand() % 100) {
↓
switch (rand() % 400) {
くらいにすると、トレースしやすい結果がでます。
376 :
デフォルトの名無しさん :2007/10/16(火) 11:08:38
>373 エラー E2034 2seihinn.cpp 44: 'void *' 型は 'order_t *' 型に変換できない(関数 create_order(int) ) エラー E2034 2seihinn.cpp 48: 'void *' 型は 'product_t *' 型に変換できない(関数 create_order(int) ) ってなるんですけど・・・
>>376 C言語じゃないのかよ!ってかそこからかよ!
>>376 とりあえず拡張子は .c にしろ。話はそれからだ。
>>376 自分でC言語と指定してるのに何を言っとるのだー
C++ でよかったのなら、書き換えたい・・・(´・ω・`)
381 :
376 :2007/10/16(火) 11:41:25
すいません。 C++でお願いします。
>>381 !!!
もしかしてどうすればコンパイルできるのか分からないだけか?
383 :
376 :2007/10/16(火) 11:52:00
実行すれば勝手にコンパイルはするんですけど・・・
とりあえず言語がC++に変更されたということで スレタイにもあるようにC++の宿題も全然おっけー
C++ に書き換えようかと思ったけど、一度 C で書いた後でってのが あほらしくなってきた・・・ 誰か他の人よろしく。わしゃもう寝る。
387 :
368 :2007/10/16(火) 13:58:25
>>372 おかげさまで間に合いました。
本当にありがとうございました。
宿題
[1] 授業単元:言語処理
[2] 問題文(含コード&リンク):
ここに書きました。
http://doiob.net/doiob/uploader/src/up11562.txt tanakaとta na kaの間はタブであけてます。taとnaの間は
スペースであけています。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン:BCC5.5
[3.3] 言語:C言語
[4] 期限:明日まで。
[5] その他の制限:
よろしくお願します。
1をメモリこいれてから、2を一行ずつよんでメモリと比較しろ
問1、キーボードから次々に整数を読み込んで足していき 最後に入力された値の合計値を表示するプログラムを作成する ただし、入力データの終わりは負の数で示すものとする (例えば1,5、4、−1が入力された場合、『合計=10』と表示) ※ ・入力された値が0以上であるかどうかをはじめて判定する前に 最初の値を読み込んでいなくてはならない ・値を読み込む回数=判定する回数=加算回数+1 問2、 問1を拡張して、合計だけでなく平均も表示するプログラムの作成 (例えば上の数の並びに対しては、『合計=10 平均=3』と表示 宜しくお願いします
>>388 可変長だと面倒なんだけど、単語の長さやファイルの行数に上限を設けたらダメかな。
392 :
デフォルトの名無しさん :2007/10/16(火) 15:38:47
[1] 授業単元:C言語 ポインタ [2] 問題文(含コード&リンク): 1、整数型iにデータを入力し、iのアドレスをポインタ変数pに記憶して、 i,&i,p,*pの値を表示するプログラムを作成せよ。 2、二つの実数型変数xとyにデータを入力してそれらのアドレスを ポインタ変数pとqにそれぞれ記憶し、ポインタ変数pとqを用いてxとyの和 を求めるプログラムを作成せよ [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:BCC5.5 [3.3] 言語:C言語 [4] 期限:10/16の10時 [5] その他の制限: 二問ありますがよろしくお願します。
>>390 #include <stdio.h>
int main()
{
int cnt = 0;
int sum = 0;
for (int val; scanf("%d", & val) == 1 && val >= 0; ++cnt) {
sum += val;
}
printf("sum:%d, avg:%g\n", sum, (double) sum / cnt);
return 0;
}
平均はintじゃね?
>>392 // 1
#include <stdio.h>
int main() {int i; scanf("%d", & i); char * p = & i; printf("%d, %p, %p, %c\n", i, & i, p, * p); return 0;}
// 2
#include <stdio.h>
int main() {float x, y; scanf("%g%g", & x, & y); float * p = x; float * q = y; * p + * q; return 0;}
397 :
390 :2007/10/16(火) 16:15:51
問1、キーボードから次々に整数を読み込んで足していき 最後に入力された値の合計値を表示するプログラムを作成する ただし、入力データの終わりは負の数で示すものとする (例えば1,5、4、−1が入力された場合、『合計=10』と表示) ※ ・入力された値が0以上であるかどうかをはじめて判定する前に 最初の値を読み込んでいなくてはならない ・値を読み込む回数=判定する回数=加算回数+1 問2、 問1を拡張して、合計だけでなく平均も表示するプログラムの作成 (例えば上の数の並びに対しては、『合計=10 平均=3』と表示 すみません、emacsで使えるようできませんか?
399 :
デフォルトの名無しさん :2007/10/16(火) 16:31:29
[1] 授業単元: c言語 ポインタ [2] 問題文(含コード&リンク): キーボードから空白を含まない文字列を入力し、その文字列内の大文字アルファベットの個数 小文字アルファベットの個数、数字の個数、それら以外の個数を数えあげて表示する プログラムを作成せよ [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語: C++ [4] 期限:無期限 [5] その他の制限:特になし 一応作ってみたんですが、思うようにいかないです
400 :
デフォルトの名無しさん :2007/10/16(火) 16:32:40
>>391 単語の長さは20くらいでカバーできると思います。
行数は10でいいです。
あとでかえるので。
>>397 >すみません、emacsで使えるようできませんか?
ここはC/C++スレ、elisperはいないです。
403 :
デフォルトの名無しさん :2007/10/16(火) 16:35:33
どなたか、これをお願いします。 問1 整数nを仮引数として取り、 n≦0のとき0 n>0のとき1/n^2 を戻り値とするdouble型関数 func(n)を定義せよ。 問2 上で定義したfunc(n)を使い、 1+1/1^2+1/2^2+1+3^2+・・・+1/100^2 の値を出力するプログラムを作成せよ。
405 :
399 :2007/10/16(火) 16:35:57
#include <stdio.h> #include<ctype.h> main() {char a[100]; char *px; int i,b,c,d,e; i = 0; b = 0; c = 0; d = 0; e = 0; scanf("%s", a); px = &a[i]; for(px=a; *px != '\0'; px++){ for(i=0; a[i] != '\0'; i++){ if (a[i] = isupper(a[i])) b++; else if(a[i] = islower(a[i])) c++; else if(a[i] = isdigit(a[i])) d++; else e++; }} printf("ALPHABET = %d\n", b); printf("alphabet = %d\n", c); printf("numeral = %d\n", d); printf("others = %d\n", e);} と作ってみてはいるんですが、コンパイルした結果を見る限り、 else if(a[i] = islower(a[i])) c++; else if(a[i] = isdigit(a[i])) d++; の部分が作用されてないっぽいです。よろしくお願いします。
406 :
404 :2007/10/16(火) 16:40:15
あ、行数指定されてたのね。 行数に関しては適当に#defineして現在6になってるところを置き換えたらいけるはず。
>>405 >for(px=a; *px != '\0'; px++){
>for(i=0; a[i] != '\0'; i++){
何で二重ループしてるの?
pxへの代入が使われてないし、
これだとaの文字数分、内側のループを繰り返すと思うよ
試してないけど
ループは一重でおk
外側のループを消し去ってしまえ
408 :
399 :2007/10/16(火) 16:52:05
>>407 俺もそう思うんですけど、それだとポインタ使わないってことですよね?
実はその部分はヒントとして教授が提示してた部分なんですよ
だから無理やりにでも使わなきゃいけないのかなって・・・
>>399 #include <iostream>
#include <string>
#include <functional>
#include <algorithm>
using namespace std;
int upper_num;
int lower_num;
int digit_num;
struct Counter : unary_function<char, void> {
void operator () (char c) {
if ('A' <= c && 'Z' >= c)
++upper_num;
else if ('a' <= c && 'z' >= c)
++lower_num;
else if ('0' <= c && '9' >= c)
++digit_num;
}
};
int main() {
string str;
cin >> str;
for_each(str.begin(), str.end(), Counter());
cout << "upper: " << upper_num << endl;
cout << "lower: " << lower_num << endl;
cout << "digit: " << digit_num << endl;
}
>>403 #include<stdio.h>
double func(int n)
{
return n<=0 ? 0 : 1.0/(n*n);
}
main()
{
int n;
double s=1.0;
for(n=0;n<=100;n++)
s+=func(n);
printf("f(n)=%.10lf\n",s);
}
表示に指定がなかったので小数点以下10桁を表示するようにしてます。
>>408 それは、外側のループ部分だけ示された、ということ?
それなら内側のループ消して、処理部分のa[i]を*pxに変えればいいだけ
もし二つのループを両方示されたなら、
どちらかを使えという意味だと思うよ
>>403 #! /usr/bin/ruby
def function(n)
if n <= 0 then
0
else
1 / n ** 2
end
end
sum = 0.0
(1..100).each { |n| sum += function(n.to_f) }
puts sum
# 何語で書けば良いか分からなかったので ruby で書きましたw
413 :
399 :2007/10/16(火) 17:14:41
>>411 示されたのは外側のループですね
言われたらなんとなくわかった気がするので、また試してみます
ありがとうございました。
>>409 ありがとうございます。
でも俺の知識の範疇を軽く越えてますね・・・ORZ
a[i]=
Rubyにしては冗長だな
>>415 ( ´∀`)つ puts (1..100).inject(0.0) { |sum, n| sum += if n <= 0 then 0.0 else 1.0 / n**2 end }
もう止めます。スレ汚しごめんなさい。
>>399 自分ならこう書きます、ただし空白を含んだ文字列も可ですが
文字列長の制限256Byteそれを越す文字列を入れると暴走します…。
#include<stdio.h>
#include<ctype.h>
#define BUFFER_LEN 256
void main(void)
{
int upper_count,lower_count,num_count;
char buffer[BUFFER_LEN];
upper_count = lower_count = num_count = 0;
gets(buffer);
for(;*buffer!='\0';++buffer){
if(isupper(*buffer))++upper_count;
if(islower(*buffer))++lower_count;
if(isdigit(*buffer))++num_count;
}
printf("大文字:%d 小文字:%d 数字:%d",upper_count,lower_count,num_count);
}
422 :
420 :2007/10/16(火) 20:14:01
*buffer!='\0'を *buffer!='|0' || *buffer != ' ' とすればいけるかな問題文満たせるな…
423 :
422 :2007/10/16(火) 20:15:31
間違い 誤:|0 正:\0
424 :
デフォルトの名無しさん :2007/10/16(火) 21:46:29
[1]授業単元:C言語実習 [2]問題文 ニュートン法を使って、f(z)=z*z*z-z-1=0の解である虚数解と実数解をすべて、C言語を使って出力せよ。 [3]環境 OS : XP 言語: C [4]期間 2007/10/22 [5]制限 特になし よろしくお願いします。m(_ _)m
g = f' = 3x^2 - 1 点aでfに接する直線は、傾きg(a)で、(a,f(a))を通る y- f(a) = g(a)(x - a) y=0 のときの解は、x = a- f(a)/g(a) たとえば a=1+i などから初めて、k(a) = a- f(a)/g(a)の値が収束すればいい
たとえば100回繰り返しても、誤差が縮まらないなら破棄して、次の値をチェックせよ 例えば、調べる値は、自然数 n に対して、( n/360 + 1 )( cos( nπ /360 ) + i * sin(nπ /360) )などにしたらどうだ
>>420 ・根本的に配列とポインタを混同している
・オーバーフロー懸念するならfgets使えよ
今日までしらなかったが complex.hってどのコンパイラでもついてるの?
C99
430 :
428 :2007/10/16(火) 23:24:19
BCCで動くからなんでも動くと考えて良さそうだな
431 :
デフォルトの名無しさん :2007/10/16(火) 23:28:48
[1]授業単元:情報理論 [2]問題文 酔歩 (ランダムウオーク) 原点から出発し、k歩あるいた後の位置がどこになるかを考察する。 乱数を発生させ、偶数であれば正の方向に一歩、奇数であれば負の方向に一歩進むとする。] k=100の場合の試行を10000回おこない、結果をグラフで表示するプログラムを作れ。 [3]環境 OS : XP 言語: C [4]期間 2007/10/17 [5]制限 特になし どなたか、お願いいたします。
432 :
428 :2007/10/16(火) 23:59:04
>>424 #include <stdio.h>
#include <complex.h>
#define Complex complex<double>
Complex f(Complex z){ z=z*z*z-z-(Complex)1;return z;}
Complex h(Complex z){z=z-f(z)/((Complex)3*z*z-(Complex)1);return z;}
main(){
Complex z , I(0,1),w[9];
int n,i,k=0;
for(n=0;n<1000;n++){
z=(Complex)(n/100)*exp(I*M_PI* (Complex)((n+0.0)/100));
for(i=0;i<200;i++)z=h(z);
if(abs(f(z))<0.001)for(i=0;i<k;i++)if(abs(z-w[i])<0.01)break;
if(i==k){w[k]=z;k++;printf("real=%f\timag=%f\n", real(z),imag(z));}}}
>>431 どんなグラフにすればいいの?
それが分かればやってみる。
434 :
デフォルトの名無しさん :2007/10/17(水) 00:09:52
>>433 ヒストグラムで表示されるプログラムだと助かりますm(_ _)m
ほとんどグラフを書く問題だな
k[200]を用意して、値は0以上とする k[0]が10なら-100のところに10個点をつける といったところだろう
k[201]
>>434 出力例を書いてくれると助かります。m(_ _)m
たとえば、5点たまったら*を一つ上に伸ばすとかだろう こういう感じ * * * * * ** *** * *
>>436 100歩移動した結果は-100〜100の間の偶数、計101個にしかならないので要素数は101でいい
#define STEP 100
#define STEP_TO_IDX(n) (((n) + STEP) / 2)
#deine IDX_TO_STEP(n) (n * 2 - STEP)
こんな感じで
だが初心者用のプログラムでマクロなんか使ったらどやされるううウウゥゥゥ!!!
なんのためにconstあると思ってるんだ。
443 :
デフォルトの名無しさん :2007/10/17(水) 00:40:53
>>438 すいません、本当にCについて無知でして・・・。というか、出力例という言葉が分からない感じでして。
一応、グラフについてはどんな形でもいいと言われました。
なので、実行した下に表示される形でも、エクセルに数値が出される形でも何でもいいです
m(_ _)m
444 :
デフォルトの名無しさん :2007/10/17(水) 00:42:11
>>424 初期値 z = x + i*y を入力する形で作れませんか?
>>439 みたいなヤツで本当にいいのか、
それとも90°曲げて右に伸びるタイプが良かったのか、
目盛や軸をつける必要があるのかないのか、
とか、そういう部分のことだ。
何でもいいということが分かったので
>>439 風にする。
>>431 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i, j, k[101] = {0}, pos;
srand(time(NULL));
for(i=0; i<1000; i++) {
for(j=0, pos=0; j<100; j++) pos += rand() % 2 ? 1 : -1;
k[(pos+100)/2]++;
}
for(i=0; i<=100; i++) {
printf("%3d:%3d:", i * 2 - 100, k[i]);
for(j=0; j<k[i]; j+=2) putchar('*');
putchar('\n');
}
return 0;
}
447 :
デフォルトの名無しさん :2007/10/17(水) 00:48:19
>>445 形は439の形で
縦軸と横軸に簡単な目盛りがついていれば助かります
目盛りはいりません
本当にすみません
>>447 >縦軸と横軸に簡単な目盛りがついていれば助かります
>目盛りはいりません
どっちだよ。
今ヨーグルト喰ってるから、ちょっと待っててね。
>>442 ごめん、何のためにあるんだ?
俺は配列定数作りたい時にしか使ってないのだが……
450 :
デフォルトの名無しさん :2007/10/17(水) 00:59:23
あれ? const てANSI時代からあったっけ?素で忘れた。 いや C++ から逆輸入かな?と思ったんだけどね。
453 :
451 :2007/10/17(水) 01:05:14
すまん、ANSIはあった気がしてきた。 少なくとも const char *str みたいのはよく書いてたな。
[1] 授業単元:データ構造 [2] 問題文(含コード&リンク): 連結リストによる実装を行う。 ・各要素を表す構造体の他に連結リストの先頭に構造体を1つ置き、これを ヘッダーと呼ぶことにする。 ・次の要素が存在しない場合には、対応する構造体では、次の構造体への ポインターをNULLとする。 ・連結リストの構造体は、 struct c{ int a; struct c *ne; }; とする。 指定された構造体の前の構造体へのポインターを返す関数preを作成せよ。 (例えば、 □→□→□→□→□ とすると、指定された構造体が左から4番目としたら、左から2番目。) 最初の引数を、指定する構造体へのポインターとし、次の引数を対象となる 連結リストのヘッダーへのポインターとして、 struct c *pre(struct c *t, struct c *l){ に続けて書くこと。尚、main関数は作らなくても良い。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 10月18日9:00まで [5] その他の制限: 文章でも説明(これは自分で書こうと思います)しないと いけないので、出来るだけ簡単な文法を使って書いて頂けると助かります。
455 :
デフォルトの名無しさん :2007/10/17(水) 01:16:11
>>452 え〜と・・・勝手な仕様変更についての「申し訳ございません」だったんですが・・・。
何かこっちの失礼としてとられたのなら、すみません。m(_ _)m
とりあえず、今からレポート作ってきます。本当に助かりました。
ありがとうございました。
>>450 ヨーグルト食べたよー。途中までは
>>446 を流用した。適当に改行して。
途中で面倒になったのは許してくれ。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int k = 100;
int n = 10000;
int a[21] = {0};
int i, j, p;
srand(time(NULL) ^ 0xBadFeel);
for (i = 0; i < n; i++) {
for (j = 0, p = 0; j < k; j++) { p += rand() % 2 ? 1 : -1; }
a[(p + k) / 10]++;
}
for (i = 0; i < 21; i++) {
printf("% 6d %c", n - i * 500, (i % 2 ? '|' : '+'));
for (j = 0; j < 21; j++) {
printf(" %c ", ((((20 - i) * 500 - a[j]) > 0) ? ' ' : '*'));
}
printf("\n");
}
printf(" /-100 0 +100\n");
return 0;
}
TABは反映されないんだった…。全角スペースで埋めるから、変換してね。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int k = 100; int n = 10000; int a[21] = {0}; int i, j, p; srand(time(NULL) ^ 0xBadFeel); for (i = 0; i < n; i++) { for (j = 0, p = 0; j < k; j++) { p += rand() % 2 ? 1 : -1; } a[(p + k) / 10]++; } for (i = 0; i < 21; i++) { printf("% 6d %c", n - i * 500, (i % 2 ? '|' : '+')); for (j = 0; j < 21; j++) { printf(" %c ", ((((20 - i) * 500 - a[j]) > 0) ? ' ' : '*')); } printf("\n"); } printf(" /-100 0 +100\n"); return 0; }
左から二番目の矢印、つまり三番目へのポインタ。 ってことじゃない?
460 :
デフォルトの名無しさん :2007/10/17(水) 02:41:53
[1] 授業単元:コンピュータプログラミング 計算幾何 [2] 問題文(含コード&リンク): (X,Y)=(-100,100) (X,Y)=(-100.0) (X,Y)=(0,100) (X,Y)=(100,0) (X,Y)=(-40,0) (X,Y)=(50,-100) これらの座標値を与えると単純な閉路(閉路を多角形と考える)を計算し、点A(-40,-20)、点B(-20,-20)が多角形の内部か外部か判定するプログラムを作れ [3] 環境 [3.1] OS:指定無し [3.2] 指定無し [3.3] 言語: どちらでも可 [4] 期限:2007年10月17日15:00まで [5] その他の制限:特に無し わかる方、是非教えてください(><)
>>460 1.与えられた点を与えられた順序で繋いでいく
2.与えられた点を凸包になるように繋いでいく
どっち?
※2.の場合には例であげられた点(-40,0)を通らない
1.だろうな。 ただ、2.の方が実装は楽しそう。
463 :
399 :2007/10/17(水) 08:17:20
昨日
>>407 ,
>>411 さんに言われたとおりにやってみたんですが、
結果は
>>405 と変わりませんでした。
やっぱり else if(*px = isdigit(*px))
d++;
else
e++;
この部分が適用されてないっぽいです。
これはいったいどういうことなんでしょうか・・・
464 :
デフォルトの名無しさん :2007/10/17(水) 08:17:38
>>458 途中で支離滅裂なことばっかりいってすみません。
最後まで面倒みていただき、ありがとうございました。
>if(*px = isdigit(*px))
467 :
デフォルトの名無しさん :2007/10/17(水) 09:30:21
460の者です。 >461さん 全ての点を含めた多角形なので1だと思われます(^O^)
468 :
デフォルトの名無しさん :2007/10/17(水) 09:36:42
460の者です。 >466さん プログラミング初心者なので規格とかわからないのですが、 とりあえずはプログラムが実行出来て答えが導き出せれば良いとのことです。 これがそのプログラムですか?参考にします☆ ありがとうございます!!
>>399 ループが終わった後に文字列表示してみればわかるんじゃないかな
470 :
466 :2007/10/17(水) 10:07:13
acon周りがうまくいってないな
>>460 #include <stdio.h>
#define NITEM(arr) (sizeof(arr)/sizeof(arr[0]))
typedef struct{int x, y;}vect2;
vect2 vect2_sub(const vect2 a, const vect2 b){
vect2 ret;
ret.x=b.x-a.x;
ret.y=b.y-a.y;
return ret;
}
int is_inside(vect2 vert[], int vert_num, vect2 p){
vect2 v1v2, v1p;
double temp;
int i, check=0;
for(i=0;i<vert_num;i++){
v1v2=vect2_sub(vert[i], vert[(i+1)%vert_num]);
v1p=vect2_sub(vert[i], p);
temp=v1v2.x*v1p.y-v1v2.y*v1p.x;
if(temp>0) check++;
if(temp<0) check--;
}
return !!(check);
}
int main(int argc, char *argv[]){
vect2 vert[]={{-100,100},{-100,0},{0,100},{100,0},{-40,0},{50,-100}};
vect2 chk_p[]={{-40,-20},{-20,-20}};
int i;
for(i=0;i<NITEM(chk_p);i++)
printf("(%d,%d) is %sside.\n", chk_p[i].x, chk_p[i].y, is_inside(vert, NITEM(vert), chk_p[i])?"in":"out");
return 0;
}
472 :
471 :2007/10/17(水) 10:37:38
473 :
466 :2007/10/17(水) 10:43:13
すみません。 内積じゃ無理ですね。
474 :
471 :2007/10/17(水) 10:55:07
>>460 #include <stdio.h>
#define NITEM(arr) (sizeof(arr)/sizeof(arr[0]))
typedef struct{int x, y;}vect2;
vect2 vect2_sub(const vect2 a, const vect2 b){
vect2 ret;
ret.x=b.x-a.x;
ret.y=b.y-a.y;
return ret;
}
int is_inside(vect2 vert[], int vert_num, vect2 p){
vect2 v1v2, v1p;
int i, j, temp, check, inside_count=0;
for(i=0;i<vert_num;i++){
for(j=0,check=0;j<3;j++){
v1v2=vect2_sub(vert[(i+j)%vert_num], vert[(i+(j+1)%3)%vert_num]);
v1p=vect2_sub(vert[(i+j)%vert_num], p);
temp=v1v2.x*v1p.y-v1v2.y*v1p.x;
if(temp>0) check++;
if(temp<0) check--;
}
if(check==3 || check==-3) inside_count+=check/3;
}
return !!(inside_count);
}
int main(int argc, char *argv[]){
vect2 vert[]={{0,0},{100,0},{0,100},{100,100}};
vect2 chk_p[]={{10,20},{20,10}};
int i;
for(i=0;i<NITEM(chk_p);i++) printf("(%d,%d) is %sside.\n", chk_p[i].x, chk_p[i].y, is_inside(vert, NITEM(vert), chk_p[i])?"in":"out");
return 0;
}
>>474 だた orz
vect2 vert[]={{0,0},{100,0},{0,100},{100,100}};
vect2 chk_p[]={{10,20},{20,10}};
↓
vect2 vert[]={{-100,100},{-100,0},{0,100},{100,0},{-40,0},{50,-100}};
vect2 chk_p[]={{-40,-20},{-20,-20}};
一番y座標が大きい点を始点として、右回りに角度がもっとも0度に近いものを結んでいくといい
>>478 どの問題の答えかは知らないが解いたものうp!
新たな宿題なら
>>1 の質問テンプレを読んで書きなおし
n点与えられたときにもっとも面積が大きくなる結び方は?
この100点からなる多角形の最大面積は? #include <stdio.h> #include <stdlib.h> main(){ int x[100],y[100]; for(int i=0;i<100;i++){x[i]=rand();y[i]=rand();} }
全部をちゃんと結ぶんだよ? あと0から1000までの内部に全ての点があれば、1000*1000以下だよ
>>483 点の結び方で異なる面積になるから、そのうち最大のやつを求めてくれって事
486 :
454 :2007/10/17(水) 13:40:23
>>456 すいません、うまく説明できてなくて。
>>459 はい、そういう事です。
よろしくお願いします。
struct c *pre(struct c *t, struct c *l) { struct c *p; for(p = l: p->ne!=NULL; p=p->ne) if(p->ne==t) return p; return NULL; }
>>484 小学生にでも言い聞かせてるつもりか?
分かってるなら自分で解けばいいだろ
491 :
490 :2007/10/17(水) 19:02:43
>>490 の
「以下のデータ」:
学生数: 10人 → 30人
科目数: 2 → 5
(数学、生物学、地学、英語、国語)
平均に基づいて成績をつけよ。
S: 90以上
A: 80 < 点数の平均 < 90
B: 70 < 点数の平均 < 80
C: 60 < 点数の平均 < 70
D: 60未満
抜けてました。すみません。よろしくお願いします。
>>490 えっと・・・どこがわからないんですか?
>>493 randに依存するけど、同じ値なら同じ出力するプログラムがいいんで巣が
498 :
466 :2007/10/18(木) 00:06:04
>>460 期限切れてるが、やり直してみた。正規の方法を知りたいところ。
#include <stdio.h>
#include <math.h>
#define N 128
typedef struct point{
double x, y;
}point;
double angle_from_x(point p1, point p2){
return atan2(p2.y - p1.y, p2.x - p1.x);
}
int main(void){
point p[N], q;
double p_ang[N], q_ang, dif_ang;
int n, i, cur, prev = 0;
for(n = 0; n < N; n++) if(scanf("%lf%lf", &p[n].x, &p[n].y) != 2) break;
scanf("%lf%lf", &q.x, &q.y);
for(i = 0; i < n; i++) p_ang[i] = angle_from_x(p[i], p[(i + 1)%n]);
for(i = 0; i < n; i++){
q_ang = angle_from_x(p[i], q);
dif_ang = p_ang[i] - q_ang;
dif_ang = dif_ang > M_PI ? dif_ang - 2*M_PI : dif_ang < -M_PI ? dif_ang + 2*M_PI : dif_ang;
cur = dif_ang > 0 ? 1 : dif_ang < 0 ? -1 : 0;
if(cur*prev < 0) break;
prev = cur;
}
if(i < n) puts("入ってる");
else puts("入ってない");
return 0;
}
499 :
466 :2007/10/18(木) 00:25:25
逆か…… だめぽ
[1] 授業単元:プログラミング言語 [2] 問題文(含コード&リンク): 名前と得点のデータをメンバとする構造体を定義し、入力と表示を行うプログラムを作成する。 入力件数は最大5件で、名前は10文字、得点は100点までの入力とし、範囲外ならばエラーを表示し再入力させる。 名前にENDと入力されたら入力を終了し結果を表示する。データは得点の高い順に表示する。 また、名前の最初にENDと入力した場合はエラーを表示しプログラムを終了する。 データの1件分の入力、表示、ソートをそれぞれ関数に分けて処理を行う。 [3] 環境 [3.1] OS:win xp [3.2] コンパイラ名とバージョン:bcc5.5 [3.3] 言語:C言語 [4] 期限:2007年10月19日10:00まで [5] その他の制限:特になし よろくお願いします><
>>399 ,409
個人的にはこっちの方が分かりやすいなぁ、1文字ずつ読むという意味においては。
#include <algorithm>
#include <cctype>
#include <iostream>
#include <iterator>
int upper_num, lower_num, digit_num;
void counter(char c) {
if (std::isupper(c))
++upper_num;
else if (std::islower(c))
++lower_num;
else if (std::isdigit(c))
++digit_num;
}
int main() {
std::for_each(std::istream_iterator<char>(std::cin), std::istream_iterator<char>(), counter);
std::cout << "upper: " << upper_num
<< "\nlower: " << lower_num
<< "\ndigit: " << digit_num
<< std::endl;
}
502 :
454 :2007/10/18(木) 01:31:16
>>487 解答ありがとうございます。
でも、それだと、指定された構造体へのポインターを返してないですか?
つまり、
□→□→□→□→□
とすると、指定された構造体が左から4番目としたら、左から3番目の
*ne(左から4番目へのポインター)を返してないですか?
指定された構造体の前の構造体へのポインターを返すと言う問題なので
左から2番目の*ne(左から3番目へのポインター)を返すことになります。
構造体とポインタの順番を別個に考えるのはやめろ。 そういう風に考えてるから、きちんと理解できないんだ
>>502 0 { a=0 , ne=*1}
1 { a=1 , ne=*2}
2 { a=2 , ne=*3}
3 { a=3 , ne=*4}
4 { a=4 , ne=NULL}
>>487 では例えば3の要素を指定した場合、
「neが3を指し示すようになっている構造体」への『ポインタ』を返している。つまり2の要素へのポインタ。
君の言い方に合わせればこれは「1のne」に等しいわけだから、問題無いと思う。
505 :
454 :2007/10/18(木) 02:19:45
>>503 >>504 レスありがとうございます。
>>504 さんの図を使うと、
「例えば3の要素を指定した場合」って言うのは
プログラム中の引数のtは*3ですよね?
そして「2の要素へのポインタ」って言うのは*2ですよね?
506 :
デフォルトの名無しさん :2007/10/18(木) 02:33:21
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 整数n(2<=n<=16)と数字列digitsを与えると10進数に変換した値を求めるプログラム [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限: 10/19 17:00 [5] その他の制限: void base2dec(int n, string digits, int &dec)を利用すること (実行例)110101(2)=53 123(8)=83 FFFF(16)=65535 ちなみにn進数を10進数に変換する方法はわかっています。 ((((digits[0]*n)+digits[1])*n+digits[2])*n+digits[3])*n+・・・ void関数の中をうまくプログラムできません。よろしくお願いします。
>>505 そう。
「指定された構造体(3)の前の構造体(2)へのポインター(*2==1.ne)を返す関数pre」
で問題無いと思うが
508 :
454 :2007/10/18(木) 02:51:16
>>507 落ち着いて、
>>504 さんの図と例を使って、紙にプログラムの動作を
一つ一つ書きながら、確認していったら、納得できました。
確かに合ってます。
ありがとうございました。
>>487 せっかく解答下さって、合ってたのに間違ってるとか言って
申し訳ないです。
>>506 #include <iostream>
using namespace std;
void base2dec(int n, string digits, int &dec){
int k=1,m,s=digits.size();dec=0;
for(int i=1;i<=s;i++){m=digits[s-i];dec+=k*(m<64?m-48:m-55);k*=n;}}
main(){ int dec;base2dec(8,"123",dec);cout<<dec;}
>>506 #include <iostream>
using namespace std;
void base2dec(int n, string digits, int &dec){
int k=1,m;dec=0;
for(int i=digits.size()-1;i>=0;i--)
{m=digits[i];dec+=k*(m<64?m-48:m-55);k*=n;}}
main(){ int dec;base2dec(16,"FFFF",dec);cout<<dec;}
for(i=0; i<s; i++) {m=digits[i]; dec = dec * n + (m<64 ? m-48 : m-55)}
497もよろしくお願いします
#include <iostream> using namespace std; void base2dec(int n, string digits, int &dec){ int m;dec=0; for(int i=0;i<digits.size();i++) {m=digits[i];dec=dec*n+(m<64?m-48:m-55);}} main(){ int dec;base2dec(8,"123",dec);cout<<dec;}
>>497 void bubble(int a[]){
int i,j,tmp;
for(i=0;i<N-1;i++)
for(j=N-1;j>i;j--)
if(a[j]<a[j-1]){
tmp=a[j];a[j]=a[j-1];a[j-1]=tmp;
print_array(a);
}
}
void insertion(int a[]){
int i,j,tmp;
for(i=1;i<N;i++){
j=i;
while(j>=1 && a[j-1]>a[j]){
tmp=a[j];a[j]=a[j-1];a[j-1]=tmp;j--;
}
print_array(a);
}
}
void selection(int a[]){
int i,j,tmp,lowest,lowkey;
for(i=0;i<N-1;i++){
lowest=i;lowkey=a[i];
for(j=i+1;j<N;j++)
if(a[j]<lowkey){
lowest=j;lowkey=a[j];
}
tmp=a[i];a[i]=a[lowest];a[lowest]=tmp;
print_array(a);
}
}
#include <iostream> int base2dec(int n, std::string d){ int m,x=0; for(int i=0;i<d.size();i++) {m=d[i];x=x*n+(m<64?m-48:m-55);} return x;} main(){std::cout<<base2dec(8,"123");}
[1] 授業単元:プログラミング及び実習U
[2] 問題文(含コード&リンク):ボイヤームーア法の機能を以下の2点について拡張する。
@ファイルの先頭からテキストを1行ずつ(1行の文字数は999文字以下とする)読み込み、何行目の何文字目に
検索文字列の先頭が存在するか出力する。
A探索文字列中に同じ文字列が複数含まれる場合について検索方法を改良する。(末尾の文字と同じ文字が、1文字まで)
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語: C
[4] 期限: [2007年10月23日10:00まで
[5] その他の制限: stdio.h string.hを使用する
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5092.txt 同じ文字が無いときを最初に書こうとしてますが、何故か無限ループになります…
検索先文字列 a[0]〜a[N-1] 、検索する文字列 b[0]〜b[M-1] 移動テーブル t[0]〜t[255] 初期化 t[i]=0 for (i=1; i<=M ;i++) t[ b[M-i] ] = i; serch(){ 検索位置n=0 while(1){ i=0→M-1 if( b[i] != a[n] ) break; if( i==M )return n; n + = t [ a[n+M] ]; if(n+M >=N)return -1;} }
10M程度のバイナリファイルから 一致するビット列の全てのアドレスを求めるプログラムを作る ただし、検索する文字列は1バイト単位とする もっとも速く計算するものを作る
>>516 Cの文字列は添え字0からなので
if(strg[length1]==ex[length1+i])
を
if(strg[length1-1]==ex[length1+i-1])
にしないとstrncmpが失敗します。
よく見ろ
バイナリファイルだと一度のどのくらい読み込むのがいいですかね?
ファイルの読み込みと探索を同時にやるといいですかね?
525 :
519 :2007/10/18(木) 12:41:25
>>524 2分探索だろ
serch(a,b){
m=(a+b)/2;
if(p<x[m])k=serch(a,m-1) else if(p>x[m]) k=serch(m+1,b); else k=m;
return k;}
2chのログファイルから文字列を探索する関数serchを作ってだれが高速か勝負しようぜ!
serch( 検索元文字列, 検索する文字列 , 見つけたバイト数の配列 )
http://fx10.web.fc2.com/2ch.zip #include <stdio.h>
#include <time.h>
void serch(char* x,char* str,int* adr){adr[0]=1;}
main(){
int N=18000000;char *x=new char[N];N=0;
printf("データロード中・・・");
FILE *fp=fopen("2ch.txt","rb");while(fread( &x[N],1,1,fp))N++;fclose(fp);
printf("完了\n");
int c,adr[100];
char str0[]="ノンアルコール",str1[]="冷蔵庫に物を沢山詰め込んでいるんです";
c=clock();
serch(x,str0,adr);
serch(x,str1,adr);
c=clock()-c;
printf("検索にかかった時間は %d 秒です\n",c);}
searchだろうに
529 :
527 :2007/10/18(木) 14:12:50
検索元のサイズが不明だと不便なので、Nはグローバルの定義にしても可にします
>FILE *fp=fopen("2ch.txt","rb");while(fread( &x[N],1,1,fp))N++;fclose(fp); これは恥ずかしい。よくこれだけの突っ込みどころをたった一行に埋め込めたもんだ。
532 :
527 :2007/10/18(木) 14:21:38
どこが汚いんだよ ほとんど何もしないところしか書いてないぞ だったらserchを綺麗にかいてくれよ
ファイルあまり扱わないから知らないんだけど、 文字列検索なのにバイナリでファイル読み込むと何か利点あるの?
いちどに256バイトとか読み込むと、末端でNにいくつ加えるか変数をひとつ用意しなくてはなら無くなる
>>532 汚いと全く思わないのか?
汚いの承知で手を抜いただけかと思った
個人的にNは小文字じゃないと解りずらい
>>533 一応、バイナリファイルの検索もできるようにする為 一行ずつよんでxに格納していいけどそちらのほうがちょっと長くなるな
c=clock(); serch(); serch(); c=clock()-c; の部分が何秒で戻ってくるかだけわかればいい あとのコードは気にしないように
[1] 授業単元:C言語 [2] 問題文: /***list.txt***/ data014s data021c data123s data126a /************/ といったファイル(list.txt)があるとする。 このファイルの中身から数字だけを取り出して int型の配列list_num[]に格納せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: ([2007年10月19日まで] [5] その他の制限:特になし
>while(fread( &x[N],1,1,fp))N++; これとほぼ等価なコード。 -- N = fread(x, 1, N, fp); -- それにしても、変数の使い回しや大文字の使用は気持ち悪い。
FILE *fp; if ((fp=fopen("2ch.txt","r")) == NULL) exit(1); for (n=0; (x[n]=fgetc(fp)) != EOF; ++n); fclose(fp); x[n] = '\0';
いちどに数十メガ読み込むと動作おかしくならない? せいぜい1Kくらいのほうが
とりあえず、勉強にもなるので
>>527 は
serch関数の部分うpしてくれ。
544 :
527 :2007/10/18(木) 14:49:54
>>543 勝負に不公平がないようにうpした時点では何も作っていない もう少しで出来るとおもう
>>527 printf("検索にかかった時間は %f7.3 秒です\n",(double)c/CLOCKS_PER_SEC);
にしないとちゃんと秒表示されないと思う…。
546 :
527 :2007/10/18(木) 14:57:15
#include <stdio.h> #include <time.h> int N; void serch(char* x,char* str,int* adr){ char t[256];int n,M,k,su=0; for(M=0;;M++)if(str[M]=='\0')break; for(n=0;n<256;n++)t[n]=M; for(n=1;n<=M;n++){k=(unsigned char)str[M-n];if(t[k]==M)t[k]=n;} n=0;while(1){ for(k=0;k<M;k++)if(str[k]!=x[n+k]) break; if(k==M){adr[su]=n;su++;n+=M;} else {k=(unsigned char)x[n+M];n+=t[k];} if(n+M>=N){adr[su]=-1;return;}}} main(){ N=18000000;char *x=new char[N];N=0; printf("データロード中・・・"); FILE *fp=fopen("2ch.txt","rb");while(fread( &x[N],1,1,fp))N++;fclose(fp); printf("完了\n"); int c,adr[100]; char str0[]="ノンアルコール",str1[]="冷蔵庫に物を沢山詰め込んでいるんです"; c=clock(); serch(x,str0,adr);printf("%dバイト目 %dバイト目 に出現する\n",adr[0],adr[1]); serch(x,str1,adr);printf("%dバイト目 %dバイト目 に出現する\n",adr[0],adr[1]); c=clock()-c; printf("検索にかかった時間は %d 秒です\n",c);}
547 :
527 :2007/10/18(木) 14:59:09
うpしたよ ノンアルコールは2つ、冷蔵庫に物を沢山詰め込んでいるんですは1つあるんだけど・・・番地はあってるかな?
548 :
527 :2007/10/18(木) 15:12:46
おまいら対戦相手が出てこない・・・
>>539 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAXLINE 1000
main()
{
char filename[100],line[MAXLINE],num[100];
int i,j,len,n=0,list_num[100];
FILE *fp;
printf("Input file name:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL){
printf("file can't open.\n");
exit(1);
}
while(fgets(line,MAXLINE,fp)!=NULL){
len=strlen(line);num[0]='\0';
for(i=0,j=0;i<len;i++){
if(isdigit(line[i])) num[j++]=line[i];
}
num[j]='\0';
if(num[0]!='\0')
list_num[n++]=atoi(num);
}
for(i=0;i<n;i++)
printf("%d\n",list_num[i]);
}
行の中にある数値を出現した順に並べてint配列に格納するようになってます。
なのでdata014s10という行だとlist_numには1410が格納されます。
550 :
527 :2007/10/18(木) 16:43:51
いまいちもりあがらいなあ そしたら、Cドライブの中にある重複ファイルを検索してみるか? ファイルの先頭64KBくらいを読み込んで、ハッシュ(CRC、MD5など) を計算してそれが一致したら詳しく調べるようにするといいと思う 一度計算したらデータベースに蓄えておき次回の検索時に使用する するとDVDなどにも対応できる
//
>>527 折角だから標準関数で対抗を作ってみた。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void serch(const char * const x, char const * const str, int * adr)
{
unsigned cnt = 0;
for (const char * np = NULL, * p = x; np = strstr(p, str); p = np + strlen(str)) adr[cnt++] = np - x;
adr[cnt] = -1;
} // >546よりざっと倍くらい遅いみたい
int main()
{
const int N = 18000000;
char * x = new char[N];
fprintf(stderr, "データロード中・・・");
FILE * fp = fopen("2ch.txt", "r");
if (fp == NULL) return EXIT_FAILURE;
unsigned size = fread(x, 1, N, fp);
fclose(fp);
x[size] = '\0';
fprintf(stderr, "完了\n");
char str0[] = "ノンアルコール";
char str1[] = "冷蔵庫に物を沢山詰め込んでいるんです";
int c = clock();
int adr[100];
serch(x,str0,adr); printf("%dバイト目 %dバイト目 に出現する\n", adr[0], adr[1]);
serch(x,str1,adr); printf("%dバイト目 %dバイト目 に出現する\n", adr[0], adr[1]);
c = clock() - c;
fprintf(stderr, "検索にかかった時間は %g 秒です\n", double(c) / CLOCKS_PER_SEC);
delete[] x; return EXIT_SUCCESS;
}
>>550 ほら、高速化してやったぞ
あとスレ違いだからよそでやって
#include <stdio.h>
#include <stdlib.h>
int main(void){
size_t bufsize;
unsigned char *buf=NULL;
FILE *fp=NULL;
printf("データロード中・・・");
fp=fopen("2ch.txt","rb");
if(fp==NULL) goto on_error;
fseek(fp, 0L, SEEK_END);
bufsize=ftell(fp);
fseek(fp, 0L, SEEK_SET);
buf=malloc(bufsize);
if(buf==NULL) goto on_error;
fread(buf, 1, bufsize, fp);
fclose(fp);
printf("完了 %u bytes\n", bufsize);
free(buf);
return 0;
on_error:
if(buf!=NULL) free(buf);
if(fp!=NULL) fclose(fp);
return 1;
}
>>421 内容が濃い課題ですが・・・お願いします。
>>553 最初見たときにやろうかと思ったんだけど、VC++のWizardが main() を吐いてくれず、
_tWinMain() とかになったので萎えた。Wizard使わないでゼロから書くのはさすがにめんどい。
556 :
デフォルトの名無しさん :2007/10/18(木) 18:00:02
[1]プログラミング [2]キーボードから数値を入力して「正」「負」「0」を表示する。ピリオド「.」が入力されたら終了。 //全体の流れ //無限ループ //数値の入力、失敗したらピリオドであるかを判定。 //ピリオドなら終了if(getchar)=='.')break; //ピリオドでなかったら入力間違いのメッセージを出して再入力。fflush(stdin); //if文で正負0を判定して表示 //以上を繰り返す。 [3] Linux gcc C [4]10/22 0:00 [5]繰り返し・条件分岐まで習得。 main() { int a; printf("数値aを入力してください"); while(scanf("%d",&a)!='.'){ ????????????????????? if(getchar()=='.'){ break; } ????????????????????? if(a>0){ printf("PLUS\n"); }else if(a<0){ printf("MINUS\n"); }else if(a==0){ printf("ZERO\n"); } } } 2箇所、分かりません。お願いします。
>>559 こんな感じになると思う…。
main()
{
int num;
char buffer[1024];
chra *ptr;
while(1){
if(!gets(buffer) || buffer[0]=='.') break;
ptr = buffer;
if(*ptr=='+'||*ptr=='-') ++ptr;
while(isdigit(*ptr))++ptr;
if(*ptr != '\0') { printf("Input Miss!\n"); continue; }
num = atoi(buffer);
if(num == 0) { printf("%s is Zero\n",buffer ); continue; }
if(num < 0) { printf("%s is Minus\n",buffer); continue; }
/*if(num > 0) { */ printf("%s is Minus\n",buffer); /* continue; } */
}
}
while(scanf("%d",&a)!='.'){
の時点で何かおかしい
>>554 既にない模様。
>>551 OldXeonで0.05秒。timeコマンドで測っても(キャッシュヒットしちゃえば)0.1秒程度。
>>527 こんな数字じゃ、工夫するのも虚しいね。
文字列探索は、工夫の余地のない分野のようだ 面白みはないようだ
560 :
デフォルトの名無しさん :2007/10/18(木) 19:57:29
>>557 解決しました。ありがとうございました。
fp=fopen("ao.txt","r"); fp2=fopen("report.txt","w"); for(i=2;i<L;i++){ while(!feof(fp)){ while(1){ fscanf(fp,"%c",&moji); if(moji=='('){ fscanf(fp,"%d",&p_num); if(p_num==i){ fprintf(fp2," (%d):",p_num); printf(" (%d):",p_num); } } break; } } } ファイルを読み込ませて括弧の中の数値を順番にバンバン表示させたいんですが いまは(2)だけにしか反応してくれません (2)・・・・・・・・・・ (3)・・・・・・・・・ っていう風にしたいのですが、どこが間違っていますでしょうか?
>>561 色々おかしい気がする。
breakでwhile(1){}しか抜けれないから、
ファイルの読み込みが終わるまでwhile(eof(fp)){}から抜けない。
その後fpをfseekもオープンし直しもして無いから、ずっとeofの位置に行ってる。
なので、forの2週目からwhile(eof(fp)){}のループに入らない。
あと、breakの位置とか。ifの中じゃね?
動作確認してるわけじゃないから、勘違いだったらスマン
>>562 の「while(eof(fp)){}」は「while(!feof(fp)){}」の間違い。
何書いてんだ俺・・・
>>561 何をやりたいかよく分からないけど、
文字が'('で無い時に繰り返す仕様になってないからでは?
565 :
564 :2007/10/18(木) 21:36:47
>>527 #include <stdio.h>
#include <string.h>
static int *table = new int[256];
static void make_table(char *ptn){
int i, len = strlen(ptn);
for(i = 0; i < 256; i++) table[i] = len;
while(*ptn) table[*ptn++] = --len;
}
static char *bm(char *str, char *ptn){
int i, len = strlen(ptn);
char *p = str + strlen(str);
if(*ptn == '\0') return NULL;
while(p - str >= len){
for(i = len - 1; i >= 0 && str[i] == ptn[i]; i--) ;
if(i < 0) return str;
str += table[str[i]] - len + 1 + i > 0? table[str[i]] - len + 1 + i : 2;
}
return NULL;
}
void search(char *str, char *ptn, int *adr){
int *q = adr, len = strlen(ptn);
char *p = str;
make_table(ptn);
while((p = bm(p, ptn)) != NULL){
*q++ = p - str;
p += len;
}
}
*tableをtable[256]に直しても負けるな
569 :
566 :2007/10/19(金) 00:35:47
上手くいってない……。 吐きそう。
>>567 問い1
#include<stdio.h>
int main(void)
{
int a; float b; double c;
int *pa;float *pb; double pc;
a = 1; b = 1.2; c = 1.23;
pa = &a;pb = &b; pc = &c;
printf("a=%d b=%f c=%f\n",*a,*b,*c);
return 0;
}
問い2はこれ+ポイント操作
ヒント:ポイント表示の書式は %p
ポイント、て。
>>567 問い1 間違ってた…まぁコンパイルとおらないから分っただろうけど…
誤 printf("a=%d b=%f c=%f\n",*a,*b,*c);
正 printf("a=%d b=%f c=%f\n",*pa,*pb,*pc);
問い2
int main(void)
{
char a; int b; float c; double d;
char *pa;int *pb;float *pc; double pd;
pa = &a;pb = &b; pc = &c;pd = &d;
printf("ポインタ移動前 a:%p b:%p c:%p d:%p\n",pa,pb,pc,pd);
++pa; ++pb; ++pc; ++pd;
printf("ポインタ移動前 a:%p b:%p c:%p d:%p\n",pa,pb,pc,pd);
--pa; --pb; --pc; --pd;
*pa = 1; *pb = 15; *pc = 1.2; *pd = 1.23;
printf("代入 a=%d b=%d c=%f d=%f\n",a,b,c,d);
++*pa; ++*pb; ++*pc; ++*pd;
printf("インクリメント a=%d b=%d c=%f d=%f\n",a,b,c,d);
return 0;
}
573 :
566 :2007/10/19(金) 02:04:10
>>527 動くけど、遅い……
#include <stdio.h>
#include <string.h>
#define max(x, y) ((x) > (y) ? x : y)
static char table[256];
static void make_table(char *ptn){
int i, ptn_len = strlen(ptn);
for(i = 0; i < 256; i++) table[i] = ptn_len;
for(i = 0; i < ptn_len - 1; i++) table[(unsigned char)ptn[i]] = ptn_len - i - 1;
}
char *bm(char *str, char *ptn){
int str_len = strlen(str), ptn_len = strlen(ptn), i = ptn_len - 1, j;
while(i < str_len){
j = ptn_len - 1;
while(str[i] == ptn[j]){
if(j == 0) return str + i;
i--, j--;
}
i = i + max(table[(unsigned char)str[i]], ptn_len - j);
}
return NULL;
}
void search(char *str, char *ptn, int *adr){
int *q = adr, ptn_len = strlen(ptn);
char *p = str;
make_table(ptn);
while((p = bm(p, ptn)) != NULL){
*q++ = p - str;
p += ptn_len;
}
}
>>421 10月19日の〜0:00って、もう過ぎたってこと?
それとも本日が終了するまで?
576 :
516 :2007/10/19(金) 02:23:42
>>574 >複数の行を1行ずつ文字列の配列に読み込み
>ただし,1行ごとの文字列の長さの制限を行なわないようにすること.
額面どおり受け取ると書けない。fgets()まわすのが妥当っぽいけど厳密には1行ずつ読み込まない。
だいたい最初の問題が一番面倒ってのもおかしいよな。。。ヒントもねえし。
必須じゃないからいいのかな。
578 :
566 :2007/10/19(金) 02:34:29
strlen(str)が相当な無駄のようだ
>>527 当方の環境では0.11ほどこちらのが速い
#include <stdio.h>
#include <string.h>
#define max(x, y) ((x) > (y) ? x : y)
static char table[256];
static int str_len, N;
static void make_table(char *ptn){
int i, ptn_len = strlen(ptn);
for(i = 0; i < 256; i++) table[i] = ptn_len;
for(i = 0; i < ptn_len - 1; i++) table[(unsigned char)ptn[i]] = ptn_len - i - 1;
}
char *bm(char *str, char *ptn){
int ptn_len = strlen(ptn), i = ptn_len - 1, j;
while(i < str_len){
j = ptn_len - 1;
while(str[i] == ptn[j]){
if(j == 0) return str + i;
i--, j--;
}
i = i + max(table[(unsigned char)str[i]], ptn_len - j);
}
return NULL;
}
void search(char *str, char *ptn, int *adr){
int *q = adr, ptn_len = strlen(ptn);
char *p = str;
str_len = N, make_table(ptn);
while((p = bm(p, ptn)) != NULL)
*q++ = p - str, str_len -= p - str, p += ptn_len;
*adr = -1;
}
579 :
566 :2007/10/19(金) 02:35:05
0.011の間違いでした。
580 :
デフォルトの名無しさん :2007/10/19(金) 02:35:45
460の者です☆ 親切にお答えくださった方、本当にありがとうございました!^^ 無事に課題提出できました♪
581 :
566 :2007/10/19(金) 02:37:32
×*adr = -1; ○*q = -1;
すみませんでした。
584 :
527 :2007/10/19(金) 02:58:00
>>577 gccでバージョンの規程が無くて制限も無いから、どうにでもなるべ。
ファイルをオープンした後にgetcを使って最大の行の長さと行数をチェック。
その数値を利用してメモリ確保。
ファイルを先頭から読み直してfgetsなり何なりで読めばいい。
メモリ確保はCならmallocで確保したchar *の配列でも文字列の配列と言えるだろうし、
行数の制限については記述が無い。
気に入らなきゃC99で動的なサイズの配列でも宣言すりゃいい。
自分でも考えてみていますが間に合うかどうか分からないため質問させていただきます。
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5101.txt [3] 環境
[3.1] OS: 学内Linux、自宅WindowsXP
[3.2] コンパイラ名とバージョン: 学内gcc、自宅Microsoft .NET Framework SDK
[3.3] 言語: C
[4] 期限: 今日中
[5] その他の制限:
まだ講義では触れていないor触れていてもほんの少しなため、
なるべく構造体・ポインタを使わないで済むようにしていただきたいです。
期限が短くてすみませんがよろしくお願いします。
>>586 Microsoft .NET Framework SDK なんてコンパイラない
どう書けばよかったのか分からなかったのでそう書きました。すみません コマンドプロンプトでcl ○○.cでコンパイルして○○.exeで実行する形です なるべく学内のPCでコンパイルした方がいいため、gccでコンパイルできれば大丈夫です
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): カレントディレクトリで作業しているときに そのディレクトリにdataというディレクトリを作って、 そのディレクトリの中身に何があるか知りたい。 そこでその中身をファイルlist.txtに書き出せ。 [3] 環境 [3.1] OS: LINUX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 10/19 17:00 [5] その他の制限:
>>591 #include<stdio.h>
#include<stdlib.h>
int main(void){
system("md data");
system("dir data>list.txt");
return 0;
}
>>592 UNIX だから dir じゃなくて ls では?
たぶん課題内容は ./data のディレクトリ内のファイル一覧だから
md data は必要ないとおもいます。
課題文が分りづらいだからだけど…
595 :
594 :2007/10/19(金) 14:36:56
間違い 誤 UNIX 正 LINUX UNIX系と打ったつもりだった… LINUXとUNIXは違うけどコマンドはおおかた同じだったと…
596 :
591 :2007/10/19(金) 15:34:02
>>592 >>594 ありがとう
mdはディレクトリ作成らしくて必要なかったです。
system("dir data>list.txt"); で中身がlist.txtに記述されました
597 :
デフォルトの名無しさん :2007/10/19(金) 16:37:41
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): キーボードから自然数nを入力し1〜nまでの合計とnの階乗を求めて表示するプログラムを作成せよ 実行例1(Xは入力) 自然数n:X 1〜10までの合計は55 10の階乗は3628800 実行例2(Xは入力) 自然数n:X 1〜20までの合計は210 20の階乗は243290202008176640000 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン [3.3] 言語: C [4] 期限: 10月19日18:00までです [5] 条件はないです お願いします
#include <stdio.h> int main(void) { int i, n; double d = 1.0; printf("自然数n:"); scanf("%d", &n); for(i=2; i<=n; i++) d *= i; printf("1〜%dまでの合計は%d\n", n, n * (n + 1) / 2); printf("%dの階乗は%.0f\n", n, d); return 0; }
599 :
デフォルトの名無しさん :2007/10/19(金) 17:10:42
ありがとうございます。期限がむちゃだったのにやっていただいて感謝します。
>>594 イマサラだけど、Linuxにもdirコマンドあるよ。
/usr/binだった気がするから、インストールしてないと入ってないかも知れない。
>>600 必ずあるとはいえないということですね…分りました。
603 :
デフォルトの名無しさん :2007/10/20(土) 00:45:51
[1] 授業単元: プログラミングC言語です。 [2] 問題文(含コード&リンク): ・それぞれ次の動作をする簡潔なプログラムを書け。極端な入力は考えなくていい。 @入力として空白で区切られた整数を任意個受け取り(入力終了は改行文字) そのうち最大のものを出力する。(*scanf()は使用不可) A4桁以下の素数を小さいほうから順に全て出力する。 B入力として英数文字の文字列を受け取り、(入力終了はEOD)その文字列中の 英小文字を英大文字に、数字を#(数字1文字につき#1つ)に変換した文字列を出力する。 (*<ctype.h>は使用しないこと) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 21日(日)の23:59までです。 今まで考えたのですけど、どうも分かりませんでした・・・ どなたかお願いします。
>>575 返事遅れました
本日までです。 から40分過ぎましたが
提出期限までは少し余裕があるので大丈夫です
明日の夜10:00までは
>>604 返事ないからもう期限過ぎたのかと思ってやってなかったw
時間あったらやっておく……
>>606 ありがとうございます。
返事遅れて本当申し訳ない
609 :
605 :2007/10/20(土) 02:03:31
typeった
分かると思うけど
>>605 の「22.cはaddline.cでデータを作成してから」は「address.cでデータを〜」の間違いです
お詫びして訂正申し上げます
>>608 どもです
610 :
605 :2007/10/20(土) 02:19:38
あーtypeったって何だよtypoだtypo スレ汚しスマソ
>>603 @
#include<stdio.h>
#define MAXIN 1000
int getword(char w[])
{
int i=0,c;
while((c=getchar())!=' '&&c!='\n')
w[i++]=c;
w[i]='\0';
return c;
}
main()
{
int c,num,max=0;
char s[MAXIN];
do{
c=getword(s);
num=atoi(s);
if(max<num)
max=num;
}while(c!='\n');
printf("max=%d\n",max);
}
>>603 A
#include<stdio.h>
main()
{
int i,j,prime[1001];
for(i=0;i<1001;i++)
prime[i]=1;
for(i=2;i<1001;i++){
if(prime[i]==1)
for(j=2;j*i<1001;j++)
prime[j*i]=0;
}
for(i=2,j=0;i<1001;i++){
if(prime[i]==1){
printf("%3d ",i);
j++;
}
if(j==10){
printf("\n");
j=0;
}
}
}
素数判定はエラトステネスのふるいでやってます。
>>603 B
#include<stdio.h>
main(){
int c,i=0;
char s[1000];
while((c=getchar())!=EOF){
if(c>='a'&&c<='z')
s[i++]=c-'a'+'A';
else if(c>='0'&&c<='9')
s[i++]='#';
else
s[i++]=c;
}
s[i]='\0';
printf("%s\n",s);
}
614 :
603です :2007/10/20(土) 11:26:26
611さん、ありがとうございます。 とても助かりました。本当にありがとうございました。感謝しています。
さーて今からUnicode -> EUC-JPの変換プログラム書くぞ〜 これだからC++ってやめられないよね! なんでこんなもん作らないといかんのだ・・・orz
>>615 日本人の集団が作った有名なやつがある それつかえよ
ntfとかだったような
Network Kanji Filter -> NKF ?
618 :
デフォルトの名無しさん :2007/10/20(土) 15:41:33
[1] 授業単元: プログラミング [2] 問題文:下に示すピボット選択付きガウスの消去法のプログラムをポインタと関数mallocを必ず用いて書き換えなさい。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: Cのみ [4] 期限:2007/10/25 午後7時
619 :
◆nTn094TDwg :2007/10/20(土) 15:43:15
#include <stdio.h> #include <stdlib.h> #include <math.h> #define MAXN 32 int main(void){ int n, i, j, k, l, imax; double b, t, a[MAXN][MAXN + 1]; /* 行列の大きさをセット */ printf("1次連立方程式の解を求めます。\n"); printf("何元の連立方程式にしますか?\nn = "); scanf("%d", &n); if (n > MAXN || n < 1) { printf(" n の値は1〜%dまでです。\n", MAXN); exit(1); }
620 :
デフォルトの名無しさん :2007/10/20(土) 15:44:21
A /* 方程式の入力 */ printf("方程式の係数を入力してください。\n"); for (k = 0; k < n; k++) for (j = 0; j < n + 1; j++) { printf("a[%d][%d]=", k, j); scanf("%lf", &a[k][j]); } for (k = 0; k < n; k++) { /* ピポットを走査する */ t = 0; imax = k; for (l = k; l < n; l++) { if (fabs(a[l][k]) > t) { imax = l; t = a[l][k]; } }
621 :
デフォルトの名無しさん :2007/10/20(土) 15:44:51
B /* 見つかったピボット行をk行と入れ替える */ for (l = 0; l < n + 1; l++) { t = a[k][l]; a[k][l] = a[imax][l]; a[imax][l] = t; } /* 後は同じ */ b = a[k][k]; for (j = 0; j < n + 1; j++) a[k][j] /= b; /* ピポット行よりも下の行について */ for (i = k + 1; i < n; i++) { /* ピポットと同じ列を0に */ b = -a[i][k]; for (j = 0; j < n + 1; j++) a[i][j] += b * a[k][j]; } } /* 次に後置代入 */ for (k = n - 2; k >= 0; k--) for (j = k + 1; j < n; j++) a[k][n] -= a[k][j] * a[j][n]; /* 答を表示 */ printf("Gauss単純消去法(部分ピボット選択)による解\n"); for (i = 0; i < n; i++) printf("x[%d]=%lf\n", i, a[i][n]); return 0; }
622 :
デフォルトの名無しさん :2007/10/20(土) 15:53:08
[1]授業単元:数値解析 [2]問題文 ニュートン法を使って、初期値 x+i*yを入力して、f(z)=z*z*z-z-1=0の解である虚数解と実数解をすべて、C言語を使って出力せよ。 収束条件は、|1-f(z)/f'(z)|<εとなる。 [3]環境 OS : XP 言語: C [4]期間 2007/10/21 [5]制限 複素数を表示するときには、配列を使ってやってください。 二度めですが、よろしくお願いします。m(_ _)m
>>622 #include <stdio.h>
#include <complex.h>
#define Complex complex<double>
Complex f(Complex z){ z=z*z*z-z-(Complex)1;return z;}
Complex h(Complex z){z=z-f(z)/((Complex)3*z*z-(Complex)1);return z;}
main(){
Complex z , I(0,1),w[9];
int n,i,k=0;
for(n=0;n<1000;n++){
z=(Complex)(n/100)*exp(I*M_PI* (Complex)((n+0.0)/100));
for(i=0;i<200;i++)z=h(z);
if(abs(f(z))<0.001)for(i=0;i<k;i++)if(abs(z-w[i])<0.01)break;
if(i==k){w[k]=z;k++;printf("real=%f\timag=%f\n", real(z),imag(z));}}}
double x[2], y[2],z[2]; tasu (double* x, double* y, double* z){ z[0]=x[0]+y[0]; z[1]=x[1]+y[1];} とやるってこと?
>>622 買い物いってきて戻ってきたらつくってやるよ
多項式をint型配列で表して、複素数値の代入、微分を出来るようにすればよい
630 :
606 :2007/10/20(土) 19:02:51
>>607 ごめんやっぱ無理ぽ
忙しい
誰か頼んだ
ユーザクラスとマスクラスを作ってどうするのかわからん コンソールか、GUIなのかわからん VisualStudioって書いてあるが、どこまでOKなんだろう .NETのクラス群使ってもいいのか、gcnewもありなのか
632 :
デフォルトの名無しさん :2007/10/20(土) 22:43:07
>>624 はい、その通りです。できれば、よろしくお願いします。
633 :
デフォルトの名無しさん :2007/10/20(土) 22:51:55
いまコピペしてみたけど動いたぞ どうして動かないのか(エラーが出てコンパイルが出来なかった等)書かないと 誰も相手にしてくれないと思う
>>622 まで読んでないからC++の宿題かと思ってた
そういえばこのスレってC++の宿題少ないよな あってもclass使わなかったりとかで、OOPっぽくないし
[1] 授業単元:アルゴリズム基礎 [2] 問題文(含コード&リンク): 以下の要素と条件を用いてキューをC言語で作成せよ キューを表す配列Q キューの左端を表す変数1eft キューの右端を表す変数right キューに含まれるデータの数 size 関数enqueue,dequeue 配列のすべての要素にデータがあってもオーバフローとしない 配列のすべての要素にデータがある際にenqueue要求があった場合にオーバフローとする [3] 環境 [3.1] OS:XP [3.2] VisualStudio2005 [3.3] 言語: C++ [4] 期限: 22日 [5] その他の制限:これといってなし よろしくお願いします!
言語にC++とあってC言語で作成せよとはこれいかに あと変数名の最初の文字に数字は使えない >キューの左端を表す変数1eft _1eftなどアンダーバーを挿入するなどの回避策をとる必要がある
640 :
638 :2007/10/21(日) 02:59:06
>>639 さん、指摘ありがとうございます。すいません、問題文を訂正させてくださいm(_ _)m
[2] 問題文(含コード&リンク):
以下の要素と条件を用いてキューをC言語(←C++でお願いします><)で作成せよ
キューを表す配列Q
キューの左端を表す変数left ←1eftからleftに変えさせていただきました><
キューの右端を表す変数right
キューに含まれるデータの数 size
関数enqueue,dequeue
配列のすべての要素にデータがあってもオーバフローとしない
配列のすべての要素にデータがある際にenqueue要求があった場合にオーバフローとする
改めてよろしくお願いします
STLは……
>>638 template <typename T>
class queue
{
static const int DATA_MAX = 3, left = 0;
T Q[DATA_MAX];
int right;
public:
queue() : right(-1) {}
int size(){return right + 1;}
T dequeue(){if (size() == 0) throw "underflow!"; return Q[right--];}
void enqueue(const T& t)
{
if (right + 1 == DATA_MAX) throw "overflow!";
T* first = Q, * last = Q + right + 1;
while (last != first) {--last; *(last + 1) = *last;}
Q[left] = t;
++right;
}
};
>>644 素で間違ってた。サンクス。
寝ぼけた頭で変数名とかつけてたからなー。お恥ずかしい限り。
646 :
574 :2007/10/21(日) 14:48:52
>>605 >>608 ありがとうございます
ファイル操作があまり良く分かっていないので、課題に苦戦していました
お礼レスが遅くなってしまい、申し訳ないです
648 :
デフォルトの名無しさん :2007/10/21(日) 15:27:12
始めまして、ヒントを探してネットを徘徊していたらこのスレを見つけました [1] 授業単元:C言語 [2] 問題文(含コード&リンク):文字列sに記述された数字列を整数値として変換する関数 int str2int(const char s[])を作成せよ(数字以外はそこまでで変換した値を返せばよい) また、これを用いて2つの数字文字列の和を求めるプログラムを作成せよ [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: VC 2005 [3.3] 言語: C [4] 期限: 10月26日まで [5] その他の制限:<stdio.h>で使える以外の関数は習ってないので使用できないです 数字文字を1字づつ変換するプログラムを作ってみたものの足し算の段階で詰まってしまいました 最初から考え直す為にもヒントを頂けると嬉しいです
int str2int(const char s[]) { int i, n; for(i=0, n=0; s[i]>='0'&&s[i]<='9'; i++) n = n * 10 + s[i] - '0'; return n; }
なにが?
符号おkな atoi() の模範解答はおれも知りたい。
首吊ってくる
int str2int(const char s[]) { int i = 0, n, flag = 1; if(s[0]=='-') { flag = 0; i++; } for(n=0; s[i]>='0'&&s[i]<='9'; i++) n = n * 10 + s[i] - '0'; return flag ? n : -n; } 一文字目をチェックすればいいだけじゃね?
658 :
デフォルトの名無しさん :2007/10/21(日) 16:03:31
[1] 授業単元: プログラミング演習U(C言語) [2] 問題文(含コード&リンク): 2つの文字列を連結するプログラムを作成せよ。 ・文字列str1とstr2を連結し、str1に格納する関数 「void str_conn(char str1[], char str2[])」 を作成する。 ・main関数で2つの文字列を入力させ、この関数を利用して 連結した結果を表示する。 *(cat)(cpy)はNG。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: cygwin gcc [3.3] 言語: C [4] 期限:23日(火) [5] その他の制限:
659 :
デフォルトの名無しさん :2007/10/21(日) 16:04:46
>>655 int atoi(const char *s)
{
int f = 1, n;
if(*s == '-')
f = -1;
for(n = 0;isdigit((unsigned char)*s);s++)
n = n * 10 + *s - '0';
return n * f;
}
660 :
659 :2007/10/21(日) 16:05:26
修正 int atoi(const char *s) { int f = 1, n; if(*s == '-') f = -1; s++; for(n = 0;isdigit((unsigned char)*s);s++) n = n * 10 + *s - '0'; return n * f; }
661 :
デフォルトの名無しさん :2007/10/21(日) 16:10:24
void str_conn(char str1[], char str2[]) { int i, j; for(i = 0;str1[i];i++) ; for(j = 0;str2[j];j++) str1[i++] = str2[j]; str1[i] = 0; return; }
void str_conn(char str1[], char str2[]) { while(*str1) str1++; while(*str1++=*str2++); }
663 :
デフォルトの名無しさん :2007/10/21(日) 16:12:22
せっかくだから、'+'も見て下さいよ。
665 :
660 :2007/10/21(日) 16:18:59
>>664 ほんとだ
int atoi(const char *s)
{
int f = 1, n;
if(*s == '-'){
f = -1;
s++;
}
for(n = 0;isdigit((unsigned char)*s);s++)
n = n * 10 + *s - '0';
return n * f;
}
>>648 /* int atoi(const char *s) */
int str2int(const char s[])
{
int n,i,f,k;
for(f=s[0]-'-',i=f?0:1,n=0;s[i]>='0'&&s[i]<='9';i++)
n=n*10+(f?s[i]-'0':-s[i]+'0');
return n;
}
int add_str(const char a[], const char b[])
{
return str2int(a) + str2int(b);
}
int main()
{
printf("%d\n", add_str("-1234abc", "4567def"));
return 0;
}
667 :
デフォルトの名無しさん :2007/10/21(日) 16:29:48
>>649 組み込んでみたら見事に動きました、足し算もばっちりですありがとうございました
原理を理解してしっかり自分の糧にしたいと思います
ちなみに応用問題でdoubleを使って-や小数の値も計算できるように改良せよと問題がありますが
これを弄ればこちらの問題も可能でしょうか?
-は上にあるの参考にすればいいし、少数は.の前後で分けて考えればいいだけ。 649がちゃんと理解できればそんなに難しい問題じゃない。
>>667 仕様書を読むとできないと明記されてる
Alice was beginning to get very tired of sitting by her sister on the bank,
and of having nothing to do: once or twice she had peeped into the book her sister was reading,
but it had no pictures or conversations in it, `and what is the use of a book,' thought Alice `without pictures or conversation?'
So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid),
whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies,
when suddenly a White Rabbit with pink eyes ran close by her.
つまらん
自分が英語読めないからって、他人もそうだと思う神経がわからんな。
672 :
デフォルトの名無しさん :2007/10/21(日) 18:40:49
今日が初めての投稿で失礼します<(_ _)>私は、大学1年ですが、大学に入ってからパソコンを使い始めた程度なので、 今履修中のプログラミング基礎に全くついていけない状態です(>_<) 周りに聞く友達もいないので、ぜひ教えてください。お願いします。 【質問テンプレ】 [1] 授業単元:scanf(); rand();? [2] 問題文(含コード&リンク): 「おみくじ」をプログラムで作成しなさい 1.任意の整数を入力 2.ランダムに割り出した値で、1で入力した日付を割り、余りを求める 3.余りの数字によって、printfする内容を変える 余りを求めて、おみくじの結果を表示する部分は、main関数とは別に作りなさい 例:intomiyage(inta) {・・・ ヒント scanf(); rand(); if文を使う 余りを求める:「%」(例)5÷2の余りをxへ:x = 5 % 2; [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語だと思います= [4] 期限: ([2007年10月22日24時まで] ) [5] その他の制限: (while文、if文と入力してもらうscanf、printf等しか習ってない段階です=)
>>672 授業単元が書けないなら大学生辞めた方がいいよ
金の無駄
>>672 こんな感じかなぁ??
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int output(unsigned int n,unsigned int m)
{
if(n == 0) { printf("大凶じゃ!!\n") ;return 0;}
if(n == m-1) { printf("大吉ですぞ!!\n") ;return 0;}
if(n < m
>>4 ) { printf("凶とはついとらんの\n");return 0;}
if(n > m
>>1 ) { printf("中吉ですぞ\n") ;return 0;}
printf("末吉だな\n") ;return 0;
}
int main(void)
{
unsigned int n,m;
srand((unsigned int)time());
printf("何番のおみくじを引く?");
scanf("%d",&n);
m = (int)rand();
output(n%m,m);
return 0;
}
>>674 問題文に忠実にするなら
関数名は omiyage
引数は 1 つで型は int
剰余を求めるのは omiyage の中
あと、scanf の書式指定が違う
676 :
674 :2007/10/21(日) 19:56:13
>>675 ,672
関数名と引数について
例に書いてあるだけだから制約とは思えないのですが?
僕の読み方が悪いのでしょうか?
剰余を求める部分について
これも「結果を表示する部分は、main関数とは別に作りなさい」とあり、
剰余した値がおみくじの結果だと思ったのですが?
%dだと負数も受け付けてしまいますね %u が正しかったです。
あと m=0 でエラーがでます。
m = (int)rand();
を
while(!(m = (unsigned int)rand()));
に訂正
>問題文に忠実に #include <stdio.h> #include <stdlib.h> #include <time.h> int toDate(int x){ static int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int i=0; while(1){ if (x <= days[i]) return x; x -= days[i]; i = (i+1)%12; }} int omiyage(int a){ static const char *results[] = {"大吉","吉","末吉","凶","大凶"}; static int table[] = {0,1,1,2,2,2,3,3,4}; printf("%s!!" , result[table[a/(sizeof(table)/sizeor(int))]]); return 0;} int main(){ unsigned x; int n; scanf("%u",x); srand(time(NULL)); x = toDate(x); while(!(n=rand())); omiyage(x%n); return 0;} こうですか? 分かりません><
679 :
678 :2007/10/21(日) 20:19:00
あ、やべ、剰余を求める場所間違えた 変数名間違えてるしorz
>>678 a/(sizeof(table)/sizeor(int)) は a/(sizeof(table)%sizeor(int))
ですね
n=1になったら大吉と吉しか出ないw
まぁ自分もn=1なら大吉と大凶しか出ませんが…
681 :
680 :2007/10/21(日) 20:30:27
訂正の訂正 a/(sizeof(table)/sizeor(int)) は a/(sizeof(table)%sizeor(int)) ↓ a/(sizeof(table)/sizeor(int)) は a%(sizeof(table)/sizeor(int))
>>681 訂正サンクス
しかしsizeor……
携帯から書くもんじゃないな
×sizeor ○sizeof
誰かエスパー呼んでこい
686 :
デフォルトの名無しさん :2007/10/21(日) 21:04:35
【質問テンプレ】 [1] 授業単元:ファイル処理 [2] 問題文(含コード&リンク): 3×3行列のデータをファイルから読み込み、その行列を計算して画面に出力せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語だと思います= [4] 期限: なし [5] その他の制限:
自分が何を習ってるかくらいちゃんと把握しろよ そして3×3行列のデータファイルをうpしる
688 :
デフォルトの名無しさん :2007/10/21(日) 21:08:38
[1] 授業単元: 情報処理 [2] 問題文(含コード&リンク): 等比数列の初項aと公比rを入力し、格項の値とn項までの総和を計算し出力せよ。ただし、r!=1とする。(for文を使用する) 等比数列: a, ar, ar^2,・・・・・ar^(n-1) 等比数列の和:Sn=a+ar+ar^2+・・・・+ar^(n-1) [3] 環境 [3.1] OS: windows2000 [3.2] コンパイラ名とバージョン:C++Builder [3.3] 言語: C [4] 期限: 明後日 [5] その他の制限: for文を使用でお願いします。その他は特に難しい文を使わないはずです。
#include <stdio.h> int main(){ int x,s,a,r,n,i; printf("初項? "); scanf("%d",&a); printf("公比? "); scanf("%d",&r); printf("何項目まで? "); scanf("%d",&n); i=1;x=a;s=0; while(i<=n){ s+=x; printf("第%d項目:%d ここまでの部分和:%d\n",i,x,s); x*=r;++i;} return 0; }
690 :
689 :2007/10/21(日) 21:25:04
あ、for文使い忘れた
#include <stdio.h>
int main(){
int x,s,a,r,n,i;
printf("初項? ");
scanf("%d",&a);
printf("公比? ");
scanf("%d",&r);
printf("何項目まで? ");
scanf("%d",&n);
for(i=1,x=a,s=0;i<=n;s+=x&&printf("第%d項目:%d ここまでの部分和:%d\n",i,x,s)&&x*=r&&++i);
return 0;
}
これでどうぞ
>>688
>>691 やべ、無限ループww
カンマ演算子が左から評価されることが保証されてる自信が無かったからショートサーキット使ったんだが、墓穴掘ったか
しょうがないから素直にこれで
未テスト
#include <stdio.h>
int main(){
int x,s,a,r,n,i;
printf("初項? ");
scanf("%d",&a);
printf("公比? ");
scanf("%d",&r);
printf("何項目まで? ");
scanf("%d",&n);
for(i=1,x=a,s=0;i<=n;++i){
s+=x;
printf("第%d項目:%d ここまでの部分和:%d\n",i,x,s);
x*=r;
}
return 0;
}
>>692 サンクス!
これは各項のすべての値でますか?
694 :
デフォルトの名無しさん :2007/10/21(日) 21:41:18
おみくじのプログラム、ありがとうございました。(>_<)本当に助かりました☆
695 :
デフォルトの名無しさん :2007/10/21(日) 21:55:31
>>695 リンク先を見る限り何が分からないのか分からないよ
697 :
680 :2007/10/21(日) 21:59:09
公比級数の値もとめるだけなら 初期値 :a 公比 :r 求める項数:n として a-a*r^n/(1-r) で求められる。 double power(double x,unsigned int n) { int temp = 0; double result; while(n&1) { int>>=1; temp=1; }; result = power(x,n-1) * x; for(;temp > 0;--temp) result *=result; return result; } double calc(double init,double ratio,unsigned int n) { return a*(1-power(ratio,n))/(1-ratio); }; 割り算あるからnが小さいと遅い… あと項数が複数あってもダメ… といろいろ束縛あるなぁ… わざわざpower書いたのも馬鹿っぽいしなぁ
>>695 それぞれの関数の名前と不等号の向きを変えるだけでできるぜ!
と優しい俺は教えてあげる
課題4は「値渡し」
699 :
697 :2007/10/21(日) 22:05:53
名前の680間違いです。
>>695 main以外書きます
int minof(int x,int y)
{
if(x < y){ return x; } else { return y; }
}
int min3(int x,int y,int z)
{
int min = x;
if(y < min) min = y;
if(z < min) min = z;
return min;
}
int min5(int v,int w,int x,int y,int z)
{ return minof(v,minof(w,minof(x,minof(y,z)))); }
宿題スレ慣れしてなさそうな解答者だな
>>697 pow(x,r)使おうぜ!
それはともかく、等比数列の各項までの和を計算する場合、こんな方法が自分は好きだ
関数名適当
int sum(int a , int r , int n){
int s;
if(n==1)s = a;
else s = sum(a,n-1)*r + a;
printf("第%d項までの和:%d",n,s);
return s;
}
なんか抜けてるw
間違えた…… else s = sum(a,r,n-1)*r + a; →else s = sum(a,r,n-1)*r + a;
推敲って言葉を知らないのかな そんなに急がなくても問題は逃げたりしないよ
>>701 rを配列で与えてaをxとすると
どこかで見た式に見えるな…
Horner級数だったっけか?
n次の関数をちょっぴり高速に計算する方法
>>705 こんな奴の事かな?
ax^3+bx^2+cx+d -> ((ax+b)x+c)x+d
>>706 そう!xの累乗求めながら計算するより乗算回数が大きく減るんですよね。
[1] 授業単元:データ構造 [2] 問題文(含コード&リンク): memo.txtの中身が abc ji a ds de sa s st ji asa a であったときに、1行ずつみて 行ごとの最初の文字列を、scanfで指定した行の文字列を取り出せ。 (abcとjiの間がtabであけた。jiとaとdsの間はスペース。) 例えば 2と入力したらdeという文字列がでるように。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:できればはやく。 [5] その他の制限:
>>708 #include<stdio.h>
#define WORD_LEN_MAX 100
#define TO_STR_(num) #num
#define TO_STR(num) TO_STR_(num)
int main(void){
int line_no;
char buf[WORD_LEN_MAX+1];
FILE *fp;
fp=fopen("memo.txt", "r");
if(fp==NULL) return 1;
printf("Input line number :");
scanf("%d", &line_no);
for(;line_no>1;line_no--) fscanf(fp, "%*[^\n]"), fscanf(fp, "%1[\n]", buf);
//fscanf(fp, "%*[ \t]");
if(fscanf(fp, "%" TO_STR(WORD_LEN_MAX) "[^ \t\n]", buf)==1) puts(buf);
fclose(fp);
return 0;
}
ありがと
711 :
デフォルトの名無しさん :2007/10/22(月) 03:02:23
深夜にすいません。よろしくお願いします。 [1] 授業単元: プログラミング演習U(C言語) [2] 問題文(含コード&リンク): クラス分けテストで出題された問題を完成させ、main関数で2つの文字を入力させ、 この関数を利用して連結した結果を表示する様実装する。 (問題) 以下は文字列str1とstr2を連結し、str1に格納するプログラムである。 @〜Bを埋めてプログラムを完成させよ。 void str_conn(char str1[], char str[]2){ int i, j; for(i=0; @; i++); for(j=0; A; j++) str1[ B ]=str2[j]; str1[i+j]=str2[j]; } [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語 [4] 期限:25日(木曜日)までにお願いします。 [5] その他の制限: 特にないです。
>>711 void str_conn(char str1[], char str[]2){
int i, j;
for(i=0; str1[i] != '\0'; i++);
for(j=0; str2[j] != '\0'; j++)
str1[i+j]=str2[j];
str1[i+j]=str2[j];
}
713 :
デフォルトの名無しさん :2007/10/22(月) 03:23:23
実装して動く様にお願い出来ますか? 一応自分でも作ってみたのですが...あまりに素人すぎてコンパイラのエラーをみても修正方法がいまいち分かりません。 #include <stdio.h> void str_conn(char str1[], char str2[]){ int i, j; for(i=0; str1[i] != '\0'; i++); for(j=0; str2[j] != '\0'; j++) str1[i+j]=str2[j]; str1[i+j]=str2[j]; } int main(void) { printf("文字列1:"); gets(str1); printf("文字列2:"); gets(str2); printf("%s\n", str2[j]); return 0; }
#include <stdio.h> void str_conn(char str1[], char str2[]) { int i, j; for(i = 0; str1[i] != '\0'; i++) ; for(j = 0; str2[j] != '\0'; j++) str1[i+j] = str2[j]; str1[i+j] = str2[j]; } int main(void) { char str1[256], str2[256]; printf("文字列1:"); gets(str1); printf("文字列2:"); gets(str2); str_conn(str1, str2); printf("%s\n", str1); return 0; }
715 :
デフォルトの名無しさん :2007/10/22(月) 04:00:53
>>714 ありがとうです。
最終的に出力する結合文字列はstr_conn関数内だから、当然呼び出しはstr_connですよね。
なに勘違いしてたんだろ。
それで結果はstr1と...納得しました。
それにstr1,2の格納文字数指定も忘れているとは...
参考になります。
>>711 658と同じ授業?と思ったけど環境が違うな……
717 :
デフォルトの名無しさん :2007/10/22(月) 10:15:08
数値int型を入力し、絶対値(数値の大きさ)を求めるプログラムを 作成しなさい 注意:標準関数は使用するな 実行画面 数値入力==>-5 絶対値:5
>>717 #include<stdio.h>
main()
{
int n;
printf("数値入力==>");
scanf("%d",&n);
printf("絶対値%d\n",n>0 ? n : -n);
}
あれ、俺いつのまに書き込みボタン押したんだってくらい 同じプログラムがすでに書かれててワロス
>注意:標準関数は使用するな -- printf("数値入力==>"); scanf("%d",&n); printf("絶対値%d\n",n>0 ? n : -n); -- 求めた結果を出力しろとも書いてないしな。
-2147483648だと誤動作しなかったっけ
722 :
デフォルトの名無しさん :2007/10/22(月) 11:09:47
C言語の宿題なんですけど、 10桁までの整数を入力すると、数字の並びを逆にして表示するプログラムを作成せよ。 ただし0123のように入力すると0123は整数ではないのでエラーと返すか321と出力させよ よろしくお願いします
>>722 #include<stdio.h>
int main(viod)
{
unsigned int num,result = 0;
printf("Input a number>");scanf("%u",&num);
while(num!=0){
result = result*10 + num%10;
num /= 10;
}
printf("%d",result);
return 0;
}
>0123は整数ではない これは新解釈だ。
725 :
723 :2007/10/22(月) 11:21:57
あ〜 unsigned intじゃまずいかも…intが2byteの処理系じゃ 10桁無理だ…。 というわけで unsigned int → unsigned long "%u" → "%lu" に訂正しないといかん
4byteでもムリじゃね?50億とか。
>0123は整数ではない 0123って書いたら8進数で123って解釈するのが普通だと思う
ちょっと緊急ですが… [1] 授業単元:C言語 [2] 問題文(含コード&リンク): 文字を入力し、その文字に含まれるアルフェベット(空白含む)の数をそれぞれ表示させよ。 またその生起確率も計算し表示させろ。 [3] 環境 [3.1] OS: Windows XP [3.2] gcc [3.3] 言語:C言語 [4] 期限: 2007年10月23日02:00まで よろしくお願いしますm(_ _)m
729 :
デフォルトの名無しさん :2007/10/22(月) 11:27:42
num /=10ってなんですか?
2の31乗は2147483648で11桁 long で何とか10桁整数入るよ 計算結果違ったらMS社のせいな。Win付属の電卓使ったから…
733 :
デフォルトの名無しさん :2007/10/22(月) 11:38:54
734 :
デフォルトの名無しさん :2007/10/22(月) 11:38:56
[1] 授業単元: c++プログラミング [2] 問題文(含コード&リンク): 10個の製品の在庫管理のプログラムを作成しなさい。 全ての製品は初期在庫として、1000個の在庫を持っている。毎日80〜120個ランダムに減っていく。 また、製品によって減っていく量は異なるものとする。 在庫量が300個(発注点)以下になった製品は発注をかけ、その三日後に500個納品される。 終了条件:1000日 単位時間: 日 出力の例: 製品A 前日在庫量 需要量 当日在庫量 320 120 200 200 100 100 100 110 0 ○日に10個欠品しました!! 500個納品されました!! 490 90 400 各製品ごとに上記のように表示されるようにしなさい。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ: bcc [3.3] 言語: C++ [4] 期限:22日19時 [5] その他の制限: できれば、後から簡単に、初期在庫量・発注点・製品数などを変更できるようにしてください。 よろしくお願いします。
>>728 文字に含まれる文字?
文を入れてもらって文字の頻度をとるのかな?
int main(void)
{
char buffer[1024];
unsigned int cnt[256];unsigned int all;
int i;
for(i = 0;i < 256;++i) cnt[i] = 0; /* memcopyの方が早い、おそらく */
gets(buffer);
for(i = 0;buffer[i]!='\0';++i){
++cnt[(unsigned char)buffer[i]];
}
all = i;
printf("文字 出現数 出現確率\n")
for(i = 0;i < 256;++i)
printf(" \"%c\" %4u %7.3f\n",(unsigned char)i,cnt[i],cnt[i]*100.0/all);
return 0;
}
>>732 >>735 うわ、日本語がおかしいorz
完全なる説明不足です
文の中の文字の間違いです…御免なさい
「abcdae df」なら「a:2 b:1 c:1 d:2 e:1 f:1 空白:1」みたいに…
738 :
728 :2007/10/22(月) 11:45:06
↑は自分です もちつけ俺。
739 :
730 :2007/10/22(月) 11:47:17
ゴメソ 徹夜のせいか数字の桁数みまちがえた…そろそろ寝んとやばいか… 64bit整数に対応してたらそれで…文字列処理版は今から書く…
742 :
741 :2007/10/22(月) 12:14:38
743 :
735 :2007/10/22(月) 12:28:13
>>737 それだと生起確率がないぞ…
printf(" \"%c\" %4u %7.3f\n",(unsigned char)i,cnt[i],cnt[i]*100.0/all);
は
if(isprint(i)&&cnt[i])
printf(" \"%c\" %4u %7.3f\n\%",(unsigned char)i,cnt[i],cnt[i]*100.0/all);
とした方が言いかもしれん
\x00〜\x1fまでが入るとやばいし0個の文字がたくさんあるとうざい…
744 :
737 :2007/10/22(月) 12:32:32
>>743 うぉ、たしかにorz
お頭の弱い人ですんません…ありがとうございます。
>>722 普通にこれでいいだろ
試してないけど
#include <stdio.h>
#define MAX 10
int main(){
char buf[MAX+1];
int count=0;
printf("10桁までの数字を入力してください");
while(count < MAX && (buf[count] = getchar) != EOF)
if(isdigit(buf[count]) && buf[0] != '0') count++;
while(count>0) putchar(buf[--count]);
return 0;
}
出力書式の\%は\nの前だの…
747 :
745 :2007/10/22(月) 12:34:52
あー、ctype.hをincludeし忘れた……
749 :
745 :2007/10/22(月) 12:37:41
MAX+1した意味ないことに気付いた…… ぬる文字いらないじゃん
>>749 EOFってint型で-1じゃなかったかな?
ShiftJIS環境下において\xffが入力されることがないからそれはまぁいいとして
入力が0だと何も表示しないがそれはいいのか?
仕様の一言で済むが…。
自分は
0123→123→321
0000→0→0
となるべきではないだろうか?0も10桁までの整数だと思う。
あと100と入れると0のとこでcount進むな…
あっ俺も反転後の頭の0消してないや…
なんか、昨日から答える側がグダグダすぎないか? もちっと落ち着け
752 :
750 :2007/10/22(月) 12:52:33
>>749 while(count>0) putchar(buf[--count]);
のまえに
while(count>0) if(buf[count]!='0'){ ++count; break; }else --count;
これで100でも001などという表示にはなんない…
countうんぬん気のせいだった忘れて欲しい。お願い忘れて!
を入れるべきか…
でもどうやって100と入力した時の
>>745 入力 7f8 って入力したら 87 って表示しそうだけど…
// 素朴に #include <stdio.h> int main() { int i; char cs[32]; printf("10桁までの整数:");scanf("%10s%*[^\n]%*c",cs); for (i = strlen(cs) - 1; 0 <= i; i--) { if (isdigit(cs[i]) && !(i == 0 && cs[i] == '0')) putchar(cs[i]); } return 0; }
// 00001 を 1 に。0000 を 0 に。 #include <stdio.h> int main() { int i; char cs[32]; printf("10桁までの整数:");scanf("%10s%*[^\n]%*c",cs); for (i = 0; i < strlen(cs) - 1 && cs[i] == '0'; i++) cs[i] = ' '; for (i = strlen(cs) - 1; 0 <= i; i--) { if (isdigit(cs[i]) && !(i == 0 && cs[i] == '0')) putchar(cs[i]); } return 0; }
// 100が001になる問題を解決gdgdすんまそ! #include <stdio.h> int main() { int i; char cs[32]; printf("10桁までの整数:");scanf("%10s%*[^\n]%*c",cs); for (i = 0; i < strlen(cs) - 1 && cs[i] == '0'; i++) cs[i] = ' '; for (i = strlen(cs) - 1; cs[i] == '0'; i--) cs[i] = ' '; for (i = strlen(cs) - 1; 0 <= i; i--) { if (isdigit(cs[i]) && !(i == 0 && cs[i] == '0')) putchar(cs[i]); } return 0; }
>>757 %10s を %[^0-9]10s ってしたほうが良くない?
7bhgjf1 とかの抑止のために…
出力側 isdigit のチェック無くなるよ?
759 :
デフォルトの名無しさん :2007/10/22(月) 13:23:42
1] 授業単元: c++プログラミング [2] 問題文(含コード&リンク): 10個の製品の在庫管理のプログラムを作成しなさい。 全ての製品は初期在庫として、1000個の在庫を持っている。毎日80〜120個ランダムに減っていく。 また、製品によって減っていく量は異なるものとする。 在庫量が300個(発注点)以下になった製品は発注をかけ、その三日後に500個納品される。 終了条件:1000日 単位時間: 日 出力の例: 製品A 前日在庫量 需要量 当日在庫量 320 120 200 200 100 100 100 110 0 ○日に10個欠品しました!! 500個納品されました!! 490 90 400 各製品ごとに上記のように表示されるようにしなさい。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ: bcc [3.3] 言語: C++ [4] 期限:22日19時 [5] その他の制限: できれば、後から簡単に、初期在庫量・発注点・製品数などを変更できるようにしてください。 よろしくお願いします。
>>756 いや 2/3 位自分だ ゴメン orz
>>758 お、それは名案ですな( ´ー`)y─┛~~
スキャンする時点でゼロも飛ばせたら…。
char配列で頑張るのはここらへんが限度か。
// 00001 を 1 に。0000 を 0 に。 dt1='00001';if('00001'==dt1){dt1=1;} dt2='0000';if('0000'==dt2){dt2=0;} write(dt1+' '+dt2);
>>763 問題文は 722 だ、
で一つ質問だが何言語だそれ?
writeって関数Cにあったか?C++でもいいが…やっぱ無かったと思うが…
'0001' '0000'もCじゃありえないぞ…
>>758 scanf("%10s%*[^\n]%*c",cs);
を
scanf("%[^1-9]c%[^0-9]10s%*[^\n]%*c",cs,cs+1);
てのはどうだろう…
>>764 cでwrite()と言えば、unixのsystem callだろう。常考
>763が何をしたいのかは私も判らんが。
>>758 あ〜〜 scanfの戻り値もチェックした方がいいよね?
そしたらこうかscanfのとここうなるかなぁ…
if(scanf("%[^1-9]c%[^0-9]10s%*[^\n]%*c",cs,cs+1) <2)
{ printf("入力が正しくありません。\n"); return -1; }
簡単な問題をいかに難しくみせるかが回答者の腕の見せ所
↑今そう名づけた
>>766 thanks
見た感じ変数宣言してないし文字列リテラルを''で囲んで書いてる
比較演算子の記述方法がCと同じdt1に文字列も数値も入るからTypeless言語
これを考えるとPerlかなと思う。確かPerlの標準出力ってwriteとwritenだったような…
773 :
デフォルトの名無しさん :2007/10/22(月) 14:38:15
>759 多製品っていうのが、やっかいだな・・・
>>772 サンプルです
オンラインで動作します
// エラー デバッグ ブラウザ ツール
//
http://www.mozilla-japan.org/ // シンプル プログミング ツール
//
http://proforceone.web.fc2.com/ // 素因数分解サンプルプログラム
// Calculation processing にコピーして[RUN]
MAX=1000; br();
for(x=2;MAX>=x;x++){write(" "+x+" ⇒");
for(i=2;x>=i;i++){if(0==x%i){k=0;
for(j=2;(i>=j)&&(1>=k);j++){
if(0==i%j){k++;}
} if(1==k){write(" "+i);}
}} br();
}
// シンプル プログミング ツール ++C++
//
http://proforceone.web.fc2.com/ // 素因数分解サンプルプログラム
// Calculation processing にコピーして[RUN]
MAX=1000; br();
for(x=2;MAX>=x;x++){write(" "+x+" ⇒");
for(i=2;x>=i;i++){if(0==x%i){k=0;
for(j=2;(i>=j)&&(1>=k);j++){
if(0==i%j){k++;}
} if(1==k){write(" "+i);}
}} br();
}
>759 製品クラスのベースクラス用意して ベースクラスのポインタvectorとかslistでもって、… 出力例は明らかに1製品だけだよな… シュミレーション関数をfor_eachで回すのか…もしかして…
777 :
772 :2007/10/22(月) 14:52:14
たしかにCインタプリタもどきみたいにみえる…helpページがないし 明らかにコンパイラとしての構文規約に違反してる…
778 :
デフォルトの名無しさん :2007/10/22(月) 14:54:54
>>776 例は1製品だけど、
>各製品ごとに上記のように表示されるようにしなさい
ってあるから、全製品について表示させるんじゃない?
>>772 >文字列リテラルを''で囲んで書いてる
そうしないとコンパイラが8進数と勘違いするよ
>>778 設定が入ったクラス用意して1製品だけを処理するシュミレーションを
for_eachで製品回数分回せばいいということにならないだろうか?
vector<> setting(3);
setting = {製品Aの設定,製品Bの設定,製品Cの設定};
for_each(setting.begin(),setting.end(),simulation);
こんな流れ出処理したら出力例が製品分縦続きで出てくると…
C++の宿題って、授業でどの程度習っている詳しく書いてくれないと、 どこらへんまで使っていいか判断が難しいよな…… 単なるCの構文置き換え程度なのか、 better C程度なのか、 クラスばりばり使っていいのか、 STLばりばり使っていいのか、 テンプレート使っていいのか、 boost使っt(ry まあ俺はクラスをちょい使うレベルしか無理だがw STLはvectorくらいしか分からん
// エラー デバッグ ブラウザ ツール
//
http://www.mozilla-japan.org/ // シンプル プログミング ツール
//
http://proforceone.web.fc2.com/ // 00001 を 1 に。0000 を 0 に。 (符号付15桁有効)
// Calculation processing にコピーして[RUN]
dt='00001 0000 095 +00000023 -0888 -123456789012345';
dt=dt.split(' ');for(i=0;dt.length>i;i++){br();di=dt[i];
si='+';if('+'==di.substr(0,1)){si='+';di=di.substr(1);}
else if('-'==di.substr(0,1)){si='-';di=di.substr(1);}
di='000000000000000'.substr(0,15-di.length)+di;
sp(2);write(eval(si+'.'+di)*1000000000000000);}
[1] 授業単元:C言語 [2] 問題文(含コード&リンク):年月日を入力して、その日に最も近いクリスマスを全て表示するプログラムを作れ [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:BCC5.5 [3.3] 言語:C言語 [4] 期限:明日まで [5] その他の制限:特になし
// ++C++ エラー デバッグ ブラウザ ツール
//
http://www.mozilla-japan.org/ // ++C++ シンプル プログミング ツール
//
http://proforceone.web.fc2.com/ // 00001 を 1 に。0000 を 0 に。 (符号付15桁) (符号明示化)
// Calculation processing にコピーして[RUN]
dt='00001 0000 095 +00000023 -0888 -123456789012345';
dt=dt.split(' ');for(i=0;dt.length>i;i++){br();di=dt[i];
si='+';if('+'==di.substr(0,1)){si='+';di=di.substr(1);}
else if('-'==di.substr(0,1)){si='-';di=di.substr(1);}
di='000000000000000'.substr(0,15-di.length)+di;
sp(2);write(si+eval('.'+di)*1000000000000000);}
プログラム構造はコレです dt='00001 0000 095 +00000023 -0888 -123456789012345'; dt=dt.split(' '); for(i=0;dt.length>i;i++){ br();di=dt[i];si='+'; if('+'==di.substr(0,1)){ si='+';di=di.substr(1); }else if('-'==di.substr(0,1)){ si='-';di=di.substr(1); }di='000000000000000'.substr(0,15-di.length)+di; sp(2);write(si+eval('.'+di)*1000000000000000); }
符号明示化表示結果はコレです +1 +0 +95 +23 -888 -123456789012345
788 :
デフォルトの名無しさん :2007/10/22(月) 16:02:57
>>781 俺はvectorすらわかんねw
ここに書き込むぐらいだから、Cの構文置き換え程度なんじゃない?
クラスとか使ったほうがきれいにできるなら使っちゃっていいんじゃない
// 00001 を 1 に。0000 を 0 に。 この問題の目的は 8進数して処理されるのを いかに10進数で認識するか と言うことでしょう・・・
>>783 >その日に最も近いクリスマスを全て表示する
???
>>789 いやC言語風味な別言語だよ 785 のは…
・理由は宣言型言語でない(変数の宣言なしで変数の使用が可能)
・main関数がない
・リテラル宣言がC,C++と異なる。
・ライブラリがない(インタプリタならあたりまえ)
・標準的な関数名の違い
なにより多少の手直しだけではコンパイラを通らない。
>>791 大元をたどるとですね
文字列"0001"を文字列"1"へ、
文字列"0000"を文字列"0"へ
文字列"0100"を文字列"100"へ
ということ
ただし文字列な長さは固定でないとする。
[1] 授業単元:プログラミング基礎
[2] 問題文(含コード&リンク):
input-3-1.txtは100000行からなり、各行には整数が1つずつ書かれている。
このinput-3-1.txtを読み込み、 input-3-1.txtの100000行目を1行目に、99999行目を2行目にというように、逆順に出力するプログラムを作り、
output.txtに出力しなさい。
このとき、プログラムへの入力と出力はscanf、printfとリダイレクトを使うこと。
input-3-1.txtは
http://toku.xdisc.net/cgi/up/vcc/nm11765.zipです 。
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:VC++2003
[3.3] 言語:C
[4] 期限:2007年10月24日
[5] その他の制限:
初心者でもわかるような感じにお願いします。
配列を使う課題なので、配列も使ってください。
>>794 こんなのはいかがでしょう
#include<iostream>
#include<string>
using namespace std:
int main(void)
{
string buffer[10000];
for(int i=0;i<10000;++i) getline(cin,buffer[i],"\n");
for(int i=10000;i>0;) cout << buffer[--i] << "\n";
return 0;
}
>>792 その
>>784 の++C++言語から
標準C++言語に変換する
プリコンパイラ?を作成せよ
なんちゃって・・・
>>796 めんどくさいの一言に尽きる。別のスレで頼め…。
あとここはC,C++のスレだから 786 でスレ違いだといったんだ。
799 :
795 :2007/10/22(月) 16:36:38
こうか… 動く気しない…どう思いますか?みなさん #include<iostream> #include<string> using namespace std: int main(void) { string buffer[100000]; for(int i=0;i<100000;++i) getline(cin,buffer[i],"\n"); for(int i=100000;i>0;) cout << buffer[--i] << "\n"; return 0; }
>>792 >いやC言語風味な別言語だよ 785 のは…
・理由は宣言型言語でない(変数の宣言なしで変数の使用が可能)
実はバリアント型である
・main関数がない
実は省略が可能である
・リテラル宣言がC,C++と異なる。
実は " も使用可能である
・ライブラリがない(インタプリタならあたりまえ)
ライブラリは .js と実は呼ばれている
・標準的な関数名の違い
標準関数に無い場合はライブラリを作れば良い
>なにより多少の手直しだけではコンパイラを通らない。
基本は変わって無いんですが・・・ライブラリ使ってます
>>799 ・言語が指定と違う
・行数が指定を満たしていない
>>794 >>799 出題者の意図を読まないといけなさそうだねえ。やっぱintの配列を期待してそうに見える。
要素100000の巨大配列なら auto 変数はやめときたい。今時無視できる大きさなのかな?
あと言語は(ry
>>790 なんかうざいし、クラス使う意味ほぼ無し
807 :
799 :2007/10/22(月) 16:52:58
ゴメン…Cでした… malloc/free使ってないのは配列使ってと書いてあるからだけど 100000て添え字までいけるのかなぁ C版に書き直しました…。 #include<stdio.h> int main(void) { int *buffer[100000]; for(int i=0;i<100000;++i) scanf("%d",buffer[i]); for(int i=100000;i>0;) printf(%d",buffer[i]); return 0; }
この関数は br(); 1行改行 br(1); 1行改行 br(2); 2行改行 br(N); N行改行
>>794 scanf?
type input-3-1.txt | 794.exe > output.txt
ってやれってことか?
810 :
807 :2007/10/22(月) 16:54:54
scanfで間違えとった…オイオイ俺 #include<stdio.h> int main(void) { int buffer[100000]; for(int i=0;i<100000;++i) scanf("%d",&buffer[i]); for(int i=100000;i>0;) printf(%d",buffer[i]); return 0; }
>>807 おいおい、ポインタ配列を作ってしれっと誤魔化すなや。
>>809 794 < input-3-1.txt > output.txt でいいんでない?
この関数は sp(); 半角1スペース sp(1); 半角1スペース sp(2); 全角1スペース sp(3); 全角1スペース+半角1スペース sp(4); 全角2スペース sp(5); 全角2スペース+半角1スペース sp(N); 全角(N/2)スペース+半角(N%2)スペース
>>809 794 < input-3-1.txt > output.txt
だが?
scanf、printf使えと書いてある。リダイレクトも
パイプは書いてないからダメだろう
ところで? 標準のC/C++って split使えるの?
>>816 仕様書を読むとできないと明記されてる
Alice was beginning to get very tired of sitting by her sister on the bank,
and of having nothing to do: once or twice she had peeped into the book her sister was reading,
but it had no pictures or conversations in it, `and what is the use of a book,' thought Alice `without pictures or conversation?'
So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid),
whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies,
when suddenly a White Rabbit with pink eyes ran close by her.
818 :
810 :2007/10/22(月) 17:01:14
配列でかい場合はやっぱグローバルに置いた方がいいですか? 目的もはっきりしてるし、他で使いまわしたりしていないし
もうネタはやめようぜ
>>818 グローバルでもstaticでも御好きに
#include<stdio.h> #include<ctype.h> #include<string.h> int issign(int chr){ return (chr=='+' || chr=='-'); } int main(void){ char buf[]="00001 0000 095 +00000023 -0888 -123456789012345"; char number[10+1], *ptr=buf; int i, sign; while(*ptr){ sign='+'; while(!isdigit(*ptr) && !issign(*ptr) && *ptr) ptr++; if(issign(*ptr)) sign=*ptr++; if(!isdigit(*ptr)) continue; while(*ptr=='0') ptr++; for(i=0;i<10 && isdigit(*ptr);i++) number[i]=*ptr++; if(i==0) sign='+',number[i++]='0'; number[i]='\0'; while(isdigit(*ptr)) ptr++; putchar(sign); for(i=strlen(number)-1;i>=0;i--) putchar(number[i]); putchar('\n'); } return 0; }
つーか、buildして動かせよ・・・
825 :
810 :2007/10/22(月) 17:08:04
>>823 ご指摘ありがとうございます。
#include<stdio.h>
int main(void)
{
int buffer[100000];
for(int i=0;i<100000;++i) scanf("%d",&buffer[i]);
for(int i=100000;i>0;) printf(%d",buffer[--i]);
return 0;
}
>>817 これを実行するために
dt="00001 0000 095 +00000023 -0888 -123456789012345".split(' ');
.split();
を標準的なC++を使ってライブラリ化せよ
>>824 ちといま開発環境がないとこにいるんだよ…
>>826 これを実行
dt="00001 0000 095 +00000023 -0888 -123456789012345".split(' ');
実行した結果に等価
dt[0]="00001";
dt[1]="0000";
dt[2]="095";
dt[3]="+00000023";
dt[4]="-0888";
dt[5]="-123456789012345";
dt[]の数 dt.length は6個となる
つまり .split() 関数が使える言語が 素晴らしい 最高だ
LLなら大抵使えるけどな
また .split() の逆で .join() も とてつもなく便利である
>>830 CにはCのBASICにはBASICのプログラミングスタイルがあるように
人の好みもそれぞれだろうからね。
でもここは宿題スレだぞ
JavaScript厨は構ってもらいたいだけなんだろうから相手にすんなって。
これを実行 dt="00001 0000 095 +00000023 -0888 -123456789012345".split(' ').join('/'); 実行した結果に等価 dt="00001/0000/095/+00000023/-0888/-123456789012345";
>>794 #include<stdio.h>
#include<stdlib.h>
#define LINE_MAX 100000
int main(void){
char *buf=NULL, *ptr, moji;
long i, cursize=0, bufsize=0, linecount=0;
long linehead[LINE_MAX+1];
linehead[0]=0;
while(scanf("%c", &moji)==1){
if(cursize>=bufsize){
bufsize+=10000;
buf=realloc(buf, bufsize);
if(buf==NULL) return 1;
}
if(moji=='\n'){
buf[cursize++]='\0';
linehead[++linecount]=cursize;
}else{
buf[cursize++]=moji;
}
if(linecount>LINE_MAX) break;
}
for(i=linecount-1;i>=0;i--) printf("%s\n", &buf[linehead[i]]);
return 0;
}
>>834 それはちがう ライブラリ化で
よりプログラムを簡単にすると言うこと
宿題にライブラリ function 付ければ それで良い
>>838 にとっては
すべての宿題はこれで片付くわけだw
#include"bakalib.h"
int main(int argc, char *argv[]){
return bakafunc(argc, argv);
}
>>837 getsで1ラインずつ読み込んでsscanfとかstrtolで変換した方が
よさそでない
fgets() + sscanf()ならscanf("%c")よりはましだが、gets()は論外。
課題にscanf使えって書いてるしw
そうだったが… scanf("%d")もしくはscanf("%ld")でとらない理由が知りたい 何か不都合があったかなぁ…
>>839 ところが
超++C++言語は
.split(' ');
たったコレだけで動作する 最高だ
>>844 サンプルのファイルだとオーバーフローしないが、
問題文には整数の桁数制限が無かったのでこうした
>>839 超++C++言語は
内部文字コードはUTF-16なので
半角文字も16ビットです
char * ではなく
int * になるよ
>>846 それを考えると整数型に変換しない方がいいと思う。
整数型にしている以上上限値は必ずあるから。
それに引き換えtxtファイルの1行の文字数制限はない…。
>>841 getsにはバッファーオーバーランの危険性がありましたね…失念…やばいやばい
100000行からなり - 変数10万個定義すんなよ
整数が1つずつ - intを使えよな
逆順に出力 - 全部メモリに取り込め
scanf、printfとリダイレクトを - fseek使うな。1passで。
でも普通は
>>837 みたいになるよな。
>>834 レベルの低いC厨はそうやって一つの事しか出来ないから困る
複数を使い分けろよ
853 :
デフォルトの名無しさん :2007/10/22(月) 18:14:43
>790 ありがとうございました
まぁ、漏れならこうするな。 -- awk '{buffer = $0 "\n" buffer;} END {print buffer;}'
ならねーよwww
>>851 課題文みるかぎり1passである必要はなさそうだよ。
まぁバイナリじゃないからfseek使えんし…
テンポラリファイルに記録しながらオフセットを記録して…邪道か…
857 :
デフォルトの名無しさん :2007/10/22(月) 18:17:40
たかだか1MBにも満たないようなデータ量なんだから、がばっと読んでメモリ上で処理するな、俺だったら。
>>857 どうやるもなにも、クラス使う意味ないし、for_each()使う意味も全くないし、何よりうざいってだけさ
>>858 やっぱそうですよね。組み込み系じゃあるまいし…。
その程度だったらウチの電子レンジでもできるがな
>>859 forで回してもいいわなそりゃ
class作ったのはその他制限の部分に関係しているのだが?
PODでも良かったかもしれんが…。
もっとスマートに書けるなら外形だけでもいいから示してもらいたい。
つまり、俺のコードがもっともスマートなのだと言いたいのかな? じゃ、それでいいよ。
<>
>>851 途中経過です
// ++C++ エラー デバッグ ブラウザ ツール
//
http://www.mozilla-japan.org/ // ++C++ シンプル プログミング ツール
//
http://proforceone.web.fc2.com/ // 100000行からなり
// 逆順に出力する
// すべて選択 して Processed input data にコピーする
pc11.2ch.net/test/read.cgi/tech/1191937213/
// Calculation processing にコピーして[RUN]
dt=$.split('\n');for(i=dt.length-1;0<=i;i--){br();sp(2);write(dt[i]);}br();br();
回答のコードを批評するスレじゃありませんよ。
男なら拳で語れ
>>859 模範回答を示せ
>>865 スレタイと
>>1 をよく読んでからどっかいけ
awk ならこれだけだ
{a[++i]=$0}END{for(;i>=1;i--)print a[i]}
< > < >
>>868 よほどあのコードに自身があるんだねぇwww
まあ
>>790 はメンバ関数がアクセッサくらいしかないからな……
そういうクラスもありだろうが、この場合はもっとうまく設計できると思う
書いたのは俺だが… 綺麗に書けたわけでもないし、もっと綺麗なコードになるなら 手本なり部分的な代案なりがないと手直しも何も出来ない
>>868 環境が無くawkの動作を確認できませんでした
俺なら、 製品毎の在庫管理クラスStockMamager 複数の製品在庫をまとめる管理クラスFactory Factoryを引数で受け取って、シミュレートするsimulate関数 という感じにする by C++ 初心者
875 :
790 :2007/10/22(月) 19:11:25
他人のコードよりまず自分の脳みそが正常かどうかをチェックすべき。
そうですね……
>>851 この掲示板の文章で動作確認しました
// ++C++ エラー デバッグ ブラウザ ツール
//
http://www.mozilla-japan.org/ // ++C++ シンプル プログミング ツール
//
http://proforceone.web.fc2.com/ // 100000行からなり
// 逆順に出力する (センタリングしてみた)
// この掲示板を すべて選択 して Processed input data にコピーする
//pc11.2ch.net/test/read.cgi/tech/1191937213/
// Calculation processing にコピーして[RUN]
write('<center>');dt=$.split('\n');
for(i=dt.length-1;0<=i;i--){br();sp(2);write(dt[i]);}br();br();
さっきからうざい
誤爆したら歓迎するスレ
C/C++はライブラリ化が 遅れてる部分あるんですね?
これからは ライブラリ化の宿題が 増える・・・
宿題:文字のドッキングをするには? 参考にBASICでは A$=B$+C$:
だからawkでは a = b c; なんだってばよ。
>>882 859じゃないけど、文字の通りにやるだけだったらこれを10回分繰り返せば終わりじゃないかと。
int _tmain(int argc, _TCHAR* argv[])
{
int zaiko = 1000;
int nouhin = -1;
time_t t; time(&t); srand(t);
printf("前日在庫量 需要量 当日在庫量");
for( int i = 0 ; i < 1000 ; i++ ) {
int n = 80 + rand()%40;
if( nouhin >= 0 ) {
if( --nouhin == 0 ) {
zaiko += 500;
printf("500個納品されました\n");
}
}
int zenjitu = zaiko;
zaiko -= n;
if( zaiko <= 300 && nouhin == -1 ) {
nouhin = 3;
}
printf("%8d %8d %8d\n",(zenjitu<0)?0:zenjitu,n,(zaiko<0)?0:zaiko);
if( zaiko < 0 ) {
printf("%d日に%d個欠品しました\n",i,-zaiko );
}
}
return 0;
}
↑ではC++ではどうですか?
C では文字はドッキングするともはや文字ではなくなってしまう。
>>891 文字で無くなるという
サンプルコードは?
printf("%d",sizeof(char));
>>893 sizeof() は size_t 型を返す立派な演算子だが…
いつもに増してカオス
899 :
デフォルトの名無しさん :2007/10/22(月) 22:02:53
>888 それじゃ1製品じゃない? 10製品同時じゃなきゃだめなんじゃないの?
>>899 10製品分のとはかかれているなぁ。
ただ製品間で関係性がないから
10製品同時でやるのも1製品ずつ10回やるのも
差違がない。
ためしにrand関数をハックして
各製品に与えられる乱数列を同じにすると同じ結果が得られる…。
901 :
デフォルトの名無しさん :2007/10/23(火) 00:33:05
あの…かなり長文の宿題なのですが聞いていただけるでしょうか? 全然分からなくて困ってるんです(><;)
>>901 きいてやるからうpれ
ただし5分以内な
904 :
901 :2007/10/23(火) 00:39:36
>>902 すみません、リナックスで書いてたので文字化けしちゃってます…
書き換えてくるのでもう少し待ってもらえませんか?
>>904 わかった待つからww
いちいちレスすんなwww
>>904 5分という約束を先延ばしにするとは
学生にしてはできるな
907 :
デフォルトの名無しさん :2007/10/23(火) 00:46:22
[1] 授業単元:C言語 [2] 問題文:オイラー法を用い、dy/dx=(3x-5y-4)/5 の常微分方程式を 解きなさい。また、その結果をExcelファイルに出力して グラフを作りなさい。諸条件は以下のようにする。 初期値 (x,y)=(0,0) 刻み幅 Δh=0.3 積分区間 [a,b]=[0,3] [3] 環境 [3.1] OS: Windows [3.3] 言語:C++ [4] 期限: 2007年10月25日まで
908 :
907 :2007/10/23(火) 00:49:37
907を書き込んだモノです。 すいません。言語はc++じゃなくて、cです。 お願いします。
909 :
901 :2007/10/23(火) 01:05:35
#include <malloc.h> #i#include <stdio.h> nclude <stdlib.h> /* 隣接点リスト中の各ノードを定義する構造体 */ struct node { int num; /* そのノードが保持する節点番号 */ struct node *pair; /* そのノードとペアのノードを指すポインタ */ struct node *next; /* そのノードの次のノードを指すポインタ */ }; /* 隣接点リストの先頭ノードと末尾ノードを覚えておくためのデータを定義する構造体 末尾ノードは"番兵"と呼ばれるダミーのノードであることに注意 */ struct adjlist { struct node *start; /* 先頭ノードを指すポインタ */ struct node *end; /* 末尾ノードを指すポインタ */ }; typedef struct node NODE; typedef struct adjlist ADJLIST; FILE *fp; char dfname[25]; NODE *intail(NODE**, int); void delnode(NODE*, NODE**); NODE *getnode(); void stop(char*);
910 :
901 :2007/10/23(火) 01:07:01
/* 隣接点リストを作成し、表示する */ main() { int N, i, x, y; int sum = 0; NODE *p, *q; ADJLIST *a; printf("\n入力データファイル名 = "); /* ファイル名を入力してもらう */ scanf("%s",dfname); fp =fopen(dfname,"r"); /* ファイルを開く */ if (fp == NULL) stop("Error: ファイルが利用できません"); if (fscanf(fp, "%d", &N) != 1) /* ファイルから節点数Nを読み込む */ stop("Error: 節点数が必要です"); int s[N],t[N]; /* (N+2)個の隣接点リストの先頭ノードと末尾ノードを覚えておくための データ領域aを確保する。[a[0]:回路リスト用,a[1]:節点1の隣接点リスト,.., a[N]:節点Nの隣接点リスト,a[N+1]:付加節点用] */ a = (ADJLIST *) malloc((N+2) * sizeof(ADJLIST)); if (a == NULL) stop("Error: 節点数が多すぎます"); /* 隣接点リストを初期化する(番兵ノードを作る) [番兵を用いたのは、所望のアルゴリズムを片方向リストで実現するため]*/ for (i = 1; i <= N; i++) a[i].start = a[i].end = getnode(); /* ファイルから枝データ(節点のペア)を読み込む */ while (fscanf(fp, "%d %d", &x, &y) == 2){ p = intail(&a[x].end,y); /*節点xの隣接点リストの末尾に節点yを挿入*/ q = intail(&a[y].end,x); /*節点yの隣接点リストの末尾に節点xを挿入*/ p->pair = q; q->pair = p; /*xとyの相互参照ポインタを設定*/ } fclose(fp);
911 :
901 :2007/10/23(火) 01:07:56
/* 隣接点リストを表示する */ for (i = 1; i<=N; i++){ printf("\n隣接点リスト%d :", i); s[i]=0; for (p = a[i].start; p != a[i].end; p = p->next){ printf(" -> %d", p->num); s[i]++; } } printf("\n"); /*オイラー回路を持つかどうか判定する*/ for (i = 1; i<=N; i++){ printf("\n節点%dの枝数 :", i); /*各節点の枝の数を表示*/ printf("%d",s[i]); sum += s[i]%2; } printf("\n"); if (sum == 0) printf("\nオイラー回路が存在します。\n"); else printf("\nオイラー回路は存在しません。\n"); printf("\n"); return 0; }
912 :
901 :2007/10/23(火) 01:08:27
/* 隣接点リストの末尾ノードの直前に新しいノードを挿入する endp: 末尾ノードへのポインタの"アドレス" x: 新しいノードが保持する節点番号 戻り値: 新しいノードのアドレス */ NODE *intail(NODE **endp, int x) { NODE *p; p = *endp; *endp = getnode(); /*番兵のアドレスを変更*/ p->num = x; p->next = *endp; return p; /*戻り値はxのアドレス(新番兵の手前)*/ } /* 隣接点リスト中のpの位置にあるノードを削除する p: 削除するノードへのポインタ endp: 末尾ノードへのポインタの"アドレス" */ void delnode(NODE *p, NODE **endp) { NODE *pn; pn = p->next; if (pn == *endp) /*nが末尾の要素であるとき、*/ *endp = p; /*nが新しく番兵になる*/ else { *p = *pn; /*nの後続ノードmの内容をnに複写*/ pn->pair->pair = p; /*mの双対ノードの双対ノードはmである*/ } free(pn); /*mの領域を解放する*/ }
>>907 出力はCSVでもいいでしょうか?
Excelファイル出力は…
914 :
901 :2007/10/23(火) 01:09:39
/* 新しいノードを得る 戻り値: 新しいノードのアドレス */ NODE *getnode() { NODE *p; p = (NODE *) malloc(sizeof(NODE)); if (p == NULL) stop("Error: メモリーが足りません"); return p; } /* エラー処理 */ void stop(char *str) { printf("\n%s\n", str); exit(1); }
915 :
901 :2007/10/23(火) 01:10:31
【1】問題 上記のデータ構造を用いてグラフがオイラー回路を持つかどうか判定し 持つ場合は見つけ出し出力するプログラムを作れ 【2】分からないところ 判定まではできたのですが、それ以降が… 【3】言語 Cです。 【4】期限 明日(10月23日)までです、お願いします(><;) なお、入力ファイルは data01.dat 6 1 2 1 3 1 5 1 6 2 3 2 4 2 5 3 4 3 5 5 6 このように節点数のしたに枝の情報が並んでいる形です。 長文申し訳ありません…
>>901 奇点が二つの時は一方を、ゼロの場合はてきとうにひとつの頂点を選んで、
あとは一度通った辺を選ばないようにして、適当にうろうろさせた結果を出せば、
それが一筆書きになってるんじゃないの?
918 :
901 :2007/10/23(火) 01:24:20
>>916 寝れるなら寝たいです(><;)
>>917 オイラー回路と一筆書きって微妙に違うんです…
一筆は始点に戻らなくてもいいんですがオイラーは………はい。
>>907 CSVファイル出力だけならこうなるけど…
あと仕様として0.3の丸め誤差で刻み幅が0.3から微妙にずれますが、
ずれないようにした方がいいですか?
#include<stdio.h>
long double df(long double x,long double y)
{ return (3*x-5*y-4)/5; }
int main(void)
{
long double x,y,delta;
FILE *outfile;
x = y = 0.0; delta = 0.3;
ourfile = fopen("data.csv","w");
fprintf(outfile,"%Lf,%Lf\n",x,y);
do{
y += dx(x,y)*delta;
x += delta;
fprintf(outfile,"%Lf,%Lf\n",x,y);
}while(x<1.0);
fclose(outfile);
return 0;
}
>>901 じゃあ、奇点が0個のだけね。
でも、適当に辺を一回ずつ選べば始点に戻るよ。
>>918 オイラー閉路を探るんなら、
1.適当なノードからスタート
2.手当たり次第エッジを選んでそちらへ進む.通過したエッジは消去。
3.行き止まり(たどれるエッジがないノード)になったら、そのノード番号をスタックに積む。
4.1個前のノードに戻り、2.へ戻る。
5.戻るノードもたどるエッジも無くなったら終了。
これでOK。プログラム見るの面倒だから書かないけど。
奇点が2以上→オイラー閉路にはならない(そもそも上記アルゴリズムを使わないで済む)
奇点が0でエッジが残っている→グラフが分断されていた。オイラー閉路ではない。(ただし各部分グラフはオイラー閉路)
奇点が0で残ったエッジも0→スタックに積んでいるのがオイラー閉路のたどり方。
あとはがんばれ。
922 :
デフォルトの名無しさん :2007/10/23(火) 02:39:35
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 英文ファイルを読み込み、指定したアルファベットで始まる英単語を英文ファイルからすべて表示する。 さらに、英文ファイル中の該当英単語数とその中から一番長い英単語を表示するプログラム [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: [3.3] 言語: C++ [4] 期限: 10/23日22時 [5] その他の制限:関数 findword(string fname, char top, string longest)を使用 実行例 Input file name-->data.txt first letter--> a Apple and alive a act an a a April advantage all 10words found and longest word --> advantage ちなみにヒント string fname,longest; int count; char top; cout << "Input file-->"; cin >> fname; cout << "first letter-->"; cin >>> top; count = findword(fname,top,longest); cout<< 結果の表示(省略) 上記のようなものをmain関数に含むと良い。(そのまま含まない) string name = "special"のとき's'=name[0],'l'=name[6]でchar型として利用可 erase()を使い、文字列の語尾を1文字短くするにはs.erase(s.size()-1)を利用するとよいとだされました。 自分の中で方針がある程度決まっているのですが、うまくプログラムで表現できません。よろしくお願いします
一行ずつよみこんでfindで見つけて、空白や.や,までを抽出せよ
こんなかんじでやっていけ findword(string fname, char top, string longest){ fstream fp(fname.c_str(),ios::in); getline(fp, st); do{ n=st.find(top); st=st.substr(n); getline(fp, st); } while(fp.eof());
927 :
907 :2007/10/23(火) 07:28:45
csvファイルでも大丈夫です。
>>922 set使って重複無くして、一番長い単語は線形検索かな…。
929 :
デフォルトの名無しさん :2007/10/23(火) 08:19:03
[1] 授業単元:C [2] 問題文(含コード&リンク):関数 add1 は int型の値を引数として受け取り,その値に1を加えて表示する. 関数 add2 は int型の値を引数として受け取り,その値に1を加えた値を戻り値として返す. 関数 add3 は int型のアドレスを引数として受け取り,ポインタの指す値に1を加えて表示する. [3] 環境 [3.1] OS: Windows [3.2] コンパラver任意 [3.3] 言語: C [4] 期限: 10月25日 [5] その他の制限:
930 :
デフォルトの名無しさん :2007/10/23(火) 08:21:07
#include <stdio.h> #include <stdlib.h> void add1(int i); int add2(int i); void add3(int *p); int main(void) { int n; printf("Input integer: "); scanf("%d", &n); printf("Original: %d \n", n); ???????; printf("After Add1: %d \n", n); printf("Add2: %d \n", ???????); /* nを適用した関数add2 の値を表示する */ printf("After Add2: %d \n", n); ???????; 関数add3 に nを適用する printf("After Add3: %d \n", n); return 0; }void add1(int i) { ??????? } int add2(int i) { ???????} void add3(int *p) { ??????? } よかったら????の部分埋めてください 見づらいってとこはスルーしてください
add1(n) add2(n) add3(&n) printf("%d", i+1); return i + 1; *p += 1;
4つ目はprintf("Add1: %d\n", i+1) の方がいいか
>>930 関数add3 に nを適用する をコメントアウトし忘れている…提出前に訂正忘れずに。
どうでもいいことでも一言いいたくて仕方ないんだな
>>926 どうせネタなんだからシンプルな方でいいっしょ。だから、野暮。
# 実用性? どうせスレ違いなんだからどうでもいいよw
936 :
デフォルトの名無しさん :2007/10/23(火) 11:28:11
929の者です 解答ありがとうございます。 どのような動作を行うプログラムか答えよ. また,以下のプログラムをもとに,コマンドラインから与えられた引数を文字列と見て,各引数の出現する順番はそのままで,文字の並びを左右逆にして表示するプログラムを作り,実行結果を示せ. #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; char *c; printf("argc=%d\n", argc); for (i = 1; i < argc; i++) { c = argv[i]; while (*c != '\0') { putchar(*c++); } putchar('\n'); } return 0; } こちらの解答も面倒でなければお願いします
#include <stdio.h> int main(int argc, char *argv[]) { int i; char *c; printf("argc=%d\n", argc); for(i=1; i<argc; i++) { c = argv[i]; while(*c!='\0') c++; while(c!=argv[i]) putchar(*--c); putchar('\n'); } return 0; }
>>936 ほいさ
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i;
char *c,*d;
for (i = 1; i < argc; i++) {
c = d = argv[i];
while (*d != '\0');
while (d-- != c){
putchar(*d);
}
putchar('\n');
}
return 0;
}
てs
940 :
938 :2007/10/23(火) 11:39:41
間違えたw
とりあえず
>>937 さんのでよさそうだからいいや
[1] 授業単元:情報 [2] 問題文(含コード&リンク):2頂点の名前を与えるとその頂点間の距離を求めるプログラムを 作成せよ。なお頂点の座標はテキスト文章で以下のように与えられる。 1 23 32 2 12 23 3 45 24 4 32 19 5 18 17 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:cc [3.3] 言語:C [4] 期限:2007年10月24日 [5] その他の制限:ファイル操作ができるようになるのが目的らしいです。 テキストファイルは一列目が頂点の名前、2列目はx座標、3列目はy座標です。 よろしくお願いします。
>>941 あってるかどうか手計算で確認してや〜
#include <stdio.h>
#include <math.h>
#define N 5
typedef struct{
int num;
int x;
int y;
}Point;
double Length(Point p1,Point p2);
int main()
{
Point P[N];
FILE *fp = fopen("data.txt","r");
int i,p1,p2;
for(i = 0; i < N; i++)
fscanf(fp,"%d%d%d",&P[i].num,&P[i].x,&P[i].y);
for(i = 0; i < N; i++)
printf("%d %d %d \n",P[i].num,P[i].x,P[i].y);
puts("1〜5番の、どの点の距離を測りますか(コンマをはさんで番号入力");
scanf("%d,%d",&p1,&p2);
printf("長さは%.3lfです \n",Length(P[p1-1],P[p2-1]));
return 0;
}
double Length(Point p1,Point p2)
{
int divx = p1.x - p2.x;
int divy = p1.y - p2.y;
return sqrt(divx*divx + divy*divy);
}
943 :
941 :2007/10/23(火) 17:36:49
>>942 ありがとうございました!!無事計算できていました。
txtファイルの文字列を配列にコピーするとき、 strcpy(配列,???); の???には何を入れればいいのでしょうか?
コピーしたい文字列を指定しないでどうする
>>946 文字列の入力されているtxtファイル名ってことですか?
948 :
デフォルトの名無しさん :2007/10/23(火) 19:34:07
>>947 txtファイルから読み込みたいんならstrcpyじゃなくてfgetsとかを使うべし
>>948 fgetsで文字列をバッファに格納した後、
strcpy(配列,バッファ);
とかですか?
なんでそこまでstrcpy()にこだわるんだよw
>>949 fgetsで直接配列に入れればいいじゃんか
952 :
デフォルトの名無しさん :2007/10/23(火) 20:25:38
[1] 授業単元:プログラミング2 [2] 問題文(含コード&リンク): (1)モンテカルロ法を用いて、y=x^2,y=0,x=1で囲まれる領域の面積を求めよ。 (2)モンテカルロ法で、ある進行方向に人が1歩ずつ前進するとき、右、または左に それぞれ1/2の確率でよろけるものとする。 10歩前進した後、中央にいる確率を10回、100回、1000回…100000回の時、 それぞれ表示させる。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:10/24の12時 [5] その他の制限:(1)(2)において発生させる乱数の数を10、100、1000…100000 と増やし、それぞれの場合における結果を画面に表示させること。 よろしくお願いします
953 :
さとみ :2007/10/23(火) 20:32:45
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): Struct を使い、何か変数を定義して、そのメンバーにアクセスする簡単なプログラムを作ってください [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: [3.3] 言語: C言語 [4] 期限: 10/24[5] その他の制限:なし #include <stdio.h>#include <stdlib.h> struct node{ int data; struct node *next;}; struct node *head; void add_head(int x) { struct node *p; p = (struct node *)malloc(sizeof(struct node)); p->data = x; p->next = head; head = p;} void print_list(struct node *q) { struct node *p; printf("list\n"); for(p = q;p != NULL;p = p->next){ printf("%d\n"p->data); }} main(int argc, char *argv[]) { int i, val, n; head = NULL; n = atoi(argv[1]); for(i = 0;i < n; i++){ scanf("%d",&val); add_head(val); } print_list(head); return(0);} ここまでやってみましたが二箇所にエラーが発生しました、間違えたところ教えてください。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node{ int data; struct node *next;}; struct node *head; void add_head(int x) { struct node *p; p = (struct node *)malloc(sizeof(struct node)); p->data = x; p->next = head; head = p;} void print_list(struct node *q) { struct node *p; printf("list\n"); for(p = q;p != NULL;p = p->next){ printf("%d\n",p->data); }} main(int argc, char *argv[]) { int i, val, n; head = NULL; n = atoi(argv[1]); for(i = 0;i < n; i++){ scanf("%d",&val); add_head(val); } print_list(head); return(0);}
>>952 (2)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i, j, k;
srand(time(NULL));
for(i=10; i<=100000; i*=10) {
int cnt = 0;
for(j=0; j<i; j++) {
int pos = 0;
for(k=0; k<10; k++) pos += rand() % 2 ? 1 : -1;
if(pos==0) cnt++;
}
printf("%6d回の試行で中央にいる確率は%f\n", i, (double)cnt / i);
}
return 0;
}
>>952 (1)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
double f(double x)
{ return x*x; };
int main(void){
double sum; unsigned long i;
srand((unsigned int)time(0));
for(i = 0;i<1000000;++i) sum += f((double)rand()/RAND_MAX);
printf("Answer:%f",sum/1000000);
return 0;
}
>>953 最近のコンパイラならエラーメッセージと行が出るからそれ晒せ。
あと、いくら行が多いって怒られたからって無理にツメツメで書くぐらいならうpロダにtxtファイルで上げろ。
959 :
955 :2007/10/23(火) 21:08:26
960 :
952 :2007/10/23(火) 21:17:07
追加問題がメールで届いてましたorz [1] 授業単元:プログラミング2 [2] 問題文(含コード&リンク): (追)モンテカルロ法を用いて、半径1の球の体積を求めよ。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:10/24の12時 [5] その他の制限;発生させる乱数の数を10、100、1000…100000 と増やし、それぞれの場合における結果を画面に表示させること。 度々すいませんがよろしくお願いします 956&957さんありがとうございました。
>>960 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10000000
int main(void)
{
double x, y, z;
int i, cnt = 0;
srand(time(NULL));
for(i=0; i<N; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
z = (double)rand() / RAND_MAX;
if(x * x + y * y + z * z <= 1) cnt++;
}
printf("%f\n", (double)cnt / N * 8);
return 0;
}
964 :
952 :2007/10/23(火) 21:49:29
962&963さん助かりました。 自分が作ったのと比べて見てみます。 ありがとうございました。
965 :
961 :2007/10/23(火) 21:58:55
>>953 そういやエラー2つって書いてあったが、エラー1警告1なんじゃ?
もしエラーが2つなら全角スペースがあったはず…
自分は整形時に置換しちゃったから…
966 :
956 :2007/10/23(火) 22:02:38
>>952 for(k=0; k<10; k++) pos += rand() % 2 ? 1 : -1;
だと、環境にもよるだろうけど、予想以上に実際の確率よりずれるな。
for(k=0; k<10; k++) pos += (int)(rand() / (RAND_MAX + 1.0) * 2) ? 1 : -1;
に修正しといて
do{ for(i=0;i<n;i++){ do{ ran=rand(); ranm=RAND_MAX; x=ran/ranm; }while(x==1.0); node1[i]=(double)(-log(1.0-x)/lambda1); } for(i=0;i<n;i++){ do{ ran=rand(); ranm=RAND_MAX; x=ran/ranm; }while(x==1.0); node2[i]=(double)(-log(1.0-x)/lambda2);
} xcnt=0; dcnt=0; for(i=0;i<n;i++){ cnt[i]=0; for(j=0;j<n;j++){ if(i!=j){ if((node1[i]+node2[j]>=theta && node1[j]+node2[i]>=theta) && i<j){ cnt[i]++; dcnt++; } } } if(cnt[i]==0){ xcnt++; } } }while(xcnt>10 && dcnt>=3800 && dcnt<=4200);
擬似的にネットワークを作って ある条件のネットワークに沿ったら do〜whileから抜け出すようにしたいのですが、 うまくループから抜け出してくれません xcntってやつの条件なら上手く抜けることは確認できました &&dcntってやつを付けたら、さっさと抜けてしまいます なにか修正点があるなら御願いします
>>969 プログラム長いんだったら 1 のアップローダー使おうよ
dcntの値を表示させればいいだけじゃね?
972 :
sage :2007/10/23(火) 22:27:23
お願いします。。 [1] 授業単元:C++プログラミング [2] 問題文(含コード&リンク): 文字列配列クラスと int 型配列クラスを定義し、2 つのクラスを基本クラスとして新たなクラスを定義してください。 定義したクラスに実装すべきメンバー関数は以下のとおりです。 文字列と数値をペアで登録できる。 数値 n (n>=0) を添字として、int 型配列の n 番目の要素を返す。 文字列 s を添字として、int 型配列の n 番目の要素を返す。 n は文字列配列で s に等しい要素のインデックスとする。 ただし、配列のサイズは 10 固定とし、それ以上の要素は登録できないものとします。 また、文字列の比較に strcmp()、文字列の複製に strdup()、文字列の解放に free() を使って構いません。 エラー処理は特に規定しません。 [3] 環境 [3.1] OS Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限:10/24の12時 [5] なし
>>969 dcnt++でしか弄ってないためforが何回まわるかで値が決まりますが
i<jの条件からおおよそn回まわるとn*n/2回インクリメントされます。
dcnt>=3800 && dcnt<=4200 から n の範囲を逆算すると
おおよそ 88<=n<=91 …明らかにきnの範囲厳しくないか?
結論 dcnt++ の場所間違えてるか dcnt のチェック値がおかしい と思う
>>969 …あれこのソース、コンパイラ通るの?
>do{
> ran=rand();
> ranm=RAND_MAX;
> x=ran/ranm;
> }while(x==1.0);
>node1[i]=(double)(-log(1.0-x)/lambda1);
x==1.0だからnode1[i]、node2[i]って全部NaN?
エラーはでないか…ハハハ……
[1]授業単元:プログラミング1 [2]問題文:以下のプログラムをのフローチャートを書け。 また、動作を説明し、変数i, j, kの値をトレースせよ。 #include <stdio.h> int problem3(void) { int i,j,k; int a[3][4]={{1,2,3,4}, {5,6,7,8}, {9,0,1,2}}; int b[4][3]={{1,2,3}, {4,5,6}, {7,8,9}, {0,1,2}}; int c[3][3]; for(i=0;i<3;i++){ for(j=0;j<3;j++){ c[i][j]=0; for(k=0;k<4;k++){ c[i][j]+=a[i][k]*b[k][j]; } } } /* output array */ for(i=0;i<3;i++){ printf("c[%d][0,1,2]:(",i); for(j=0;j<3;j++){ printf("%d,", c[i][j]); } printf(")\n"); } return 0; } 行数制限にかかるので、環境以下は次に…
[3] 環境 [3.1] OS: Windows Vista [3.2] コンパイラ名とバージョン: bcc [3.3] 言語: C++ …のはずです… [4] 期限: 07年10月24日03:00まで [5] その他の制限: 特になし
担当教授がC++とばかり言っていたもので… すいませんorz
>>976 (i=0〜2まで繰り返す)
(j=0〜2まで繰り返す)
c[i][j] = 0.0 で 初期化
(k=0〜3まで繰り返す)
c[i][j]+=a[i][k] * b[k][j]
(kのループ終了)
(jのループ終了)
(iのループ終了)
(i=0〜3まで繰り返す)
(j=0〜3まで繰り返す)
c[i][j]を表示
(jのループ終了)
(iのループ終了)
図はさすがにかけないが
______________
/i=0〜2 \
| ________________| ループはこうやって書く。んだっけ?
そういや…ループのマークあったか…
>>982 まあ、授業でやってない可能性もあるわけだがw
んで、このプログラムは要するに行列の掛け算をしている。
i j k c[i][j]
0 0 0 +1*1
0 0 1 +2*4
0 0 2 +3*7
0 0 3 +4*0 # c[0][0] = 1+8+21+0 = 30
0 1 0 +5*2
0 1 1 +6*5
0 1 2 +7*8
0 1 3 +8*1 # c[0][1] = 10+30+57+8 = 105
あとは自分で頑張れ。
>>922 時間過ぎたけど。#includeの改行は自分で展開してちょうだい。
#include <algorithm> #include <cctype> #include <fstream> #include <iostream> #include <iterator> #include <set> #include <string>
std::set<std::string> words;
int in_length(const std::string& x, const std::string& y) {return x.length() < y.length();}
int findword(const std::string& fname, char top, std::string& longest) {
std::ifstream input(fname.c_str());
const char delimiters[] = " \t,.;:\"?!()[]-";
std::string line;
while (getline(input, line)) {
std::string::size_type start_index = line.find_first_not_of(delimiters);
while (start_index != std::string::npos) {
std::string::size_type end_index = line.find_first_of(delimiters, start_index);
if (end_index == std::string::npos) end_index = line.length();
if (end_index - start_index != 0 && std::tolower(line[start_index]) == std::tolower(top)) words.insert(line.substr(start_index, end_index - start_index));
start_index = line.find_first_not_of(delimiters, end_index);
}
}
longest = *std::max_element(words.begin(), words.end(), in_length);
return words.size();
}
int main() {
std::string fname, longest; int count; char top;
std::cout << "Input file-->"; std::cin >> fname; std::cout << "first letter-->"; std::cin >> top;
count = findword(fname, top, longest);
std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
std::cout<< "\n" << count << " words found and longest word --> " << longest << std::endl;
}
989 :
987 :2007/10/23(火) 23:52:05
ばかした…orz 立て直したほうがいい
>>972 3回読み直したが理解できない
多分、文章で書いてくれても分からないので動作例を書いて下さい
#超解釈すると劣化 map を実装せよってことかな
class homework{
private:
int number[10];
string key[10];
int membernum;
public:
int add(string key, int number);
int get(int number);
int get(string key);
};
>>991 忘れてました・・・
どうかよろしくお願いします。
993 :
デフォルトの名無しさん :2007/10/24(水) 00:14:04
>>990 しかもキーと値は別々の配列に格納。
その配列クラスも手作りで、何故か継承して使うように
書いてあるように見える…。
普通はprivateメンバじゃないかと自分は思う…
どうなの?
>>972
C++しばらくやってないから適当コードだけど、こんなんじゃないの? class StringArray {} class IntArray {} class Map : public StringArray, IntArray { void append(string, int); int operator [] (int n); int operator [] (string&); } stringじゃなくてcharかな?
>>991 たびたびすいません
[4] 期限: 2007年10月24日22:00まで
でした。
996 :
デフォルトの名無しさん :2007/10/24(水) 00:17:31
>>994 課題文にでてくる関数名を見る限り
stringじゃなくてchar*を使って欲しそうに見える…。
標準C関数…C++なのに…まぁchar*で文字列扱う時はstlのalgorithmより楽だが
埋めっか
埋め
ume
だが断る
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。