C/C++の宿題を片付けます 97代目

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。

【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
【過去ログ検索】        http://chomework.sakura.ne.jp/
【wiki】               http://www23.atwiki.jp/homework/

【前スレ】
C/C++の宿題を片付けます 96代目
http://pc11.2ch.net/test/read.cgi/tech/1190331997/
2デフォルトの名無しさん:2007/10/09(火) 23:02:39
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
3デフォルトの名無しさん:2007/10/10(水) 00:45:52
そのテンプレはいただけない。
4デフォルトの名無しさん:2007/10/10(水) 00:47:08
>>2
読みにくいから引用符くらい覚えてよ
5デフォルトの名無しさん:2007/10/10(水) 05:26:43
宿題━キョロ━(゚∀゚≡゚∀゚)━キョロ━マダ━?
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も書かないといけないのでできるだけ簡単なのでお願いします。
7デフォルトの名無しさん:2007/10/10(水) 07:48:56
読解にしばらく時間を要したぞ。
年齢の数と同じ回数だけ「誕生日おめでとう」と表示するんだな。
8デフォルトの名無しさん:2007/10/10(水) 08:48:53
>>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;
}
9デフォルトの名無しさん:2007/10/10(水) 09:28:27
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
与えられた整数値の階乗を計算する関数を作成しなさい。
ただし整数値はint型で受け取るものとし、結果は文字列としてchar型配列で返すこと。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: 任意
 [3.3] 言語: C
[4] 期限: 無期限
[5] 備考:いや、宿題じゃないんだけどね。
暇つぶしにどうぞ。
10デフォルトの名無しさん:2007/10/10(水) 10:24:58
書き忘れ

分かると思うけど、結果がintの範囲を越える場合も考慮してください
11デフォルトの名無しさん:2007/10/10(水) 10:39:41
うちのパソコン4bitCPUだからなー
12デフォルトの名無しさん:2007/10/10(水) 11:18:02
多倍長計算かあ。C++で多倍長計算クラスを使えば一発なんだが。
Cでもライブラリがそこら辺にゴロゴロしてるけど
139:2007/10/10(水) 11:24:24
標準ライブラリ内で
14デフォルトの名無しさん:2007/10/10(水) 11:58:46
http://www5.airnet.ne.jp/tomy/cpro/lt1.htm

面倒臭いからここでも見ろ
15デフォルトの名無しさん:2007/10/10(水) 12:35:24
掛け算だけなら簡単かと思いきや、10進数文字列にすんのめんどくせー
16デフォルトの名無しさん:2007/10/10(水) 13:27:46
>>9
(・∀・)つttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5040.txt

実行例
$ ./a.exe
value: 1234567
1234567! = 762078456028

うちのボロPCではこれ以上の桁を計算させるのは可哀想・・・orz
17デフォルトの名無しさん:2007/10/10(水) 13:33:19
>>16
あっ、ごめ。階乗って 1 * 2 * 3 * ... だった・・・orz
18デフォルトの名無しさん:2007/10/10(水) 14:15:30
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
1から10までの和や1から100までの和を表示させるプログラムを作成せよ
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: VC 6.0
 [3.3] 言語: C++
[4] 期限: 10月10日まで
[5] その他の制限:宜しくお願いします
19デフォルトの名無しさん:2007/10/10(水) 14:15:51
>>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
20デフォルトの名無しさん:2007/10/10(水) 14:17:28
>>18
>>16 が、ちょうど階乗を間違って 1 + 2 + 3 ... + n として作ったプログラムです。
2118: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
このようなエラーが出ました。
22デフォルトの名無しさん:2007/10/10(水) 14:30:14
>>18
#include <iostream>

int main()
{
int n, sum = 0;

std::cin >> n;

while(n) sum += n--;

std::cout << sum;

return 0;
}
23デフォルトの名無しさん:2007/10/10(水) 14:30:54
>>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(&current, &result);
24デフォルトの名無しさん:2007/10/10(水) 14:34:00
>>18
あ、C++だったのね。
>>20,23 は無視して下さい。
25デフォルトの名無しさん:2007/10/10(水) 14:36:48
でも授業単元はC言語になってんだよな。

よくこうなってるの見るけど、大学側がバカなのか本人がバカなのかどっちなんだろ。
26デフォルトの名無しさん:2007/10/10(水) 14:41:08
多倍長演算はアセンブラで書くと効率よく書けるんだが、
C言語で書くとCPUのキャリーフラグを扱えないので一工夫必要だし
効率も少し悪くなるな。
27デフォルトの名無しさん:2007/10/10(水) 14:48:58
>>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ビットシフトする様にしたら速いかなあ
31デフォルトの名無しさん:2007/10/10(水) 15:22:43
>>29
n の取りうる範囲は INT_MAX ?
32デフォルトの名無しさん:2007/10/10(水) 15:24:59
>>30
intelCPUなら遅くなるはず
3329: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桁まで)

制限というかイメージ的には、こんな感じかなぁとは思うのですが式がわかりませんでした。
大変お手数ですが、よろしくお願いいたします 。
35デフォルトの名無しさん:2007/10/10(水) 16:13:57
>>34 コビペ
36デフォルトの名無しさん:2007/10/10(水) 16:18:12
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}
37デフォルトの名無しさん:2007/10/10(水) 16:19:02
>>36
基数は10000な
38デフォルトの名無しさん:2007/10/10(水) 16:21:44
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}
39デフォルトの名無しさん:2007/10/10(水) 16:30:00
速度は道なんだよ
40デフォルトの名無しさん:2007/10/10(水) 16:35:17
まあ多分一瞬

内部的に10000進数表現をunsigned intの配列にして保持してるから,
基本的にO(log(n))くらいか?
41デフォルトの名無しさん:2007/10/10(水) 16:43:17
>>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}
42デフォルトの名無しさん:2007/10/10(水) 16:58:03
>>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;
}
439:2007/10/10(水) 16:58:57
>>19>>41
宿題でもないものにわざわざお付き合いいただきありがとうございます!
ソース読んで勉強させていただきます。
44デフォルトの名無しさん:2007/10/10(水) 17:56:48
>>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] 期限: 改めて明日

46デフォルトの名無しさん:2007/10/10(水) 18:08:26
>>44 もしよろしければお付き合いいただけないでしょうか?
授業単元:プログラミングT
問題文:下図の左のグラフ(頂点と辺からなる図)で、出発点を1とする一筆書きの書き順を全パターン生成しなさい。
期限:無期限

この課題は既に提出済みなので、期限は存在しません。
ここにお願いしましたのは、今後の勉強のために、皆様にご指導いただけたらと思った次第であります。
アップロードしたファイルの中身は
・問題の詳細(画面をキャプチャしたファイルです)
・自分が作ったソースコード
・問題に対する考察
などが入っています。
添削や別解の案などがありましたらご教授下さい。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5033.zip
47デフォルトの名無しさん:2007/10/10(水) 18:18:58
[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

もう正の数はありません。
48デフォルトの名無しさん:2007/10/10(水) 18:48:06
[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] その他の制限: 制限なし
49デフォルトの名無しさん:2007/10/10(水) 18:54:32
>>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;
}
50デフォルトの名無しさん:2007/10/10(水) 19:02:47
>>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

ありがとうございます!
ソース等よく読んで理解できるようになるよう頑張ります。
52デフォルトの名無しさん:2007/10/10(水) 21:33:58
前スレの話でアレだけど、>981の解答の>984、>991って
永久ループ使ってないからダメなんじゃ?
53デフォルトの名無しさん:2007/10/10(水) 22:03:52
>>52
ほんまやね。あれダメだ。本人より。
54デフォルトの名無しさん:2007/10/10(水) 22:06:53
このスレでは17歳教信者をどのように扱うかは決まりましたか?
55デフォルトの名無しさん:2007/10/10(水) 22:25:58
俺の嫁。
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()を使う。
57デフォルトの名無しさん:2007/10/10(水) 22:50:44
>>56
> Axを計算する
わけわからん
58デフォルトの名無しさん:2007/10/10(水) 22:51:15
>>56

>>57わけわかった
59デフォルトの名無しさん:2007/10/10(水) 23:02:07
>>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
中性子移動プログラムお願いします。
61デフォルトの名無しさん:2007/10/10(水) 23:47:38
>>1を読んでテンプレに沿ってください。
62デフォルトの名無しさん:2007/10/10(水) 23:50:07
[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] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)


お願いします
63デフォルトの名無しさん:2007/10/10(水) 23:51:32
グラフ理論がまるで分からん。
情報系の人たちはどんな授業を受け、どういうふうに勉強してんの?
64デフォルトの名無しさん:2007/10/10(水) 23:57:00
[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
66デフォルトの名無しさん:2007/10/11(木) 00:20:02
>>65
ソートするのはいいがその後は自由ってのは気に入らんな
表示でもするのかね
67デフォルトの名無しさん:2007/10/11(木) 00:21:34
>>62
「異なるM個の要素」は、1からMまでの連番でいいのかな?

>>64
やってみる。15分くれ。
6865:2007/10/11(木) 00:30:42
表示でお願いします
69デフォルトの名無しさん:2007/10/11(木) 00:31:25
>>59
ありがとうございます!
70デフォルトの名無しさん:2007/10/11(木) 00:51:05
>>64
遅くなってすまん。あまりデバッグできてないけどあげる。
ちゃんとソートできていないようなら、比較関数を修正して。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5046.txt

あと、mainをint型に変更した。
71デフォルトの名無しさん:2007/10/11(木) 00:53:57
>>66
そうでした…スミマセン!!!!!
そのあとにソート結果を表示します。


>>67
ソート語、ソート結果を表示します。
お手数ですが、よろしくお願いいたします。
72デフォルトの名無しさん:2007/10/11(木) 00:54:07
>>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;
}
7364:2007/10/11(木) 01:00:53
>>70
すすすごい
ありがとうございました!!
非常に助かりました
74デフォルトの名無しさん:2007/10/11(木) 01:01:56
カウントするの忘れた。
if(tmp_index == n){ 内に大局変数のカウンタを増やして、mainで表示してください。
75デフォルトの名無しさん:2007/10/11(木) 01:09:07
[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.多次元配列ってとこやっております・・・。/* 得点の集計 */が下に続くのですが省略><
76デフォルトの名無しさん:2007/10/11(木) 01:12:56
[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次元配列を用いること。
77デフォルトの名無しさん:2007/10/11(木) 01:13:29
俺の朝は10時くらいなんだが、それでもいいならやっておこうか?
7876: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;
}
80デフォルトの名無しさん:2007/10/11(木) 01:48:57
なんでch[i]が出来ると思うんだ
81デフォルトの名無しさん:2007/10/11(木) 01:49:59
>>77
できれば9時までにお願いします><
82デフォルトの名無しさん:2007/10/11(木) 03:07:16
>>75
問題が腐ってるので穴埋めしても完成しない。
やる価値無し。
83デフォルトの名無しさん:2007/10/11(木) 03:25:11
>>75
というかやたらミスが多い問題文だな
講師は事前にデバッグとかしないのかよ

i=i;て何やねん
84デフォルトの名無しさん:2007/10/11(木) 03:25:47
>>75
というかやたらミスが多い問題文だな
講師は事前にデバッグとかしないのかよ

i=i;て何やねん
85デフォルトの名無しさん:2007/10/11(木) 03:28:55
私は私
あなたはあなた
86デフォルトの名無しさん:2007/10/11(木) 03:32:50
=iは75の写し間違いだとは思うけど、そこ除いてもひどいコードなのは間違いない。
87デフォルトの名無しさん:2007/10/11(木) 03:46:01
>>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は順不同。
88デフォルトの名無しさん:2007/10/11(木) 06:55:57
>>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;
}
8962: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] その他の制限: 環境のコンパイラ名とバージョンというのがよくわかりません
説明不足な点があると思いますがよろしくお願いします
91デフォルトの名無しさん:2007/10/11(木) 13:26:30
>>90
これだけでいいのかな?
int is_grass(int r, int g, int b){
return ((100<=r && r<=140) && (140<=g && g<=170) && (70<=b && b<=100));
}
9290: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': 識別子が見つかりませんでした

○○のところは私の名前などが入っているため隠しています
93デフォルトの名無しさん:2007/10/11(木) 14:22:04
>>92
301行目をコピペして晒してみ。
94デフォルトの名無しさん:2007/10/11(木) 14:24:31
>>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++
96デフォルトの名無しさん:2007/10/11(木) 14:36:34
>>95
文字列をランダムに生成するのにどうしてAが必ず先頭にくるのか説明したまえ
9795:2007/10/11(木) 14:43:57
アルファベット26文字生成だからです
aからと書いたほうがよかったですかね。
98デフォルトの名無しさん:2007/10/11(木) 14:48:41
なんか問題文が説明不足じゃね?
文字列の文字数とか文字列自体の数とかはどうなってんの?
99デフォルトの名無しさん:2007/10/11(木) 14:56:29
>>97
だから問題文の説明が不足してるって言ってるの。
A〜Zのランダム文字列を生成してからそれを整列して改めて表示するの?
10090: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);
101デフォルトの名無しさん:2007/10/11(木) 15:30:39
102デフォルトの名無しさん:2007/10/11(木) 15:56:45
>>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』でもう一度お願いできませんか?
お願いします
104デフォルトの名無しさん:2007/10/11(木) 16:36:08
>>103
小学生じゃないんだから、習ってないもの使ったって問題ないよ。
むしろ評価する人はよく調べてるなと思うだろう。
105デフォルトの名無しさん:2007/10/11(木) 17:22:58
>>104
完璧に使いこなせたら、ちょっと危なくなるから。
こっちの都合なんですけど・・・。
お願いします。
106デフォルトの名無しさん:2007/10/11(木) 17:26:20
>>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;
}
107デフォルトの名無しさん:2007/10/11(木) 17:45:56
>>105
お前が何を習ったのか、どこまで知ってるのかを考慮してプログラムするのは難しい
108デフォルトの名無しさん:2007/10/11(木) 17:50:07
>>103
ありがとうございました。明日学校でやってみます。
>>107
制限がなかったらこんなこと言われなくて済むんですけどね。
未熟者ですみません。
10975:2007/10/11(木) 18:48:03
>>87
ありがとうございました!何とか間に合いました。
^^
110デフォルトの名無しさん:2007/10/11(木) 20:42:58
[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] その他の制限:
素数の数までは完成したのですが、素因数分解が出来ません。
まだ授業が進んでいないので、効率の悪い方法で構いません。
よろしくお願いします
111デフォルトの名無しさん:2007/10/11(木) 20:46:28
[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枚ずつ比較して探すプログラムがあるのでこれの矢印で囲んだ部分を改変させて作って欲しいです
お願いします
112デフォルトの名無しさん:2007/10/11(木) 21:17:17
>>111
半物ずつって何?
こういうパズルって比較する回数を限定するんじゃないの?
113デフォルトの名無しさん:2007/10/11(木) 21:35:38
>>112
すみません説明不足でした
このプログラムの場合だと12枚あるコインを6枚6枚で比較して
偽物の入ってる方を3枚3枚で比較して・・・・・って感じです
回数の指定は特にないみたいですが、なるべく少ない回数でやるみたいなのと
講義内で半分ずつ比較するのが一番良いやり方だと言っていたので半分の方法でやろうと思いまして
114デフォルトの名無しさん:2007/10/11(木) 22:30:48
>>110
1で求めた配列って素数しか入ってないんじゃない?
1で求めた配列を使って、12345を含むランダムで選んだ整数を素因数分解するってこと?
11576(78):2007/10/11(木) 22:33:37
すいません、どなたか解答頂けないでしょうか?
116デフォルトの名無しさん:2007/10/11(木) 22:42:32
>>114
すいません、その通りです。問題読み間違えてました・・・・

A訂正
@の配列を使って、12345を含む任意の整数を素因数分解せよ。です
117デフォルトの名無しさん:2007/10/11(木) 23:12:12
入りきらないから、素因数分解の関数だけ
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);
}
118デフォルトの名無しさん:2007/10/12(金) 02:04:21
メインもつけて、ちょっと修正
#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デフォルトの名無しさん:2007/10/12(金) 05:19:56
前にデータベースを頼んだものですが、このままでは危険が危ないのでなんとかお願いします。
120デフォルトの名無しさん:2007/10/12(金) 07:06:10
>>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++;}
こんな感じで作りましたがいまいちわかりませんおよろしく願いします。


122デフォルトの名無しさん:2007/10/12(金) 10:00:59
>>120
typo?「危険が危ない」はちょっと古いですが普通に使われる正しい日本語なんですが…。
123デフォルトの名無しさん:2007/10/12(金) 10:08:29
ドラえもんだっけ?
124121: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;
}
訂正。
125デフォルトの名無しさん:2007/10/12(金) 10:29:40
>>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
127デフォルトの名無しさん:2007/10/12(金) 11:32:07
>>125
いえ、重言ではありますが似た意味の表現を重ねて重要さや意味を強める、
畳語に近い正しい日本語の用法なんですが…。
失礼ですが、どちらの大学をご卒業ですか?
128デフォルトの名無しさん:2007/10/12(金) 12:15:37
私ゃ頭が頭痛で痛いよ。
129デフォルトの名無しさん:2007/10/12(金) 12:19:47
>>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");
}
}

全角が表示されなくて困ってます
131デフォルトの名無しさん:2007/10/12(金) 12:29:59
私は頭が割れるように痒いですよ。
132デフォルトの名無しさん:2007/10/12(金) 12:30:51
>>130
char ではなくて wchar_tでしょう。
133120:2007/10/12(金) 12:35:28
>>122
あ、そういう表現あるの?
こりゃ失礼

だけど>>129は「期限が危ない」のtypoだろう
134120:2007/10/12(金) 12:36:53
間違えた、>>129じゃなくて>>119
135デフォルトの名無しさん:2007/10/12(金) 12:41:51
>>132
ありがとうございます
136デフォルトの名無しさん:2007/10/12(金) 13:07:42
>>130
数字が間違っていたんでできなくて当たり前でした
恥ずかしいです・・・
137デフォルトの名無しさん:2007/10/12(金) 14:51:49
>>122
>>125
>>127
「危険が危ない」が日本語的にどうだろうと>>119
「期限が危ない」と言いたかったと思うのは変な奴扱い?
だから>>120はtypoっていったんだろ?
138デフォルトの名無しさん:2007/10/12(金) 16:35:57
>>122はふざけてるだけか。知識はあってもそれを生かせない可哀想な子
って、下らないレスしてる俺も可哀想な子だな。可哀想な俺に問題を恵んでください。

>>119
期限が危ない問題はどれですか?
139デフォルトの名無しさん:2007/10/12(金) 16:41:50
ぶっちゃけそんなんどうでもいいから、
宿題プリーズ
140デフォルトの名無しさん:2007/10/12(金) 17:15:52
[1] 授業単元: C/C++の宿題を片付けます 97代目
[2] 問題文:くだらない喧嘩を止めさせ、結果を表示させる
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: gcc 3.4
 [3.3] 言語: C
[4] 期限: なるべく早く
[5] その他の制限: 特になし
141デフォルトの名無しさん:2007/10/12(金) 17:18:19
>>140
喧嘩はどこですか?
142デフォルトの名無しさん:2007/10/12(金) 17:25:52
>>140
#include <stdio.h>
int main() {
    puts("\n"
        "      ∧_∧   / ̄ ̄ ̄ ̄ ̄ \n"
        "     (    ) < マターリは… \n"
        "     (    )   \_____ \n"
        "     │ │ │ \n"
        "     (_(__) \n"
        "\n"
        "\n"
        "      ∧_∧     / ̄ ̄ ̄ ̄ ̄ \n"
        "     ( ・∀・ ) ミ < 義務だよ! \n"
        "    ⊂    9    \_____ \n"
        " クルッ   ( ヽノ  \n"
        "      し(_)\n"
    );
    return 0;
}
143デフォルトの名無しさん:2007/10/12(金) 17:26:38
>>142
ありがとうございました
144111:2007/10/12(金) 17:40:26
>>111>>113どなたかお願いします
145デフォルトの名無しさん:2007/10/12(金) 17:49:48
>>144
途中まで作ったけど、もう挫けた
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5054.lzh
146デフォルトの名無しさん:2007/10/12(金) 18:54:00
>>76
もう遅いかもしれないけど一応
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5055.txt
規制で書き込めなかった。
147126 ◆manko/yek. :2007/10/12(金) 19:01:25
時間だ、答えを聞こう
148デフォルトの名無しさん:2007/10/12(金) 19:13:23
またお前か。
騙るのは勝手だけど明日の昼まで待てないのか
149デフォルトの名無しさん:2007/10/12(金) 19:25:59
[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] その他の制限:ポインタは使わないで書いてほしいです

お願いします!
150デフォルトの名無しさん:2007/10/12(金) 19:34:47
>>138
もう期限過ぎちゃいましたからいいです。
出来てるところまで提出しなさいと言われたので空のファイルを提出しました。
151デフォルトの名無しさん:2007/10/12(金) 19:43:12
コレに懲りたら二度とくんじゃねえぞ ( ´ー`)y─┛~~
152デフォルトの名無しさん:2007/10/12(金) 20:29:51
>>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 という環境で動作確認しました。

久しぶりにハマってしまったよ・・・(´;ω;`)
こんな難しい課題が出ちゃうのですか?情報系の学科かな?
私は今までこんな課題もらったことないなぁ・・・
153デフォルトの名無しさん:2007/10/12(金) 21:05:46
154デフォルトの名無しさん:2007/10/12(金) 21:56:11
>>149
やたら回りくどくなってしまったお・・・。いい訳だけどCは使いにくすぎ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5058.c

ヒントが素晴らしかったお。
155デフォルトの名無しさん:2007/10/12(金) 21:57:13
test
156デフォルトの名無しさん:2007/10/12(金) 22:03:01
>>154
23: 不正な初期化(関数 calc )って出てコンパイルできません・・・・

157デフォルトの名無しさん:2007/10/12(金) 22:20:13
>>156
その23行とやらをコピペしてみてくれ。
158デフォルトの名無しさん:2007/10/12(金) 22:25:39
>>157
node n = {tail, '\0', 0};

です


あと構造体を使わないでかけますか?
159デフォルトの名無しさん:2007/10/12(金) 22:28:36
ポインタを使わないとな。俺の力では無理だょ…。ほかの誰か頼んだ!
160デフォルトの名無しさん:2007/10/12(金) 22:29:32
やっぱりポインタを使わないときついですか・・・・
161デフォルトの名無しさん:2007/10/12(金) 22:33:21
>>159
違う違う
変数を使って初期化できるのはC99ってだけ
162161:2007/10/12(金) 22:36:46
変なことを書いてしまったようだ
163≠154:2007/10/12(金) 22:38:09
>>158
gccでは警告だけでコンパイルできる。
それが通らないとは一体どんなコンパイラだ?
一応こう書き換えれば通ると思うが。
--
node n;
n.tail = tail;
n.c = '\0';
n.value = 0;
--
しかし、問題は他にもあって、環境によっては
--
fprintf(stderr, "\nFIND:");
--
をprintf()にしないと表示がぐずぐずになる。
また、割り切れない除算を強行するので例えば、1 2 / 3 + 4 *が得られている。
と言うことで、誰かが書き直すのを待った方がいいかも知らん。
164デフォルトの名無しさん:2007/10/12(金) 22:38:22
node n;
n.tail = tail;
みたいに分ければいけるかも
165149:2007/10/12(金) 22:40:35
>>163
コンパイルとおりました。

しかし、問題の要件を満たしてないです・・・
166≠154:2007/10/12(金) 22:44:43
入れ替えや括弧までって言うと結構面倒なんだよね。私ゃパスだ。
167149:2007/10/12(金) 22:51:20
>>166
そうですね。
9C4=126通りの組合せに対してそれをやらないといけないですね
168デフォルトの名無しさん:2007/10/12(金) 22:52:56
括弧は入れ替えの一種だから考慮しなくていいんじゃね?
169153:2007/10/12(金) 23:02:31
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5059.txt
>>153で上げたのはコインの枚数を変えるとおかしくなったので修正した。
ろだのコメントがおかしいけど気にしないで。
170デフォルトの名無しさん:2007/10/12(金) 23:09:00
再帰使えばポインタも構造体も使わずに解けるはず。
171デフォルトの名無しさん:2007/10/12(金) 23:15:07
やべ、calc(..., 1, ...)じゃなくてcalc(..., number - 1, ...) だったわ…。
ポインタ使うなってのは配列をスタックにしてやれってことなんだろうけど。
172デフォルトの名無しさん:2007/10/12(金) 23:24:12
つかいろいろ間違ってた…鬱
173デフォルトの名無しさん:2007/10/13(土) 00:05:07
174デフォルトの名無しさん:2007/10/13(土) 00:12:39
>>173
どうもありがとうございます。
。でも数字を自分で入力するんじゃなく、9個の数字から4つ選ぶ9C4=126通りの組合せそれぞれに対して
12になるのが一つだせればいいんです。もし一つもなければNGを出すんですが・・・
175デフォルトの名無しさん:2007/10/13(土) 00:37:27
>>173
割り算それでいいの?
176デフォルトの名無しさん:2007/10/13(土) 00:51:43
>>173
ポインタ使わずに頑張ったところ悪いが、
1 3 / 9 * 4 *
↑こんなんが出ない
177デフォルトの名無しさん:2007/10/13(土) 00:51:45
>>175
まずい?浮動小数点数になおすべきなんかな

>>174
longjmp使っていいならやるお
178デフォルトの名無しさん:2007/10/13(土) 01:02:31
13/が0になっていいわけないだろw
179デフォルトの名無しさん:2007/10/13(土) 01:15:30
そりわ悪かった。投げやりになっちたったお
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5061.c
180デフォルトの名無しさん:2007/10/13(土) 01:35:37
> 9 7 2 1 ---> 9 7 2 / + 1 *
本当にわかってんの?
181デフォルトの名無しさん:2007/10/13(土) 01:41:53
>>179
tmpもdoubleにするか、キャストしないと、
端数切り捨てられますよ、っと

しかしポインタ使うなと言われて関数ポインタ使うとはw
182デフォルトの名無しさん:2007/10/13(土) 01:48:32
がんばれ。
183デフォルトの名無しさん:2007/10/13(土) 01:51:11
184デフォルトの名無しさん:2007/10/13(土) 02:42:24
>>149 >>183
ポインタなしでどうやってんのかと見てみたら、関数の仮引数を int a[] みたいな書式でやってるのな、痛々しいw
185デフォルトの名無しさん:2007/10/13(土) 03:57:11
もっとみんな人に優しく
186デフォルトの名無しさん:2007/10/13(土) 05:55:11
187デフォルトの名無しさん:2007/10/13(土) 06:02:55
>>186 の67行目と68行目の間に追加
if(!is_12) printf("%d %d %d %d ---> NG\n", num[0], num[1], num[2], num[3]);
188デフォルトの名無しさん:2007/10/13(土) 06:17:04
>> 186
もう気づいてるかもだが、 >>183 では 1789 ---> 98*71-/ になってるとこが
NG になるお。 9*8/(7-1) の括弧に対応してないのかな
189デフォルトの名無しさん:2007/10/13(土) 06:25:46
括弧の事なんて忘れてたさ
190デフォルトの名無しさん:2007/10/13(土) 07:58:19
カッコ悪い
191111:2007/10/13(土) 08:06:53
>>145
>>153
遅くなりましたがありがとうございました
本当に助かりました
192デフォルトの名無しさん:2007/10/13(土) 08:35:31
>>184
配列わずにポインタ使えって言うから例題みたら*(array+i)とかよくあること。
193149:2007/10/13(土) 09:39:26
>>183
>>186

おお!すごい。ありがとうございます。186と183の結果違いますね。

アルゴリズム的にはどういう感じですか?
186も改造して 1789にも対応しようと思うんですが
194デフォルトの名無しさん:2007/10/13(土) 10:39:44
[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
195デフォルトの名無しさん:2007/10/13(土) 10:56:45
脊髄反射でscanが%15.5lfと予測
196デフォルトの名無しさん:2007/10/13(土) 11:07:50
>>194
どっかで色々指摘したと思うのだが、完全無視か?
197デフォルトの名無しさん:2007/10/13(土) 11:29:15
15.5fが怪しいな
19876(78):2007/10/13(土) 11:51:27
>>146
今日、出しに行ったら何とか受け付けてくれました。
ありがとうございました。
199デフォルトの名無しさん:2007/10/13(土) 12:24:58
宿題マダァ?(・∀・ )っ/凵⌒☆チンチン
200デフォルトの名無しさん:2007/10/13(土) 12:54:15
>>199
[1] 授業単元:暇つぶしにもならないか?
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5065.txt
[3] 環境
 [3.1] OS: 自由
 [3.2] コンパイラ名とバージョン: 自由
 [3.3] 言語: C
[4] 期限:2007年10月20日0時00分
[5] その他の制限:他の課題を優先
201デフォルトの名無しさん:2007/10/13(土) 13:13:34
202デフォルトの名無しさん:2007/10/13(土) 13:22:39
>>201
show_deckやり直し
203デフォルトの名無しさん:2007/10/13(土) 13:35:47
204デフォルトの名無しさん:2007/10/13(土) 13:55:21
>>186
今さら指摘すると、それ分数使えない
205デフォルトの名無しさん:2007/10/13(土) 14:08:26
>>203 のシャッフル方法は一般に使われてるもんなんでしょうか?
混ぜ具合の要求レベルによるんだろうってことはわかるんですけど。
206デフォルトの名無しさん:2007/10/13(土) 14:09:32
一般的でもないだろう
207デフォルトの名無しさん:2007/10/13(土) 14:18:53
>>205
シャッフルとして使っちゃダメなレベル
208デフォルトの名無しさん:2007/10/13(土) 14:20:54
完全にシャッフルされていることを証明するのってどうすればいいの?
高卒の俺に教えてください。
209111:2007/10/13(土) 14:23:50
>>169
重ね重ねありがとうございました
210デフォルトの名無しさん:2007/10/13(土) 14:24:03
211デフォルトの名無しさん:2007/10/13(土) 14:34:11
seed をきちんと選べば、それなりにシャッフルされると思ったのですが・・・
あ、seed(time(0)); はめんどくさくて端折りました。
212デフォルトの名無しさん:2007/10/13(土) 14:35:19
srand(time(0)); だった・・・かるく自殺してくる。
213デフォルトの名無しさん:2007/10/13(土) 14:38:40
>>208
53枚のカードから一発でババを引き当てることが出来る状態のことを
完全シャッフル状態といいます。
214デフォルトの名無しさん:2007/10/13(土) 14:40:15
前半と後半(乱数)の入れ替えだから後半に動かないカードが多少出るね。
どちらかといえば>>203のほうがいいと思うんだ、うん。
215デフォルトの名無しさん:2007/10/13(土) 14:43:20
>>214
210じゃなくて203?
216デフォルトの名無しさん:2007/10/13(土) 14:46:45
>>215
うげ、安価ミスw>210です
217デフォルトの名無しさん:2007/10/13(土) 14:47:05
>>208
農学部卒の俺の答え
今回の例だったら 52x52 のカウンタの配列作って、数万回試行、カウンタとって
標準偏差とってほかの方法と比べる、みたいなんじゃないか?証明はムリ
218デフォルトの名無しさん:2007/10/13(土) 14:58:18
シャッフルについては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からの議論を参照されたし
219デフォルトの名無しさん:2007/10/13(土) 14:59:33
>>203のは後半に動かないカードが多少出るどころじゃないだろ。
1から25までに入ってる奴は自分より小さい番号のところに絶対入らない糞仕様だぞ
220デフォルトの名無しさん:2007/10/13(土) 15:00:28
あ、書こうと思ったら先越された>>218

均一に混ぜるなら>>218の方法だけど、
リアルに似せるなら多少不均一でもいいかもね。よくないか。
221デフォルトの名無しさん:2007/10/13(土) 15:25:33
なるほどねぇ。
222デフォルトの名無しさん:2007/10/13(土) 18:41:50
>>204
いまさら指摘すると、分数を使う必要はない
1/3*6 = 2 ができなくても 6*1/3 のように並び替えで同じ解が得られるから
223デフォルトの名無しさん:2007/10/13(土) 18:58:14
カードシャッフルのチート対策版
メモリ内を覗かれても、カードが配られる時まで
次に配られるカードが何であるか分からない
#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;
}

※上記の表現は誇張しています。頑張れば次のカードを調べることは可能です
224デフォルトの名無しさん:2007/10/13(土) 19:13:15
ちょっと聞きたいんだけど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);
}
で、ビットマップが変換できないってエラーでて困ってるんだけど
225149:2007/10/13(土) 19:30:02
完全な回答だれかできませんか?

183は組合せが1234から始まってないので・・・

あとプログラムのアルゴリズムに対して考察もしないといけないので・・・
226デフォルトの名無しさん:2007/10/13(土) 19:33:18
その書き方だと「できます」ってだけのやつが出てくるぞ
催促するならはっきり書かなきゃ
227デフォルトの名無しさん:2007/10/13(土) 19:35:56
考察したら自分で完全版作れるんじゃない?
228149:2007/10/13(土) 19:36:02
>>226
はい。では仕様を満たすプログラムを作ってください。
お願いします。。。
229デフォルトの名無しさん:2007/10/13(土) 20:07:21
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++) {
//チェック用の関数
}}}}
ってやればよくね?
230デフォルトの名無しさん:2007/10/13(土) 20:10:27
>>229
チェック用の関数がどこにあたるかわからないです。。。
>>183のプログラムが理解できなくて・・・

>>186ならなんとか理解できそうなんですが
231デフォルトの名無しさん:2007/10/13(土) 20:28:58
理解できるんなら、それを自分で変えればいいだけだろ。
232デフォルトの名無しさん:2007/10/13(土) 20:29:32
>>222
うは、俺恥ずかしす
233149:2007/10/13(土) 20:48:59
>>231

やっぱり理解できなかったです。

122行目の
temp=work[index], work[index]=work[i], work[i]=temp; の構文がよくわからないです。なんでセミコロンじゃなくてコンマなんですか?
234デフォルトの名無しさん:2007/10/13(土) 21:01:58
temp=work[index];
work[index]=work[i];
work[i]=temp;

と同じ。
ただ、そういう書き方もできるだけ。
235149:2007/10/13(土) 21:04:24
>>234
わかりました。
236149:2007/10/13(土) 21:05:09
途中で送信してしまいました。


>>186の方がまだいるならば完全版をお願いしたいです。
237デフォルトの名無しさん:2007/10/13(土) 21:07:42
1〜9の数字を重複せずに選んで、入力した数nを計算できる数式を全て列挙せよ
238デフォルトの名無しさん:2007/10/13(土) 21:17:13
>>186 の人は立ち上がってポインタを解禁して欲しそうにしている
解禁しますか?はいかイエスで答えて下さい
ニア はい
     イエス
239デフォルトの名無しさん:2007/10/13(土) 21:30:04
>>149こんなん簡単だろ

まず f ( a b c d) 数字abcdをそのままの順序でつかって計算可能な式すべてを計算する を作る

○は加減乗算とする

可能性として  a  b ○ c ○ d ○ または  a  b ○ c d ○○ の形しかない 

これで関数fはつくれるだろ
240149:2007/10/13(土) 21:33:04
>>239
a b c * + d - (b*c)+a-d   

みたいな感じもありえますよね?
241デフォルトの名無しさん:2007/10/13(土) 21:33:31
すまん まちがえた
242デフォルトの名無しさん:2007/10/13(土) 21:42:04
3つなら a b○c○   a bc○○ のみ

4つなら
a b○c○d○   a bc○○d○  と
a bcd○○○
でいいか?
243デフォルトの名無しさん:2007/10/13(土) 21:44:18
a b○c○d○   a bc○○d○  a bcd○○○ a b○cd○○ だな
244デフォルトの名無しさん:2007/10/13(土) 21:47:12
>>243
ab○c○d○ は dcab○○○ と等価
245デフォルトの名無しさん:2007/10/13(土) 21:48:41
順番はかえないっていってるだろ
246デフォルトの名無しさん:2007/10/13(土) 22:00:56
任意の個数のときは、全部を後方に置くか、、一カ所区切りをいれる
というのを再帰して求めれば全ての配置が決まるな
247デフォルトの名無しさん:2007/10/13(土) 22:09:59
(1〜9から重複せず4個選ぶ組み合わせ)×(+-*/から重複を許して3個選ぶ組み合わせ)×(8個の物を並べる順列)
248デフォルトの名無しさん:2007/10/13(土) 22:22:20
249248:2007/10/13(土) 22:27:59
あー
9/(8-5)*4=12
が抜けとる

思ったよりめんどいな
250デフォルトの名無しさん:2007/10/13(土) 22:34:06
なぜ抜けている事がわかった?
251248:2007/10/13(土) 22:36:35
割り算が可換じゃないことを思い出したから
252デフォルトの名無しさん:2007/10/13(土) 22:41:58
というか>>183じゃ駄目なのか?
俺は試してないから知らないけど
253デフォルトの名無しさん:2007/10/14(日) 03:05:54
あー酔っ払った。とりあえず宿題くれ。
254183:2007/10/14(日) 03:26:47
ああ俺のは組み合わせの順序が4321〜9786…
(組み合わせの結果を逆順に配列に入れてるだけ)になるからダメなんだな…。
直してあげたいが2日間飯食ってなくて辛いんだ。すまない。
255デフォルトの名無しさん:2007/10/14(日) 03:33:50
表示のところで逆からにすればいいだけじゃね?
256デフォルトの名無しさん:2007/10/14(日) 03:35:47
>>254
そんな貴方の生活習慣を直してあげたい。
257デフォルトの名無しさん:2007/10/14(日) 11:51:28
は、はやく宿題を!
258デフォルトの名無しさん:2007/10/14(日) 11:58:31
どど、どうしたんだ急に!
259149:2007/10/14(日) 12:16:01
>>254
なんかおごりますよ

>>255

それはできないきがします。

>>257

できたら俺のをお願いします。締め切りが・・・
260デフォルトの名無しさん:2007/10/14(日) 12:20:17
>>259
計算の順番は固定じゃないんだから、4321を1234って風に逆順にすればいいだけだろ?
261デフォルトの名無しさん:2007/10/14(日) 12:20:57
>>257は宿題をやらないと禁断症状が出る病気だと思われる。
>>257に宿題
>>223を考察せよ。
(1)本当にチート対策されているのか?
(2)均一にシャッフルされているか?
(3)その他気付いた点
262デフォルトの名無しさん:2007/10/14(日) 12:22:12
解いてほしかったら問題補足以外にはしゃべらないほうがいい。
263デフォルトの名無しさん:2007/10/14(日) 12:37:50
[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

あんまおもしろくないかな?ファイルが関わってくると色々面倒だよね。
264デフォルトの名無しさん:2007/10/14(日) 12:47:01
一気にLEVEL上がってるYO!初心者には辛いYO!
Javaじゃないんだから”Write once, run anywhere ”なんて
ヒントくれYO!
265デフォルトの名無しさん:2007/10/14(日) 12:51:18
書庫ってもLHAやらZIPやらで圧縮しなくてもいいよ。単にファイルの収納/取り出しが出来るだけで。
余裕があるのならRUN-LENGTH圧縮くらいやっても。
266デフォルトの名無しさん:2007/10/14(日) 12:52:00
OSはこれか?:
http://www.jnode.org/
267デフォルトの名無しさん:2007/10/14(日) 13:13:36
ferror←フェラー
268デフォルトの名無しさん:2007/10/14(日) 13:13:52
ここはもはや何スレか分からんなw
暇つぶしスレとか、
初心者がレベルアップに問題こなしてくスレとか、
そんな感じじゃねえかw
269デフォルトの名無しさん:2007/10/14(日) 13:23:01
まあ最初からそうじゃないの。楽しくも無いのに他人の宿題を黙々と解くなんてどこのインベーダーだよ。
270デフォルトの名無しさん:2007/10/14(日) 15:34:40
>>149 あああああああ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5070.txt


も、もっと簡単な宿題を
271デフォルトの名無しさん:2007/10/14(日) 15:41:13
>>270
実行できないぞ
272デフォルトの名無しさん:2007/10/14(日) 15:51:54
273デフォルトの名無しさん:2007/10/14(日) 15:55:37
おお、これは大作だな。
ただ要求を大きく見誤ってるぞ・・・。4つの数字は組み合わせで与えないと。
274デフォルトの名無しさん:2007/10/14(日) 15:58:17
なんだと……?
275デフォルトの名無しさん:2007/10/14(日) 16:08:14
そろそろ俺のターンでok?
276デフォルトの名無しさん:2007/10/14(日) 16:18:58
ずっと牛のターン
277:2007/10/14(日) 16:19:24
278:2007/10/14(日) 16:23:55
>>277
って、1789対応してねえ... orz
279:2007/10/14(日) 16:31:10
>>278
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5073.txt

なんかこんどは数多すぎ orz こんなもん? 1578以外全部OKになっちゃった。
280:2007/10/14(日) 16:43:59
,,,すまんかった、牛のターン終了で頼む。
281デフォルトの名無しさん:2007/10/14(日) 16:48:17
全部の数式をチェックするのは最終手段っぽいな。なんか良いやり方ないかな

宿題のくせにむずいぞ
282デフォルトの名無しさん:2007/10/14(日) 16:52:16
全部の数式チェックすればいいだけ 簡単だろが
283デフォルトの名無しさん:2007/10/14(日) 16:54:23
a b○c○d○   a bc○○d○  a bcd○○○ a b○cd○○ のところへ+-*/をいれて総当たり

abcdは、9C4 × 4! だけいれかえろ
284デフォルトの名無しさん:2007/10/14(日) 17:00:29
せっかく頑張って>>152書いたのにレスがないのはちと寂しい・・・
>>46氏はもうどこかへ旅立たれたのだろうか。
285デフォルトの名無しさん:2007/10/14(日) 17:02:06
>>149をたのむ
286デフォルトの名無しさん:2007/10/14(日) 17:03:22
>>285 >>149
>>283方式でやったやつ >>279

287デフォルトの名無しさん:2007/10/14(日) 17:06:35
288デフォルトの名無しさん:2007/10/14(日) 17:08:02
>>286
やったな 完成してるじゃん
289デフォルトの名無しさん:2007/10/14(日) 17:10:25
>>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

290デフォルトの名無しさん:2007/10/14(日) 17:13:38
>>289
小1時間自分で考えろよ
291デフォルトの名無しさん:2007/10/14(日) 17:23:22
>>290
だが、断る。
292デフォルトの名無しさん:2007/10/14(日) 17:31:34
ちなみに、逆ポーランド記法で、交換などで同一の式はどう判断すればいいですか?
293デフォルトの名無しさん:2007/10/14(日) 17:42:47
それも宿題の一部?面倒くさいから総当りでやっちゃったけど、いい方法思いつかんよ・・・。
294デフォルトの名無しさん:2007/10/14(日) 22:05:26
( ´∀`)つttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5075.txt

もうだめ・・・ワインがまわってきた・・
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を用いていただけると助かります。
296149:2007/10/14(日) 22:47:58
>>279

>>287

ありがとうございます。
>>287さんのが動作も速くて良い感じです

>>294

全部NGになってしまいます・・・
297デフォルトの名無しさん:2007/10/14(日) 22:48:50
>>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] その他の制限:特にありません

宜しくお願いします。
300デフォルトの名無しさん:2007/10/14(日) 23:10:38
301デフォルトの名無しさん:2007/10/14(日) 23:25:52
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5076.txt
[3] 環境
 [3.1] OS:Windows
 [3.3] 言語: C 言語
[4] 期限:10月15日午前1時まで
よろしくお願いします
302デフォルトの名無しさん:2007/10/14(日) 23:27:25
>>299
キモい課題だな
303デフォルトの名無しさん:2007/10/14(日) 23:33:55
というより質問者がキモい
304デフォルトの名無しさん:2007/10/14(日) 23:47:51
>>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;
}
305デフォルトの名無しさん:2007/10/14(日) 23:50:32
>>301 課題2(while文)
#include <stdio.h>

int main(void)
{
int no;

puts("============================");
puts(" 読み込んだ整数の個数だけ*を連続表示 " );
puts("============================");

printf("正の整数を入力してください:");
scanf("%d", &no);

while (no-- > 0) puts("*");

return(0);
}
306デフォルトの名無しさん:2007/10/14(日) 23:53:40
>>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);
}
307デフォルトの名無しさん:2007/10/15(月) 00:00:21
>>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のはどうやってんだ?
310デフォルトの名無しさん:2007/10/15(月) 00:26:18
きっと >>149 が考察を書いてうpしてくれるさ
311デフォルトの名無しさん:2007/10/15(月) 01:49:02
>>308
教科書もしかして「線型代数とその応用」?
ピポットなんて概念その本でしかみたことない。
ピポットの概念の説明も書いたほうがレスつきやすい希ガス。
312デフォルトの名無しさん:2007/10/15(月) 01:50:45
>>311
もっと本を読め
313デフォルトの名無しさん:2007/10/15(月) 01:53:58
>>312
リョーカイ
314デフォルトの名無しさん:2007/10/15(月) 02:23:30
>>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;
}
315デフォルトの名無しさん:2007/10/15(月) 03:32:04
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
316読みづらいので書き直し:2007/10/15(月) 03:34:35
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
317デフォルトの名無しさん:2007/10/15(月) 03:35:08
なぜか左に詰められるなorz
318デフォルトの名無しさん:2007/10/15(月) 03:42:45
x = x - (x > 0) * (k == 4) + (x < 239) * (k == 8);
319デフォルトの名無しさん:2007/10/15(月) 03:48:02
掛け算はねーな
x = x - (k == 4 && x > 0) + (k == 8 && x < 239);
のほうがいいか。

どっちにしろ、無理に一文にまとめても、効率悪くなるだけで意味ないと思うが。
320デフォルトの名無しさん:2007/10/15(月) 03:58:35
それよりint k = atoi((char *)&a); の挙動が気になる
321デフォルトの名無しさん:2007/10/15(月) 04:26:05
求める数字になるか、0になるかは環境依存
322デフォルトの名無しさん:2007/10/15(月) 04:43:30
>>317
専用ブラウザでみてると、ちゃんとインデントされてるよ。
323デフォルトの名無しさん:2007/10/15(月) 06:30:02
それは専用ブラウザの種類による
324315-317:2007/10/15(月) 06:53:56
回答thxです
いや、このスレ通りそういう風にするという宿題だったんです
効率はともかく・・・
アルゴリズムの勉強だったんですかね?
とにかくありがとうございます
325デフォルトの名無しさん:2007/10/15(月) 07:10:43
x = k==4 && x > 0 ? x - 1 : k==8 && x < 239 ? x + 1 : x;
の方が、題意に沿ってるかもな
こういう書き方は好きじゃないが
326デフォルトの名無しさん:2007/10/15(月) 07:12:39
>>325
条件演算子とかいう奴でしたっけ?
そういう書き方もできるのか…あんまり使わないですが覚えておきます
327デフォルトの名無しさん:2007/10/15(月) 08:38:17
x+=(k==8)-(k==4),x=(x<0)?0:(x>239)?239:x;
328デフォルトの名無しさん:2007/10/15(月) 08:41:21
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
331デフォルトの名無しさん:2007/10/15(月) 10:16:07
>>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;
}
332デフォルトの名無しさん:2007/10/15(月) 10:24:20
5枚の画像(a.jpg、b.jpg、・・・、e.jpg)ファイルがあります
最初にa.jpgを表示し、xキーを押すと次の画像(b.jpg)を表示します
yキーを押すと前の画像(a.jpg)を表示します


これのアルゴリズムが分かりません
for文を使って書きたいです
333デフォルトの名無しさん:2007/10/15(月) 11:04:29
そうですか
では、がんばってください
334デフォルトの名無しさん:2007/10/15(月) 11:06:05
休み期間中に108問ある問題を終らせるには、毎日平均何問解けばよいか計算するプログラムを作成しなさい
int day=29;

実行画面
3問:8日
4問:21日
335デフォルトの名無しさん:2007/10/15(月) 12:57:49
336デフォルトの名無しさん:2007/10/15(月) 13:47:20
>>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;
}
337デフォルトの名無しさん:2007/10/15(月) 16:20:45
>>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] その他の制限:

よろしくお願いします。
339デフォルトの名無しさん:2007/10/15(月) 18:07:41
なんだそりゃ?以前の発注から、最適なスケジューリングをするプログラム?
340338: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日。

発注が毎日来た場合には、機械がすでに使用されているから、完成するまでの時間がかかるし、
発注があまりない場合には、直ぐに完成する。っていうプログラムを作れって事だと思うんですけど・・・

よろしくお願いします
341デフォルトの名無しさん:2007/10/15(月) 19:22:43
やっぱわかんねえ。入力と出力の例を書くとか、なんか工夫してくれ。
それともおれだけ理解できないのか?
342デフォルトの名無しさん:2007/10/15(月) 19:43:11
なんとなく理解できた
343デフォルトの名無しさん:2007/10/15(月) 19:43:45
とりあえず勤務時間と福利厚生についてkwsk
344デフォルトの名無しさん:2007/10/15(月) 20:37:51
[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箇所、分かりません。よろしくお願いします。
346デフォルトの名無しさん:2007/10/15(月) 21:11:50
>>345
こっちに誘導した俺が言うのもなんだが、>>1をよく読め
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 に値を出力し,最後に合計値を出力する.
348デフォルトの名無しさん:2007/10/15(月) 21:27:39
テンプレって強制だっけ?

>>345
無限ループってかいてあるじゃない。
ループはwhile(1)かfor(;;)が正解
でその後
if(scanf("%d", &a) != 1) {
 if(getchar() == '.') break;
 puts("なめんな");
 fflash(stdin);
 continue;
}

scanfって途中で失敗したら読み込んだ内容をストリームに返すっけ…?
349デフォルトの名無しさん:2007/10/15(月) 21:29:00
s/fflash/fflush/

最近ActionScriptに凝ってるもんで<(^_^;)
350デフォルトの名無しさん:2007/10/15(月) 21:32:17
>>348
いや、while(scanf("%d",&a)!='.')はちゃんと無限ループになると思いますよw
351デフォルトの名無しさん:2007/10/15(月) 21:34:22
確かにw
352 ◆TwS3xDXeFQ :2007/10/15(月) 21:38:45
【質問テンプレ】
[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
353 ◆TwS3xDXeFQ :2007/10/15(月) 22:02:29
あ・・・例が間違ってました
出力例:4 2 5 1 3
に訂正します
354デフォルトの名無しさん:2007/10/15(月) 22:10:22
>>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);
}
355デフォルトの名無しさん:2007/10/15(月) 22:17:34
fprintf(fp,"%d ",*a--);はfprintf(fp,"%d ",*--a);の間違いなので訂正。
356デフォルトの名無しさん:2007/10/15(月) 22:20:08
C言語でなかなかポインタやリスト構造のプログラムが自由に書けません。
図で説明はできるので理解はできているつもりです(理解できていないのかもしれませんが)。
皆さんはどうやってポインタ関連を克服しましたか?
357デフォルトの名無しさん:2007/10/15(月) 22:26:52
ひたすら実践あるのみ
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] その他の制限:

よろしくお願いします。


359デフォルトの名無しさん:2007/10/15(月) 22:44:45
>>356
宿題以外ならつかわなければいい
360デフォルトの名無しさん:2007/10/15(月) 22:49:29
>>356
ここで他の人の宿題を解いて覚えたよ
361デフォルトの名無しさん:2007/10/15(月) 22:49:56
>>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");
}
整列にバブルソートを使用。ソート部分を関数化すれば他のソートにも変更可能。
362デフォルトの名無しさん:2007/10/15(月) 22:58:49
>>358
一日の発注数の最大とかは決まってないの?
363358:2007/10/15(月) 23:11:59
>362
発注量は一定です。

よろしくお願いします
364デフォルトの名無しさん:2007/10/15(月) 23:13:19
>>361
thx
助かりました
365 ◆vLIz8KOkPM :2007/10/15(月) 23:14:00
>354
ありがとうございましたm(__)m助かりました☆
366デフォルトの名無しさん:2007/10/16(火) 00:05:13
>>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++);
}
}
367デフォルトの名無しさん:2007/10/16(火) 00:12:18
>263

参考になるかもしれないソースは見つけた…。
有名なtarのソースファイル……自前で組む気になれない

http://www.vector.co.jp/soft/winnt/util/se015014.html
368714:2007/10/16(火) 01:06:25
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5080.txt
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン:
 [3.3] 言語: C言語
[4] 期限: 10月16日 pm5:00
[5] その他の制限:

よろしくお願いします。
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] その他の制限:

よろしくお願します。
370デフォルトの名無しさん:2007/10/16(火) 01:44:43
>>369
void swap(int *x,int *y){
int temp;

temp=*x;
*x=*y;
*y=temp;
}

swap(&a,&b);

確認してないから間違ってるかも
371369:2007/10/16(火) 02:45:30
>>370
本当にありがとうございました。
372デフォルトの名無しさん:2007/10/16(火) 02:56:41
>>368
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5081.txt
問題文のnewton()だとaが渡せないのでaをグローバル変数として宣言してます。
373デフォルトの名無しさん:2007/10/16(火) 10:38:48
374デフォルトの名無しさん:2007/10/16(火) 10:41:43
あ、BCC を持ってないので gcc3.4/cygwin で動作確認しました。
375デフォルトの名無しさん:2007/10/16(火) 11:05:10
>>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) )

ってなるんですけど・・・
377デフォルトの名無しさん:2007/10/16(火) 11:10:09
>>376
C言語じゃないのかよ!ってかそこからかよ!
378デフォルトの名無しさん:2007/10/16(火) 11:12:46
>>376
とりあえず拡張子は .c にしろ。話はそれからだ。
379デフォルトの名無しさん:2007/10/16(火) 11:21:17
>>376
自分でC言語と指定してるのに何を言っとるのだー
380デフォルトの名無しさん:2007/10/16(火) 11:24:30
C++ でよかったのなら、書き換えたい・・・(´・ω・`)
381376:2007/10/16(火) 11:41:25
すいません。
C++でお願いします。
382デフォルトの名無しさん:2007/10/16(火) 11:45:00
>>381
!!!
もしかしてどうすればコンパイルできるのか分からないだけか?
383376:2007/10/16(火) 11:52:00
実行すれば勝手にコンパイルはするんですけど・・・
384デフォルトの名無しさん:2007/10/16(火) 11:55:59
とりあえず言語がC++に変更されたということで
スレタイにもあるようにC++の宿題も全然おっけー
385デフォルトの名無しさん:2007/10/16(火) 12:50:20
C++ に書き換えようかと思ったけど、一度 C で書いた後でってのが
あほらしくなってきた・・・
誰か他の人よろしく。わしゃもう寝る。
386デフォルトの名無しさん:2007/10/16(火) 13:58:08
>>385 分かるわその気持ちw もつかれさん。
387368:2007/10/16(火) 13:58:25
>>372
おかげさまで間に合いました。
本当にありがとうございました。
388デフォルトの名無しさん:2007/10/16(火) 15:24:48
宿題
[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] その他の制限:

よろしくお願します。
389デフォルトの名無しさん:2007/10/16(火) 15:29:12
1をメモリこいれてから、2を一行ずつよんでメモリと比較しろ
390デフォルトの名無しさん:2007/10/16(火) 15:33:43
問1、キーボードから次々に整数を読み込んで足していき
   最後に入力された値の合計値を表示するプログラムを作成する
   ただし、入力データの終わりは負の数で示すものとする
   (例えば1,5、4、−1が入力された場合、『合計=10』と表示)
    ※
     ・入力された値が0以上であるかどうかをはじめて判定する前に
     最初の値を読み込んでいなくてはならない
     ・値を読み込む回数=判定する回数=加算回数+1

問2、 問1を拡張して、合計だけでなく平均も表示するプログラムの作成
    (例えば上の数の並びに対しては、『合計=10 平均=3』と表示


宜しくお願いします
391デフォルトの名無しさん:2007/10/16(火) 15:34:58
>>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] その他の制限:

二問ありますがよろしくお願します。
393デフォルトの名無しさん:2007/10/16(火) 15:40:29
>>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;
}
394デフォルトの名無しさん:2007/10/16(火) 15:43:40
平均はintじゃね?
395デフォルトの名無しさん:2007/10/16(火) 15:44:13
>>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;}
396デフォルトの名無しさん:2007/10/16(火) 16:08:04
>>392
LinuxでBCCっすかw
397390:2007/10/16(火) 16:15:51
問1、キーボードから次々に整数を読み込んで足していき
   最後に入力された値の合計値を表示するプログラムを作成する
   ただし、入力データの終わりは負の数で示すものとする
   (例えば1,5、4、−1が入力された場合、『合計=10』と表示)
    ※
     ・入力された値が0以上であるかどうかをはじめて判定する前に
     最初の値を読み込んでいなくてはならない
     ・値を読み込む回数=判定する回数=加算回数+1

問2、 問1を拡張して、合計だけでなく平均も表示するプログラムの作成
    (例えば上の数の並びに対しては、『合計=10 平均=3』と表示

すみません、emacsで使えるようできませんか?
398デフォルトの名無しさん:2007/10/16(火) 16:21:32
>>390
>1
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でいいです。
あとでかえるので。
401デフォルトの名無しさん:2007/10/16(火) 16:32:41
>>399
その「一応」をアップロードしたまえ。
402デフォルトの名無しさん:2007/10/16(火) 16:33:26
>>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
の値を出力するプログラムを作成せよ。
404デフォルトの名無しさん:2007/10/16(火) 16:35:54
>>388
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5083.txt
エラーチェックを全くしてないのでそのあたり突っ込まれそうなら適宜補完してください。
あと、1.txtと2.txtがc:\にあることになってるのでそこも変更してください。
405399: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++;
の部分が作用されてないっぽいです。よろしくお願いします。

406404:2007/10/16(火) 16:40:15
あ、行数指定されてたのね。
行数に関しては適当に#defineして現在6になってるところを置き換えたらいけるはず。
407デフォルトの名無しさん:2007/10/16(火) 16:47:15
>>405
>for(px=a; *px != '\0'; px++){
>for(i=0; a[i] != '\0'; i++){
何で二重ループしてるの?
pxへの代入が使われてないし、
これだとaの文字数分、内側のループを繰り返すと思うよ
試してないけど

ループは一重でおk
外側のループを消し去ってしまえ
408399:2007/10/16(火) 16:52:05
>>407
俺もそう思うんですけど、それだとポインタ使わないってことですよね?
実はその部分はヒントとして教授が提示してた部分なんですよ
だから無理やりにでも使わなきゃいけないのかなって・・・
409デフォルトの名無しさん:2007/10/16(火) 16:57:05
>>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;
}
410デフォルトの名無しさん:2007/10/16(火) 16:59:22
>>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桁を表示するようにしてます。
411デフォルトの名無しさん:2007/10/16(火) 17:05:43
>>408
それは、外側のループ部分だけ示された、ということ?
それなら内側のループ消して、処理部分のa[i]を*pxに変えればいいだけ

もし二つのループを両方示されたなら、
どちらかを使えという意味だと思うよ
412デフォルトの名無しさん:2007/10/16(火) 17:09:46
>>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
413399:2007/10/16(火) 17:14:41
>>411
示されたのは外側のループですね
言われたらなんとなくわかった気がするので、また試してみます
ありがとうございました。
>>409
ありがとうございます。
でも俺の知識の範疇を軽く越えてますね・・・ORZ
414デフォルトの名無しさん:2007/10/16(火) 17:19:39
a[i]=
415デフォルトの名無しさん:2007/10/16(火) 17:23:55
Rubyにしては冗長だな
416デフォルトの名無しさん:2007/10/16(火) 17:47:31
とりあえず>>403>>1を読むべきだと思うし、
>>412はスレタイを読むべきだと思うよ
417デフォルトの名無しさん:2007/10/16(火) 17:50:18
>>415
( ´∀`)つ puts (1..100).inject(0.0) { |sum, n| sum += if n <= 0 then 0.0 else 1.0 / n**2 end }
418デフォルトの名無しさん:2007/10/16(火) 17:51:04
もう止めます。スレ汚しごめんなさい。
419デフォルトの名無しさん:2007/10/16(火) 18:33:32
>>410
解答、ありがとうございました。

>>412
C言語でした。書き忘れて申し訳ないです。
420デフォルトの名無しさん:2007/10/16(火) 19:14:12
>>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);
}
421デフォルトの名無しさん:2007/10/16(火) 19:21:12
[1] 授業単元:C++実習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5084.txt
[3] 環境
 [3.1] OS: XP VISTA
 [3.2] visual studio 2005
 [3.3] 言語: C++
[4] 期限: 10/19 〜0:00
[5] その他の制限: 特になし

よろしくお願いします。
422420:2007/10/16(火) 20:14:01
*buffer!='\0'を
*buffer!='|0' || *buffer != ' '
とすればいけるかな問題文満たせるな…
423422: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
425デフォルトの名無しさん:2007/10/16(火) 22:07:39
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)の値が収束すればいい
426デフォルトの名無しさん:2007/10/16(火) 22:13:05
たとえば100回繰り返しても、誤差が縮まらないなら破棄して、次の値をチェックせよ

例えば、調べる値は、自然数 n に対して、( n/360 + 1 )( cos( nπ /360 ) + i * sin(nπ /360) )などにしたらどうだ
427デフォルトの名無しさん:2007/10/16(火) 22:49:32
>>420
・根本的に配列とポインタを混同している
・オーバーフロー懸念するならfgets使えよ
428デフォルトの名無しさん:2007/10/16(火) 22:58:37
今日までしらなかったが complex.hってどのコンパイラでもついてるの?
429デフォルトの名無しさん:2007/10/16(火) 23:13:06
C99
430428: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]制限
  特になし
どなたか、お願いいたします。
432428: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));}}}
433デフォルトの名無しさん:2007/10/17(水) 00:06:45
>>431
どんなグラフにすればいいの?
それが分かればやってみる。
434デフォルトの名無しさん:2007/10/17(水) 00:09:52
>>433
ヒストグラムで表示されるプログラムだと助かりますm(_ _)m
435デフォルトの名無しさん:2007/10/17(水) 00:17:42
ほとんどグラフを書く問題だな
436デフォルトの名無しさん:2007/10/17(水) 00:19:23
k[200]を用意して、値は0以上とする
k[0]が10なら-100のところに10個点をつける といったところだろう
437デフォルトの名無しさん:2007/10/17(水) 00:23:04
k[201]
438デフォルトの名無しさん:2007/10/17(水) 00:28:14
>>434
出力例を書いてくれると助かります。m(_ _)m
439デフォルトの名無しさん:2007/10/17(水) 00:30:11
たとえば、5点たまったら*を一つ上に伸ばすとかだろう こういう感じ

    *
    *
*   *   *
**  *** * *
440デフォルトの名無しさん:2007/10/17(水) 00:35:34
>>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)

こんな感じで
441デフォルトの名無しさん:2007/10/17(水) 00:39:03
だが初心者用のプログラムでマクロなんか使ったらどやされるううウウゥゥゥ!!!
442デフォルトの名無しさん:2007/10/17(水) 00:40:16
なんのためにconstあると思ってるんだ。
443デフォルトの名無しさん:2007/10/17(水) 00:40:53
>>438
すいません、本当にCについて無知でして・・・。というか、出力例という言葉が分からない感じでして。
一応、グラフについてはどんな形でもいいと言われました。
なので、実行した下に表示される形でも、エクセルに数値が出される形でも何でもいいです
m(_ _)m

444デフォルトの名無しさん:2007/10/17(水) 00:42:11
>>424
初期値 z = x + i*y を入力する形で作れませんか?
445デフォルトの名無しさん:2007/10/17(水) 00:44:38
>>439みたいなヤツで本当にいいのか、
それとも90°曲げて右に伸びるタイプが良かったのか、
目盛や軸をつける必要があるのかないのか、
とか、そういう部分のことだ。

何でもいいということが分かったので>>439風にする。
446デフォルトの名無しさん:2007/10/17(水) 00:47:30
>>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の形で
縦軸と横軸に簡単な目盛りがついていれば助かります
目盛りはいりません
本当にすみません
448デフォルトの名無しさん:2007/10/17(水) 00:50:34
>>447
>縦軸と横軸に簡単な目盛りがついていれば助かります
>目盛りはいりません

どっちだよ。

今ヨーグルト喰ってるから、ちょっと待っててね。
449デフォルトの名無しさん:2007/10/17(水) 00:51:29
>>442
ごめん、何のためにあるんだ?
俺は配列定数作りたい時にしか使ってないのだが……
450デフォルトの名無しさん:2007/10/17(水) 00:59:23
>>448
申し訳ございませんm(_ _)m
451デフォルトの名無しさん:2007/10/17(水) 01:00:29
あれ? const てANSI時代からあったっけ?素で忘れた。
いや C++ から逆輸入かな?と思ったんだけどね。
452デフォルトの名無しさん:2007/10/17(水) 01:00:47
>>450
ちょ
453451:2007/10/17(水) 01:05:14
すまん、ANSIはあった気がしてきた。 少なくとも const char *str みたいのはよく書いてたな。
454デフォルトの名無しさん:2007/10/17(水) 01:16:00
[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
とりあえず、今からレポート作ってきます。本当に助かりました。
ありがとうございました。
456デフォルトの名無しさん:2007/10/17(水) 01:22:32
>>454
3番目じゃなくて2番目?
457デフォルトの名無しさん:2007/10/17(水) 01:25:09
>>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;
}
458デフォルトの名無しさん:2007/10/17(水) 01:28:08
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;
}
459デフォルトの名無しさん:2007/10/17(水) 01:41:14
左から二番目の矢印、つまり三番目へのポインタ。
ってことじゃない?
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] その他の制限:特に無し

わかる方、是非教えてください(><)
461デフォルトの名無しさん:2007/10/17(水) 05:27:21
>>460
1.与えられた点を与えられた順序で繋いでいく
2.与えられた点を凸包になるように繋いでいく
どっち?

※2.の場合には例であげられた点(-40,0)を通らない
462デフォルトの名無しさん:2007/10/17(水) 07:18:55
1.だろうな。
ただ、2.の方が実装は楽しそう。
463399: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
途中で支離滅裂なことばっかりいってすみません。
最後まで面倒みていただき、ありがとうございました。
465デフォルトの名無しさん:2007/10/17(水) 08:27:12
>if(*px = isdigit(*px))
466デフォルトの名無しさん:2007/10/17(水) 08:56:30
467デフォルトの名無しさん:2007/10/17(水) 09:30:21
460の者です。

>461さん
全ての点を含めた多角形なので1だと思われます(^O^)
468デフォルトの名無しさん:2007/10/17(水) 09:36:42
460の者です。

>466さん
プログラミング初心者なので規格とかわからないのですが、
とりあえずはプログラムが実行出来て答えが導き出せれば良いとのことです。
これがそのプログラムですか?参考にします☆
ありがとうございます!!
469デフォルトの名無しさん:2007/10/17(水) 09:38:14
>>399
ループが終わった後に文字列表示してみればわかるんじゃないかな
470466:2007/10/17(水) 10:07:13
acon周りがうまくいってないな
471デフォルトの名無しさん:2007/10/17(水) 10:34:18
>>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;
}
472471:2007/10/17(水) 10:37:38
>>471
ごめ、途中送信です
473466:2007/10/17(水) 10:43:13
すみません。
内積じゃ無理ですね。
474471: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;
}
475デフォルトの名無しさん:2007/10/17(水) 10:56:54
>>473 の頂点座標は書き換えておいて下さい
476デフォルトの名無しさん:2007/10/17(水) 10:57:45
>>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}};
477デフォルトの名無しさん:2007/10/17(水) 11:16:05
>>474 は根本的に間違ってた
478デフォルトの名無しさん:2007/10/17(水) 11:58:27
一番y座標が大きい点を始点として、右回りに角度がもっとも0度に近いものを結んでいくといい
479デフォルトの名無しさん:2007/10/17(水) 12:30:36
>>478
どの問題の答えかは知らないが解いたものうp!
新たな宿題なら>>1の質問テンプレを読んで書きなおし
480デフォルトの名無しさん:2007/10/17(水) 12:48:55
n点与えられたときにもっとも面積が大きくなる結び方は?
481デフォルトの名無しさん:2007/10/17(水) 12:53:09
>>480
何の話だ?必要な情報が無い
482デフォルトの名無しさん:2007/10/17(水) 13:02:06
この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();}
}
483デフォルトの名無しさん:2007/10/17(水) 13:06:39
>>482
RAND_MAX*RAND_MAX
484デフォルトの名無しさん:2007/10/17(水) 13:11:23
全部をちゃんと結ぶんだよ? あと0から1000までの内部に全ての点があれば、1000*1000以下だよ
485デフォルトの名無しさん:2007/10/17(水) 13:12:14
>>483
点の結び方で異なる面積になるから、そのうち最大のやつを求めてくれって事
486454:2007/10/17(水) 13:40:23
>>456
すいません、うまく説明できてなくて。

>>459
はい、そういう事です。

よろしくお願いします。
487デフォルトの名無しさん:2007/10/17(水) 13:54:45
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;
}
488デフォルトの名無しさん:2007/10/17(水) 14:28:36
489デフォルトの名無しさん:2007/10/17(水) 14:50:40
>>484
小学生にでも言い聞かせてるつもりか?
分かってるなら自分で解けばいいだろ
490デフォルトの名無しさん:2007/10/17(水) 19:00:27
[1] 授業単元:データ構造とアルゴリズム1
[2] 問題文(含コード&リンク):宿題1で作ったプログラムを以下のデータに
  対応できるように変更及び拡張せよ。
  成績データとしてホームページから seiseki2.txtをダウンロードせよ。
  変更するプログラム:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5088.txt
  seiseki2.txt:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5089.txt
[3] 環境
 [3.1] OS:win xp
 [3.2] Microsoft Visual Studio .NET 2003
 [3.3] 言語:c++
[4] 期限:2007年10月19日9:30まで
[5] その他の制限:(どこまで習っているか)構造体、ファイル処理まで


よろしくお願いします。
491490:2007/10/17(水) 19:02:43
>>490
「以下のデータ」:
学生数: 10人 → 30人
科目数: 2 → 5
(数学、生物学、地学、英語、国語)
平均に基づいて成績をつけよ。
S: 90以上
A: 80 < 点数の平均 < 90
B: 70 < 点数の平均 < 80
C: 60 < 点数の平均 < 70
D: 60未満

抜けてました。すみません。よろしくお願いします。
492デフォルトの名無しさん:2007/10/17(水) 19:35:05
>>490
えっと・・・どこがわからないんですか?
493デフォルトの名無しさん:2007/10/17(水) 20:54:11
>>482
rand()の実装依存。
494デフォルトの名無しさん:2007/10/17(水) 21:28:42
>>493
randに依存するけど、同じ値なら同じ出力するプログラムがいいんで巣が
495デフォルトの名無しさん:2007/10/17(水) 22:21:49
>>494
>>488 はダメだった?
496デフォルトの名無しさん:2007/10/17(水) 22:39:34
>>421 お願います
497デフォルトの名無しさん:2007/10/17(水) 22:47:15
[1] 授業単元:
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5090.txt
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 10月19日10:00まで
[5] その他の制限: 特になし
よろしくお願いします
498466: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;
}
499466:2007/10/18(木) 00:25:25
逆か……
だめぽ
500デフォルトの名無しさん:2007/10/18(木) 01:08:19
[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] その他の制限:特になし

よろくお願いします><
501デフォルトの名無しさん:2007/10/18(木) 01:09:32
>>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;
}
502454:2007/10/18(木) 01:31:16
>>487
解答ありがとうございます。
でも、それだと、指定された構造体へのポインターを返してないですか?
つまり、
□→□→□→□→□
とすると、指定された構造体が左から4番目としたら、左から3番目の
*ne(左から4番目へのポインター)を返してないですか?
指定された構造体の前の構造体へのポインターを返すと言う問題なので
左から2番目の*ne(左から3番目へのポインター)を返すことになります。
503デフォルトの名無しさん:2007/10/18(木) 01:35:34
構造体とポインタの順番を別個に考えるのはやめろ。
そういう風に考えてるから、きちんと理解できないんだ
504デフォルトの名無しさん:2007/10/18(木) 01:53:41
>>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」に等しいわけだから、問題無いと思う。
505454: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関数の中をうまくプログラムできません。よろしくお願いします。
507デフォルトの名無しさん:2007/10/18(木) 02:36:57
>>505
そう。
「指定された構造体(3)の前の構造体(2)へのポインター(*2==1.ne)を返す関数pre」
で問題無いと思うが
508454:2007/10/18(木) 02:51:16
>>507
落ち着いて、>>504さんの図と例を使って、紙にプログラムの動作を
一つ一つ書きながら、確認していったら、納得できました。
確かに合ってます。
ありがとうございました。

>>487
せっかく解答下さって、合ってたのに間違ってるとか言って
申し訳ないです。
509デフォルトの名無しさん:2007/10/18(木) 02:54:56
>>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;}
510デフォルトの名無しさん:2007/10/18(木) 03:02:43
>>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;}
511デフォルトの名無しさん:2007/10/18(木) 03:21:02
for(i=0; i<s; i++) {m=digits[i]; dec = dec * n + (m<64 ? m-48 : m-55)}
512デフォルトの名無しさん:2007/10/18(木) 08:34:48
497もよろしくお願いします
513デフォルトの名無しさん:2007/10/18(木) 08:47:23
#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;}
514デフォルトの名無しさん:2007/10/18(木) 09:08:33
>>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);
}
}
515デフォルトの名無しさん:2007/10/18(木) 09:08:48
#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");}
516デフォルトの名無しさん:2007/10/18(木) 10:40:29
[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
同じ文字が無いときを最初に書こうとしてますが、何故か無限ループになります…
517デフォルトの名無しさん:2007/10/18(木) 11:56:24
検索先文字列 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;}
}
518デフォルトの名無しさん:2007/10/18(木) 12:10:59
10M程度のバイナリファイルから
一致するビット列の全てのアドレスを求めるプログラムを作る
ただし、検索する文字列は1バイト単位とする

もっとも速く計算するものを作る
519デフォルトの名無しさん:2007/10/18(木) 12:11:52
>>516

Cの文字列は添え字0からなので
if(strg[length1]==ex[length1+i])

if(strg[length1-1]==ex[length1+i-1])
にしないとstrncmpが失敗します。
520デフォルトの名無しさん:2007/10/18(木) 12:13:45
よく見ろ
521デフォルトの名無しさん:2007/10/18(木) 12:20:40
>>519
それ以前に改行文字を取り除いてない
522デフォルトの名無しさん:2007/10/18(木) 12:23:18
バイナリファイルだと一度のどのくらい読み込むのがいいですかね?
523デフォルトの名無しさん:2007/10/18(木) 12:24:09
ファイルの読み込みと探索を同時にやるといいですかね?
524デフォルトの名無しさん:2007/10/18(木) 12:33:29
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5093.txt
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン: Dos窓c
 [3.3] 言語: C言語
[4] 期限: ([2007年10月19日まで]
[5] その他の制限:特になし

よろしくお願いします。
525519:2007/10/18(木) 12:41:25
>>521

fgetsで読み込んでるから改行文字は変更されている。
そこは問題なかった…

for(j=length1-1;j>0;j--)
if(strg[j]==ex[length1+i]) i+=length1-j;
if(j==0 && strg[j]!=ex[length1+i]) i+=length1;
ここもいろいろおかしい
その一、始めのif文だけどi操作してbreakしないといけないのでは?
その二、二つ目のifだがここに書いちゃいけないだろ

ちなみにこうしたら一応動いた検索文字列に文字重複あるとダメだが…。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5094.txt

実行環境 Win98SE BCC5.5.1 Pen3
526デフォルトの名無しさん:2007/10/18(木) 12:49:50
>>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;}
527デフォルトの名無しさん:2007/10/18(木) 14:09:03
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);}
528デフォルトの名無しさん:2007/10/18(木) 14:10:31
searchだろうに
529527:2007/10/18(木) 14:12:50
検索元のサイズが不明だと不便なので、Nはグローバルの定義にしても可にします
530デフォルトの名無しさん:2007/10/18(木) 14:19:07
>>527
コードが汚い
531デフォルトの名無しさん:2007/10/18(木) 14:20:38
>FILE *fp=fopen("2ch.txt","rb");while(fread( &x[N],1,1,fp))N++;fclose(fp);
これは恥ずかしい。よくこれだけの突っ込みどころをたった一行に埋め込めたもんだ。
532527:2007/10/18(木) 14:21:38
どこが汚いんだよ ほとんど何もしないところしか書いてないぞ だったらserchを綺麗にかいてくれよ
533デフォルトの名無しさん:2007/10/18(木) 14:23:21
ファイルあまり扱わないから知らないんだけど、
文字列検索なのにバイナリでファイル読み込むと何か利点あるの?
534デフォルトの名無しさん:2007/10/18(木) 14:24:32
いちどに256バイトとか読み込むと、末端でNにいくつ加えるか変数をひとつ用意しなくてはなら無くなる
535デフォルトの名無しさん:2007/10/18(木) 14:25:06
>>532
汚いと全く思わないのか?
汚いの承知で手を抜いただけかと思った
536デフォルトの名無しさん:2007/10/18(木) 14:25:57
個人的にNは小文字じゃないと解りずらい
537デフォルトの名無しさん:2007/10/18(木) 14:26:32
>>533
一応、バイナリファイルの検索もできるようにする為 一行ずつよんでxに格納していいけどそちらのほうがちょっと長くなるな
538デフォルトの名無しさん:2007/10/18(木) 14:29:07
c=clock();
serch(); serch();
c=clock()-c;

の部分が何秒で戻ってくるかだけわかればいい あとのコードは気にしないように
539デフォルトの名無しさん:2007/10/18(木) 14:31:14
[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] その他の制限:特になし
540デフォルトの名無しさん:2007/10/18(木) 14:32:38
>while(fread( &x[N],1,1,fp))N++;
これとほぼ等価なコード。
--
N = fread(x, 1, N, fp);
--
それにしても、変数の使い回しや大文字の使用は気持ち悪い。
541デフォルトの名無しさん:2007/10/18(木) 14:40:37
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';
542デフォルトの名無しさん:2007/10/18(木) 14:41:21
いちどに数十メガ読み込むと動作おかしくならない? せいぜい1Kくらいのほうが
543デフォルトの名無しさん:2007/10/18(木) 14:47:27
とりあえず、勉強にもなるので>>527
serch関数の部分うpしてくれ。
544527:2007/10/18(木) 14:49:54
>>543
勝負に不公平がないようにうpした時点では何も作っていない もう少しで出来るとおもう
545デフォルトの名無しさん:2007/10/18(木) 14:50:16
>>527

printf("検索にかかった時間は %f7.3 秒です\n",(double)c/CLOCKS_PER_SEC);
にしないとちゃんと秒表示されないと思う…。
546527: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);}
547527:2007/10/18(木) 14:59:09
うpしたよ
ノンアルコールは2つ、冷蔵庫に物を沢山詰め込んでいるんですは1つあるんだけど・・・番地はあってるかな?
548527:2007/10/18(木) 15:12:46
おまいら対戦相手が出てこない・・・
549デフォルトの名無しさん:2007/10/18(木) 15:17:28
>>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が格納されます。
550527:2007/10/18(木) 16:43:51
いまいちもりあがらいなあ そしたら、Cドライブの中にある重複ファイルを検索してみるか?
ファイルの先頭64KBくらいを読み込んで、ハッシュ(CRC、MD5など) を計算してそれが一致したら詳しく調べるようにするといいと思う
一度計算したらデータベースに蓄えておき次回の検索時に使用する するとDVDなどにも対応できる
551デフォルトの名無しさん:2007/10/18(木) 17:03:35
// >>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;
}
552デフォルトの名無しさん:2007/10/18(木) 17:04:02
>>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;

}
553デフォルトの名無しさん:2007/10/18(木) 17:15:58
>>421
内容が濃い課題ですが・・・お願いします。
554デフォルトの名無しさん:2007/10/18(木) 17:40:22
>>550
このへんで や ら な い か ?

君ならどう書く? in 厶板
ttp://pc11.2ch.net/test/read.cgi/tech/1169104637/
555デフォルトの名無しさん:2007/10/18(木) 17:48:17
>>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箇所、分かりません。お願いします。
557デフォルトの名無しさん:2007/10/18(木) 19:02:34
>>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)!='.'){
の時点で何かおかしい
558デフォルトの名無しさん:2007/10/18(木) 19:18:59
>>554
既にない模様。

>>551
OldXeonで0.05秒。timeコマンドで測っても(キャッシュヒットしちゃえば)0.1秒程度。

>>527
こんな数字じゃ、工夫するのも虚しいね。
559デフォルトの名無しさん:2007/10/18(木) 19:40:16
文字列探索は、工夫の余地のない分野のようだ 面白みはないようだ
560デフォルトの名無しさん:2007/10/18(木) 19:57:29
>>557
解決しました。ありがとうございました。
561デフォルトの名無しさん:2007/10/18(木) 21:09:22
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)・・・・・・・・・
っていう風にしたいのですが、どこが間違っていますでしょうか?
562デフォルトの名無しさん:2007/10/18(木) 21:31:46
>>561
色々おかしい気がする。

breakでwhile(1){}しか抜けれないから、
ファイルの読み込みが終わるまでwhile(eof(fp)){}から抜けない。
その後fpをfseekもオープンし直しもして無いから、ずっとeofの位置に行ってる。
なので、forの2週目からwhile(eof(fp)){}のループに入らない。

あと、breakの位置とか。ifの中じゃね?

動作確認してるわけじゃないから、勘違いだったらスマン
563デフォルトの名無しさん:2007/10/18(木) 21:33:26
>>562の「while(eof(fp)){}」は「while(!feof(fp)){}」の間違い。
何書いてんだ俺・・・
564デフォルトの名無しさん:2007/10/18(木) 21:34:57
>>561
何をやりたいかよく分からないけど、
文字が'('で無い時に繰り返す仕様になってないからでは?
565564:2007/10/18(木) 21:36:47
あ、違うな、見間違い
>>562-563さんの言う通りだと思います
566デフォルトの名無しさん:2007/10/18(木) 23:39:57
>>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;
    }
}
567デフォルトの名無しさん:2007/10/19(金) 00:03:20
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5096.txt
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:明日まで
[5] その他の制限:特にありません

よろしくお願いします
568デフォルトの名無しさん:2007/10/19(金) 00:09:19
*tableをtable[256]に直しても負けるな
569566:2007/10/19(金) 00:35:47
上手くいってない……。
吐きそう。
570デフォルトの名無しさん:2007/10/19(金) 00:51:42
>>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
571デフォルトの名無しさん:2007/10/19(金) 01:00:16
ポイント、て。
572デフォルトの名無しさん:2007/10/19(金) 01:21:29
>>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;
}
573566: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;
    }
}
574デフォルトの名無しさん:2007/10/19(金) 02:10:58
[1] 授業単元:プログラミング(データ構造)
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5097.txt
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:10/25まで
[5] その他の制限:(必須)と追記されているものは必ずやらなければならない問題なので、可能ならばこちらを優先的にお願いします
575デフォルトの名無しさん:2007/10/19(金) 02:20:12
>>421
10月19日の〜0:00って、もう過ぎたってこと?
それとも本日が終了するまで?
576516:2007/10/19(金) 02:23:42
>>525 こんな風に書いたら,2文字重複までならできるようになりました。
ありがとうございました!!
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5098.c
577デフォルトの名無しさん:2007/10/19(金) 02:31:32
>>574
>複数の行を1行ずつ文字列の配列に読み込み
>ただし,1行ごとの文字列の長さの制限を行なわないようにすること.
額面どおり受け取ると書けない。fgets()まわすのが妥当っぽいけど厳密には1行ずつ読み込まない。
だいたい最初の問題が一番面倒ってのもおかしいよな。。。ヒントもねえし。
必須じゃないからいいのかな。
578566: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;
}
579566:2007/10/19(金) 02:35:05
0.011の間違いでした。
580デフォルトの名無しさん:2007/10/19(金) 02:35:45
460の者です☆
親切にお答えくださった方、本当にありがとうございました!^^
無事に課題提出できました♪
581566:2007/10/19(金) 02:37:32
×*adr = -1;
○*q = -1;
582デフォルトの名無しさん:2007/10/19(金) 02:43:59
>>566
いい加減にしてとっとと失せろ
583デフォルトの名無しさん:2007/10/19(金) 02:46:30
すみませんでした。
584527:2007/10/19(金) 02:58:00
>>566さん、測定方法をかえました あまりに時間が短すぎる為
あと>>578なんですけどうごきませんでしたよ

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5100.txt
585デフォルトの名無しさん:2007/10/19(金) 03:05:43
>>577
gccでバージョンの規程が無くて制限も無いから、どうにでもなるべ。

ファイルをオープンした後にgetcを使って最大の行の長さと行数をチェック。
その数値を利用してメモリ確保。
ファイルを先頭から読み直してfgetsなり何なりで読めばいい。

メモリ確保はCならmallocで確保したchar *の配列でも文字列の配列と言えるだろうし、
行数の制限については記述が無い。
気に入らなきゃC99で動的なサイズの配列でも宣言すりゃいい。
586デフォルトの名無しさん:2007/10/19(金) 11:37:49
自分でも考えてみていますが間に合うかどうか分からないため質問させていただきます。

[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触れていてもほんの少しなため、
なるべく構造体・ポインタを使わないで済むようにしていただきたいです。
期限が短くてすみませんがよろしくお願いします。
587デフォルトの名無しさん:2007/10/19(金) 11:42:41
>>586
Microsoft .NET Framework SDK なんてコンパイラない
588デフォルトの名無しさん:2007/10/19(金) 11:56:58
どう書けばよかったのか分からなかったのでそう書きました。すみません
コマンドプロンプトでcl ○○.cでコンパイルして○○.exeで実行する形です
なるべく学内のPCでコンパイルした方がいいため、gccでコンパイルできれば大丈夫です
589デフォルトの名無しさん:2007/10/19(金) 12:18:50
>> 586

とりあえず1のほう 動作確認はしていないが

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5103.txt
590デフォルトの名無しさん:2007/10/19(金) 12:54:17
>>586

問い2はこんなかんじでしょう… やはり動作未確認…

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5104.txt
591デフォルトの名無しさん:2007/10/19(金) 13:30:01
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
カレントディレクトリで作業しているときに
そのディレクトリにdataというディレクトリを作って、
そのディレクトリの中身に何があるか知りたい。
そこでその中身をファイルlist.txtに書き出せ。


[3] 環境
 [3.1] OS: LINUX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 10/19 17:00
[5] その他の制限:
592デフォルトの名無しさん:2007/10/19(金) 13:38:15
>>591
#include<stdio.h>
#include<stdlib.h>
int main(void){
system("md data");
system("dir data>list.txt");
return 0;
}
593デフォルトの名無しさん:2007/10/19(金) 14:33:12
>>562-565 ありがとうございます、参考にします
594デフォルトの名無しさん:2007/10/19(金) 14:34:26
>>592

UNIX だから dir じゃなくて ls では?
たぶん課題内容は ./data のディレクトリ内のファイル一覧だから
md data は必要ないとおもいます。
課題文が分りづらいだからだけど…
595594:2007/10/19(金) 14:36:56
間違い

誤 UNIX
正 LINUX

UNIX系と打ったつもりだった…
LINUXとUNIXは違うけどコマンドはおおかた同じだったと…
596591: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] 条件はないです

お願いします
598デフォルトの名無しさん:2007/10/19(金) 16:52:22
#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
ありがとうございます。期限がむちゃだったのにやっていただいて感謝します。
600デフォルトの名無しさん:2007/10/19(金) 20:57:46
>>594
イマサラだけど、Linuxにもdirコマンドあるよ。
/usr/binだった気がするから、インストールしてないと入ってないかも知れない。
601デフォルトの名無しさん:2007/10/19(金) 21:31:22
>>600

必ずあるとはいえないということですね…分りました。
602デフォルトの名無しさん:2007/10/20(土) 00:02:17
>>598
doubleか…。いや、>>597が納得しているならいいんだけどさ…。
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までです。

今まで考えたのですけど、どうも分かりませんでした・・・
どなたかお願いします。
604デフォルトの名無しさん:2007/10/20(土) 00:48:47
>>575
返事遅れました
本日までです。 から40分過ぎましたが
提出期限までは少し余裕があるので大丈夫です
明日の夜10:00までは
605デフォルトの名無しさん:2007/10/20(土) 00:49:31
>>574
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5105.zip
めぼしいのをいくつかやっといた
ファイル名が一部適当だけど、必須課題は"address.c"と"22.c"ね
"addline.c"が行番号付加のやつ。他は分かると思う。
22.cはaddline.cでデータを作成してから試してね。

あと、へったな英語を表示するので嫌だったら直しておいてw
606デフォルトの名無しさん:2007/10/20(土) 00:51:21
>>604
返事ないからもう期限過ぎたのかと思ってやってなかったw
時間あったらやっておく……
607デフォルトの名無しさん:2007/10/20(土) 01:12:30
>>606
ありがとうございます。
返事遅れて本当申し訳ない
608デフォルトの名無しさん:2007/10/20(土) 01:40:59
609605:2007/10/20(土) 02:03:31
typeった
分かると思うけど>>605の「22.cはaddline.cでデータを作成してから」は「address.cでデータを〜」の間違いです
お詫びして訂正申し上げます

>>608
どもです
610605:2007/10/20(土) 02:19:38
あーtypeったって何だよtypoだtypo
スレ汚しスマソ
611デフォルトの名無しさん:2007/10/20(土) 02:47:07
>>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);
}
612デフォルトの名無しさん:2007/10/20(土) 02:48:54
>>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;
}
}
}
素数判定はエラトステネスのふるいでやってます。
613デフォルトの名無しさん:2007/10/20(土) 02:50:26
>>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);
}
614603です:2007/10/20(土) 11:26:26
611さん、ありがとうございます。
とても助かりました。本当にありがとうございました。感謝しています。
615デフォルトの名無しさん:2007/10/20(土) 13:27:16
さーて今からUnicode -> EUC-JPの変換プログラム書くぞ〜
これだからC++ってやめられないよね!



なんでこんなもん作らないといかんのだ・・・orz
616デフォルトの名無しさん:2007/10/20(土) 14:00:40
>>615
日本人の集団が作った有名なやつがある それつかえよ
ntfとかだったような
617デフォルトの名無しさん:2007/10/20(土) 14:15:38
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
623デフォルトの名無しさん:2007/10/20(土) 16:20:44
>>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));}}}
624デフォルトの名無しさん:2007/10/20(土) 16:25:12
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];}
とやるってこと?
625デフォルトの名無しさん:2007/10/20(土) 17:14:39
[1] 授業単元: C言語プログラミング
[2] 問題文:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5111.txt
[3] 環境
 [3.1] OS:XP
 [3.2] コンパイラ名とバージョン: Borland C++Compiler
 [3.3] 言語: C/C++
[4] 期限:2007/10/21
[5] 途中までソース作りました。よろしくお願いします。
626デフォルトの名無しさん:2007/10/20(土) 17:47:53
>>622
買い物いってきて戻ってきたらつくってやるよ
627デフォルトの名無しさん:2007/10/20(土) 17:51:39
628デフォルトの名無しさん:2007/10/20(土) 18:15:15
多項式をint型配列で表して、複素数値の代入、微分を出来るようにすればよい
629デフォルトの名無しさん:2007/10/20(土) 18:47:04
>>627
早速ありがとうございました!!!!1
630606:2007/10/20(土) 19:02:51
>>607
ごめんやっぱ無理ぽ
忙しい

誰か頼んだ
631デフォルトの名無しさん:2007/10/20(土) 21:19:17
ユーザクラスとマスクラスを作ってどうするのかわからん
コンソールか、GUIなのかわからん
VisualStudioって書いてあるが、どこまでOKなんだろう
.NETのクラス群使ってもいいのか、gcnewもありなのか
632デフォルトの名無しさん:2007/10/20(土) 22:43:07
>>624
はい、その通りです。できれば、よろしくお願いします。
633デフォルトの名無しさん:2007/10/20(土) 22:51:55
>>623
うごきませんでした
634デフォルトの名無しさん:2007/10/20(土) 22:57:59
いまコピペしてみたけど動いたぞ
どうして動かないのか(エラーが出てコンパイルが出来なかった等)書かないと
誰も相手にしてくれないと思う
635デフォルトの名無しさん:2007/10/20(土) 23:18:49
>>623ってC++じゃね?
636デフォルトの名無しさん:2007/10/20(土) 23:27:20
>>622まで読んでないからC++の宿題かと思ってた
637デフォルトの名無しさん:2007/10/21(日) 00:13:55
そういえばこのスレってC++の宿題少ないよな
あってもclass使わなかったりとかで、OOPっぽくないし
638デフォルトの名無しさん:2007/10/21(日) 02:19:02
[1] 授業単元:アルゴリズム基礎
[2] 問題文(含コード&リンク):
以下の要素と条件を用いてキューをC言語で作成せよ

キューを表す配列Q
キューの左端を表す変数1eft
キューの右端を表す変数right
キューに含まれるデータの数 size
関数enqueue,dequeue

配列のすべての要素にデータがあってもオーバフローとしない
配列のすべての要素にデータがある際にenqueue要求があった場合にオーバフローとする

[3] 環境
 [3.1] OS:XP
 [3.2] VisualStudio2005
 [3.3] 言語: C++
[4] 期限: 22日
[5] その他の制限:これといってなし

よろしくお願いします!
639デフォルトの名無しさん:2007/10/21(日) 02:45:51
言語にC++とあってC言語で作成せよとはこれいかに
あと変数名の最初の文字に数字は使えない
>キューの左端を表す変数1eft
_1eftなどアンダーバーを挿入するなどの回避策をとる必要がある
640638:2007/10/21(日) 02:59:06
>>639さん、指摘ありがとうございます。すいません、問題文を訂正させてくださいm(_ _)m
[2] 問題文(含コード&リンク):
以下の要素と条件を用いてキューをC言語(←C++でお願いします><)で作成せよ

キューを表す配列Q
キューの左端を表す変数left ←1eftからleftに変えさせていただきました><
キューの右端を表す変数right
キューに含まれるデータの数 size
関数enqueue,dequeue

配列のすべての要素にデータがあってもオーバフローとしない
配列のすべての要素にデータがある際にenqueue要求があった場合にオーバフローとする

改めてよろしくお願いします
641デフォルトの名無しさん:2007/10/21(日) 03:22:45
STLは……
642デフォルトの名無しさん:2007/10/21(日) 04:28:11
>>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;
    }
};
643デフォルトの名無しさん:2007/10/21(日) 11:54:16
>>421
@
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5112.txt
C++の入門書を読んでクラスの基本的な作り方覚えただけの人間が作ったものなのでちと汚いです。
マスの効果をクラスに含めるともう少しスマートになると思います。
644デフォルトの名無しさん:2007/10/21(日) 13:28:06
>>643
リンク間違えてるぞ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5115.txt

あとiventに噴いた
eventね
645デフォルトの名無しさん:2007/10/21(日) 13:31:59
>>644
素で間違ってた。サンクス。
寝ぼけた頭で変数名とかつけてたからなー。お恥ずかしい限り。
646574:2007/10/21(日) 14:48:52
>>605
>>608
ありがとうございます
ファイル操作があまり良く分かっていないので、課題に苦戦していました
お礼レスが遅くなってしまい、申し訳ないです
647デフォルトの名無しさん:2007/10/21(日) 14:51:48
>>645 ありがとうございます
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字づつ変換するプログラムを作ってみたものの足し算の段階で詰まってしまいました
最初から考え直す為にもヒントを頂けると嬉しいです
649デフォルトの名無しさん:2007/10/21(日) 15:39:49
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;
}
650デフォルトの名無しさん:2007/10/21(日) 15:42:20
>>649
逆じゃね?
651デフォルトの名無しさん:2007/10/21(日) 15:47:46
なにが?
652デフォルトの名無しさん:2007/10/21(日) 15:54:09
>>651
走査する向きが
653デフォルトの名無しさん:2007/10/21(日) 15:56:10
>>652
確認はしましたか?
654デフォルトの名無しさん:2007/10/21(日) 15:57:23
>>652
お前の頭の向きが逆じゃね?
655デフォルトの名無しさん:2007/10/21(日) 15:58:07
符号おkな atoi() の模範解答はおれも知りたい。
656デフォルトの名無しさん:2007/10/21(日) 16:01:02
首吊ってくる
657デフォルトの名無しさん:2007/10/21(日) 16:03:02
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;
}
660659: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;
}
662デフォルトの名無しさん:2007/10/21(日) 16:11:01
void str_conn(char str1[], char str2[])
{
while(*str1) str1++;
while(*str1++=*str2++);
}
663デフォルトの名無しさん:2007/10/21(日) 16:12:22
せっかくだから、'+'も見て下さいよ。
664デフォルトの名無しさん:2007/10/21(日) 16:14:59
>>660
まだおかしい
665660: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;
}
666デフォルトの名無しさん:2007/10/21(日) 16:25:47
>>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を使って-や小数の値も計算できるように改良せよと問題がありますが
これを弄ればこちらの問題も可能でしょうか?
668デフォルトの名無しさん:2007/10/21(日) 16:47:40
-は上にあるの参考にすればいいし、少数は.の前後で分けて考えればいいだけ。
649がちゃんと理解できればそんなに難しい問題じゃない。
669デフォルトの名無しさん:2007/10/21(日) 16:49:07
>>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.
670デフォルトの名無しさん:2007/10/21(日) 16:53:23
つまらん
671デフォルトの名無しさん:2007/10/21(日) 16:59:17
自分が英語読めないからって、他人もそうだと思う神経がわからんな。
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等しか習ってない段階です=)
673デフォルトの名無しさん:2007/10/21(日) 19:14:39
>>672
授業単元が書けないなら大学生辞めた方がいいよ
金の無駄
674デフォルトの名無しさん:2007/10/21(日) 19:19:53
>>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;
}
675デフォルトの名無しさん:2007/10/21(日) 19:27:41
>>674
問題文に忠実にするなら
関数名は omiyage
引数は 1 つで型は int
剰余を求めるのは omiyage の中

あと、scanf の書式指定が違う
676674:2007/10/21(日) 19:56:13
>>675,672

関数名と引数について
例に書いてあるだけだから制約とは思えないのですが?
僕の読み方が悪いのでしょうか?

剰余を求める部分について
これも「結果を表示する部分は、main関数とは別に作りなさい」とあり、
剰余した値がおみくじの結果だと思ったのですが?

%dだと負数も受け付けてしまいますね %u が正しかったです。

あと m=0 でエラーがでます。
m = (int)rand();

while(!(m = (unsigned int)rand()));
に訂正
677デフォルトの名無しさん:2007/10/21(日) 20:01:05
>>676
すみません >>675 は気にしないで下さい
678デフォルトの名無しさん:2007/10/21(日) 20:17:37
>問題文に忠実に
#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;}

こうですか?
分かりません><
679678:2007/10/21(日) 20:19:00
あ、やべ、剰余を求める場所間違えた
変数名間違えてるしorz
680デフォルトの名無しさん:2007/10/21(日) 20:28:20
>>678

a/(sizeof(table)/sizeor(int)) は a/(sizeof(table)%sizeor(int))
ですね
n=1になったら大吉と吉しか出ないw
まぁ自分もn=1なら大吉と大凶しか出ませんが…
681680: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))
682デフォルトの名無しさん:2007/10/21(日) 20:37:03
>>681
訂正サンクス
しかしsizeor……

携帯から書くもんじゃないな
683デフォルトの名無しさん:2007/10/21(日) 20:37:36
×sizeor
○sizeof
684デフォルトの名無しさん:2007/10/21(日) 20:55:38
誰かエスパー呼んでこい
685デフォルトの名無しさん:2007/10/21(日) 21:02:41
>>684
よんだか?
686デフォルトの名無しさん:2007/10/21(日) 21:04:35
【質問テンプレ】
[1] 授業単元:ファイル処理
[2] 問題文(含コード&リンク):
3×3行列のデータをファイルから読み込み、その行列を計算して画面に出力せよ。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C言語だと思います=
[4] 期限: なし
[5] その他の制限:
687デフォルトの名無しさん:2007/10/21(日) 21:05:50
自分が何を習ってるかくらいちゃんと把握しろよ
そして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文を使用でお願いします。その他は特に難しい文を使わないはずです。
689デフォルトの名無しさん:2007/10/21(日) 21:22:35
#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;
}
690689: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デフォルトの名無しさん:2007/10/21(日) 21:28:01
>>690
r=0 の時にどうなる?
692デフォルトの名無しさん:2007/10/21(日) 21:31:10
>>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;
}
693デフォルトの名無しさん:2007/10/21(日) 21:37:26
>>692
サンクス!
これは各項のすべての値でますか?
694デフォルトの名無しさん:2007/10/21(日) 21:41:18
おみくじのプログラム、ありがとうございました。(>_<)本当に助かりました☆
695デフォルトの名無しさん:2007/10/21(日) 21:55:31
[1] 授業単元: C言語入門
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5116.txt
[3] 環境
 [3.1] OS: Windows
 [3.3] 言語: C言語
[4] 期限: 10月22日(月)午前1時まで
よろしくお願いします
696デフォルトの名無しさん:2007/10/21(日) 21:58:34
>>695
リンク先を見る限り何が分からないのか分からないよ
697680: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書いたのも馬鹿っぽいしなぁ
698デフォルトの名無しさん:2007/10/21(日) 22:01:29
>>695
それぞれの関数の名前と不等号の向きを変えるだけでできるぜ!
と優しい俺は教えてあげる

課題4は「値渡し」
699697: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)))); }
700デフォルトの名無しさん:2007/10/21(日) 22:08:43
宿題スレ慣れしてなさそうな解答者だな
701デフォルトの名無しさん:2007/10/21(日) 22:11:43
>>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;
}
702デフォルトの名無しさん:2007/10/21(日) 22:13:20
なんか抜けてるw
703デフォルトの名無しさん:2007/10/21(日) 22:14:06
間違えた……
else s = sum(a,r,n-1)*r + a;
→else s = sum(a,r,n-1)*r + a;
704デフォルトの名無しさん:2007/10/21(日) 22:15:28
推敲って言葉を知らないのかな
そんなに急がなくても問題は逃げたりしないよ
705デフォルトの名無しさん:2007/10/21(日) 23:05:07
>>701

rを配列で与えてaをxとすると
どこかで見た式に見えるな…
Horner級数だったっけか?
n次の関数をちょっぴり高速に計算する方法
706デフォルトの名無しさん:2007/10/21(日) 23:10:24
>>705
こんな奴の事かな?
ax^3+bx^2+cx+d -> ((ax+b)x+c)x+d
707デフォルトの名無しさん:2007/10/21(日) 23:22:52
>>706
そう!xの累乗求めながら計算するより乗算回数が大きく減るんですよね。
708デフォルトの名無しさん:2007/10/21(日) 23:32:03
[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] その他の制限:
709デフォルトの名無しさん:2007/10/21(日) 23:44:48
>>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;
}
710デフォルトの名無しさん:2007/10/22(月) 01:10:48
ありがと
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] その他の制限: 特にないです。
712デフォルトの名無しさん:2007/10/22(月) 03:08:44
>>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;
}
714デフォルトの名無しさん:2007/10/22(月) 03:41:58
#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の格納文字数指定も忘れているとは...
参考になります。
716デフォルトの名無しさん:2007/10/22(月) 07:30:07
>>711
658と同じ授業?と思ったけど環境が違うな……
717デフォルトの名無しさん:2007/10/22(月) 10:15:08
数値int型を入力し、絶対値(数値の大きさ)を求めるプログラムを 作成しなさい
注意:標準関数は使用するな
実行画面
数値入力==>-5
絶対値:5
718デフォルトの名無しさん:2007/10/22(月) 10:20:09
>>717
#include<stdio.h>
main()
{
int n;
printf("数値入力==>");
scanf("%d",&n);
printf("絶対値%d\n",n>0 ? n : -n);
}
719デフォルトの名無しさん:2007/10/22(月) 10:22:39
あれ、俺いつのまに書き込みボタン押したんだってくらい
同じプログラムがすでに書かれててワロス
720デフォルトの名無しさん:2007/10/22(月) 11:00:05
>注意:標準関数は使用するな
--
printf("数値入力==>");
scanf("%d",&n);
printf("絶対値%d\n",n>0 ? n : -n);
--
求めた結果を出力しろとも書いてないしな。
721デフォルトの名無しさん:2007/10/22(月) 11:06:24
-2147483648だと誤動作しなかったっけ
722デフォルトの名無しさん:2007/10/22(月) 11:09:47
C言語の宿題なんですけど、

10桁までの整数を入力すると、数字の並びを逆にして表示するプログラムを作成せよ。
ただし0123のように入力すると0123は整数ではないのでエラーと返すか321と出力させよ


よろしくお願いします
723デフォルトの名無しさん:2007/10/22(月) 11:13:29
>>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;
}
724デフォルトの名無しさん:2007/10/22(月) 11:16:25
>0123は整数ではない
これは新解釈だ。
725723:2007/10/22(月) 11:21:57
あ〜 unsigned intじゃまずいかも…intが2byteの処理系じゃ
10桁無理だ…。

というわけで
unsigned int → unsigned long
"%u" → "%lu"
に訂正しないといかん
726デフォルトの名無しさん:2007/10/22(月) 11:24:12
4byteでもムリじゃね?50億とか。
727デフォルトの名無しさん:2007/10/22(月) 11:25:20
>0123は整数ではない
0123って書いたら8進数で123って解釈するのが普通だと思う
728デフォルトの名無しさん:2007/10/22(月) 11:26:56
ちょっと緊急ですが…

[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ってなんですか?
730デフォルトの名無しさん:2007/10/22(月) 11:28:10
2の31乗は2147483648で11桁 long で何とか10桁整数入るよ
計算結果違ったらMS社のせいな。Win付属の電卓使ったから…
731num = num / 10:2007/10/22(月) 11:28:17
>>729
ここは質問スレではありません。
732デフォルトの名無しさん:2007/10/22(月) 11:29:42
>>728
文字は一つ
733デフォルトの名無しさん:2007/10/22(月) 11:38:54
>>731
お願いします
教えて下さい
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] その他の制限: できれば、後から簡単に、初期在庫量・発注点・製品数などを変更できるようにしてください。

よろしくお願いします。
735デフォルトの名無しさん:2007/10/22(月) 11:40:06
>>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;
}
736デフォルトの名無しさん:2007/10/22(月) 11:41:41
>>733

731の名前のとこに書いとるがな…
737デフォルトの名無しさん:2007/10/22(月) 11:44:21
>>732
>>735
うわ、日本語がおかしいorz
完全なる説明不足です
文の中の文字の間違いです…御免なさい
「abcdae df」なら「a:2 b:1 c:1 d:2 e:1 f:1 空白:1」みたいに…
738728:2007/10/22(月) 11:45:06
↑は自分です
もちつけ俺。
739730:2007/10/22(月) 11:47:17
ゴメソ
徹夜のせいか数字の桁数みまちがえた…そろそろ寝んとやばいか…

64bit整数に対応してたらそれで…文字列処理版は今から書く…
740デフォルトの名無しさん:2007/10/22(月) 11:49:06
>>739
釣りだと思って無視してたw
741723=725=730=739:2007/10/22(月) 12:08:50
>722,726

書き直しました。
頭の0は無視します。
10進以外の数を入れると何も表示せず終わります。
スペース、タブも無視しません。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5117.txt
742741:2007/10/22(月) 12:14:38
一行足りてなかった…落ち着け俺

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5118.txt
743735: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個の文字がたくさんあるとうざい…
744737:2007/10/22(月) 12:32:32
>>743
うぉ、たしかにorz
お頭の弱い人ですんません…ありがとうございます。
745デフォルトの名無しさん:2007/10/22(月) 12:33:29
>>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;
}
746735=743:2007/10/22(月) 12:34:44
出力書式の\%は\nの前だの…
747745:2007/10/22(月) 12:34:52
あー、ctype.hをincludeし忘れた……
748デフォルトの名無しさん:2007/10/22(月) 12:35:14
>>745 素直やね。素直が一番。
749745:2007/10/22(月) 12:37:41
MAX+1した意味ないことに気付いた……
ぬる文字いらないじゃん
750デフォルトの名無しさん:2007/10/22(月) 12:47:38
>>749
EOFってint型で-1じゃなかったかな?
ShiftJIS環境下において\xffが入力されることがないからそれはまぁいいとして

入力が0だと何も表示しないがそれはいいのか?
仕様の一言で済むが…。
自分は
0123→123→321
0000→0→0
となるべきではないだろうか?0も10桁までの整数だと思う。

あと100と入れると0のとこでcount進むな…
あっ俺も反転後の頭の0消してないや…
751デフォルトの名無しさん:2007/10/22(月) 12:50:41
なんか、昨日から答える側がグダグダすぎないか?
もちっと落ち着け
752750: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と入力した時の
753デフォルトの名無しさん:2007/10/22(月) 12:55:50
>>745
入力 7f8 って入力したら 87 って表示しそうだけど…
754デフォルトの名無しさん:2007/10/22(月) 12:58:52
// 素朴に
#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;
}
755デフォルトの名無しさん:2007/10/22(月) 13:03:32
// 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;
}
756デフォルトの名無しさん:2007/10/22(月) 13:06:34
>>751
ぐだぐたなのの半分は俺
757デフォルトの名無しさん:2007/10/22(月) 13:07:17
// 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;
}
758デフォルトの名無しさん:2007/10/22(月) 13:22:41
>>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] その他の制限: できれば、後から簡単に、初期在庫量・発注点・製品数などを変更できるようにしてください。

よろしくお願いします。
760デフォルトの名無しさん:2007/10/22(月) 13:23:58
>>756
いや 2/3 位自分だ ゴメン orz
761デフォルトの名無しさん:2007/10/22(月) 13:25:16
>>758 お、それは名案ですな( ´ー`)y─┛~~

スキャンする時点でゼロも飛ばせたら…。
char配列で頑張るのはここらへんが限度か。
762デフォルトの名無しさん:2007/10/22(月) 13:26:31
>>759 でた!工場問題><
763デフォルトの名無しさん:2007/10/22(月) 14:06:06
// 00001 を 1 に。0000 を 0 に。

dt1='00001';if('00001'==dt1){dt1=1;}
dt2='0000';if('0000'==dt2){dt2=0;}

write(dt1+' '+dt2);
764デフォルトの名無しさん:2007/10/22(月) 14:16:49
>>763
問題文は 722 だ、

で一つ質問だが何言語だそれ?
writeって関数Cにあったか?C++でもいいが…やっぱ無かったと思うが…
'0001' '0000'もCじゃありえないぞ…
765デフォルトの名無しさん:2007/10/22(月) 14:23:31
>>758

scanf("%10s%*[^\n]%*c",cs);

scanf("%[^1-9]c%[^0-9]10s%*[^\n]%*c",cs,cs+1);
てのはどうだろう…
766デフォルトの名無しさん:2007/10/22(月) 14:27:06
>>764
cでwrite()と言えば、unixのsystem callだろう。常考
>763が何をしたいのかは私も判らんが。
767デフォルトの名無しさん:2007/10/22(月) 14:28:22
>>758

あ〜〜 scanfの戻り値もチェックした方がいいよね?
そしたらこうかscanfのとここうなるかなぁ…

if(scanf("%[^1-9]c%[^0-9]10s%*[^\n]%*c",cs,cs+1) <2)
{ printf("入力が正しくありません。\n"); return -1; }

768デフォルトの名無しさん:2007/10/22(月) 14:32:12
↑簡単な問題を難しくしてませんか? >>763
769デフォルトの名無しさん:2007/10/22(月) 14:35:05
簡単な問題をいかに難しくみせるかが回答者の腕の見せ所
770デフォルトの名無しさん:2007/10/22(月) 14:36:06
>>764
それって『++C++』って言うんだよ
771デフォルトの名無しさん:2007/10/22(月) 14:37:19
↑今そう名づけた
772デフォルトの名無しさん:2007/10/22(月) 14:37:33
>>766
thanks

見た感じ変数宣言してないし文字列リテラルを''で囲んで書いてる
比較演算子の記述方法がCと同じdt1に文字列も数値も入るからTypeless言語
これを考えるとPerlかなと思う。確かPerlの標準出力ってwriteとwritenだったような…
773デフォルトの名無しさん:2007/10/22(月) 14:38:15
>759
多製品っていうのが、やっかいだな・・・
774デフォルトの名無しさん:2007/10/22(月) 14:40:42
>>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(); 
}
775デフォルトの名無しさん:2007/10/22(月) 14:43:19
// シンプル プログミング ツール ++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(); 
}
776デフォルトの名無しさん:2007/10/22(月) 14:45:49
>759
製品クラスのベースクラス用意して
ベースクラスのポインタvectorとかslistでもって、…

出力例は明らかに1製品だけだよな…
シュミレーション関数をfor_eachで回すのか…もしかして…
777772:2007/10/22(月) 14:52:14
たしかにCインタプリタもどきみたいにみえる…helpページがないし
明らかにコンパイラとしての構文規約に違反してる…
778デフォルトの名無しさん:2007/10/22(月) 14:54:54
>>776
例は1製品だけど、
>各製品ごとに上記のように表示されるようにしなさい
ってあるから、全製品について表示させるんじゃない?
779デフォルトの名無しさん:2007/10/22(月) 14:57:08
>>772
>文字列リテラルを''で囲んで書いてる
そうしないとコンパイラが8進数と勘違いするよ
780デフォルトの名無しさん:2007/10/22(月) 15:01:06
>>778
設定が入ったクラス用意して1製品だけを処理するシュミレーションを
for_eachで製品回数分回せばいいということにならないだろうか?

vector<> setting(3);
setting = {製品Aの設定,製品Bの設定,製品Cの設定};
for_each(setting.begin(),setting.end(),simulation);

こんな流れ出処理したら出力例が製品分縦続きで出てくると…
781デフォルトの名無しさん:2007/10/22(月) 15:42:55
C++の宿題って、授業でどの程度習っている詳しく書いてくれないと、
どこらへんまで使っていいか判断が難しいよな……

単なるCの構文置き換え程度なのか、
better C程度なのか、
クラスばりばり使っていいのか、
STLばりばり使っていいのか、
テンプレート使っていいのか、
boost使っt(ry

まあ俺はクラスをちょい使うレベルしか無理だがw
STLはvectorくらいしか分からん
782デフォルトの名無しさん:2007/10/22(月) 15:45:07
// エラー デバッグ ブラウザ ツール
// 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);}
783デフォルトの名無しさん:2007/10/22(月) 15:50:07
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):年月日を入力して、その日に最も近いクリスマスを全て表示するプログラムを作れ
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン:BCC5.5
 [3.3] 言語:C言語
[4] 期限:明日まで
[5] その他の制限:特になし
784デフォルトの名無しさん:2007/10/22(月) 15:52:40
// ++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);}
785デフォルトの名無しさん:2007/10/22(月) 15:59:09
プログラム構造はコレです
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);
}
786デフォルトの名無しさん:2007/10/22(月) 16:00:38
>>785
いい加減スレ違いだし、くどいよ。
787デフォルトの名無しさん:2007/10/22(月) 16:01:52
符号明示化表示結果はコレです
 +1
 +0
 +95
 +23
 -888
 -123456789012345
788デフォルトの名無しさん:2007/10/22(月) 16:02:57
>>781
俺はvectorすらわかんねw
ここに書き込むぐらいだから、Cの構文置き換え程度なんじゃない?

クラスとか使ったほうがきれいにできるなら使っちゃっていいんじゃない
789デフォルトの名無しさん:2007/10/22(月) 16:03:39
>>786
かわいそう〜
790デフォルトの名無しさん:2007/10/22(月) 16:07:25
>>759
とりあえず書いたけど動作確認まではしてないよ…。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5119.cpp

>>772
'0000'と書いてあったんだ…
791デフォルトの名無しさん:2007/10/22(月) 16:09:54
// 00001 を 1 に。0000 を 0 に。

この問題の目的は
8進数して処理されるのを
いかに10進数で認識するか
と言うことでしょう・・・
792デフォルトの名無しさん:2007/10/22(月) 16:16:36
>>783
>その日に最も近いクリスマスを全て表示する
???

>>789
いやC言語風味な別言語だよ 785 のは…
・理由は宣言型言語でない(変数の宣言なしで変数の使用が可能)
・main関数がない
・リテラル宣言がC,C++と異なる。
・ライブラリがない(インタプリタならあたりまえ)
・標準的な関数名の違い
なにより多少の手直しだけではコンパイラを通らない。
793デフォルトの名無しさん:2007/10/22(月) 16:19:22
>>791

大元をたどるとですね
文字列"0001"を文字列"1"へ、
文字列"0000"を文字列"0"へ
文字列"0100"を文字列"100"へ
ということ
ただし文字列な長さは固定でないとする。
794デフォルトの名無しさん:2007/10/22(月) 16:20:20
[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] その他の制限:
初心者でもわかるような感じにお願いします。
配列を使う課題なので、配列も使ってください。
795デフォルトの名無しさん:2007/10/22(月) 16:29:00
>>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;
}
796デフォルトの名無しさん:2007/10/22(月) 16:29:03
>>792
その>>784の++C++言語から
標準C++言語に変換する
プリコンパイラ?を作成せよ
なんちゃって・・・
797デフォルトの名無しさん:2007/10/22(月) 16:30:11
ステレオで広がる初音ミク音源検索
http://youtv.atspace.com/?rSTV=STEREO+%E5%88%9D%E9%9F%B3%E3%83%9F%E3%82%AF
798デフォルトの名無しさん:2007/10/22(月) 16:32:11
>>796
めんどくさいの一言に尽きる。別のスレで頼め…。
あとここはC,C++のスレだから 786 でスレ違いだといったんだ。
799795: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;
}
800デフォルトの名無しさん:2007/10/22(月) 16:43:13
>>792
>いやC言語風味な別言語だよ 785 のは…

・理由は宣言型言語でない(変数の宣言なしで変数の使用が可能)
  実はバリアント型である
・main関数がない
  実は省略が可能である
・リテラル宣言がC,C++と異なる。
  実は " も使用可能である
・ライブラリがない(インタプリタならあたりまえ)
  ライブラリは .js と実は呼ばれている
・標準的な関数名の違い
  標準関数に無い場合はライブラリを作れば良い

>なにより多少の手直しだけではコンパイラを通らない。
  基本は変わって無いんですが・・・ライブラリ使ってます
801デフォルトの名無しさん:2007/10/22(月) 16:44:00
>>799
・言語が指定と違う
・行数が指定を満たしていない
802デフォルトの名無しさん:2007/10/22(月) 16:45:25
>>794 >>799
出題者の意図を読まないといけなさそうだねえ。やっぱintの配列を期待してそうに見える。
要素100000の巨大配列なら auto 変数はやめときたい。今時無視できる大きさなのかな?
あと言語は(ry
803デフォルトの名無しさん:2007/10/22(月) 16:45:49
>>800
大丈夫?
804デフォルトの名無しさん:2007/10/22(月) 16:49:19
>>790
なんかうざいし、クラス使う意味ほぼ無し
805デフォルトの名無しさん:2007/10/22(月) 16:49:55
>>793
それでは
汎用性が無い

>>787
これは
すばらしい
806デフォルトの名無しさん:2007/10/22(月) 16:50:43
>>795
Cだっちゅーに
807799: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;
}
808デフォルトの名無しさん:2007/10/22(月) 16:53:25
この関数は

br();      1行改行
br(1);     1行改行
br(2);     2行改行
br(N);     N行改行

809デフォルトの名無しさん:2007/10/22(月) 16:54:43
>>794
scanf?
type input-3-1.txt | 794.exe > output.txt
ってやれってことか?
810807: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;
}
811デフォルトの名無しさん:2007/10/22(月) 16:55:29
>>807
おいおい、ポインタ配列を作ってしれっと誤魔化すなや。
812デフォルトの名無しさん:2007/10/22(月) 16:56:18
>>809
794 < input-3-1.txt > output.txt でいいんでない?
813デフォルトの名無しさん:2007/10/22(月) 16:56:22
>>807
もちつけ
814デフォルトの名無しさん:2007/10/22(月) 16:57:31
この関数は

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)スペース
815デフォルトの名無しさん:2007/10/22(月) 16:57:48
>>809

794 < input-3-1.txt > output.txt
だが?

scanf、printf使えと書いてある。リダイレクトも
パイプは書いてないからダメだろう
816デフォルトの名無しさん:2007/10/22(月) 16:59:34
ところで?

標準のC/C++って
split使えるの?
817デフォルトの名無しさん:2007/10/22(月) 17:01:02
>>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.
818810:2007/10/22(月) 17:01:14
配列でかい場合はやっぱグローバルに置いた方がいいですか?
目的もはっきりしてるし、他で使いまわしたりしていないし
819デフォルトの名無しさん:2007/10/22(月) 17:01:51
もうネタはやめようぜ
820デフォルトの名無しさん:2007/10/22(月) 17:02:52
>>818
グローバルでもstaticでも御好きに
821デフォルトの名無しさん:2007/10/22(月) 17:03:09
#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;
}
822デフォルトの名無しさん:2007/10/22(月) 17:05:55
>>816

こっちで聞いた方が良くない?
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50

標準じゃsplitはないよ…
823デフォルトの名無しさん:2007/10/22(月) 17:06:05
>>810
バッファオーバーフロー
824デフォルトの名無しさん:2007/10/22(月) 17:06:54
つーか、buildして動かせよ・・・
825810: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;
}
826デフォルトの名無しさん:2007/10/22(月) 17:08:50
>>817

これを実行するために
dt="00001 0000 095 +00000023 -0888 -123456789012345".split(' ');

.split();
を標準的なC++を使ってライブラリ化せよ
827デフォルトの名無しさん:2007/10/22(月) 17:09:18
>>824
ちといま開発環境がないとこにいるんだよ…
828デフォルトの名無しさん:2007/10/22(月) 17:17:31
>>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";
829デフォルトの名無しさん:2007/10/22(月) 17:19:56
dt[]の数 dt.length は6個となる
830デフォルトの名無しさん:2007/10/22(月) 17:21:59
つまり .split() 関数が使える言語が 素晴らしい 最高だ
831デフォルトの名無しさん:2007/10/22(月) 17:24:37
LLなら大抵使えるけどな
832デフォルトの名無しさん:2007/10/22(月) 17:25:28
また .split() の逆で .join() も とてつもなく便利である 
833デフォルトの名無しさん:2007/10/22(月) 17:25:58
>>830
CにはCのBASICにはBASICのプログラミングスタイルがあるように
人の好みもそれぞれだろうからね。
でもここは宿題スレだぞ
834デフォルトの名無しさん:2007/10/22(月) 17:27:59
JavaScript厨は構ってもらいたいだけなんだろうから相手にすんなって。
835デフォルトの名無しさん:2007/10/22(月) 17:28:15
これを実行
dt="00001 0000 095 +00000023 -0888 -123456789012345".split(' ').join('/');

実行した結果に等価
dt="00001/0000/095/+00000023/-0888/-123456789012345";
836デフォルトの名無しさん:2007/10/22(月) 17:30:14
>>834
了解
837デフォルトの名無しさん:2007/10/22(月) 17:32:24
>>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;
}
838デフォルトの名無しさん:2007/10/22(月) 17:32:50
>>834
それはちがう ライブラリ化で
よりプログラムを簡単にすると言うこと
宿題にライブラリ function 付ければ それで良い
839デフォルトの名無しさん:2007/10/22(月) 17:36:32
>>838 にとっては
すべての宿題はこれで片付くわけだw
#include"bakalib.h"
int main(int argc, char *argv[]){
return bakafunc(argc, argv);
}
840デフォルトの名無しさん:2007/10/22(月) 17:38:57
>>837

getsで1ラインずつ読み込んでsscanfとかstrtolで変換した方が
よさそでない
841デフォルトの名無しさん:2007/10/22(月) 17:42:57
fgets() + sscanf()ならscanf("%c")よりはましだが、gets()は論外。
842デフォルトの名無しさん:2007/10/22(月) 17:45:56
課題にscanf使えって書いてるしw
843デフォルトの名無しさん:2007/10/22(月) 17:46:13
844デフォルトの名無しさん:2007/10/22(月) 17:49:54
そうだったが…
scanf("%d")もしくはscanf("%ld")でとらない理由が知りたい
何か不都合があったかなぁ…
845デフォルトの名無しさん:2007/10/22(月) 17:49:56
>>839
ところが
超++C++言語は

.split(' ');

たったコレだけで動作する 最高だ
846デフォルトの名無しさん:2007/10/22(月) 17:51:44
>>844
サンプルのファイルだとオーバーフローしないが、
問題文には整数の桁数制限が無かったのでこうした
847デフォルトの名無しさん:2007/10/22(月) 17:55:21
>>839
超++C++言語は
内部文字コードはUTF-16なので
半角文字も16ビットです

char * ではなく
int * になるよ
848デフォルトの名無しさん:2007/10/22(月) 18:00:23
>>846
それを考えると整数型に変換しない方がいいと思う。
整数型にしている以上上限値は必ずあるから。
それに引き換えtxtファイルの1行の文字数制限はない…。

>>841
getsにはバッファーオーバーランの危険性がありましたね…失念…やばいやばい
849デフォルトの名無しさん:2007/10/22(月) 18:02:37
850デフォルトの名無しさん:2007/10/22(月) 18:06:16
>>847
unsigned int * かな
851デフォルトの名無しさん:2007/10/22(月) 18:06:53
100000行からなり - 変数10万個定義すんなよ
整数が1つずつ - intを使えよな
逆順に出力 - 全部メモリに取り込め
scanf、printfとリダイレクトを - fseek使うな。1passで。

でも普通は >>837 みたいになるよな。
852デフォルトの名無しさん:2007/10/22(月) 18:14:03
>>834
レベルの低いC厨はそうやって一つの事しか出来ないから困る
複数を使い分けろよ
853デフォルトの名無しさん:2007/10/22(月) 18:14:43
>790
ありがとうございました
854デフォルトの名無しさん:2007/10/22(月) 18:15:40
まぁ、漏れならこうするな。
--
awk '{buffer = $0 "\n" buffer;} END {print buffer;}'
855デフォルトの名無しさん:2007/10/22(月) 18:15:59
ならねーよwww
856デフォルトの名無しさん:2007/10/22(月) 18:17:18
>>851
課題文みるかぎり1passである必要はなさそうだよ。
まぁバイナリじゃないからfseek使えんし…
テンポラリファイルに記録しながらオフセットを記録して…邪道か…
857デフォルトの名無しさん:2007/10/22(月) 18:17:40
>>804
じゃあどーやんの?
858デフォルトの名無しさん:2007/10/22(月) 18:17:42
たかだか1MBにも満たないようなデータ量なんだから、がばっと読んでメモリ上で処理するな、俺だったら。
859デフォルトの名無しさん:2007/10/22(月) 18:22:24
>>857
どうやるもなにも、クラス使う意味ないし、for_each()使う意味も全くないし、何よりうざいってだけさ
860デフォルトの名無しさん:2007/10/22(月) 18:24:08
>>858
やっぱそうですよね。組み込み系じゃあるまいし…。
861デフォルトの名無しさん:2007/10/22(月) 18:33:31
その程度だったらウチの電子レンジでもできるがな
862デフォルトの名無しさん:2007/10/22(月) 18:33:33
>>859
forで回してもいいわなそりゃ
class作ったのはその他制限の部分に関係しているのだが?
PODでも良かったかもしれんが…。
もっとスマートに書けるなら外形だけでもいいから示してもらいたい。
863デフォルトの名無しさん:2007/10/22(月) 18:38:04
つまり、俺のコードがもっともスマートなのだと言いたいのかな?
じゃ、それでいいよ。
864デフォルトの名無しさん:2007/10/22(月) 18:38:46
<>
865デフォルトの名無しさん:2007/10/22(月) 18:44:34
>>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();
866デフォルトの名無しさん:2007/10/22(月) 18:44:39
回答のコードを批評するスレじゃありませんよ。
867デフォルトの名無しさん:2007/10/22(月) 18:46:20
男なら拳で語れ
868デフォルトの名無しさん:2007/10/22(月) 18:55:37
>>859
模範回答を示せ

>>865
スレタイと>>1をよく読んでからどっかいけ
awk ならこれだけだ
{a[++i]=$0}END{for(;i>=1;i--)print a[i]}
869デフォルトの名無しさん:2007/10/22(月) 18:56:00
< >
< >
870デフォルトの名無しさん:2007/10/22(月) 19:00:36
>>868
よほどあのコードに自身があるんだねぇwww
871デフォルトの名無しさん:2007/10/22(月) 19:05:12
まあ>>790はメンバ関数がアクセッサくらいしかないからな……
そういうクラスもありだろうが、この場合はもっとうまく設計できると思う
872862≠868:2007/10/22(月) 19:05:47
書いたのは俺だが…
綺麗に書けたわけでもないし、もっと綺麗なコードになるなら
手本なり部分的な代案なりがないと手直しも何も出来ない
873デフォルトの名無しさん:2007/10/22(月) 19:05:52
>>868 環境が無くawkの動作を確認できませんでした
874デフォルトの名無しさん:2007/10/22(月) 19:09:44
俺なら、
製品毎の在庫管理クラスStockMamager
複数の製品在庫をまとめる管理クラスFactory
Factoryを引数で受け取って、シミュレートするsimulate関数
という感じにする
by C++ 初心者
875790:2007/10/22(月) 19:11:25
>>874
参考にさせて頂きます
876デフォルトの名無しさん:2007/10/22(月) 19:12:34
他人のコードよりまず自分の脳みそが正常かどうかをチェックすべき。
877デフォルトの名無しさん:2007/10/22(月) 19:17:24
そうですね……
878デフォルトの名無しさん:2007/10/22(月) 19:28:07
>>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();
879デフォルトの名無しさん:2007/10/22(月) 19:33:19
さっきからうざい
880デフォルトの名無しさん:2007/10/22(月) 19:39:10
>>868
ループを書くだけ野暮。
>854
881デフォルトの名無しさん:2007/10/22(月) 19:39:23
誤爆したら歓迎するスレ
882デフォルトの名無しさん:2007/10/22(月) 19:40:24
>>859
模範回答を示せ
883デフォルトの名無しさん:2007/10/22(月) 19:47:37
C/C++はライブラリ化が
遅れてる部分あるんですね?
884デフォルトの名無しさん:2007/10/22(月) 19:50:55
>>883
ここは宿題スレだから
885デフォルトの名無しさん:2007/10/22(月) 19:56:17
これからは
ライブラリ化の宿題が
増える・・・
886デフォルトの名無しさん:2007/10/22(月) 19:59:08
宿題:文字のドッキングをするには?
参考にBASICでは A$=B$+C$:

887デフォルトの名無しさん:2007/10/22(月) 20:04:01
だからawkでは a = b c; なんだってばよ。
888デフォルトの名無しさん:2007/10/22(月) 20:09:09
>>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;
}


889デフォルトの名無しさん:2007/10/22(月) 20:09:52
↑ではC++ではどうですか?
890デフォルトの名無しさん:2007/10/22(月) 20:10:57
>>887
↑ではCではどうですか?
891デフォルトの名無しさん:2007/10/22(月) 20:12:29
C では文字はドッキングするともはや文字ではなくなってしまう。
892デフォルトの名無しさん:2007/10/22(月) 20:15:18
>>891
文字で無くなるという
サンプルコードは?
893デフォルトの名無しさん:2007/10/22(月) 21:39:11
printf("%d",sizeof(char));
894デフォルトの名無しさん:2007/10/22(月) 21:43:47
>>889
C++だろ
895デフォルトの名無しさん:2007/10/22(月) 21:50:21
>>893
sizeof() は size_t 型を返す立派な演算子だが…
896デフォルトの名無しさん:2007/10/22(月) 21:52:57
いつもに増してカオス
897デフォルトの名無しさん:2007/10/22(月) 21:53:33
>>895
C99だとな
898デフォルトの名無しさん:2007/10/22(月) 21:53:45
>>889
どこがC++じゃないの?
899デフォルトの名無しさん:2007/10/22(月) 22:02:53
>888
それじゃ1製品じゃない?
10製品同時じゃなきゃだめなんじゃないの?
900デフォルトの名無しさん:2007/10/22(月) 23:30:38
>>899
10製品分のとはかかれているなぁ。
ただ製品間で関係性がないから
10製品同時でやるのも1製品ずつ10回やるのも
差違がない。
ためしにrand関数をハックして
各製品に与えられる乱数列を同じにすると同じ結果が得られる…。
901デフォルトの名無しさん:2007/10/23(火) 00:33:05
あの…かなり長文の宿題なのですが聞いていただけるでしょうか?
全然分からなくて困ってるんです(><;)
902デフォルトの名無しさん:2007/10/23(火) 00:34:58
>>901
きいてやるからうpれ
ただし5分以内な
903デフォルトの名無しさん:2007/10/23(火) 00:38:38
>>901
端折ったら死亡
904901:2007/10/23(火) 00:39:36
>>902
すみません、リナックスで書いてたので文字化けしちゃってます…
書き換えてくるのでもう少し待ってもらえませんか?
905デフォルトの名無しさん:2007/10/23(火) 00:41:46
>>904
わかった待つからww
いちいちレスすんなwww
906デフォルトの名無しさん:2007/10/23(火) 00:41:58
>>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日まで
908907:2007/10/23(火) 00:49:37
907を書き込んだモノです。
すいません。言語はc++じゃなくて、cです。
お願いします。
909901: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*);
910901: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);
911901: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;
}
912901: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の領域を解放する*/
}
913デフォルトの名無しさん:2007/10/23(火) 01:09:32
>>907

出力はCSVでもいいでしょうか?
Excelファイル出力は…
914901: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);
}

915901: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

このように節点数のしたに枝の情報が並んでいる形です。

長文申し訳ありません…
916デフォルトの名無しさん:2007/10/23(火) 01:15:10
>>909-915
ラリホー
917デフォルトの名無しさん:2007/10/23(火) 01:19:44
>>901
奇点が二つの時は一方を、ゼロの場合はてきとうにひとつの頂点を選んで、
あとは一度通った辺を選ばないようにして、適当にうろうろさせた結果を出せば、
それが一筆書きになってるんじゃないの?
918901:2007/10/23(火) 01:24:20
>>916
寝れるなら寝たいです(><;)

>>917
オイラー回路と一筆書きって微妙に違うんです…
一筆は始点に戻らなくてもいいんですがオイラーは………はい。
919デフォルトの名無しさん:2007/10/23(火) 01:27:34
>>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;
}
920デフォルトの名無しさん:2007/10/23(火) 01:27:59
>>901
じゃあ、奇点が0個のだけね。
でも、適当に辺を一回ずつ選べば始点に戻るよ。
921デフォルトの名無しさん:2007/10/23(火) 02:29:44
>>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)を利用するとよいとだされました。
自分の中で方針がある程度決まっているのですが、うまくプログラムで表現できません。よろしくお願いします
923デフォルトの名無しさん:2007/10/23(火) 02:50:46
一行ずつよみこんでfindで見つけて、空白や.や,までを抽出せよ
924デフォルトの名無しさん:2007/10/23(火) 02:56:59
こんなかんじでやっていけ

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());
925デフォルトの名無しさん:2007/10/23(火) 03:58:21
>>922
英単語は何で区切られてるの?
926デフォルトの名無しさん:2007/10/23(火) 04:15:33
>>880
>>854>>868 の処理速度を比べてみたが予想通りだった
何を野暮と思うかは人それぞれだから納得できる説明が欲しいな
927907:2007/10/23(火) 07:28:45
csvファイルでも大丈夫です。
928デフォルトの名無しさん:2007/10/23(火) 07:43:32
>>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) {
???????
}
よかったら????の部分埋めてください
見づらいってとこはスルーしてください
931デフォルトの名無しさん:2007/10/23(火) 08:26:53
add1(n)
add2(n)
add3(&n)
printf("%d", i+1);
return i + 1;
*p += 1;
932デフォルトの名無しさん:2007/10/23(火) 08:32:12
4つ目はprintf("Add1: %d\n", i+1) の方がいいか
933デフォルトの名無しさん:2007/10/23(火) 08:44:35
>>930
関数add3 に nを適用する をコメントアウトし忘れている…提出前に訂正忘れずに。
934デフォルトの名無しさん:2007/10/23(火) 08:47:01
どうでもいいことでも一言いいたくて仕方ないんだな
935デフォルトの名無しさん:2007/10/23(火) 11:04:46
>>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;
}
こちらの解答も面倒でなければお願いします
937デフォルトの名無しさん:2007/10/23(火) 11:36:55
#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;
}
938デフォルトの名無しさん:2007/10/23(火) 11:38:07
>>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;
}
939デフォルトの名無しさん:2007/10/23(火) 11:39:05
てs
940938:2007/10/23(火) 11:39:41
間違えたw
とりあえず>>937さんのでよさそうだからいいや
941デフォルトの名無しさん:2007/10/23(火) 15:28:34
[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座標です。
よろしくお願いします。
942デフォルトの名無しさん:2007/10/23(火) 17:07:14
>>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);
}
943941:2007/10/23(火) 17:36:49
>>942
ありがとうございました!!無事計算できていました。
944デフォルトの名無しさん:2007/10/23(火) 18:35:22
[1] 授業単元:C++実習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5120.txt
[3] 環境
 [3.1] OS: XP VISTA
 [3.2] visual studio 2005
 [3.3] 言語: C++
[4] 期限: 10/25 12:00まで
[5] その他の制限: 特になし

よろしくお願いします。
945デフォルトの名無しさん:2007/10/23(火) 18:44:50
txtファイルの文字列を配列にコピーするとき、
strcpy(配列,???);
の???には何を入れればいいのでしょうか?
946デフォルトの名無しさん:2007/10/23(火) 18:53:12
コピーしたい文字列を指定しないでどうする
947デフォルトの名無しさん:2007/10/23(火) 18:59:27
>>946
文字列の入力されているtxtファイル名ってことですか?
948デフォルトの名無しさん:2007/10/23(火) 19:34:07
>>947
txtファイルから読み込みたいんならstrcpyじゃなくてfgetsとかを使うべし
949デフォルトの名無しさん:2007/10/23(火) 19:44:07
>>948
fgetsで文字列をバッファに格納した後、
strcpy(配列,バッファ);
とかですか?
950デフォルトの名無しさん:2007/10/23(火) 20:05:20
なんでそこまでstrcpy()にこだわるんだよw
951デフォルトの名無しさん:2007/10/23(火) 20:13:28
>>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);}
ここまでやってみましたが二箇所にエラーが発生しました、間違えたところ教えてください。




954デフォルトの名無しさん:2007/10/23(火) 20:41:36
#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);}
955デフォルトの名無しさん:2007/10/23(火) 20:54:08
956デフォルトの名無しさん:2007/10/23(火) 20:56:09
>>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;
}
957デフォルトの名無しさん:2007/10/23(火) 20:59:02
>>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;
}
958デフォルトの名無しさん:2007/10/23(火) 21:06:13
>>953
最近のコンパイラならエラーメッセージと行が出るからそれ晒せ。
あと、いくら行が多いって怒られたからって無理にツメツメで書くぐらいならうpロダにtxtファイルで上げろ。
959955:2007/10/23(火) 21:08:26
>>944
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5123.txt

>>955は題意を満たしていなかった(各クラスのメンバ変数の入出力関数が
おかしな事になっていた)ので作り直した。
960952: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さんありがとうございました。

961デフォルトの名無しさん:2007/10/23(火) 21:26:20
>>953
Win98SE PenV1G BCC32 5.5.1で動作確認した。
自分で間違い探し…。ほんと基本的なとこだよ

訂正前:整形のみ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5125.txt
訂正後
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5126.txt
962デフォルトの名無しさん:2007/10/23(火) 21:32:54
>>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;
}
963デフォルトの名無しさん:2007/10/23(火) 21:38:52
964952:2007/10/23(火) 21:49:29
962&963さん助かりました。

自分が作ったのと比べて見てみます。

ありがとうございました。
965961:2007/10/23(火) 21:58:55
>>953
そういやエラー2つって書いてあったが、エラー1警告1なんじゃ?
もしエラーが2つなら全角スペースがあったはず…
自分は整形時に置換しちゃったから…
966956: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;
に修正しといて
967デフォルトの名無しさん:2007/10/23(火) 22:09:19
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);
968デフォルトの名無しさん:2007/10/23(火) 22:09:50
 }
 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);
969デフォルトの名無しさん:2007/10/23(火) 22:11:31
擬似的にネットワークを作って
ある条件のネットワークに沿ったら
do〜whileから抜け出すようにしたいのですが、
うまくループから抜け出してくれません

xcntってやつの条件なら上手く抜けることは確認できました
&&dcntってやつを付けたら、さっさと抜けてしまいます

なにか修正点があるなら御願いします
970デフォルトの名無しさん:2007/10/23(火) 22:15:07
>>969
プログラム長いんだったら 1 のアップローダー使おうよ
971デフォルトの名無しさん:2007/10/23(火) 22:23:48
dcntの値を表示させればいいだけじゃね?
972sage: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] なし
973デフォルトの名無しさん:2007/10/23(火) 22:32:02
>>969
dcnt++でしか弄ってないためforが何回まわるかで値が決まりますが
i<jの条件からおおよそn回まわるとn*n/2回インクリメントされます。
dcnt>=3800 && dcnt<=4200 から n の範囲を逆算すると
おおよそ 88<=n<=91 …明らかにきnの範囲厳しくないか?
結論 dcnt++ の場所間違えてるか dcnt のチェック値がおかしい と思う
974デフォルトの名無しさん:2007/10/23(火) 22:42:32
>>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?
エラーはでないか…ハハハ……
975デフォルトの名無しさん:2007/10/23(火) 22:44:48
>>972
問題文が意味不明。
976 ◆tbYrCgujzM :2007/10/23(火) 22:51:28
[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;
}

行数制限にかかるので、環境以下は次に…
977デフォルトの名無しさん:2007/10/23(火) 22:55:33
[3] 環境
 [3.1] OS: Windows Vista
 [3.2] コンパイラ名とバージョン: bcc
 [3.3] 言語: C++ …のはずです…
[4] 期限: 07年10月24日03:00まで
[5] その他の制限: 特になし
978デフォルトの名無しさん:2007/10/23(火) 22:58:35
>>976-977
明らかにC言語だよね

いや明らかでもないか
979デフォルトの名無しさん:2007/10/23(火) 23:00:25
担当教授がC++とばかり言っていたもので…
すいませんorz
980デフォルトの名無しさん:2007/10/23(火) 23:11:47
>>976
フローチャートもどき作成…てかtextでフローチャートかけるかメンドイ。
ソース横に流れを罫線で書いてprintfとかの処理あるところには□置いたから
これ見ながらWordなりExcelなりで書いてくれ

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5128.txt
981デフォルトの名無しさん:2007/10/23(火) 23:13:31
>>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デフォルトの名無しさん:2007/10/23(火) 23:14:35
そういや…ループのマークあったか…
983誰か次スレ立てて:2007/10/23(火) 23:21:10
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。

【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
【過去ログ検索】        http://chomework.sakura.ne.jp/
【wiki】               http://www23.atwiki.jp/homework/

【前スレ】
C/C++の宿題を片付けます 97代目
http://pc11.2ch.net/test/read.cgi/tech/1191937213/
984デフォルトの名無しさん:2007/10/23(火) 23:21:34
>>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

あとは自分で頑張れ。

985デフォルトの名無しさん:2007/10/23(火) 23:22:46
>>984
7*8=57 orz
986デフォルトの名無しさん:2007/10/23(火) 23:41:48
>>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;
}
987デフォルトの名無しさん:2007/10/23(火) 23:49:29
988デフォルトの名無しさん:2007/10/23(火) 23:52:00
>>987
このスレタイは…
989987:2007/10/23(火) 23:52:05
ばかした…orz
立て直したほうがいい
990デフォルトの名無しさん:2007/10/24(水) 00:01:41
>>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デフォルトの名無しさん:2007/10/24(水) 00:05:34
[1] 授業単元:プログラミング実験
[2] 問題文(含コード&リンク):
  http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5129.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2007年10月14日22:00まで
[5] その他の制限: なし
992デフォルトの名無しさん:2007/10/24(水) 00:06:21
>>991
忘れてました・・・
どうかよろしくお願いします。
993デフォルトの名無しさん:2007/10/24(水) 00:14:04
>>990

しかもキーと値は別々の配列に格納。
その配列クラスも手作りで、何故か継承して使うように
書いてあるように見える…。
普通はprivateメンバじゃないかと自分は思う…
どうなの?>>972
994デフォルトの名無しさん:2007/10/24(水) 00:14:11
C++しばらくやってないから適当コードだけど、こんなんじゃないの?
class StringArray {}
class IntArray {}
class Map : public StringArray, IntArray {
 void append(string, int);
 int operator [] (int n);
 int operator [] (string&);
}
stringじゃなくてcharかな?
995デフォルトの名無しさん:2007/10/24(水) 00:16:19
>>991
たびたびすいません
[4] 期限: 2007年10月24日22:00まで
でした。
996デフォルトの名無しさん:2007/10/24(水) 00:17:31
>>994

課題文にでてくる関数名を見る限り
stringじゃなくてchar*を使って欲しそうに見える…。
標準C関数…C++なのに…まぁchar*で文字列扱う時はstlのalgorithmより楽だが
997デフォルトの名無しさん:2007/10/24(水) 00:29:20
埋めっか
998デフォルトの名無しさん:2007/10/24(水) 00:30:30
埋め
999デフォルトの名無しさん:2007/10/24(水) 00:31:30
ume
1000デフォルトの名無しさん:2007/10/24(水) 00:31:58
だが断る
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。