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

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

【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。

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

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 2.9 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

【前スレ】
51代目: http://pc8.2ch.net/test/read.cgi/tech/1128493272/
2デフォルトの名無しさん:2005/10/28(金) 01:43:23
3デフォルトの名無しさん:2005/10/28(金) 01:44:16
4デフォルトの名無しさん:2005/10/28(金) 01:45:40
5デフォルトの名無しさん:2005/10/28(金) 01:46:36
6デフォルトの名無しさん:2005/10/28(金) 02:08:04
もう一度書き込ませてください。
どなたか助けてください。
ヒントでも何でもいいです。
お願いします。

[1] 授業単元:ネットワーク
[2] 問題文(含コード&リンク):
以下のようなウェブサーバーを作りなさい。
#ブラウザからHTTPのリクエスト1つのみを受け付ける。
#サーバーのファイルシステムからリクエストファイルを受け取る。
#そのリクエストファイルのヘッダーラインを表示するHTTP responseメッセージをつくる。
#クライアントに直接、それを送る。
[3] 環境
 [3.1] OS: Linuxが好ましいけどWindowsでも可。
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 明日。
[5] その他の制限: レベル等に制限はなし。
見よう見まねで途中までやったファイルがここにあります。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1013.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1014.txt
どうかお願いします。
7デフォルトの名無しさん:2005/10/28(金) 02:35:00
>>6 見よう見まねで途中まで、って何が足りないの?こんだけのソース読むの結構面倒なんだよね。
8デフォルトの名無しさん:2005/10/28(金) 04:07:19
>>7
ありがとうございます。
うまく動作しません。
webserver.cという1つのファイルを提出すれば良いのです。
最初のファイルのところは、send_html関数が完成していません。
課題に似たファイルを見つけてそれを変形していったという感じなのですが。
2つの似たファイルを見つけて変形していったので、2つは別物です。
ネットワークプログラミングは初めてで、今勉強してるのですが、
何せ今日提出なので、時間が足りません。
助けてください。お願いします。
9デフォルトの名無しさん:2005/10/28(金) 04:16:53
見ないでいうが、

A1)リクエスト受けたら、決まったファイルを送信する。
A2)リクエスト受けたら、リクエストの文字列を含んだ(動的に生成した)もの送信する。

B1)指定されたファイルを探し、フルパスを返す
B2)フルパスの内容をコンソールに表示する

C)AとBをあわせ、リクエストされたページを返す。

と、ステップ踏んでいけばいいんじゃなね?
10デフォルトの名無しさん:2005/10/28(金) 04:53:53
そのステップは分かるのですが、ネットワークプログラミング能力が初めたばかりでないもので・・・。
bind listen 等の決まりきった関数は、理解するというよりその関数を丸覚えでいいのですかね?
11デフォルトの名無しさん:2005/10/28(金) 05:19:32
1)使い方を覚える(たぶん、あなたの言う丸覚え)
2)必要に応じてアレンジする(たぶん、あなたの言う理解。試行錯誤は必要)
の順だろ。
for文だって、最初は0から9までループさせる方法から入ったはずだ。
12デフォルトの名無しさん:2005/10/28(金) 06:41:29
>>11
やってみます。
リクエストファイルを受け取って、そのヘッダを表示するResponseメッセージをサーバーに送るのを
どのように書いたら良いのかわかりません。
まず、ヘッダをゲットして、それをコピーしてクライアントに送るのですよね?
ヘッダをどのようにゲットしたら良いのでしょう??
13デフォルトの名無しさん:2005/10/28(金) 07:06:14
前に貼ったリンクの下のが凄く近いと思うのですが、
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1014.txt
ヘッダを上手く送れないみたいなのです。
14鈴木:2005/10/28(金) 10:46:50
PARCOR係数を使っての拡大縮小の仕方を教えてもらえませんか?
15デフォルトの名無しさん:2005/10/28(金) 10:47:37
>>14 >>1を10回読め
16デフォルトの名無しさん:2005/10/28(金) 10:49:43
>>12
その前に単純echoサーバは作った事はあるか?
無いならまずそれを作ってみろ
17デフォルトの名無しさん:2005/10/28(金) 11:20:24
[1] 授業単元:プログラミング演習U
[2] 問題文:
適当な文字列を読み込んで、その長さを求めるプログラムを作成せよ。
各文字を走査する時には、ポインタ変数を使用すること。

入力:適当な長さ(100字以内)の文字列
出力:入力文字列と、その長さ(文字数)

ヒント:文字列の最後には、ヌル文字('\0')が入ることを利用。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:11/3まで
[5] その他の制限:配列とポインタ、ポインタと文字列、動的メモリの確保の方法まで習いました。

どなたかご教授お願いします。
18デフォルトの名無しさん:2005/10/28(金) 11:36:57
>>17 空文字の文字数は 0、空文字でないなら 1 + (1文字目から先の文字数)。
#include <stdio.h>
int mystrlen(char *s) { return *s == '\0' ? 0 : 1 + mystrlen(s+1); }
int main() { printf("%d\n", mystrlen("test string")); }
19デフォルトの名無しさん:2005/10/28(金) 11:40:37
>>16
sonna jikan naidesu....
mousugu simekiri nanode...
dareka tasukete kudasai
20デフォルトの名無しさん:2005/10/28(金) 12:31:11
警告:aの宣言は仮引数を覆い隠します  って出るんですけど、どういうことですか?
21デフォルトの名無しさん:2005/10/28(金) 12:34:24
>>20
aと言う仮引数があるのにaと言う局所変数を宣言したから
良いけどスレ違い
22デフォルトの名無しさん:2005/10/28(金) 12:37:32
それを外したら、『invalid use of array with unspecified bound』って出るけどこれは?
23デフォルトの名無しさん:2005/10/28(金) 13:24:01
>>22
当てっこゲームじゃないんだから該当ソース晒せ
24デフォルトの名無しさん:2005/10/28(金) 13:37:41
気に入らない質問やその他や発言はスルーの方向で。
25名無し:2005/10/28(金) 13:48:31
名無し :2005/10/27(木) 22:48:14
[1] 授業単元:電卓
[2] 問題文:
  入力:二つの10進数(非負の整数、4桁以下で符号無し)を加算記号"+"、減算記号"-"、で連結し最後に等号を付け加えた式を文字列として入力。
  操作:入力された文字列から加算記号、減算記号、等号を区切り記号として二つの10進数を文字列として切り出す。
     切り出した文字列を数値に変換する。加減算を行って結果を計算。
  出力:計算結果を等号"="の後ろに出力。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: [2005年10月29日9:00まで]
[5] その他の制限:文字列を読み込み、整数か記号であるかを判断(isalpha,isdegit等)、次に数字を数値変換(strtoi,strtol等)でその後、演算記号に従って計算
どうかお願いします。
26デフォルトの名無しさん:2005/10/28(金) 14:10:31
>>25 前スレから移動するときはちゃんと経緯も書こうね
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main() {
  char s[] = "1234+2345="; /* 入力 */
  char sl[256], sr[256], *stop;
  char *p = s, *q = sl, *r = sr, op;
  int i, lhs, rhs, ans;
  while (isdigit(*p)) *q++ = *p++;
  op = *p++;
  while (isdigit(*p)) *r++ = *p++;
  lhs = strtol(sl, &stop, 10); /* 10進法 */
  rhs = strtol(sr, &stop, 10); /* 10進法 */
  printf("lhs = %d, rhs = %d\n", lhs, rhs);
  switch (op) {
    case '+': ans = lhs+rhs; break;
    case '-': ans = lhs-rhs; break;
  }
  printf("ans = %d\n", ans); 
}
27名無し:2005/10/28(金) 15:11:56
>>26
すみません。気をつけます。
プログラムありがとうございました。
28名無し:2005/10/28(金) 15:46:47
宿題で万年カレンダーの作成がだされたのですが考えてもさっぱりわからないので代りに作って下さい><
課題の条件は次のとおりです
・C言語 ・閏年の考慮
・1700〜2100年までのカレンダー ・年と月を入力しその年月の1ヶ月分を表示
・月に0が入力された場合は入力された年の1年分を表示・表示形式は4*3の以下の状態

1月 2月 3月
4月 5月 6月
7月 8月 9月
10月 11月 12月

どなたか作成お願いします!ここの掲示板にソースをはってくれればうれしいです
29デフォルトの名無しさん:2005/10/28(金) 15:48:42
どいつもこいつもなぜ>>1を読まんのだ
30デフォルトの名無しさん:2005/10/28(金) 16:05:29
>>1は単なる推奨だろ?かってにルール決めてるだけじゃん?
31デフォルトの名無しさん:2005/10/28(金) 16:17:50
前スレの784です。
[1] 授業単元:名前解決を実装するソケットプログラミング
[2] 問題文(含コード&リンク):ドメイン名をIPアドレスに変換するプログラムを作成せよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1020.c
[3] 環境
 [3.1] OS: Windows or Linux
 [3.2] コンパイラ名とバージョン: bcc or gcc
 [3.3] 言語: C
[4] 期限: [2005年10月28日まで]
[5] その他の制限:現在DNSパケットをルートDNSに送信しようとしております。
とりあえず指定したDNSパケットを送ってみたいと思い、
下記のデータを送信しようとしております。
(char型)00000100000100000000000003777777057961686F6F02636F026A700000010001

しかしうまくいきませんでした。
パケットキャプチャーのetherealでデータを解析してみると上記のデータが
3030303030313030303030313030303030303030303030303033373737373737303537
39363136383646364630323633364630323641373030303030303130303031
となっておりました。

char型の0が0x30になったためだというのは分かるのですが、
char型の0を0x00として表現したいです。

短い数値でしたらatoi("0")みたいな感じで良いでしょうが、
これだけ長い文字列を数列に変換する方法が分かりません。

どなたかお分かりになる方教えていただけないでしょうか。
32 ◆gIPWFRjycg :2005/10/28(金) 16:18:49
[1] 授業単元:実験
[2] :2次元ランダムウォークのプログラム
   x方向に100、y方向に100ます目があるとして
   座標(0,0)から出発して(99,99)につくまでのステップ数を計算せよ
   ただし前、右、左には進めるが、後ろには進めない
   また(0,0)-(99,99)を超える範囲には移動できない

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C
[4] 期限: 11/4まで
[5] その他の制限: 特になし
33デフォルトの名無しさん:2005/10/28(金) 16:22:57
>31です。
今現在の私のソースの結果(異常)です。
-------------------------------------------------------------------------------
Domain Name System (query)
Transaction ID: 0x3030
Flags: 0x3030 (Unknown operation)
0... .... .... .... = Response: Message is a query
.011 0... .... .... = Opcode: Unknown (6)
.... ..0. .... .... = Truncated: Message is not truncated
.... ...0 .... .... = Recursion desired: Don't do query recursively
.... .... .0.. .... = Z: reserved (0)
.... .... ...1 .... = Non-authenticated data OK: Non-authenticated data is acceptable
Questions: 12337
Answer RRs: 12336
Authority RRs: 12336
Additional RRs: 12337
Queries
[Malformed Packet: DNS]
-------------------------------------------------------------------------------
34デフォルトの名無しさん:2005/10/28(金) 16:25:41
>31です。
ブラウザからwww.yahoo.co.jpにアクセスした結果(正常)です。
-------------------------------------------------------------------------------
Domain Name System (query)
Transaction ID: 0x4db6
Flags: 0x0100 (Standard query)
0... .... .... .... = Response: Message is a query
.000 0... .... .... = Opcode: Standard query (0)
.... ..0. .... .... = Truncated: Message is not truncated
.... ...1 .... .... = Recursion desired: Do query recursively
.... .... .0.. .... = Z: reserved (0)
.... .... ...0 .... = Non-authenticated data OK: Non-authenticated data is unacceptable
Questions: 1
Answer RRs: 0
Authority RRs: 0
Additional RRs: 0
Queries
www.yahoo.co.jp: type A, class IN
Name: www.yahoo.co.jp
Type: A (Host address)
Class: IN (0x0001)
-------------------------------------------------------------------------------
35デフォルトの名無しさん:2005/10/28(金) 16:25:46
>>31
二文字→1バイトじゃないのか?
unsigned enc(const char * ptr)
{
static char buf[] = "0x00";
buf[2] = *ptr++;
buf[3] = *ptr;
return strtoul(buf, 0, 0);
}
36デフォルトの名無しさん:2005/10/28(金) 16:44:50
>>32
条件がぜんぜん不足.

1. 「計算せよ」というのは乱数を用いてシミュレートせよ,という意味でOK?
2. 前,右,左という意味がわからない.どの方向が前?それとも右,左は方向転換?それだったら初期方向は?
3. 各行動の生起確率は?全部 1/3 で一様?
4. 境界条件は行動可能なものについて一様?
37デフォルトの名無しさん:2005/10/28(金) 16:45:16
>>31
つか、キャプチャの情報元にルートDNSに対して送信なんかするなよな。
大いに非常にとても迷惑だ。
そんな数字文字列をパケットに置き換えるなんざプログラミングじゃない。
Webの上の「DNSパケットの解説(運用面?)」なんかじゃなくて、
ネットワークプログラミングの観点から、ちゃんとプロトコルや
プログラミングの実際、実装を調べてからやれよ。
そういうCの(perlなんかじゃなく)サンプルも少なくないはずだし。
38デフォルトの名無しさん:2005/10/28(金) 16:50:20
>>32
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1021.txt

SHOW_ROOTというマクロを定義すれば、全経路を標準出力に出します。
最初の向きは上です。

>>36さんが質問しておられますので、その結果によってはプログラムを変更する
必要があるかもしれません。
39 ◆gIPWFRjycg :2005/10/28(金) 17:04:51
>>36
すみません
1.乱数を用いてシミュレートです
2.移動方向に対してです。たとえば(2,2)から(2,3)に移動したら
次のステップでは(2,2)に戻れないということです。
3.yes
4.yes
です。
40デフォルトの名無しさん:2005/10/28(金) 17:05:11
GPSから座標を受け取って、ファイルに出力するのってどうやるのですか?

GPS端末 : SHARP Zaurus
41デフォルトの名無しさん:2005/10/28(金) 17:08:55
>>28
年と月からそのときのカレンダーを表示するプログラムだけ作っといた.後はがんばれ.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1022.c
42デフォルトの名無しさん:2005/10/28(金) 17:14:21
>>41
1752年9月の処理が間違っています
4338:2005/10/28(金) 17:19:42
>>39
私のプログラムでは、プログラムを簡単にするために、後ろ方向を
向こうとしたら強制的にループの先頭に戻すようにしてあります。

三方向だけ向くようにすれば、永久ループの可能性はゼロになり
ますが、その場合二次元配列を使う必要があります。

そんなに難しくないので、試してみてください。
4441:2005/10/28(金) 17:21:10
>>42 あ,暦が切り替わるのを忘れてたorz 指摘thx. >>28 というわけでそこだけ別にハードコーディングしといてください.
45デフォルトの名無しさん:2005/10/28(金) 17:22:54
センセイがそこまで狙って出題してるかは謎だけどな・・・
46 ◆gIPWFRjycg :2005/10/28(金) 17:41:34
>>38
ありがとうございます
ソースを見ながら考えてみます
47デフォルトの名無しさん:2005/10/28(金) 18:04:36
まあ、解く気がないんで、てけとーに書くわ。

Webサーバのネタは
ttp://www.coins.tsukuba.ac.jp/~syspro/2005/
Webサーバそのものじゃないけど。echoサーバは書いてあったはず。

pgmフォーマットの共通ライブラリとか書いてあったが、まあ・・・書け。
ヘッダ部がややこしいように感じるが、1行読み込みとsscanfを組み合わせれば楽だろう。
48デフォルトの名無しさん:2005/10/28(金) 20:10:30
>>47
甘いな。pgmはヘッダ部の改行の数を規定していない。
49デフォルトの名無しさん:2005/10/28(金) 21:25:40
>>48
>>47 が言ってるのは http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/965.cpp みたいなのでしょ.
これくらいで仕様を満たすものが書けるから楽な部類だと思うけど.
50デフォルトの名無しさん:2005/10/28(金) 21:43:23
>>6
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1023.c

不完全版
#そのリクエストファイルのヘッダーラインを表示するHTTP responseメッセージをつくる。
↑この辺の意味がわからなかったので、単にファイルを送信してみた。

デバッグ不十分。404 と 200 を各一ファイルについて確かめたのみ。
51デフォルトの名無しさん:2005/10/28(金) 23:48:41
[1] 授業単元:プログラミング演習
[2] 環境
 [2.1] OS:Linux
 [2.2] コンパイラ(バージョン):gcc
 [2.3] 言語:C
[3] 期限:11/1午後4時
[4] 問題文:与えられたデータをバブルソートで降順にソートさせるとともに、それらのメジアンを求めるプログラムを作成し、実行せよ。
ただし、プログラムは以下の仕様を満たすものとする。
<仕様>
1、データはf_gakusei[]{165,158,170,156,175]
s_gakusei[]{150,180,173,158,167,178}
の2組とし、各組に対して、ソート及びメジアンを求める。
2、ソート、及びメジアン導出それぞれについて関数を作成すること。また、
これら関数には、配列を示すポインタ及び配列の要素数を第一引数、第二引数として与えるものとする。
3、メジアン導出関数は、メジアンとなる値をmain関数に返す。また、main関数では、
ソート済みの配列とメジアンを表示させる。
<関数プロトタイプ例>
void b_sort(int *array,int count); ←バブルソート
float seek?median(int *array,int count); ←メジアン導出関数
<出力例>
Sorted data in first class
175 170 165 158 156
Median of data in first class:165 ←この値が正解とは限らない
sorted data in second class
180 178 173 167 158 150
Median of data in second class ←この値が正解とは限らない

#メジアン:データの大きさに関してちょうど中央に当たるデータのこと

以上です、どうかお願いいたします
52デフォルトの名無しさん:2005/10/29(土) 00:26:00
>>51 脳内コンパイルしかしてない
#include <stdio.h>
void swap(int *a,int *b){*a^=*b;*b^=*a;*a^=*b;}
void b_sort(int *array, int count) {
int i,j;
for(i=0;i<count-1;i++)for(j=i;j<count-1;j++)if(array[j]<array[j+1])swap(&array[j],&array[j+1]);
}
float seek_median(int *array, int count) {
if(count&1){return array[count/2];
return (array[count/2-1]+array[count/2])*0.5;
}
int main(void) {
int f_gakusei[] = {165,158,170,156,175}, s_gakusei[] = {150,180,173,158,167,178}, i, count;
count = sizeof(f_gakusei)/sizeof(f_gakusei[0]);
b_sort(f_gakusei, count); printf("Sorted data in first class\n");
for(i=0;i<count;i++) printf("%d ", f_gakusei[i]);
printf("\nMedian of data in first class:%f\n", seek_median(f_gakusei,count));
count = sizeof(s_gakusei)/sizeof(s_gakusei[0]);
b_sort(s_gakusei, count); printf("Sorted data in first class\n");
for(i=0;i<count;i++) printf("%d ", s_gakusei[i]);
printf("\nMedian of data in first class:%f\n", seek_median(s_gakusei,count));
return 0;
}
53デフォルトの名無しさん:2005/10/29(土) 02:02:02
あるソフトのバグ?を追求している過程で、問題を純化していったら
以下のC++コードの合法性が焦点となることがわかったのだが、規格書
見てもよくわかりません。誰か、これの規格合致・違反・未定義性を
指摘できませんか?

 <規格合致か違反か?>
 struct foo {} とした場合、foo::foo としてその型(struct foo)を
 表記してよい(foo でできるのは当然だが、foo::foo はありか?)

別の見方をすると

namespace foo { void hi(); }
class foo { static void hi(); }

があるとき、両方の hi() が共存することは可能か?それともエラーか?

どのコンパイラで通るって話ではなく(g++ で foo::hi() と
foo::foo::hi() で共存するのは確認済)、規格書の第何項の
どういう解釈によって合致・違反と定まるのか、という点で知りたいです。
そうじゃないと単なるコンパイラのローカル拡張とも思えるので。

規格上はクラス名は名前空間定義とほぼ等価なのだが、じゃあ
それなら上の foo::foo って foo class-scope の中の foo という
解釈になって、それは型名ではなくコンストラクタではないのかとか、
g++ が通しても本当に正しいのかちょっと悩んでます。
5453:2005/10/29(土) 02:07:17
しまった、こっちは宿題スレだった・・・

スレ違いすまん。相談室に出しなおして回線切手首釣って来ます。
55デフォルトの名無しさん:2005/10/29(土) 03:08:52
>48 んー。
sscanf()のフォーマット部分は次のようにして、
最初"%s %d %d %d" PI5 width height max
1つ充足している"%d %d %d" width height max
2つ充足している"%d %d" height max
3つ充足している"%d" max
充足するまでループ・・・とか考えてたんだわ。
行も無限長じゃなくて、70文字までとか決まってるようなので、ぼちぼち書けるでしょ。
56デフォルトの名無しさん:2005/10/29(土) 04:07:33
[1] 授業単元: プログラミング
[2] 問題文: 4以上500以下の整数で、その整数が2つの素数の和に分解できる整数を
      全て表示するプログラムを作成せよ。その際、分解した場合の2つの素数
      も表示すること。また複数の分解を持つ場合、2つの素数の差が最も小さい
      ものを表示すること。例えば10という整数を考えた場合
      10=3+7 , 10=5+5の2通りの分解があるが
      2つの素数の差が小さいのは10=5+5の方なので
      この場合は10=5+5と表示する。
[3] 環境
 [3.1] OS: WinXP
 [3.2] コンパイラ名とバージョン: lsic86NT.exe
 [3.3] 言語: C
[4] 期限: 2005年11月2日まで
[5] その他の制限: for文まで学習

よろしくおねがいします。
57デフォルトの名無しさん:2005/10/29(土) 05:08:11
>>56
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1024.txt

適当に作ってみました。ポインタの使用がまずいのであれば、
これらをすべて配列表現に直す必要があります。と言っても、
bsearch()の部分を線形探索に直すなどすればいいだけです。
58デフォルトの名無しさん:2005/10/29(土) 05:40:31
>>57
早朝からご苦労様です。ありがとうございます。
ポインタについてですがまだ習っていないのです。
C言語の授業2回目で出された課題で、1回目はコマンドプロンプトの起動方法
およびコンパイルの仕方等を学習しました。
配列表現や線形探索等初めて聞く用語で私には正直さっぱり……です。
授業2回目でハードルが急に上がったと思ってるのは私だけなのかな
これが普通なのでしたらごめんなさい。
59デフォルトの名無しさん:2005/10/29(土) 06:17:38
>>58
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1026.txt
57とは別人だが書いてみた。
素数を配列で与えるのがダメなら言ってくれ。
60デフォルトの名無しさん:2005/10/29(土) 06:27:25
>>59
ありがとうです。
問題文が言葉足らずでしたね、ごめんなさい
素数もプログラムによって求めないとだめと言われました。
61デフォルトの名無しさん:2005/10/29(土) 06:43:23
#include <stdio.h>
#include <math.h>
#define NMAX 501
void make_primelist(int*);
int main(void){
int prime[NMAX];
int i,n,x,y,fFind;
make_primelist(prime);
for(n=4 ; n<NMAX ;n++){
fFind=0;
//差が小さいのは真ん中付近なのでそこから調べる
for(x=n/2; x<n ; x++){
if(prime[x]){
y=n-x;
if(prime[y])
fFind=1;
break;
}}
if(fFind) printf("%d,%d,%d\n",n,x,y);
}
return 0;
}
62デフォルトの名無しさん:2005/10/29(土) 06:44:09
//素数なら1違うなら0
void make_primelist(int* prime)
{
int i,j,t;
//初期化
for(i=0; i<NMAX ;i++) prime[i] = 1;
t = (int)sqrt(NMAX) + 1;
//エラストテネスのふるい
for(i=2; i<t ;i++){
//もしチェック済みなら次
if(prime[i]==0) continue;
for(j=2; i*j<NMAX ;j++){
prime[i*j]=0;
}
}
prime[0]=0;prime[1]=0;
return;
}
63デフォルトの名無しさん:2005/10/29(土) 06:44:53
int tbl[500], prime[500];
int i, j, n;
for (i = 0; i < 500; ++i)
  tbl[i] = 1;
for (i = 2; i < 500; ++i) {
  if (!tbl[i]) continue;
  for (j = i*i; j < 500; j += i)
    tbl[j] = 0;
}
for (i = 2, n = 0; i < 500; ++i)
  if (tbl[i]) prime[n++] = i;
}
64デフォルトの名無しさん:2005/10/29(土) 06:46:11
ケコーン
65デフォルトの名無しさん:2005/10/29(土) 06:48:27
>>61-62
わかりやすくつくってみたよ^^;
66デフォルトの名無しさん:2005/10/29(土) 07:12:25
>>58
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1027.txt
なんか早起きしたら初めてこのスレ見たので作ってみました
配列も習ってないっぽいので問題をそのままプログラムにしたけど、
2回目の授業でこれできたらこれから大変な気がする。

もっと効率上げられるけど、余計なことはしてません。
67デフォルトの名無しさん:2005/10/29(土) 07:16:05
>>66 7=3+4 ?
6866:2005/10/29(土) 07:20:05
あう。上(a)直して下(b)直してなかった...
// bは素数か調べる。調べ方はaと一緒
flag = 0;
for(i=2;i<= b/2;i++){
for文の判定に=入れてください
6917:2005/10/29(土) 11:19:20
>>18
どうもありがとうございました。返事が遅くなってすいません。
70デフォルトの名無しさん:2005/10/29(土) 11:42:40
[1] 授業単元:プログラミング実験
[2] 問題文:
テキストファイルからデータを一行ずつ読み込み、
指定された文字列を含む表のみを行番号と共に出力するプログラムを作成せよ。

ここで、テキストファイル名、指定された文字列は入力できるようにする

 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン: cgiwin
 [3.3] 言語: C++
[4] 期限: [2005年10月31日9:00まで]
[5] その他の制限:前回の授業でメンバ関数cin.getとgetlineを習ったのでその応用だと思うのですが、
キャラ型で使えたwhile ((str=fin.get(word)) !EOF)みたいなメンバがストリングだと使えないらしく
(使い方が間違ってるのかもしれませんが)四苦八苦しております。
書き出しは
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()

の形です。
71デフォルトの名無しさん:2005/10/29(土) 12:54:51
>>演算子って習わんの
72デフォルトの名無しさん:2005/10/29(土) 13:12:41
>>71 skipws とか教えるのは面倒でしょ
73デフォルトの名無しさん:2005/10/29(土) 13:21:48
>>70
適当に書いてみた

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
string filename,search_string;
cout << "入力ファイル名 : " ;cin >> filename;
cout << "検索文字列 : "; cin >> search_string;
string line;
fstream strm(filename.c_str());
for(int i=0;getline(strm,line);++i)
if(line.find(search_string) != string::npos)
cout << i << ": " << line << endl;
}
74デフォルトの名無しさん:2005/10/29(土) 13:28:04
>>73
うわっ俺の書いたのとほとんど同じだ。
75デフォルトの名無しさん:2005/10/29(土) 14:45:37
>>73
どうもありがとうございます!しっかり作動しました。
strmをfinに書き換えてみましたが問題は無さそうです。
forの中にメンバ関数入れても平気なんですね。
あとlinefindもテキストには書いてなかったですが、講義資料の末尾に書かれてました。
7659:2005/10/29(土) 14:55:09
>>60
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1028.txt
必要ないかもしれないが一応書いてみた。
7756:2005/10/29(土) 16:54:24
みなさん本当にありがとうございます。
とても分かりやすい解説まで付けてくれた方もいて
本当に助かりました。何度も修正してくれたりご苦労様です。
私の問題についてはこれで解決という形で終了させてください。
最後に本当にありがとうです。
78デフォルトの名無しさん:2005/10/29(土) 17:21:48
>>75
>strmをfinに書き換えてみましたが問題は無さそうです。
なんで変数名が動作に影響を与えるなんて発想が出てくるんだ
79デフォルトの名無しさん:2005/10/29(土) 19:14:22
[1] 授業単元: 情報特講
[2] 問題文(含コード&リンク):
キーボードから年月を入力し、その月のカレンダーを作成しなさい。
また、月の入力が0であるときは1年分3ヶ月ずつ横に出力する。
年号は西暦で1900年から2100年の間のみ指定する。
さらに、閏年は4の倍数で100の倍数でない年。
ただ、400の倍数は閏年となる。
また、1900年1月1日は月曜日である。また、関数は1つ以上使用すること。

出力例 :
年 : 1994
月 : 3

=== 1994 3月 ===
日 月 火 水 木 金 土
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: bcc
 [3.3] 言語: C
[4] 期限: 2005年10月31日12:00まで
[5] その他の制限: 特にはありません。
よろしくおねがいします。
80デフォルトの名無しさん:2005/10/29(土) 19:18:58
>>79
似たような問題がこのスレにあるから改造なさい
81デフォルトの名無しさん:2005/10/29(土) 20:04:13
>>80
>>28ですよね。一年分を出力する所まではできたのですが、
一年分出力する 部分がどうしてもわからないんです。
ttp://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/c/tutorial/t02h.html
一か月分は↑ここで見つけました。
どうか、おねがいします。
82デフォルトの名無しさん:2005/10/29(土) 20:58:28
いつも思うのだが、うるう年の説明はややこしい。

順番代えただけだが、次のような説明のほうがわかりやすくないか?
1)400で割り切れる年はうるう年
2)1に当てはまらなく、100で割り切れる年は平年
3)1、2に当てはまらなく4で割り切れる年はうるう年
83デフォルトの名無しさん:2005/10/29(土) 21:04:44
400年に1度しかないのにそんな前面に出して主張されてもな、遭遇する価値がほとんど無い。
現代人は稀有で2000年を体験したが。
84デフォルトの名無しさん:2005/10/29(土) 23:08:52
85デフォルトの名無しさん:2005/10/30(日) 10:18:27
>>84
ずいぶん遅くなりましたが、本当にありがとうございました。
相当難しいですけれど、頑張ってみます。
86デフォルトの名無しさん:2005/10/30(日) 11:33:10
>82
地球の公転周期の近似365.2422日≒365+1/4-1/100+1/400

4年に一度うるう年
でも西暦が100で割り切れる年はうるう年としない
但し400で割り切れる年はうるう年とする

で結構
87デフォルトの名無しさん:2005/10/30(日) 16:54:10
もうめんどくさいから、1900年から2100年までは4年に一度閏年ってことでいいよ。
88デフォルトの名無しさん:2005/10/30(日) 17:02:13
>>87
2000年が違う。
89デフォルトの名無しさん:2005/10/30(日) 17:02:50
あっ、逆だわ、1900年と2100年が違う。
90デフォルトの名無しさん:2005/10/30(日) 17:25:48
訂正、1901年から2099年まで……
91デフォルトの名無しさん:2005/10/30(日) 18:45:49
みんな、うるう年のことになると語るねぇ!
92デフォルトの名無しさん:2005/10/30(日) 18:52:39
zellerの公式
93デフォルトの名無しさん:2005/10/30(日) 21:06:08
>>92
これが過去のある年代を超えると通用しなくなるんだよな。
なんでだったかな?
94デフォルトの名無しさん:2005/10/30(日) 21:16:19
>>93
その「過去のある年代以前」を考えに入れてないからだろ。
95デフォルトの名無しさん:2005/10/30(日) 21:21:45
>>93
そもそも暦が連続してないから
96デフォルトの名無しさん:2005/10/30(日) 21:22:23
いまいち面白くないなぁ
97デフォルトの名無しさん:2005/10/30(日) 21:26:23
>>96
鏡でも見てみろ 面白いものが写るぜ
98デフォルトの名無しさん:2005/10/30(日) 21:27:24
>>95
>>93です。詳しく!
99デフォルトの名無しさん:2005/10/30(日) 21:29:04
>>97
君の場合は面白いものが写るのか…ドンマイ!
100デフォルトの名無しさん:2005/10/30(日) 21:31:04
日本で西暦が適用されたのが1800年代だからとかか?
101デフォルトの名無しさん:2005/10/30(日) 21:31:51
いまいち面白くないなぁ
102デフォルトの名無しさん:2005/10/30(日) 21:38:50
>>95
>>93です。調べてたらその理由がわかりました。
どうもありがとうございました。
103デフォルトの名無しさん:2005/10/30(日) 22:01:45
厳密に解釈するなら、国コードを見て暦を変えないといけないわけだ。
だからめんどいから1901年かr(以下略
104デフォルトの名無しさん:2005/10/30(日) 22:15:56
グレゴリオ暦→1582→現代
105デフォルトの名無しさん:2005/10/30(日) 22:26:37
うーん雑学本で年表の比較が載ってる本が出版されてた気がするんだが。
いや、ほんの一部じゃなくって、主題がそれって本なんだが・・・一度読んでみたかった。
106デフォルトの名無しさん:2005/10/30(日) 23:45:39
>>104
英国がやや遅れて、ロシアが大幅に遅れて採用したので一概に1582年とは言えない罠。
107デフォルトの名無しさん:2005/10/30(日) 23:59:25
[1] 授業単元:プログラミング
[2] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語:C
[4] 期限: 2005/10/30/14:30

1.fork()を使って子プロセスを2つ生成するプログラム

fork()を2回使えばいい話だろって思ってたんですが
どうも1つの子からしか返事が返って来ないプログラムしか書けません
108デフォルトの名無しさん:2005/10/31(月) 00:00:24
↑の期限は10/31/14:30です、すみません。
109デフォルトの名無しさん:2005/10/31(月) 00:04:32
>>107
そのプログラムを晒して味噌。
110デフォルトの名無しさん:2005/10/31(月) 00:09:13
>>107
>fork()を2回使えばいい話だろって思ってたんですが 
>どうも1つの子からしか返事が返って来ないプログラムしか書けません 


111デフォルトの名無しさん:2005/10/31(月) 00:12:56
>>107
fork()って何?
112デフォルトの名無しさん:2005/10/31(月) 00:18:48
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(void){
pit_t ch1;
pit_t ch2;

if(!(ch1=fork())){
printf("I am child 1.\n");
exit(0)
}
if
if(!(ch2=fork())){
printf("I am child 2.\n");
exit(0)
}
printf(child 1 ID is %d\n,ch1);
printf(child 2 ID is %d\n,ch2);
}
113デフォルトの名無しさん:2005/10/31(月) 00:25:13
↑すみません、手打ちでカキコしたので””とかreturnとか抜けました

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(void){
pit_t ch1;
pit_t ch2;

if(!(ch1=fork())){
printf("I am child 1.\n");
exit(0)
}
if(!(ch2=fork())){
printf("I am child 2.\n");
exit(0)
}
printf("child 1 ID is %d\n",ch1);
printf("child 2 ID is %d\n",ch2);
return 0;
}
114aaa:2005/10/31(月) 00:25:20
国語の教育方針(?)の中に語句の効果的な用い方について
「文中の効果的な表現を味わい、自らの言語生活に役立てることができる。」
というのがあったんですけど、自らの言語生活に役立たせられるものって何かありますか?
効果的な語句っていうのは、例えば
蝉しぐれ(抄)で「蝉が鳴いている」っていうのが2回でてきます。
これは単に夏って言う事をあらわしているんじゃなくて、文四郎が幸せな時に
蝉は鳴きます。で、題名も・・・という風に(わかりづらくてすいません)奥の
深い(?)語句とか、表現のコトです。
115デフォルトの名無しさん:2005/10/31(月) 10:27:54
[1] 授業単元:プログラミング演習U
[2] 問題文:
5桁以下の文字(数字を除く)と、5桁以下の数字からなる文字列(例えば TARO1970)を入力し(必ず、
文字の固まりの次に数字の固まりがあると仮定する)、これを分解して、文字部分を文字配列へ、
数字部分を整数型の変数へ格納して、それぞれを出力するプログラムを書け。
但し、文字列の分解にはポインタ変数を使用すること。

ヒント1:文字変数 ch が文字か数字かの区別は、例えば、
(ch < '0') || (ch > '9')
が成り立てば、文字であることを利用すれば良い。

ヒント2:文字列の内容をポインタ変数を用いて走査するには、例えば、次のような方法がある。
char *ptr;
...
ptr の初期化(文字列の先頭アドレスを代入)
while(*ptr != '\0'){/* 文字列の最後の'\0'文字となるまで以下を繰り返す */
...
ptr++; /* 次の文字を指すアドレスとする */
}

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:11/3まで
[5] その他の制限:配列とポインタ、ポインタと文字列、動的メモリの確保の方法まで習いました。

どなたかご教授お願いします。
116デフォルトの名無しさん:2005/10/31(月) 12:09:49
こんなんじゃダメっすかね(´・ω・`)
#include <stdio.h>
int main(){
char input_str[20], *ptr;
char str[10], *s_p;
char integer[10], *i_p;

printf("文字列を入力してください\n");
scanf("%s", input_str);

ptr = input_str;
s_p = str;
i_p = integer;

while(*ptr != '\0'){
if ((*ptr >= '0') && (*ptr <= '9')){
*i_p++ = *ptr++;
} else {
*s_p++ = *ptr++;
}

}
*s_p = '\0';
*i_p = '\0';
printf("%s\n%s\n", str, integer);
return 0;
}
117デフォルトの名無しさん:2005/10/31(月) 12:16:43
[1] 授業単元:プログラミングII
[2] 問題文(含コード&リンク):
main関数にある3つのint変数a,b,cの値を順に入れ替えることを
値を順に入れ替える関数rotateを呼び出すことにより実現せよ。
例えばa=5,b=4,c=3をa=3,b=5,c=4と出ればよい
[3] 環境
 [3.1] OS:UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 11月2日まで
[5] その他の制限: 特になし
よろしくおねがいします
118デフォルトの名無しさん:2005/10/31(月) 12:30:26
#include <stdio.h>

void rotate(int *a, int *b, int *c){
int temp;
temp = *c;
*c = *b;
*b = *a;
*a = temp;
}

int main(){
int a = 5, b = 4, c = 3;
rotate(&a, &b, &c);
printf("a=%d b=%d c=%d\n", a, b, c);
return 0;
}
119115:2005/10/31(月) 14:18:59
>>116
hello.c: In function `main':
hello.c:15: error: `lt' undeclared (first use in this function)
hello.c:15: error: (Each undeclared identifier is reported only once
hello.c:15: error: for each function it appears in.)
hello.c:15: error: syntax error before ';' token

というエラーが出るのですが。
どこを直したらいいのでしょうか?
120デフォルトの名無しさん:2005/10/31(月) 16:22:38
[1]プログラミング演習
[2]8王妃問題を解くプログラムを作成せよ
[3.1]2000
[3.2]VC6.0
[3.3]C
[4]11月中
[5]途中まで作ったのが

int PrintBoard(int no,int bd[])
{
int i,j;
printf("%d個目の解は\n",no);
for(i=1;i<=8;i++){
for(j=1;j<=bd[i]-1;j++){
printf(" .");
}
printf(" Q");
for(j=bd[i]+1;j<=8;j++){
printf(" .");
}
printf("\n");
}
printf("\n");
return 0;
}

121120:2005/10/31(月) 16:23:38
int Check(int i,int bd[])
{
int j;
for(j=1;j<=i-1;j++){
if(bd[i]==bd[j]){
return 0;
}
else if(bd[i]+i==bd[j]+j){
return 0;
}
else if(bd[i]-i==bd[j]-j){
return 0;
}
}
return 1;
}

です。あとはこれを使ってうまく組み立てたいのですが…
よろしくお願いします。
122英文でのお願い:2005/10/31(月) 18:34:54
[1] 授業単元:C++
[3] 環境
 [3.1] OS: Unix
 [3.2] コンパイラ名とバージョン: g++
 [3.3] 言語: c++
[4] 期限: 2005/11/1 12:00
[5] その他の制限: 長い英文の問題ですがどうかよろしくお願いします
[2] 問題文(含コード&リンク):
In this section you are asked to create a class definition for a data-type called Rational
that will store and operate on rational numbers that can be represented as the quotient of two integers.
For example, 1/2, 1/3, etc. Notice that the rational number 1/2 doesn't mean the integer division of 1 and 2,
but it is expressed as a fraction including both digits.
You will be writing functions to add, subtract, multiply and divide rational numbers,
so you may want to review those operations.
NOTE: For simplicity, we will not require you to reduce the results of these arithmetic operations. That will be an extra credit option.


 
123デフォルトの名無しさん:2005/10/31(月) 18:36:16
>>122
せめて和訳しろ。機械翻訳に掛けてもなんか変。
124英文でのお願い:2005/10/31(月) 18:36:45
The functions for this class are listed below.
NOTE: Please read the descriptions closely.
We have specified a variety of class, friend, and non-member (global) functions
to give you a wider range of experience in working with classes.
Also, for each function, we are listing the parameters, return value and action.
The functions you will be creating in this lab are fairly standard functions
that you might include in a variety of classes. Future lab descriptions
(and possibly test questions) will assume that you are familiar with
the standard way of defining these member functions.
For example, a future lab might say to include a 2-parameter constructor,
and you would be expected to know that means that it will have two parameters
that are used to set the two data members of the class.

125デフォルトの名無しさん:2005/10/31(月) 18:38:35
>>122
先に
だれか英語翻訳すれ(ッド) inム板
http://pc8.2ch.net/test/read.cgi/tech/1102768288/
こっちに行ってきたら?
126124:2005/10/31(月) 18:39:27
英語のわからない無能には聞いていません。
どうか英語とプログラミングの両方分かる方お願いします。。
127デフォルトの名無しさん:2005/10/31(月) 18:39:57
気に入らない質問やその他や発言はスルーの方向で。
128デフォルトの名無しさん:2005/10/31(月) 18:40:58
>>126は偽者だな
124はsageできるほど賢くない
129英文でのお願い:2005/10/31(月) 18:41:13
1.Default constructor. Parameters: none. Return: none allowed. Action: sets both data members to 1.
Constructors MUST be member functions.

2.2-parameter constructor. Parameters: correspond to numerator and denominator data values.
Return: none. Action: sets data members based on parameters.

3.Accessor for the numerator data member. Parameters: none needed.
Return: value of data member. Action: just a return statement. Must be a member function.

4.Accessor for the denominator data member. Same as above.

5.Overloaded >> operator. Parameters: must take an istream (always passed by reference) and an object of type Rational that is passed by reference (why?).
Return: istream, to allow statements such as: cin >> rational1 >> rational2;
Action: prompts user for input, accepts and stores values in Rational object.
CHECK IF DENOMINATOR IS NOT ZERO. Make this a non-member (global) function.

6.Overloaded << operator. Parameters: takes an ostream (also passed by reference) and an object of type Rational that ispassed by value.
Return: ostream, to allow statements such as: cout << rational1 << endl; or cout << rational1 << rational2;
Action: prints member variables in form numerator/denominator (e.g., 3/4). Make this a friend function.
130デフォルトの名無しさん:2005/10/31(月) 18:41:31
>>128
ワラタ
確かに。
131デフォルトの名無しさん:2005/10/31(月) 18:43:33
単純に一般的な有理数クラスを設計しろってだけだろ?
132英文でのお願い:2005/10/31(月) 18:45:33
7.Overloaded + operator. Parameters: takes 2 Rational objects. Return: the resulting Rational object.
Action: Add the values from the two Rational objects. This is a non-member (global) function, so it has two explicit parameters.
You must use accessors and constructors to get/modify data values.A temporary object of type Rational must be declared inside the function. The data values of this new object must be set appropriately, then this object is returned.
8.Overloaded - operator. Parameters: takes 1 Rational object. Return: the resulting Rational object.
Action: Subtract the second parameter from the first. NOTE: this is a member function, which means that one object is the "calling" or "invoking" object, the other is the parameter.
Example (assume objects previously declared): rational3 = rational1 - rational2;
will use the data from rational1 as the "calling" object, the data from rational2 will be accessed via the parameter.
Extra requirement: display a message that says "Overloaded - operator called."
The purpose of this message is just to help you understand when the overloaded - operator is called.
9.Overloaded * operator. Parameters: takes 2 Rational objects. Return: the resulting Rational object.
Action: Compute the product of the two objects.
This is a friend function, so although it takes two parameters and is not a member function, it does have access to the private data members.
Although you could use accessors, to show that you understand a friend function, DO NOT use accessors in this function.
10.Overloaded / operator. Same as overloaded * operator.
11.Overloaded == operator. Parameters: takes 2 Rational objects.
Return: true if the two objects are equal (have same values for both data members, again we won't worry about reducing), false otherwise.
NOTE: use the boolean values true and false, do NOT return 0 and 1. Action: compares data values. This is a non-member (global) function.
133英文でのお願い:2005/10/31(月) 18:47:07
To test all of your functions, your main program should do the following:
1.Using the default constructor for the Rational class, declare two variables called fraction1 and fraction3.
2.Use the overloaded << operator to display fraction1. NOTE: For all displays, include a label so you can tell what's being displayed.
3.Declare four values of type int called numerator1, numerator2,denominator1 and denominator2.
4.Prompt the user to input two integer values, then accept (on one line) numerator1 and denominator1.
5.Set numerator2 to 1 and denominator2 to 5.
6.Use the two-parameter constructor to declare a variable called fraction2 and give it the values of numerator2 and denominator2.
7.Use the two-parameter constructor to set the values of fraction1 to numerator1 and denominator1.
8.Use the overloaded >> operator to input values for fraction3.
9.Use the overloaded << operator to display fraction1and then fraction3.
10.Use the overloaded == operator to determine whether fraction1 and fraction3 are equal. Display an appropriate message.
134英文でのお願い *最後です*:2005/10/31(月) 18:48:04
11.Calculate and display the difference of numerator1 and numerator2. What version of - did this use?
12.Set fraction3 equal to the difference of fraction1 and fraction2. What version of - did this use? Display fraction3.
13.Set fraction3 equal to the sum of fraction1 and fraction2. Display fraction3.
14.Set fraction3 equal to the product of fraction1 and fraction2. Display fraction3.
15.Set fraction3 equal to fraction1 / fraction2. Display fraction3.

135デフォルトの名無しさん:2005/10/31(月) 18:49:10
有理数クラスを作れ
答:めんどくさい
136デフォルトの名無しさん:2005/10/31(月) 19:35:13
[1] 授業単元:情報科学
[2] 問題文: 重みの付いたトポロジカルソートの最大/最小ディレイパスを求めるプログラムの作成。
[3] 環境
 [3.1] OS:UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 11月1日まで

途中までググりつつやってみました。
#include <stdio.h>
#define N 8
int a[N+1][N+1]={{0,0,0,0,0,0,0,0,0},
{0,0,0,3,0,0,0,0,0},
{0,4,0,0,0,2,0,0,0},
{0,0,0,0,5,0,0,2,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,3,0,0},
{0,0,0,0,0,0,0,2,4},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,5,0}};
137136のつづきです:2005/10/31(月) 19:35:57
int v[N+1];
void visit(int);

int main(void)
{
int i;

for(i=1; i<=N; i++)
v[i]=0;
for(i=1; i<=N; i++)
if(v[i]==0)
visit(i);
}
void visit(int i)
{
int j;
v[i]=1;
for(j=1; j<=N; j++){
if(a[i][j]!=0 && v[j]==0)
visit(j);
}
printf("%d ",i);
}
138デフォルトの名無しさん:2005/10/31(月) 21:00:48
>>122
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1030.cpp

# なぜ問題が英文なのかぜひ聞きたいでつ
139デフォルトの名無しさん:2005/10/31(月) 22:34:01

[1] 授業単元: 基本プログラミング
[2] 問題文(含コード&リンク):
最大でmグラムまで入れることが出来る袋に以下にあげる3種類の商品を、最も高い組み合わせで入れたい。
その組み合わせを出力するプログラムを作成せよ。複数組み合わせがある場合、1つ出せばよいものとする。
商品a(240g\130) b(550g\335) c(850g\540)

[3] 環境
 [3.1] OS: windowsXP
 [3.2] コンパイラ名とバージョン: 不明
 [3.3] 言語: C++
[4] 期限: [2005年11月2日9:00まで]
[5] その他の制限:条件分岐、繰り返し制御までしか使えません。

forで全パターンを求めつつ、ifで比べて…みたいなことくらいまでは分かったのですが
その先がさっぱりです…。
140デフォルトの名無しさん:2005/10/31(月) 22:40:17
いわゆるナップサック問題
141デフォルトの名無しさん:2005/10/31(月) 22:44:06
[1] 授業単元:プログラム演習
[2] 問題文(含コード&リンク):5個の整数を入力し、その要素の最大値と最小値を出力するプログラムを作りなさい。
但し、5個の整数を入力する関数(入力関数)と最大値と最小値を求める関数(最大・最小値サーチ関数)を作り、
main関数ではその2つの関数を呼び出すようにしなさい。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語:C
[4] 期限: 2005年11月2日の正午まで
5] その他の制限: 配列とポインタを習ったところです

ポインタに入った途端ちんぷんかんぷんです・・・
よろしくおねがいします
142デフォルトの名無しさん:2005/10/31(月) 23:10:38
>>118
サンクストンクスです
143122:2005/11/01(火) 02:09:27
>>138さんありがとうございます。
英文な理由は、講師がインド人だからとしか答えようがありません。
講義とった当初からずっと問題が英文でした。
144デフォルトの名無しさん:2005/11/01(火) 06:13:11
>>139 アルゴリズムの指示が無いので DP.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1031.cpp
145デフォルトの名無しさん:2005/11/01(火) 06:16:38
もし同じ商品は一度しか詰め込んではいけないなら,38行目からの
if (k - w[i-1] >= 0 && tbl[i][k] < tbl[i][k-w[i-1]] + p[i-1]) {
  tbl[i][k] = tbl[i][k-w[i-1]] + p[i-1];
  prev_i[i][k] = i;
  prev_k[i][k] = k-w[i-1];

if (k - w[i-1] >= 0 && tbl[i][k] < tbl[i-1][k-w[i-1]] + p[i-1]) {
  tbl[i][k] = tbl[i-1][k-w[i-1]] + p[i-1];
  prev_i[i][k] = i-1;
  prev_k[i][k] = k-w[i-1];
に変更.
146デフォルトの名無しさん:2005/11/01(火) 06:56:41
>>141
#include <stdio.h>

int get_max(const int *iNum, const int size)
{
    int num_max;
    int i;

    num_max=iNum[0];
    for (i=0 ; i<size ; i++)
    {
        if (num_max<iNum[i])
        {
            num_max=iNum[i];
        }
    }

    return num_max;
}

int get_min(const int *iNum, const int size)
{
    int num_min;
    int i;

    num_min=iNum[0];
    for (i=0 ; i<size ; i++)
    {
        if (num_min>iNum[i])
        {
            num_min=iNum[i];
147デフォルトの名無しさん:2005/11/01(火) 06:57:12
        }
    }

    return num_min;
}

void input(int *iNum, const int size)
{
    int i;

    for (i=0 ; i<size ; i++)
    {
        scanf("%d", &iNum[i]);
    }
}

int main()
{
    int iNum[5];
    int num_min, num_max;
    const int size=5;

    input(iNum, size);

    num_min=get_min(iNum, size);
    num_max=get_max(iNum, size);

    printf("MIN:%d\n", num_min);
    printf("MAX:%d\n", num_max);

    return 0;
}
148C言語です。:2005/11/01(火) 10:29:46
VIPPERスレでも聞いたんですが,
時間がないのでこちらでもきいていいですか?
マルチですいません。

•キーボードから任意の整数を2個入力し,その入
力データの平均値(小数点以下切り上げ)に相当
する数の‘#’の文字を表示するプログラムを作
成せよ.
• ‘#’の表示個数は5までを限度とし,5を越える時
には"ERROR"の文字を表示をさせるようにせよ.
•プログラムの確認用データは以下の2つとする.
–3,3 → この場合# は3 個になる
–3,4 → この場合# は4 個になる

↑学校の課題で出されたものです。
明日までに解かなくてはいけないんですが,
僕にはできませんでした。簡単な問題だとは思いますが,
皆さんの力を貸してください( ^ω^)
149デフォルトの名無しさん:2005/11/01(火) 10:33:42
>>148
駄目です。VIPPERスレに引きこもっててください。
150デフォルトの名無しさん:2005/11/01(火) 10:35:18
[1] 授業単元:プログラム演習
[2] 問題文:どんな物でもいいからvlookupで構造体を作成。
[3] 環境
 [3.1] OS:windowsxp
 [3.2] コンパイラ名とバージョン:不明
 [3.3] 言語: C
[4] 期限: 2005年11月2日まで
[5] その他の制限: 無制限。

ソートでなくvlookupで構造体を作れと言われさっぱりです・・
よければ、ご協力願います
151136:2005/11/01(火) 11:16:37
重みをどの位置で加算するかが分かりません。
ヒントだけでもいいので何か閃きましたらお願いします。
152デフォルトの名無しさん:2005/11/01(火) 11:51:37
>>150
いや、仮令ソートで構造体を作れと言われても私らには理解できませんから。
もう少し課題の背景と詳細を書いてみてはどうか。
153デフォルトの名無しさん:2005/11/01(火) 13:22:17
>>150
vlookupって何?詳しく説明せよ。
154デフォルトの名無しさん:2005/11/01(火) 15:18:06
>>136 重みの付いたトポロジカルソートって?そのディレイパスって?言葉をきちんと定義してください.
155デフォルトの名無しさん:2005/11/01(火) 15:24:22
何か最近、丸投げそのものの質が落ちてきたな。
質問の内容が曖昧過ぎて、答えられませんがな(´・ω・`)
156デフォルトの名無しさん:2005/11/01(火) 15:42:40
>>148
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int average;
    int input1, input2;
    int i;

    scanf("%d", &input1);
    scanf("%d", &input2);

    average=(input1+input2)/2;

    if (average*2 < input1+input2)
    {
        average+=1;
    }

    if (average>5)
    {
        printf("ERROR\n");
        return EXIT_FAILURE;
    }

    for (i=0 ; i<average ; i++)
    {
        printf("#");
    }
    printf("\n");
157デフォルトの名無しさん:2005/11/01(火) 15:43:10
    return EXIT_SUCCESS;
}
158デフォルトの名無しさん:2005/11/01(火) 15:51:46
幼稚なコードだな
159156:2005/11/01(火) 16:08:56
ceilを使えってことですね?
>>158先生ご指摘ありがとうございます
160デフォルトの名無しさん:2005/11/01(火) 16:16:22
>>146
ありがとうございます
なんとか理解できるようがんばってみます
161デフォルトの名無しさん:2005/11/01(火) 16:44:13
>>160
こっちを提出した方が自力でやったっぽくていいかも
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1035.txt
162デフォルトの名無しさん:2005/11/01(火) 17:20:58
[1] 授業単元:プログラム演習&情報数学
[2] 問題文(含コード&リンク):
隣接行列を入力して、連結かどうかを判定するプログラムを作成せよ。
連結かどうかの判定は、隣接行列をA、 位数(頂点の数)をmとしたとき、
A+A^2+…+A^(m-1) の成分に0があるものが連結ではないと言える。

[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年11月3日まで
[5] その他の制限: 特に無し

以上の内容なのですが、分かる方がいましたら教えてください。
よろしくお願いします。
163デフォルトの名無しさん:2005/11/01(火) 17:24:50
>>162
ちょっと用語がおかしいかも知れないが、ホップ数m-1以下で
到達する経路の無い奴が有るかどうか調べろってこと?

とりあえず行列のn乗返す関数作ってくる
164162:2005/11/01(火) 17:32:38
>>163
はい、そういう意味の問題です。
165デフォルトの名無しさん:2005/11/01(火) 17:56:36
>>162 163 じゃないけどさくっと書いちゃったのでうp
#include <stdio.h>
#define m 5
int main() {
  int i, j, k, l;
  int A[m][m], B[m][m], C[m][m], tmpB[m][m];
  /* 初期化 (C: 0,B: 単位行列) */
  for (i = 0; i < m; ++i) {
    for (j = 0; j < m; ++j) 
      A[i][j] = B[i][j] = C[i][j] = 0;
    B[i][i] = 1;
  }
  /* 連結してるところを 1 ,その他を 0 に設定 */
  A[0][1] = A[0][2] = A[2][3] = A[3][4] = A[3][1] = A[4][2] = 1;
166デフォルトの名無しさん:2005/11/01(火) 17:59:36
  for (l = 1; l <= m-1; ++l) { /* C = sum_k A^k */
    for (i = 0; i < m; ++i) 
      for (j = 0; j < m; ++j) 
        for (k = 0, tmpB[i][j] = 0; k < m; ++k)
          tmpB[i][j] += B[i][k] * A[k][j]; /* B = A^k は前の値を使って計算 */
    for (i = 0; i < m; ++i) 
      for (j = 0; j < m; ++j) 
        B[i][j] = tmpB[i][j], C[i][j] += B[i][j];
  }
  for (i = 0; i < m; ++i) 
    for (j = 0; j < m; ++j) 
      if (C[i][j] == 0) 
        printf("%d -> %d cannot approve\n", i, j);
}

オーダーは for 文を数えればわかるように O(V^4).
Floyd Warshall あたりを使えば O(V^3) でできるはずなので,不利なアルゴリズムと思う.
167165:2005/11/01(火) 18:02:00
>>165 コメントがミスリーディングだった.C = sum_k A^l.
168165:2005/11/01(火) 18:03:11
>>167 C = sum_l A^l 俺氏ね
169デフォルトの名無しさん:2005/11/01(火) 18:18:11
>>120
#include <stdio.h>
#define BOARD_SIZE (8)
#define GET_BIT(val, pos) (((val)>>(pos))&1)
#define SET_BIT(val, pos) ((val)|(1<<(pos)))

int     count;

void print_board(unsigned board)
{
  int   i, j;
  printf("NO.%d\n", ++count);
  for (i = 0; i < BOARD_SIZE; i++) {
    for (j = 0; j < BOARD_SIZE; j++) {
      printf(" %c", (((board >> (3 * j)) & 007) == i) ? 'Q' : '.');
    }
    puts("");
  }
  puts("");
}

void try(unsigned board, unsigned flg_l_r, unsigned flg_ul_lr,
         unsigned flg_ur_ll, int column)
{
170デフォルトの名無しさん:2005/11/01(火) 18:18:53
  if (column == BOARD_SIZE) {
    print_board(board);
  } else {
    int line;
    for (line = 0; line < BOARD_SIZE; line++) {
      if (!GET_BIT(flg_l_r, line)
          && !GET_BIT(flg_ul_lr, line - column + BOARD_SIZE - 1)
          && !GET_BIT(flg_ur_ll, line + column)) {
        try(board | (line << (3 * column)),
            SET_BIT(flg_l_r, line),
            SET_BIT(flg_ul_lr, line - column + BOARD_SIZE - 1),
            SET_BIT(flg_ur_ll, line + column),
            column + 1);
      }
    }
  }
}

int main(void)
{
  try(0, 0, 0, 0, 0);
  return 0;
}
171デフォルトの名無しさん:2005/11/01(火) 18:49:12
>>162
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1036.txt
ちんたらやってる内に165が解いてくれたようだが、折角書いたのでうp
まだ独学でCやり始めて半年ほどだから見苦しいし無駄が多いと思うが・・・_| ̄|○
172デフォルトの名無しさん:2005/11/01(火) 19:52:33
c言語検定1級の宿題ってここで聞いてもいいですか?
173デフォルトの名無しさん:2005/11/01(火) 19:57:07
ここで聞いてみてダメなようだったらC言語なら俺に聞けスレで事情を説明して再度聞けばいいのでないのかな
174デフォルトの名無しさん:2005/11/01(火) 20:10:20
>>173どうもありがとうございます。長いですがお言葉に甘えて

[1] 授業単元: c言語検定一級

[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm? の52代目スレのNO.1037です

1、規模拡張に伴い、システムのリプレースを行う。

2、会員数を400人に増やす。

3、同業他社との競争のため、DMの専用印刷機を購入済みである。

4、DM専用印刷機はCSV形式のデータを使っている。
  内容は、郵便番号、住所、氏名、会員番号、備考であり、備考は空の場合もある。

5、DMは誕生日の月とトレーニング30回ごとに優待サービスとして発送する。
  (例)10月誕生日の人は、8月末に発送するので、原則25日に処理を行う。
  システムはPC1台で行うことはすでに決定している。
  DM専用印刷機とのデータ交換はFDで行う。

6、退会者の一覧を画面で参照したい。表示項目は
  退会日、  会員コード、  測定回数、  初回日付、  初回データ、  最高記録日付、
  最高記録データ、  最新測定日付、  最新測定データ、  測定データ(1〜9回前)。

7、表示がカタカナになっており、見にくいので、漢字に変更してほしい。

[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: VC 6.0
 [3.3] 言語: C
[4] 期限: [2005年11月13日まで]
[5] その他の制限: 自分の受け持ちが4,5なので出来ればそこだけでもおねがいします
175 ◆G2NM99TIzo :2005/11/01(火) 23:12:52
[1] 授業単元:ソケットプログラミング
[2] 問題文(含コード&リンク):
作るプログラムは2台のPC間でUDPソケットをオープンした後、
送信側は、音声を録音→そのファイルをG711エンコード→RTP送信する。
受信側は、RTP受信→G711デコード→音声の再生。
という流れです。
ftp://ftp2.ohmsha.co.jp/link/4-274-06559-6/sip_voip_sample.tar.gz
リンク先のアーカイブ内にある、sound.c、sound.h、codec.c、codec.h、
rtp_ctrl.c、rtp_ctrl.hの関数を使い、送信と受信のsend.cとreceive.cの
2つのプログラムを作る。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C言語
[4] 期限:2005年11月5日まで
[5] その他の制限:
sound.h等のヘッダファイルはソースに組み込んで使う、
SIPは使用しない(?)

シンプルな物ができそうな気がするのですが、うまくできないので
どなたか詳しい方よろしくお願いします。
17651:2005/11/02(水) 12:56:32
52を実行してみたのですが、
src11-2.c: 関数 `seek_median' 内:
src11-2.c:26: 入力の最後に 構文解析エラー
ってなってしまって、どこをなおせばいいのでしょうか?
177デフォルトの名無しさん:2005/11/02(水) 13:16:38
[1] 授業単元:計算機概論
[2] 問題文:
h1時m1分s1秒からh2時m2分s2秒までは何時何分何秒になるかを計算するプログラムを作ってみましょう。
最も簡単な方法は、全部を秒に換算して引き算し、その結果を時分秒に戻せばよいのですが、
今回はif文の練習ですから
    s2からs1を引いてみる
    もし負になるならば60を加え、m2から1を引く
    m2からm1を引いてみる
    もし負になるならば60を加え、h2から1を引く
といった手順で計算してみてください。

また、始めの時間より終わりの時間のほうが早い場合はエラーメッセージを表示してください。

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):わかりません
 [3.3] 言語:C
[4] 期限:11/8まで
[5] その他の制限:「整数の計算と入出力」「実数の計算と出入力」だけ習いました。

ほんと初歩の初歩で申しわけありません。ド文系なものでw一応2時間以上考えたんですけどうまくいかなくて・・・。 よろしくお願いします。
178デフォルトの名無しさん:2005/11/02(水) 13:36:39
int h1, m1, s1 ;
int h2, m2, s2 ;
int h3, m3, s3 ; // 結果格納用

// 中略 適当にh1 m1 s1 h2 m2 s2 に設定する

s3 = s2 - s1 ;
if ( s3 < 0 ) {
s3 += 60 ;
--m2 ;
}
m3 = m2 - m1 ;
if ( m3 < 0 ) {
179178:2005/11/02(水) 13:39:04
すまん、途中で送信してもうた

int h1, m1, s1 ;
int h2, m2, s2 ;
int h3, m3, s3 ; // 結果格納用

// 中略 適当にh1 m1 s1 h2 m2 s2 に設定する

s3 = s2 - s1 ;
if ( s3 < 0 ) {
s3 += 60 ;
--m2 ;
}
m3 = m2 - m1 ;
if ( m3 < 0 ) {
m3 += 60 ;
--h2 ;
}
h3 = h2 - h1 ;
if ( h3 < 0 ) {
printf( "エラー\n") ;
}
180177:2005/11/02(水) 13:45:57
>>178-179
ありがとうございます。

一つ質問なんですが、h3=0のときも、m3<0だったりしたらエラーになると思うんですが、どうなんでしょうか?
181178:2005/11/02(水) 13:49:47
>>180
なりません。
m3<0の時はif(m3<0)の箇所でh2からあらかじめ1引いてるので。
182デフォルトの名無しさん:2005/11/02(水) 13:56:39
>>181
なるほど。理解しました。ありがとうございます。
183デフォルトの名無しさん:2005/11/02(水) 15:04:20
[1] 授業単元:プログラミング実習
[2] 問題文(含コード&リンク):
文字列を用いて5人文の名前を入力し表示するプログラムを作りなさい。
ただし名前の頭文字のアルファベット順に並べ変えて表示すること
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: ([2005年11月06日まで]
[5] その他の制限:配列あたりまで習っています。
なんか急に難しくなってきた気がしてお手上げです。
どうか宜しくお願いします。
184デフォルトの名無しさん:2005/11/02(水) 15:20:42
>>183
#include <stdio.h>
#include <string.h>
typedef char string[256];
int main() {
  int i, j; string s[5], tmp;
  for (i = 0; i < 5; ++i) { printf("name%d: ", i); scanf("%s", s[i]); }
  for (i = 0; i < 5; ++i) /* sort */
    for (j = i+1; j < 5; ++j) 
      if (strcmp(s[i], s[j]) > 0) 
        strcpy(tmp, s[i]), strcpy(s[i], s[j]), strcpy(s[j], tmp); /* swap */
  for (i = 0; i < 5; ++i) printf("%s\n", s[i]);
}
185デフォルトの名無しさん:2005/11/02(水) 15:23:10
/*
* 文字列を用いて5人文の名前を入力し表示するプログラムを作りなさい。
* ただし名前の頭文字のアルファベット順に並べ変えて表示すること
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NAMEMAX 20
/* クイックソートかバブルか選択 */
#define BUBBLE 0
#define QUICK 1

typedef char Name[NAMEMAX+1];

void swap(Name*, int, int);
int comp(const Name*, const Name*);

int main(void)
{
Name names[5], tmp;
int i, j;

for (i=0;i<5;i++) {
j = scanf("%s", &names[i]);
if (!j) {
puts("Invalid!!");
return -1;
}
}
186デフォルトの名無しさん:2005/11/02(水) 15:24:10
#if (BUBBLE)
for (i=4;i>=0;i--)
for (j=0;j<i;j++)
if (strcmp(&names[j][0], &names[j+1][0]) > 0)
swap(names, j, j+1);
#endif

#if (QUICK)
qsort(names, 5, sizeof(Name), (int (*)(const void*, const void*))comp);
#endif

putchar('\n');
for (i=0;i<5;i++)
printf("%s\n", names[i]);
return 0;
}

void swap(Name *array, int op1, int op2)
{
Name tmp;

strcpy(tmp, array[op1]);
strcpy(array[op1], array[op2]);
strcpy(array[op2], tmp);
}

int comp(const Name* n1, const Name* n2)
{
return strcmp(n1[0], n2[0]);
}
187デフォルトの名無しさん:2005/11/02(水) 15:51:30
[1] 授業単元:プログラミングC
[2] 問題文(含コード&リンク):以下に示す二つの配列を
大きい順(降順)に並べ替えて出力するプラグラムを作りなさい。
並び替える前の配列も表示しなさい。
但し、配列を降順に並べる関数と配列を出力する関数を作り、main関数では
それらの関数を呼び出すようにしなさい。
#define MAX1 6
#define MAX2 10

int data[MAX1] = { 3, 9, 2. 20, 1, 15}
int data[MAX2] = {5,10, 3, 2, 19, 8, 1, 20, 9, 6}

[3] 環境
 [3.1] OS: LINUX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語:C
[4] 期限: 11月5日まで
[5] その他の制限: ポインタをやりはじめたところです。よろしくお願いします
188デフォルトの名無しさん:2005/11/02(水) 16:11:11
189デフォルトの名無しさん:2005/11/02(水) 16:29:19
>>184〜186
早々のレスありがとうございました。
184できれいにできました。
190デフォルトの名無しさん:2005/11/02(水) 18:23:25
[1] 授業単元: プログラム演習
[2] 問題文(含コード&リンク):
四則演算プログラム。
数値A及びBの入力を求め、入力された数値で計算し表示しなさい。
なお計算するのは+,-,*。
だたしBが0でない場合は/も行い計算結果、余りを表示する。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: VC6.0
 [3.3] 言語: C++
[4] 期限: 11月7日
[5] その他の制限: printfなどは分かるのですが、計算式がよく分かりません。
          初歩的な質問ですが、よろしくお願いします。
191デフォルトの名無しさん:2005/11/02(水) 18:55:54
>>190
#include <stdio.h>

int main(void)
{
int op1, op2, i, tmp;

printf("Input A: ");
i = scanf("%d", &op1);
printf("Input B: ");
tmp = scanf("%d", &op2);

if (!(i && tmp)) {
puts("Error!! A or B is invalid!");
return -1;
}

printf("\n%d + %d = %d\n%1$d - %2$d = %d\n%1$d * %2$d = %d\n",
op1, op2, op1+op2, op1-op2, op1*op2);
op2?printf("%d / %d = %d ・・・ %d\n", op1, op2, op1/op2, op1-(op1/op2)*op2)
:1;

return 0;
}

printfの書式指定でちょっとややこしいこと+三項演算子使ってるがダメだったら言ってくれ
192デフォルトの名無しさん:2005/11/02(水) 22:33:41
>>191
エラーは出ませんでした。ありがとうございます。
193デフォルトの名無しさん:2005/11/03(木) 00:44:59
[1] 応用C言語
[2] 8×8のオセロゲームを作る。1手ごとに盤面の表示を更新する。
  <条件>
  ・コマの置かれていない状態を0、黒を1、白を2で表現する。
  ・起動時に中央に交差する形で黒2個、白2個を置く
  ・黒(1)を先手とし、行と列番号(0〜7)を指定する。
  ・すでにコマが置かれてる場合・挟めない位置を指定するとエラーを表示。
  ・コマを置いたら相手のコマを裏返し(数字を変更し)結果を表示。
  ・全てのコマが埋まったら結果を表示して終了。
  ・その際黒と白の個数をカウントして表示すること。
[3] 環境
 [3.1] WindowsXPがメイン、稀にLinux。
 [3.2] 自宅だとbcpad、学校はgcc。バージョンは失念。
 [3.3] C言語。
[4] 2005年11月いっぱい。
[5] 特に制限なし。自由に作ってよいとのことなので
  ここで受けたアドバイスを元にアレンジできれば効かせたい。


全部代理で受けるのは面倒かもしれません。
石を置けるかどうかの判定ルーチン、特に裏返せる位置の発見部分が
どうしても上手く行かず悩んでいます。よろしくお願いします。
194デフォルトの名無しさん:2005/11/03(木) 01:36:23

1ヶ月あったら、自分でやれ
195デフォルトの名無しさん:2005/11/03(木) 02:07:32
>>193 人間対人間?
196デフォルトの名無しさん:2005/11/03(木) 02:17:42
金取るよ。
197デフォルトの名無しさん:2005/11/03(木) 02:53:31
198デフォルトの名無しさん:2005/11/03(木) 02:57:32
>>196
大人気ないこと言うんじゃありません
>>197
音投げないことするんじゃありません
199デフォルトの名無しさん:2005/11/03(木) 03:13:29
200デフォルトの名無しさん:2005/11/03(木) 03:18:10
>>199 set の先頭に if (!inboard(x,y,board)) return flg; を追加
201デフォルトの名無しさん:2005/11/03(木) 07:33:35
>>194-200
ありがとうございました。
丸写しで提出ではなく自分なりに何か参考にしながら作ってみます。
202デフォルトの名無しさん:2005/11/03(木) 11:32:57
>>192
いやコンパイルがどうかって事じゃなくて、授業の進度的に大丈夫かというつもりだったんだが
203デフォルトの名無しさん:2005/11/03(木) 12:27:25
[1] 授業単元:プログラム
[2] 問題文(含コード&リンク):
配列a[ ]のすべての要素に1を代入する。
この代入する部分を独立させ配列要素を添字で指定するやりかたで書け。
(mainから配列で渡し、代入の関数も配列として受け取る)
配列要素を添字で指定するやりかたの例
#include <stdio.h>
main()
int a[6],i=0;
while (i<6)
{
a[i]=1;
i++;
}
  出力
}
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年11月4日まで
[5] その他の制限:なし
宜しくお願いします
204デフォルトの名無しさん:2005/11/03(木) 13:16:58
>>203 その例でいいんじゃないの?
205デフォルトの名無しさん:2005/11/03(木) 13:25:55
配列の要素を全部1にする関数を書けってこと?
メインはこうして
main()
{
int a[6];
set_all_one(a,6);
}
関数で
int set_all_one(int a[], int n)
{
...
あとは例を参考にset_all_oneを作る
206デフォルトの名無しさん:2005/11/03(木) 14:51:16
>>199
int i, j, k, dx, dy, flg;
flg = 0;
int dxtbl[] = {1, 1, 0,-1,-1,-1, 0, 1};
int dytbl[] = {0, 1, 1, 1, 0,-1,-1,-1};
こんなん出来たッけ。しばらくC離れてるから忘れたけど
int i, j, k, dx, dy, flg;
int dxtbl[] = {1, 1, 0,-1,-1,-1, 0, 1};
int dytbl[] = {0, 1, 1, 1, 0,-1,-1,-1};
flg = 0;
こうじゃ?
207206:2005/11/03(木) 15:13:25
>>206 そのとおりですね.すんません.コンパイラが通したので見逃してました.
208199:2005/11/03(木) 15:14:24
>>207 名前ミスorz......
209175:2005/11/03(木) 15:17:36
音声の録音、再生とg711関係はなんとなくできたのですが、
RTPの送受信をどういう風に作ったらいいのかわかりません。
誰か教えてもらえないでしょうか?
210デフォルトの名無しさん:2005/11/03(木) 16:09:22
>>206
規格が変わって今はそれは許される。
まだ実装は普及してないけど。
211デフォルトの名無しさん:2005/11/03(木) 16:15:21
>>210
C99の実装を完全に満たしている処理系の例を挙げてください。
212210:2005/11/03(木) 16:21:43
>>211
俺は知らない。たぶん無いと思う
213デフォルトの名無しさん:2005/11/03(木) 16:23:12
ISO/IECで固まった規格なのにね。
9899:1999(´・ω・)カワイソス
214デフォルトの名無しさん:2005/11/03(木) 17:22:13
>>211
C99の実装を完全に満たしていなくとも 199 の通る実装はあるし、全然珍しくもない。
215デフォルトの名無しさん:2005/11/03(木) 18:31:20
GCC以外にあるの?
216デフォルトの名無しさん:2005/11/03(木) 18:34:54
Digital Marsとか
217デフォルトの名無しさん:2005/11/03(木) 18:36:58
>>214
C99の実装を95%とまでは言わないから、90%ほど満たしている
処理系でないと使いたくない。学校の課題ではまずC99は使われ
ないだろう。その事実を念頭に入れずに机上の空論をここで論じて
も、説得力がない。

gccですら80%弱だし。
218デフォルトの名無しさん:2005/11/03(木) 18:41:50
>>217
俺には>>214が「机上の空論を論じて」いるようには見えんのだが。
お前が使いたがらんのは結構だが、一体何に文句があるんだ?

ところで、「C99の実装を満たす」って表現はおかしくないか?
219デフォルトの名無しさん:2005/11/03(木) 18:56:29
>>218
詭弁の特徴のガイドライン

4:主観で決め付ける
14:細かい部分のミスを指摘し相手を無知と認識させる

逝ってよし。
220デフォルトの名無しさん:2005/11/03(木) 19:04:43
 本質的という言葉も、なかなかの曲者である。
「それはたしかに本質的な点をついている」
「それでは本質的な解決にならない」
「本質的な問題はそんなところにない」
 こういう場合での「本質的な」という言葉は、「おれがいいたい」と同じ意味ではないかと私は疑っている。
221デフォルトの名無しさん:2005/11/03(木) 19:09:38
依頼側の条件を満たした回答なのになんでクレームが発生してるんだ?
コンパイラまで指定されてるのに他の処理系関係ないじゃん
222218:2005/11/03(木) 19:12:42
>>219
それを使うときは発言のどの部分が該当するか指摘した方がいいと思うが。

>4:主観で決め付ける
俺は何かを主張したかった訳じゃなくて、>>217の真意に興味があったから
聞いたまでだ。
223デフォルトの名無しさん:2005/11/03(木) 19:20:43
もれ
>219は>217宛だと思ってた...
224206:2005/11/03(木) 19:28:45
単に実装依存な書き方はどうかな?って思い指摘しただけの事
深い意味はありませんw
225デフォルトの名無しさん:2005/11/03(木) 19:34:44
C99厨必死だな( ゚,_ゝ゚)
226デフォルトの名無しさん:2005/11/03(木) 19:35:27
おまいらスレの趣旨から逸れすぎ
227206:2005/11/03(木) 19:36:02
実装依存云々というかCでこんな書き方出来たッけな?ってだけです ハイ
228デフォルトの名無しさん:2005/11/03(木) 19:38:23
VCが対応してない書き方は存在価値がないですぅ
229デフォルトの名無しさん:2005/11/03(木) 19:41:01
現時点では、質問者にC99の話をしても、迷惑が掛かるだけだと思う。
そんなにC99が好きなら、別スレ立ててそこで勝手に議論してくれ。
230デフォルトの名無しさん:2005/11/03(木) 19:51:49
わざわざC99を推すほどメリットがある書き方だと思えない
231デフォルトの名無しさん:2005/11/03(木) 20:00:46
誰もC99を推してはいないし、質問者にC99の話をしてもいない。
単に>>206に指摘しただけ。
232デフォルトの名無しさん:2005/11/03(木) 20:27:10
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
二次元配列 list[5][5]に整数が入っているとき、配列cmp[4]に入っている数字のうちちょうど3つ含む行を出力せよ
例:
cmp[0] 〜 cmp[3] = 1 3 4 8
list[0][0] 〜 list[0][4] = 1 2 5 8 9   <- 2個含む × 
list[1][0] 〜 list[1][4] = 1 1 2 3 9   <- 3個含むが1が重複なので2個と見なす ×
list[2][0] 〜 list[2][4] = 1 2 3 4 8   <- 3個含む ○
list[3][0] 〜 list[3][4] = 2 3 4 5 8   <- 3個含む ○
list[4][0] 〜 list[4][4] = 1 2 3 4 8   <- 4個含む 3個ちょうどではないので ×

出力結果:
3行目と4行目

[3] 環境
 [3.1] OS: XP Pro
 [3.2] コンパイラ名とバージョン: BorlandC++ Compiler
 [3.3] 言語: Cでお願いします
[4] 期限: 2005年11月07日09:20まで
[5] その他の制限: 特になし
233デフォルトの名無しさん:2005/11/03(木) 20:42:12
cmp[0] 〜 cmp[3] = 1 3 4 8
list[2][0] 〜 list[2][4] = 1 2 3 4 8   <- 3個含む ○

そーなの?4個じゃねーの?
234デフォルトの名無しさん:2005/11/03(木) 20:48:08
最後が9のつもりだったのでは?
235デフォルトの名無しさん:2005/11/03(木) 20:55:43
>>232
#include <stdio.h>
#define SRC 5
#define COMP 4

int comp_array(int*, int*);

int main(void)
{
int i, flag = 0;
int list[SRC][SRC] = {
{1, 2, 5, 8, 9},
{1, 1, 2, 3, 9},
{1, 2, 3, 5, 8},
{2, 3, 4, 5, 8},
{1, 2, 3, 4, 8},
};
int cmp[COMP] = {1, 3, 4, 8};

for (i=0;i<SRC;i++)
if (comp_array(list[i], cmp) == 3) {
if (flag++) printf("と");
printf("%d行目", i+1);
}
putchar('\n');

return 0;
}
236デフォルトの名無しさん:2005/11/03(木) 20:56:54
int comp_array(int* src, int* cmp)
{
int i, j, count = 0;

for (i=0;i<COMP;i++)
for (j=0;j<SRC;j++)
if (src[j] == cmp[i]) {
count++;
break;
}
return count;
}

既に書かれてるように例がおかしかったので3行目変更した
gccに-ansi付けてコンパイル通る事は確認したが、bccは持ってないからシラネ
237デフォルトの名無しさん:2005/11/03(木) 21:13:51
>>233-234
すみません、見直したつもりだったんですが間違えました

>>235
うまく行きました。ありがとうございました。
238デフォルトの名無しさん:2005/11/03(木) 22:50:55
言語:C
[3] 環境
 [3.1] OS: XP Home
 [3.2] コンパイラ名とバージョン: VC6.0
 [3.3] 言語: Cでお願いします
[4] 期限: 2005年11月04日06:00まで
[5] その他の制限: 特になし


次の1〜8を埋めよ。
実数値配列の要素の総和を計算する。次の関数sumは、分割統治法を適用して作った。引数l と r とで、a[l]、a[l+1]、・・・、a[r-1]の和を計算することで指定している。
double sum(double a[], int l, int r){
int n= r-l, m= (l+r)/2;
if( n==0 ) return 0.0;
if( n==1 ) return 【 1 】;
return sum(a, l, m)+sum(a,【 2 】,【 3 】); /* (1) */
}
この関数を使うと、 double x[100];と宣言された配列に記録された100個の全要素の値の総和は、
sum(x,【 4 】, 【 5 】) という関数で求めることが出来る。
sum(x, 0, 2)の呼び出しによって(1)と記した行での加算は全部で【 6 】回行われる。
sum(x, 5, 10)の呼び出しによって(1)と記した行での加算は全部で【 7 】回行われる。
一般にsum (x, u, v)の呼出し(0 <= u <= v <= 100)によって(1)と記した行での加算は全部で【 8 】回行われる。

穴埋め問題です。本を見て調べたのですが、よく分からなかったので、宜しくお願いします。
239デフォルトの名無しさん:2005/11/03(木) 22:55:47
こりゃ難しい。オレだったら総和は単純ループで計算するよ。
240デフォルトの名無しさん:2005/11/03(木) 22:56:53
なんで再帰呼び出ししてんだか
241デフォルトの名無しさん:2005/11/03(木) 22:57:26
そうわイカンザキ
242デフォルトの名無しさん:2005/11/03(木) 22:59:21
>>188
すばやいレスありがとうございます。
でも、#include <stdlib.h>
ってまだ習ってないです・・・orz
243デフォルトの名無しさん:2005/11/03(木) 23:03:40
>>238
1:a[l] 2:m+1 3:r 4:0 5:101 6:1 7:4 8:v-u-1
暇だったから解いたがツマラン+間違っててもシラネ
つーか、なんだこの問題。こんなの分割統治にしても
ある程度以上の個数なら関数呼び出しのオーバーヘッドの方がでかいだろうに
クイックソートとか二分探索の方が問題としてもいいと思うがな
244デフォルトの名無しさん:2005/11/03(木) 23:08:11
>>243
どうも、有難うございます。4、5は、同感です。1〜3を代入してプログラムを動かしてみて、6〜8の確認をします。
有難うございます。
245デフォルトの名無しさん:2005/11/03(木) 23:10:07
>>243は微妙に間違っている罠。
246デフォルトの名無しさん:2005/11/03(木) 23:15:26
>>245
やっぱり間違ってたか
とりあえず半閉区間[l,r)だという事まで考えたところでやる気が尽きたから適当にやったからな
6以降はあんま考えてないし
247デフォルトの名無しさん:2005/11/03(木) 23:16:40
>>238
243が答えてしまったがせっかく作ったので
#include <stdio.h>

double sum( double a[], int l, int r )
{
printf( "sum( %x, %d, %d )\n", a, l , r ) ;
int n = r - l ;
int m = ( l + r ) / 2 ;

if( n == 0 ){
printf( "Nullpo\n" ) ;
return 0.0 ;
}
if( n == 1 ){
printf( "Gatt%lf\n", a[ l ] ) ;
return a[ l ] ;
}
return sum( a, l, m ) + sum( a, m, r ) ;
}

int main()
{
double x[] = { 0, 1, 2, 3, 4, 5 } ;

printf( "sum=%lf\n", sum( x, 0, sizeof( x ) / sizeof( x[0] ) ) ) ;
return 0 ;
}
248デフォルトの名無しさん:2005/11/03(木) 23:37:15
[1] 環境
[1.1] OS: XP Home
[1.2] コンパイラ名とバージョン: VC6.0
[1.3] 言語: Cでお願いします
[2] 期限: 2005年11月04日06:00まで
[3] その他の制限: 特になし
次のquicksort プログラムを考え、空所を埋めよ。
void quicksort(int a[], int l, int r){
if( l<=r ){
int m= (l+r)/2; int v= a[m];
int p= l, q= r;
while( p<=q ){
while( a[p]<v ) p++;
while( v<a[q] ) q--;
if( p<=q ){ /* (1) */
int w= a[p]; a[p]= a[q]; a[q]= w;
p= p+1; q= q-1;
}
}
quicksort(a, l, q);
quicksort(a, p, r);
}
}
249デフォルトの名無しさん:2005/11/03(木) 23:38:24
>>248
続き
a[0],...,a[n-1]がすべて異なる値で小さい方から順に並んでいるとき、
quicksort(a,0,n-1)の呼出しによって(1)と記したif文の中身が実行される回数を考える。
n=1, 2, 3の時の回数は、それぞれ全部で【 1 】回、【 2 】回、【 3 】回であり、一般にn = k (k > 0)の時、【 4 】回である。
また、全て異なる値で大きい方から順に並んでいるとすると、一般にn = k (k > 0)の時、【 5 】回である。
整列aに整数0が1個だけ記録されている時、quicksort(a, 0, 0)の呼出しによって生じる再帰呼出しの深さは2に達する。
配列aに1,0と2個の整数が並んでいる時、quicksort(a, 0, 1)の呼出しによって生じる再帰呼出しの深さは【 6 】に達する。
配列aに1, 2, 4, 0, 3 と5個の整数が並んでいる時quicksort(a, 0,4)の呼出しによって生じる再帰呼出しの深さは【 7 】に達する。
同じ{0, 1, 2, 3, 4}の5個が配列aに【 8 】と並んでいる時にもquicksort(a, 0, 4)の呼出しによって生じる再帰呼出しの深さは【 9 】に達する。

難しい課題が多いです。助けてください。。
250デフォルトの名無しさん:2005/11/04(金) 00:04:16
[1] 授業単元:配列
[2] 問題文(含コード&リンク): 二項係数の計算
[3] 環境
 [3.1] OS: Windows
 [3.3] 言語: C

(1+x)^nの係数の計算
x^iの係数を配列c[i]に求める
初期値:(1+x)^1の係数はc[0]=c[1]=1;

(nは入力で与える)
for(k=2; k<=n; k=k+1) {
for (si1=c[0], i=1; i<k; i=i+1)
{ si=c[i]+si1; si1=c[i]; c[i]=si; }
c[i]=si1;
/*c[0],・・・・c[k+1]を出力して動作確認*/
}

これらが講義資料に書かれていたんですが、一日中やっていてもうまく作れませんでしたorz
これができないと宿題に取り掛かれません。助けてください
251デフォルトの名無しさん:2005/11/04(金) 00:11:47
>>250
問題の意味が分からん
つーか、プログラムというより数学の問題だろ
なんでもっとわかりやすいのにしないんだろうな
252デフォルトの名無しさん:2005/11/04(金) 00:25:52
>251
その通りなんですorz
毎回C言語というより数学の問題のような・・・
偏差値低い大学なのに何考えてるんだかw

>250

(1+x)^kの係数
C0+C1x+C2x^2+……+Ck-1x^(k-1)
+ C0x+C1x^2+……+Ck-2x^(k-1)+Ck-1x^k

例 1+x
+ 1x+x^2
=1+2x+x^2
253デフォルトの名無しさん:2005/11/04(金) 00:28:21
>>248-249
1:1 2:2: 3:3 4:k(=n) 5:わからん 6:3 7:5 8:わからん 9:4

>>250 組み合わせの数だな。パスカルの三角形とか・・・。
んー。ちゃんと動いてるようだけど・・・?
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
254デフォルトの名無しさん:2005/11/04(金) 00:32:00
>253
/*c[0],・・・・c[k+1]を出力して動作確認*/
のところを教えていただけませんか?
255デフォルトの名無しさん:2005/11/04(金) 00:33:19
あぁパスカルの三角形を書けという問題か・・・
253によると動いてるみたいだし、検索すりゃサンプルみつかるんじゃまいか?

そういやうちの大学にもいるな、無駄に数学だとか統計学だとかの知識を問う課題を課す
プログラミング担当の教授・・・
256デフォルトの名無しさん:2005/11/04(金) 00:36:56
for (i = 0; i <= k; i++)
  printf("%3d", c[i]);
printf("\n");
257デフォルトの名無しさん:2005/11/04(金) 00:58:04
>>248-249

6:00〆切ですが、その後に大学で演習があるので、6:00以降でも、解けた方がいらっしゃいましたら、宜しくお願いします。
258デフォルトの名無しさん:2005/11/04(金) 01:16:36
5: 1.5 * n (小数以下切り捨て)
8: やっぱわからん。「整列済みで」という意味なんだと思うが、日本語が出てこん。
259250:2005/11/04(金) 01:33:45
出来た〜〜〜!
" ゚☆,。・:*:・゚★o(´▽`*)/♪Thanks♪\(*´▽`)o゚★,。・:*:・☆゚ "
260デフォルトの名無しさん:2005/11/04(金) 01:40:06
[3] 環境
 [3.1] OS: Windows
 [3.3] 言語: C
〆切:11月4日23:59
*特に指定無し。VCでやってます。
プログラム A と プログラム B の
性能比較を行え。
[user@mypc ~] ./a.out 35
f(35)= 9227465
[user@mypc ~] time ./a.out 35
f(35)= 9227465
1.330u 0.032s 0:02.43 55.9% 0+0k 0+0io 0pf+0w

プログラム A
★再帰呼出し版
int F(int i)
if (i < 1) return 0;
if (i == 1) return 1;
return F(i-1) + F(i-2);}

プログラム B
★トップダウン動的計画法
(プログラム11)
int F(int i){
int t;
if (knownF[i] != unknown) return knownF[i];
if (i == 0) t = 0;
if (i == 1) t = 1;
if (i > 1) t = F(i-1) + F(i-2);
return knownF[i] = t; }
どのようにすればいいのでしょうか?宜しく頼みます。
261デフォルトの名無しさん:2005/11/04(金) 01:49:22
>>260
WindowsでUnixのtimeコマンド相当のことをやりたいなら、
echo %time%
.\a.exe 35
echo %time%
といったバッチでも作って動かすくらいしか手がないと思う。

つーか、スレ違い臭いがな。
262デフォルトの名無しさん:2005/11/04(金) 01:50:50
>>260

前スレから引用

937 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/27(木) 01:34:35
>>935
実際、どんな呼び出しが行われるか数える。プログラムをちょいと変更して
int F(int i){
static count=0;
printf("i = %d (%d 回目の呼び出し)\n", i, ++count);
 :
}
みたいにすれば分かる。で、両方のプログラムについて引数を少しずつ増やしながら
その増え方を見ればいいのでは?
あとは元のプログラムを使って、例にあるように time で実際にかかる時間の伸びを見るとか。
n を入力とした場合、プログラム10は O(2^n)、 プログラム11は O(n) くらいになると思う、多分。

あとはメモリ効率…っていっても、メモリが問題になるような環境だと時間が
洒落になってないだろうなぁ…ということで私は放置。
263デフォルトの名無しさん:2005/11/04(金) 05:04:16
>>260,261
スレ違いだなあ。つうか質問の意図自体不明だなあ。
なんで Unixでやったらだめなのとか、別に main()の頭とお尻で経過時間を
計れるコード入れれば、とか、少しは考えてから質問を整理しないと。
Unixのtimeコマンド相当(?)は "Windows 実行時間" でぐぐっただけでも
timeit とか出るのに。(他にもCygwinとか含めていくつかあるのでは?)
264デフォルトの名無しさん:2005/11/04(金) 09:17:51
関数の呼び出し回数や処理時間ならCygwin入れてgprofに掛ければ出るだろ
まぁあの時間が呼び出し時のオーバーヘッドも含めてるのかそうじゃないのかは知らないが

265デフォルトの名無しさん:2005/11/04(金) 16:53:13
>>174お願いします
266デフォルトの名無しさん:2005/11/04(金) 17:17:53
自分で数値計算した結果のデータを、再度読み込んでプログラム上で処理したくて
C言語で精度の良いローパスフィルタを作ろうと思ってるんですが、
ライブラリとかソースがのってる場所とか無いですかね。
なかなか見つからないので・・・・

[3] 環境
 [3.1] WindowsXP Pro
 [3.2] VC++6
 [3.3] C

期限等や制限等は全くないです。課題とかじゃないので。


267デフォルトの名無しさん:2005/11/04(金) 17:25:15
>>266
LPF なら FFT ライブラリ使えばすぐに作れるんじゃね?というわけで ↓ FFT
http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
268デフォルトの名無しさん:2005/11/04(金) 21:13:46
[1] 授業単元:応用プログラミング
[2] 問題文
10進数からn進数へ、n進数から10進数へ変換するプログラムを作成せよ。但し、
nは16以下でn進数の桁数は10桁以下。変換は以下のようなvoid型関数を定義して行え。
これらの関数の引数では10進数はint型変数に入れ、n進数はchar型の配列(string型はダメ)に入れる。
decTon 10進数をn進数に変換する関数。
引数 10進数を渡すint型の値引数。
n進数を入れる(結果)char型の配列。
nの値。
nTondec n進数を10進数に変換する関数。
引数 n進数を渡す、char型の配列。
nの値
10進数(結果)を入れるint型の参照引数。
データは実行例のように、繰り返し読めるようにする。

注1)char型の配列の文字列を入れる場合、文字列の終わりにはヌル文字を入れる。
注2)n進数でn>10の場合は、11はA、12はBと表示されるがその変換にはASCIIコードの性質を利用すること。
ASCIIコード表
ttp://www.psl.ne.jp/perl/pdojo00b.html
[3] 環境
 [3.1] OS: windows
 [3.2] コンパイラ名とバージョン: 不明
 [3.3] 言語: C++
[4] 期限:05年11月7日13:00まで
[5] その他の制限: #include<iostream>から書き始める

n進数を10進数にするだけならなんとか出来そうなのですがその逆が出来ませんorz
どなたかご教示を賜りたいです。
269デフォルトの名無しさん:2005/11/04(金) 21:14:41
続き 実行例
実行例)
何進数から何進数へ変換しますか?:10 16
10進数値を入力してください:123456
123456は16進数に変換すると1E240
何進数から何進数へ変換しますか?:16 10
16進数値を入力してください:1E240
16進数で1E240は123456
何進数から何進数へ変換しますか?:5 8
どちらかは、10進数にしてください
270デフォルトの名無しさん:2005/11/04(金) 21:26:20
[1] 授業単元:プログラミング入門U
[2] 問題文(含コード&リンク):

http://tenous.hp.infoseek.co.jp/kadai.txt

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン:特になし
 [3.3] 言語: C
[4] 期限: 11/7 12:00
[5] その他の制限:
sample.cファイルの意味を一通り教えられたという程度です
PC室が閉まるまで頑張ってみたのですがエラー続きで…
おねがいします
271デフォルトの名無しさん:2005/11/04(金) 22:35:49
>>268適当に書いてみた
#include<iostream>
#include<cctype>
using namespace std;
void decTon(int value,char string[],int radix){
 if(value<0)*string++ = '-',value = -value;
 char*p=string,c;
 do *string++ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[value%radix];while(value /= radix);
 *string-- = '\0';
 while(p < string)c = *p,*p++ = *string,*string-- = c;
}
void nTondec(char string[],int radix,int&value){
 value=0;
 bool sign = *string=='-';
 string += sign;
 while(char c=tolower(*string++))value = value*radix+(isdigit(c)?c-'0':c-'a'+10);
 if(sign)value=-value;
}
int main(){
 char buf[80];
 for(int from,to,value;;){
  cout << "何進数から何進数へ変換しますか?:";cin >> from >> to;
  if(from==10 || to==10){
   cout << from << "進数値を入力してください:"; cin >> buf; 
   cout << buf << "は"<< to <<"進数に変換すると";
   nTondec(buf,from,value);decTon(value,buf,to);
   cout << buf << endl;
  }else cout << "どちらかは、10進数にしてください" << endl;
 }
}
272デフォルトの名無しさん:2005/11/04(金) 22:39:05
>>268
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1041.txt
作ったが、最初のcstringのincludeは要らない・・・手動で削除よろ
それと今読んでるAccelerated C++に影響されて不変の表明なんて付けてたら
何かやり残した気がしないでもないんだが忘れてしまった
簡単にはテストしたが十分にテストよろ

それと無限ループで遊んでるが、不味かったら消してくれw
273デフォルトの名無しさん:2005/11/04(金) 22:39:11
>>270
int ten[1],five[5],i;
printf("No.%d:",1);
scanf("%d",&five[0]);
ten[0]=five[0];
for(i=1;i<5;i++){
printf("No.%d:",i+1);
scanf("%d",&five[i]);
if(ten[0]>five[i]) ten[0]=five[i];
}
printf("点数表示\n");
for(i=0;i<5;i++){
printf("No:%d:%d\n",i+1,five[i]);
}
printf("最小値= %d\n,ten[0]");
printf("多分出題者の期待するものと違うだろなnullpo乙!");
274270:2005/11/04(金) 22:52:26
すんません出題の配列名打ちまちがえてました_| ̄|○
今修正しますた
275デフォルトの名無しさん:2005/11/04(金) 23:49:40
前すれで依頼があったRSAを書いてるんだけど、パフォーマンスがひどい。
long longの剰余演算が実行時間の半分を占めているみたいだ。
誰か64ビット整数を0xc0000001で割った余りを高速に求める方法思い付かない?
276デフォルトの名無しさん:2005/11/05(土) 00:14:32
>>271>>272
すばやい反応どうもです。
二つを参考にして1つ書き上げてみます。ありがとうございました。
277デフォルトの名無しさん:2005/11/05(土) 00:30:06
>>272
連投すいません。コンパイルエラー出たので報告です。
kan.cpp: function `int main()':
kan.cpp:27: error: stray '\33' in program
kan.cpp:27: error: stray '\33' in program
kan.cpp:27: error: `B10' undeclared (first use this function)
kan.cpp:27: error: (Each undeclared identifier is reported only once for each
function it appears in.)
kan.cpp:27: error: before `?' token
kan.cpp:27: error: before `@' token
kan.cpp:27: error: stray '\33' in program
kan.cpp:27:78: "
HAL/home/Ryo&
278デフォルトの名無しさん:2005/11/05(土) 00:35:55
>>277
\33が出てるから日本語絡みな気がする
とりあえずコンパイルに使ったソース上げてくれ
279デフォルトの名無しさん:2005/11/05(土) 01:43:44
>>275
a%0xc0000001を求めたいとして
(a>=0xc0000001)?a&0x3ffffffe:a;
ってのはどう?
280279:2005/11/05(土) 01:45:41
訂正。
(a>=定数)?a-定数:a;
そんなに差がない気もするけど
281デフォルトの名無しさん:2005/11/05(土) 01:46:32
#include <stdio.h>

int main(void)
{
int min,five[5];
for(int i=0;i<5;i++){
printf("No.%d:",i+1);
scanf("%d",&five[i]);
if(min>five[i] || i==0)min = five[i];
}
printf("点数表示\n");
for(int i=0;i<5;i++)
printf("No:%d %d\n",i+1,five[i]);

printf("最小値= %d\n",min);
printf("多分出題者の期待するものと違うだろなnullpo乙!");

}

>>273のものを改変
282デフォルトの名無しさん:2005/11/05(土) 01:52:08
>なお、最小値の画面表示には以下の一行を使用すること。
>printf("最小値= %d\n",ten[0])

何をさせたいんだ?
283デフォルトの名無しさん:2005/11/05(土) 02:06:04
>>280
サンクス。でもそれだと、aが定数の二倍を越えるときにうまくいかない。
aは最大で0x9000 0000 0000 0000なんだ。
284デフォルトの名無しさん:2005/11/05(土) 03:09:53
>>268
一部だけ
char CCode[] = "0123456789ABCDEF";

void decTon(int val, char result[], int radix)
{
for(int n=0,v=val;v>0;n++,v/=radix)
result[n]=CCode[v%radix];
}
void nTonDec(const char val[], int radix, int &result)
{
int t=0,r=1;
for(int n=0,r=1;val[n]!='\0';n++,r*=radix)
{
if(val[n] >= 'A')
result+=r*(val[n]-'A'+10);
else
result+=r*(val[n]-'0');
}
}
285デフォルトの名無しさん:2005/11/05(土) 03:12:30
関数をなるだけ簡潔に書こうとしたんで
引数の範囲チェックはしてないし
resultは各々{'\0'}と0とで初期化されてる必要がある
286デフォルトの名無しさん:2005/11/05(土) 03:13:40
int t=0,r=1;
は不要だな
消し忘れだ
287デフォルトの名無しさん:2005/11/05(土) 03:42:57
間違ってんじゃんん・・・
訂正したら長くなってしまった・・・
strlne使えばちっと短くなるけどiostreamのみでいってみた

char CCode[] = "0123456789ABCDEF";

void decTon(int val, char result[], int radix)
{
for(int n=0,v=val;v>0;n++,v/=radix)
{
for(int k=0;k<n;k++)
result[k+1]=result[k];
result[0]=CCode[v%radix];
}
}

void nTonDec(const char val[], int radix, int &result)
{
int n;
for(n=0;val[n]!='\0';n++);
for(int i=1,r=1;i<=n;i++,r*=radix)
result+=r*(val[n-i]-((val[n-i]>='A')?'A'+10:'0'));
}
288デフォルトの名無しさん:2005/11/05(土) 03:57:02
それも間違ってますよ
289デフォルトの名無しさん:2005/11/05(土) 08:33:54
>>278
コンパイルにはアップしてもらったのと同じファイルをコンパイルしました。
最初の/33は半角の10を全角10に書き換えたら消えました。
でも残りのエラーはそのまま出てきます…。


290デフォルトの名無しさん:2005/11/05(土) 08:56:20
>>289
とりあえず,”B10”をおまいのソース中で検索しろ
そして自己解決するかおまいのソースをうpしろ
291デフォルトの名無しさん:2005/11/05(土) 09:36:49
すいませんB10〜は取り除けてました。
ソースは>>272そのままです。どんなふうに動くのか見てみたかったので。
292デフォルトの名無しさん:2005/11/05(土) 11:23:59
>>275
>剰余演算が実行時間の半分を占めているみたいだ。
RSAなんだから普通だと思う。

そんな定数での剰余が必要なシチュエーションが思い浮かばないんだが何に使うの?
293デフォルトの名無しさん:2005/11/05(土) 12:06:01
>>292
多倍長整数の乗算をO(n log n)でやるためにFFTを使うんだが、
そのとき普通の複素数体上じゃなくて素数を法とした剰余類のつくる有限体上で行う。
で、ここで使う法のひとつが0xc0000001。これを法とする剰余は
32びっと整数のシフトと加減算だけで効率良く計算できるはず(そのように選ばれてる)
なんだが。(A*2^32 ≡ A*2^30-A (mod 0xc0000001)が成り立つ)
上に書いた事は全部下のサイトの受け売り。
http://homepage1.nifty.com/~umetani/ims/Algebra.html

そもそも1024びっと程度なら筆算で十分速いんだが、そこはつっこまないでくれ。
294デフォルトの名無しさん:2005/11/05(土) 12:46:17
>>291
とりあえずS-JISでエンコードしてるが、それをEUCだとかUTFだとかに変えてみれ
少なくともこっちのg++-3.3.3@cywginじゃ正常にコンパイル出来てるから
それぐらいしか思いつかん
295デフォルトの名無しさん:2005/11/05(土) 13:01:46
エラーの出てる行がただの文字出力だったので一行全部消したら動きました…
お手数かけてすみません
296デフォルトの名無しさん:2005/11/05(土) 13:04:58
>>295
けどあの行だけってのも不思議だな
「、」どうもこれが原因な気がするな

一応、どのコンパイラ使ったのか教えてくれ
297デフォルトの名無しさん:2005/11/05(土) 13:54:39
学校からもらったやつなのでバージョンはわかりませんがCygwinとKtermを使いました
298デフォルトの名無しさん:2005/11/05(土) 20:44:51
Gcc使っちゃってるとか?
299デフォルトの名無しさん:2005/11/05(土) 20:51:34
>>298
gccだと死ぬほどエラーでる
300 ◆cozUiU9.kc :2005/11/05(土) 22:11:09
[1] 授業単元: 情報処理
[2] 問題文:
  (1)キーボードから除数(割る数)と被除数(割られる数)を入力し、
    割り算を行い、商と余りを求めるプログラムを加算(+)、減算(-)、乗算(*)
    のいずれか、又は全てを使い求めるプログラムを作成せよ。
  (2)九九の表を作成するプログラムを作成せよ。但し、配列は使わない。
  (3)1、2、3 と順に数を足してゆき、その和が 1000 を越えない間計算を続け、
    最後に足した数を表示させるプログラムを作成せよ。検算もすること
    (1〜N までの和はどのように書かれるか?)。
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名:
 [3.3] 言語: C
[4] 期限: 2005年11月7日20時まで
[5] その他の制限: 関数は使わないこととする。

301デフォルトの名無しさん:2005/11/05(土) 22:34:59
>>300
#include <stdio.h>

int main(void)
{
int op1, op2, i;

i = scanf("%d %d", &op1, &op2);
if (i != 2) {
puts("Input is invalid!");
return -1;
}

i = 0;
//不変の表明:iには減算回数
while (op1 >= op2)
op1 -= op2, i++;

printf("%d / %d = %d 余り:%d\n", op1+op2*i, op2, i, op1);

return 0;
}

とりあえず1だけ
302デフォルトの名無しさん:2005/11/05(土) 22:38:52
0
303デフォルトの名無しさん:2005/11/05(土) 22:45:01
>>300
2)
#include <stdio.h>

int main(void)
{
int i, j;

//header
puts(" 1 2 3 4 5 6 7 8 9");
puts("=================================================");

//main
for (i=1;i<10;i++) {
printf("%d ||", i);
for (j=1;j<10;j++)
printf(" %2d |", i * j);
putchar('\n');
}

//footer
puts("=================================================");

return 0;
}

こんなの配列使ったら逆にややこしいだけだろ
304デフォルトの名無しさん:2005/11/05(土) 22:56:25
じゃ、おれは(2)を二通り
#include <stdio.h>
int main(void)
{
int i,n;
for(i=1,n=1;n<1000;n=(i+1)*(i+2)/2,i++);
printf("%d\n",i);

for(i=1,n=0;n<1000;i++)
n+=i;
printf("%d\n",i-1);

return 0;
}
305デフォルトの名無しさん:2005/11/05(土) 22:57:22
#include <stdio.h>

int main(void)
{
static int sum, last;
char *str;

//不変の表明:lastは最後に加算された数
while (sum < 1000)
sum += ++last;
sum -= last;
last--;

printf("Last: %d\tcheck...", last);
((1+last)*last/2 == sum) ?
puts("OK"):
puts("Error");

return 0;
}
306デフォルトの名無しさん:2005/11/05(土) 22:58:29
>>305
何も書かずに送信してしまったが>>300の3
307デフォルトの名無しさん:2005/11/05(土) 22:58:30
(2)じゃなくて(3)ね
308デフォルトの名無しさん:2005/11/05(土) 23:03:12
>>300
じゃ俺(3)。ケータイだから空白変換出来ないが…。

#include<stdio.h>
int main(void) {
int m, n;
for(m=1, n=0; m+n =< 1000; m++)
n += m;
printf("結果=%d:%d, 最後に足した数=%d\n", n, (1001*1000)/2, m);
return 0;
}
309デフォルトの名無しさん:2005/11/05(土) 23:05:11
既に投稿済みか…。しかも1000項じゃないし…間違ってた…。
310(1):2005/11/05(土) 23:05:42
(3)の人気に嫉妬
311デフォルトの名無しさん:2005/11/05(土) 23:08:32
>>307-309
暇に任せて1〜3全部貼った
スマンカッタ
312○×:2005/11/06(日) 00:03:33
[1] 授業単元: 基礎情報科学実験
[2] 問題文(含コード&リンク):
○×ゲームを行うゲームを作成する。まずはサンプルプログラムを
    入力し、実行してみる。
[3] 環境
 [3.1] OS: Linux
 [3.2] gcc 2.9 vc 6.0
 [3.3] 言語:C
[4] 期限: 2005年11月10日15:00まで
[5] その他の制限:関数を使ったプログラミングという章です。基礎なので
array,if,while, for, else ifとか本当に基礎的なものしか学んでません。

ろだの方に詳細を乗させて頂きました。どなたかご教授お願いいたします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm?
○×ゲーム プログラミング です。
313デフォルトの名無しさん:2005/11/06(日) 00:10:59
>>300 人気の無い(1)
#include <stdio.h>
int main(void)
{
int josu, hijosu, sho, amari;
do{
printf("被除数 除数 : ");
} while( scanf("%d %d", &hijosu, &josu) != 2 );
sho = hijosu / josu; // 除算を使ってはいけないという規則は無い
amari = hijosu - sho * josu; // 指定の演算を使っている
printf("%d÷%d=%d…%d\n", hijosu, josu, sho, amari);
return 0;
}
314デフォルトの名無しさん:2005/11/06(日) 00:12:16
>>313
いや、同じく。皆なんで / 使ってないのかなぁと思っていたよ
315デフォルトの名無しさん:2005/11/06(日) 00:16:31
>>313
そういわれればそれもありか・・・
けど、出題者の意図としては減算による割り算じゃないかと思うが
316デフォルトの名無しさん:2005/11/06(日) 00:16:52
317313:2005/11/06(日) 01:09:01
まぁ半分ねらって書いたけどね。多分出題意図としては
for(sho=0, amari=hijosu ; amari >= josu ; sho++) amari -= josu;
または
for(sho=0; tmp=hijosu ; tmp >= josu ; sho++) tmp -= josu;
amari = hijosu - josu * sho;
という選択肢なんだろうね。セキュリティホールを突くのもありかと。
318○×:2005/11/06(日) 01:35:39
自己解決しました。
319デフォルトの名無しさん:2005/11/06(日) 01:59:41
>>317
セキュリティホールってうまい例えだなw
320 ◆cozUiU9.kc :2005/11/06(日) 06:44:11
>>301-311,314-316
ありがとうございます。
321○×:2005/11/06(日) 07:55:31
312ですけど、318俺じゃないです。
解決はまだしていません。
322デフォルトの名無しさん:2005/11/06(日) 10:31:20
もう見てないかも知れないけど。前すれ948
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1044.zip

ものすごく勉強になった。ありがとう。
323322:2005/11/06(日) 12:05:37
書き忘れてたけど、64ビット整数を使うためにC99に依存してる。
コンパイルするときは-std=c99が必要。
324デフォルトの名無しさん:2005/11/06(日) 13:49:39
自己解決しました、ありがとうございました。
















とかやってみる。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1045.txt
325デフォルトの名無しさん:2005/11/06(日) 15:25:17
>>322
あまり詳しく読んでないけど、

鍵生成時に
gcd(n,e)=1⇔gcd(p,e)=1,gcd(q,e)=1になるから
素数判定の前にこっちの判定をしちゃったほうが早い。

has_small_factorでもっとも引っかかるのは3とかはずなので、
gcdをとるよりもforでの試し割りの方が早いかも

あと、nの最上位ビットを1にするために、
p,qの最上位2ビットを1にしておくとよい。
(OEAPやPSSのときに便利)
326デフォルトの名無しさん:2005/11/06(日) 15:46:03
935 名前: デフォルトの名無しさん [sage] 投稿日: 2005/11/06(日) 15:25:10
このsageない基地外なんか過去から全部同じ椰子じゃないかとまで思ってしまう。
(ネタがつまらんのが致命的にキモイ)
327デフォルトの名無しさん:2005/11/06(日) 16:02:14
質問があります。
Pro*Cを使用した埋め込みSQLで、CSVファイルからデータを読み込み
テーブルに登録し、その登録したデータを降順でソートした結果を
改めてCSVファイルとして出力したいのですが、どのようなコードを
書いたらいいのか検討がつきません。

登録に関しては
EXEC SQL BEGIN DECLARE SECTION;
char hoge[30];
int hage;
...
EXEC SQL END DECLARE SECTION;
でホスト変数を定義してやり、strtokで分割して取り込もうと考えております。

DBからデータを抽出し、それをCの変数にはどのようにして代入すればいいのでしょうか?

328322:2005/11/06(日) 16:53:18
今見直すとコメントやらusageやらにたくさん嘘が書いてあって恥ずかしい。

>>325
コメントさんくす。

>鍵生成時に
>gcd(n,e)=1⇔gcd(p,e)=1,gcd(q,e)=1になるから
>素数判定の前にこっちの判定をしちゃったほうが早い。
確かに。でもgcd(n,e)≠1のケースは滅多に無いからどっちでも良いような。

>has_small_factorでもっとも引っかかるのは3とかはずなので、
>gcdをとるよりもforでの試し割りの方が早いかも
そうでした。この方法に変えて、1000まで(コメントには500と書いてあるけど)じゃなくて
10000までテストするようにしたら全体で30%速くなった。

>あと、nの最上位ビットを1にするために、
>p,qの最上位2ビットを1にしておくとよい。
>(OEAPやPSSのときに便利)
OEAP(OAEP?)やPSSなんて聞いたことも無かった。
329325:2005/11/06(日) 17:33:09
ごめん、OAEP(Optical Asymmetric Encryption Padding)だったよ
330322:2005/11/06(日) 18:49:39
論理的なバグがあったので修正版をあげました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1046.zip
331248:2005/11/06(日) 20:11:29
>>248
お願いします。
332デフォルトの名無しさん ◆.bx/RmFBek :2005/11/06(日) 20:22:35
おねがいします。
[1]数値解析
[2]3sin(x)+ln(x)=0
を ニュートン・ラフトン法によって、xを導け
[3]WindowsXP , lcc ,C言語
[4]11/8までの宿題

333デフォルトの名無しさん:2005/11/06(日) 20:52:15
【1】 1
【2】 2
【3】 3
【4】 k
【5】
【6】 3
【7】 5
【8】
【9】

8と9は何を言ってるのか分からん
5は考えんのマンドクセ
334デフォルトの名無しさん:2005/11/06(日) 21:26:01
#include <stdio.h>
#include <math.h>

double func(double x);
double funcd(double x);
double neuton(double x);
int main(void)
{
double x = 4.0;
int i;
for(i=0;i<100;i++){
printf("%e\n",x);
x = neuton(x);
if(x == neuton(x))break;
}
printf("[x] = %lf",func(x));
return 0;
}

double func(double x)
{return (3*sin(x)+log(x));}
double funcd(double x)
{return (3*cos(x)+1/x);}
double neuton(double x)
{return (x-func(x)/funcd(x));}

ニュートン法ならこれで、xに近い点にある解が求まる
ラフトンてのはシラネ
335デフォルトの名無しさん:2005/11/06(日) 21:30:53
連立一次方程式をガウス消去法で解きなさい
(注)
・最低4元
・与えた一次方程式の明記
・ピボット洗濯を必ず必要とする方程式であること

という課題なんですがさっぱりわかりません
助けてくださいお願いします
336デフォルトの名無しさん:2005/11/06(日) 21:33:26
まず、アリエール買って来い。
337デフォルトの名無しさん:2005/11/06(日) 21:35:05
ネットで調べたのですが、解けません。誰か、分かる方、いらっしゃらないでしょうか?
〆切は、本日23時です。

順位キューについて答えよ.ただし,順位キューの要素数はN とする。
(a) 整列ずみの配列によって実現された順位キューについて
1 つの要素の挿入操作に必要な比較回数は最悪でO【 1 】 回であり,最大値の削除操作に必
要な比較回数は最悪でO【 2 】 回である。

(b) ヒープによって実現された順位キューについて、
1 つの要素の挿入操作に必要な比較回数は最悪でO【 3 】 回であり,最大値の削除操作に必要な比較
回数は最悪でO【 4 】 回である。

【 1 】〜【 4 】を埋めよ。
338デフォルトの名無しさん:2005/11/06(日) 21:36:35
#include <stdio.h>
#include <math.h>
#include <string.h>

double func(double x);
double funcd(double x);
double neuton(double x);
int main(int argc,char** argv)
{
double _t = 3.0;
int i;
for(i=0;i<100;i++){
_t = neuton(_t);
if(func(_t)==0.0)break;
}
printf("func(%lf) = 0.0",_t);
return 0;
}

double func(double x)
{return (3*sin(x)+log(x));}
double funcd(double x)
{return (3*cos(x)+1/x);}
double neuton(double x)
{return (x-func(x)/funcd(x));}

ちょっと変更
339デフォルトの名無しさん:2005/11/06(日) 21:39:26
>>335
ttp://kiso.dj.kit.ac.jp/~nakamori/class/Numerical/html/chap3/Gauss_eli.html

これ見てできないようなら課題落とせ
340デフォルトの名無しさん:2005/11/06(日) 21:43:45

>>1のテンプレは最低限読めよ
341332 ◆.bx/RmFBek :2005/11/06(日) 21:58:32
>>334
本当にありがとうございます。ただ、よければwhile文で
精度まで分かるように プログラムできませんか?
0.1 ,0.01 ,0.001 ,0.0001 ,0.00001 ,0.000001 の精度で
繰り返し回数 まで出るようにしたいのです。
342デフォルトの名無しさん:2005/11/06(日) 22:01:06
>>339
お願いします
343デフォルトの名無しさん:2005/11/06(日) 22:06:17
>>249
【5】 x + Σ{i = 1 .. ∞}({[x / (2^i)] * 2^(i-1)})
ただし[x]はxを越えない最大の整数。
344デフォルトの名無しさん:2005/11/06(日) 22:07:51
>>341
いや、精度の意味がわかんね
ニュートン法自体理解してないんじゃないか?

繰り返し回数はi自体が繰り返し回数だよ
345デフォルトの名無しさん:2005/11/06(日) 22:14:31
(a) 整列ずみの配列によって実現された順位キューについて
1 つの要素の挿入操作に必要な比較回数は最悪でO【 1 】 回であり,
最大値の削除操作に必要な比較回数は最悪でO【 2 】 回である。

1− binaryサーチを利用すれば1回の比較で探索範囲が(1/2)ずつ狭まる。
   よってlog2(N)回比較する。
2− 整列されているので、最後尾要素を選択すれば良いので0

(b) ヒープによって実現された順位キューについて、
1 つの要素の挿入操作に必要な比較回数は最悪でO【 3 】 回であり,
最大値の削除操作に必要な比較回数は最悪でO【 4 】 回である。

3−要素の追加はヒープの最後尾要素にデータを追加し、
  そのデータ→データの親→その親→...→根と繰り返しながら、場所を決定する。
  ヒープの高さはlog Nなのでlog N
4−最大値の選択はヒープの根を選択し、
  削除は根→次の子→その子...を繰り返すのでやっぱりlog N回
346デフォルトの名無しさん:2005/11/06(日) 22:16:45
あー、1もlog Nって書いといて。厳密には全部底が2なんだが、
そこだけ2って書くのは変なので。
347デフォルトの名無しさん:2005/11/06(日) 22:20:09
>【 1 】〜【 4 】を埋めよ。
まかせとけ!!

(a) 整列ずみの配列によって実現された順位キューについて
1 つの要素の挿入操作に必要な比較回数は最悪でO■■■■■ 回であり,最大値の削除操作に必
要な比較回数は最悪でO■■■■■回である。

(b) ヒープによって実現された順位キューについて、
1 つの要素の挿入操作に必要な比較回数は最悪でO■■■■■ 回であり,最大値の削除操作に必要な比較
回数は最悪でO■■■■■回である。
348341 ◆.bx/RmFBek :2005/11/06(日) 22:21:23
>>344
344の場合は繰り返し回数によってxの精度が変わっていますが
(繰り返し回数を多くすることで答えの精度が上がる)、
今回はあらかじめ精度を決めて 何回繰り返したらその精度に
達するか というプログラムを作成したいのです。
下に書くプログラムは 今回の問題とはちがいますけど
「x=5sin(x)」をみたすxの値を 求めたものです。
#include <stdio.h>
#include <math.h>
float f(float x);
float g(float g);
float main()
{
float a,b,c=4.0,h=0.01;
int k=0;
while(fabs(f(c))>10e-6){
k++;
b=c+h;
a=(f(b)-f(c))/h;
c=c-f(c)/a;
}
printf("%f\n",c);
printf("\n%d",k);
}
float f(float x){
return(x+5*sin(x));

}
349デフォルトの名無しさん:2005/11/06(日) 22:26:38
double epsilon = 0.1;
ってやっといて
>if(x == neuton(x))break;
これを
if( fabs(x - neuton(x)) >= episilon ) break;
にして
>printf("[x] = %lf",func(x));
これを
printf("[x] = %lf [loops] = %d",func(x) , i);

動くかどうかはしらね。
350デフォルトの名無しさん:2005/11/06(日) 22:26:45
[1] 情報処理1
[2] 2ケタの数字をキーボードから入力し、配列とポインタを用いて連続する10個の数字を出力せよ。
[3] Windows bcc55 C
[4] 明日
[5] なし
↓ポインタを使わずにするとこんな風になるんですが、ポインタがよくわからないのでお願いします。
#include <stdio.h>
main()
{
int i, n,s[10];
printf("input number n>=10 --->");
scanf("%d",&n);
s[0]=n;
for(i=0; i<10; i++){
s[i+1]=s[i]+1;
printf("%d\n",s[i]);}
}
351デフォルトの名無しさん:2005/11/06(日) 22:28:42
ピボット選択が必要な4元1次方程式ってどのようなものがありますか??
352デフォルトの名無しさん:2005/11/06(日) 22:31:44
ちょwwww i=9で破綻してるw
353デフォルトの名無しさん:2005/11/06(日) 22:36:48
ワラタ
354デフォルトの名無しさん:2005/11/06(日) 22:38:43
349
if( fabs(x - neuton(x)) <= episilon ) break;

「誤差量がep以下になったら」breakする。
355348 ◆.bx/RmFBek :2005/11/06(日) 22:45:03
>>354
なぜか[loops]の値が0になるのですけど・・・
356デフォルトの名無しさん:2005/11/06(日) 22:46:01
>>249
間違ってるかも。
【8】 3,2,0,4,1
【9】 5
357デフォルトの名無しさん:2005/11/06(日) 22:46:55
>>355 条件文間違ってる。これだと最初の一回しか処理しない。
>>354
358デフォルトの名無しさん:2005/11/06(日) 22:47:07
2w+3x+4y−5z=0
5w+2x−2y+z=7
3w+x−y+z=6
7w+2x+y−3z=2
(注)ピボット選択必須
この連立一次方程式をガウスの消去法で解くプログラムを完成させよ
お願いします
359デフォルトの名無しさん:2005/11/06(日) 22:47:16
#include <stdio.h>
#include <math.h>

#define ACC 1e-3

double func(double x);
double funcd(double x);
double neuton(double x);
int main(int argc,char** argv)
{
printf("%d回", get_acc(12.0,ACC));
}
int get_acc(double _x, double acc){
int i=0;double x=_x;
printf("%lf\n",x);
while(fabs(neuton(x)-x)>acc){
x=neuton(x);i++;
printf("%lf\n",x);
}
printf("func(%lf)=%lf\n",x,func(x));
return i;
}

double func(double x)
{return (3*sin(x)+log(x));}
double funcd(double x)
{return (3*cos(x)+1/x);}
double neuton(double x)
{return (x-func(x)/funcd(x));}

こういうこと?
360デフォルトの名無しさん:2005/11/06(日) 22:48:48
>>358
>>335

最近の若い奴はログもろくに読まんのか(´д`)
361358&335:2005/11/06(日) 22:55:08
>>360
方程式を自分で考えるよう言われたのでやってみました
お願いします
362デフォルトの名無しさん:2005/11/06(日) 23:05:11
「ガウスの消去法」でyahooで検索したら、上から4番目に詳しい説明が出た。

n = 4;
double a[4][4],b[4];
a[0][0]=... みたいにして書けば動くはず。

というか既出の問題に関してはまとめサイト欲しいな...
363362:2005/11/06(日) 23:17:41
ピボットなしだよ。。。ごめんなさい。

364デフォルトの名無しさん:2005/11/06(日) 23:21:00
365355 ◆.bx/RmFBek :2005/11/06(日) 23:29:27
>>357 >>359
ありがとうございます!!
無事プログラムを完成させることができました。
本当に 感謝です。
366334=338=359:2005/11/06(日) 23:35:58
じゃ、指定した口座に10万円振り込んどいてくださいね
取り立てますよ
367デフォルトの名無しさん:2005/11/06(日) 23:40:25
>>無事プログラムを完成させることができました。
ってお前は何もやってねーだろwww
368デフォルトの名無しさん:2005/11/06(日) 23:43:08
>>345
迅速に埋めて頂き、有難うございました!
369365:2005/11/07(月) 00:01:57
>>367
すまないすまないww でも本当に助かったよ。ありがとう。
370(1/3):2005/11/07(月) 00:07:41
>>358
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

swap( double *x, double *y ){
double temp;
temp = *x;
*x = *y;
*y = temp;
}
main(){
int i, j, k, n=4, pibot;
double max;
double a[4][4]={{2,3,4,-5},{5,2,-2,1},{3,1,-1,1},{7,2,1,-3}};
double b[4]={0,7,6,2};
int z;
for(z=0;z<4;z++)
printf("(%5.2f)A+(%5.2f)B+(%5.2f)C+(%5.2f)D=%5.2f\n"
,a[z][0],a[z][1],a[z][2],a[z][3],b[z]);
371(2/3):2005/11/07(月) 00:08:24
for( i = 0; i < n; i++ ){
/* ピボット選択 */
max = 0; pibot = i;
for( j=i; j<n; j++ ){
if( fabs( a[j][i] ) > max ){
max = fabs( a[j][i] );
pibot = j;
}
}
if( pibot != i ) {
for( j = 0; j < n; j++ ){
swap( &a[i][j], &a[pibot][j] );
}
swap( &b[i], &b[pibot] );
}

/* 前進消去 */
for( j = i+1; j < n; j++ ){
a[i][j] /= a[i][i];
}
b[i] /= a[i][i];
for( k = i+1; k < n; k++ ){
for( j = i+1; j < n; j++ ){
a[k][j] -= a[i][j] * a[k][i];
}
b[k] -= b[i] * a[k][i];
}
372(3/3):2005/11/07(月) 00:09:02
/* 後退代入 */
for( i = n-1; i >= 0; i-- ){
for( j = i+1; j < n; j++ ){
b[i] -= a[i][j] * b[j];
}
}

/* 出力 */
printf( "解A=%5.2f\n", b[0] );
printf( "解B=%5.2f\n", b[1] );
printf( "解C=%5.2f\n", b[2] );
printf( "解D=%5.2f\n", b[3] );

}

あと、氏ねカス
373カス:2005/11/07(月) 00:29:17
>>372
ありがとっす
374350:2005/11/07(月) 00:55:07
すみません。華麗にスルーされているみたいなので重ねてお願い申しageます
375デフォルトの名無しさん:2005/11/07(月) 01:08:12
>>374

はい、ポインタ使った

#include <stdio.h> 
main() 

int i, n,s[10], *p; 
printf("input number n>=10 --->"); 
scanf("%d",&n); 
p = &s[0];
p[0]=n; 
for(i=0; i<10-1; i++){ 
p[i+1]=p[i]+1; 
printf("%d\n",p[i]);} 

376デフォルトの名無しさん:2005/11/07(月) 01:08:13
#include <stdio.h>
main()
{
int i, n,s[10],*p=s;
printf("input number n>=10 --->");
scanf("%d",&n);
*p=n;
for(i=0; i<10; i++)*(++p)=++n;

for(i=0; i<10; i++)printf("%d\n",s[i]);
}

配列とポインタを使う意味が分からん
377デフォルトの名無しさん:2005/11/07(月) 01:10:45
>>375
どうせなら*p++使ってやれw

>>376
配列をポインタで走査できるぞってことの例じゃねーの?
それにしたってもうちょっといいのが有りそうなもんだが・・・
378350:2005/11/07(月) 01:12:05
皆さんありがとうございます。おかげさまで提出日に間に合いました。
379デフォルトの名無しさん:2005/11/07(月) 02:30:31
2分探索木のデータ構造で
typedef struct _node {
int key;
int info;
struct _node *left;
struct _node *right;
} NODE;
static NODE *root = NULL;
NODE *insert(int key)
{
NODE **node = &root;

while (*node != NULL) {
if (key == (*node)->key) return NULL;
if (key < (*node)->key) node = &((*node)->left);
else node = &((*node)->right);
}
if ((*node = (NODE *)malloc(sizeof(NODE))) == NULL) return NULL;
(*node)->key = key;
(*node)->left = (*node)->right = NULL;
return (*node);
}
insert関数のところでNODE *node = root
ではなくてNODE **node = &rootとしているのは何故ですか?
380デフォルトの名無しさん:2005/11/07(月) 02:41:01
rootはNODE構造体(1)のポインタ(2)
&rootはそのポインタを格納してるアドレス(3)

**node = &root
とすると
nodeは(3)
*nodeは(2)
**nodeは(1)
つまり
node = rootとなる

なんでこんなことしてんのかは
詳しく見てないから分からん
381379:2005/11/07(月) 03:42:09
うはwwww試しに
NODE *node = root;
でやってみたら恐ろしく冗長になったしwww
めんどくせーけどこれしかないのか。
382デフォルトの名無しさん:2005/11/07(月) 08:20:14
[1] 授業単元: 基礎プログラミング
[2] 問題文(含コード&リンク): データの最大値・最小値・平均値を求めるプログラミング
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: CPad for Borland 2.31(でいいんでしょうか?)
 [3.3] 言語: C
[4] 期限:今日夕方
[5] その他の制限:for文 While文 if文程度です。

とりあえず↓まで書いたのですが、数字を入力し実行しても何も表示されません。どこが間違っているのでしょうか?
#include <stdio.h>
main()
{
int max, min, i, d, s, t;
printf("整数値="); scanf("%d", &d);
max = d, min = d, t = d;
for (i=0; scanf("%d",&d)!=EOF; i++){
if (max < d) max = d;if (min > d) min = d; t = t + d;
}
s = t/i;
printf("max=%d,min=%d, ave = %d\n", max, min, s);

}

よろしくお願いします。

383デフォルトの名無しさん:2005/11/07(月) 08:39:07
>>174もう一方の方で聞いてみます。ありがとうございました
384デフォルトの名無しさん:2005/11/07(月) 08:50:46
>>382
一見しても間違いはなさそうだし、俺が試してみてもきちんと動いた。
385デフォルトの名無しさん:2005/11/07(月) 09:39:52
>>382
scanfは2回以上使うなとあれ程・・・
っていうかscanf("%d",&d)!=EOFで終わるって
やばくね???
文字なんか入力した日にゃ・・・
386デフォルトの名無しさん:2005/11/07(月) 11:39:58
[1] 授業単元:プログラミング演習U
[2] 問題文:
入力した文字列を逆順で再構成する関数strinverseを作れ。
ただし関数名、引数の型と数および返り値は以下のようにせよ。
また、引数として与えた文字列を破壊してはいけない。
s がNULLである場合は考慮しなくてもよい。

char *strinverse(char *s)
{
    …
}

※関数だけでなく,適当なテストが可能なmainプログラム、
そして適当なテストデータとその結果を添えよ。

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:11/11まで
[5] その他の制限:関数とポインタまで習いました。

どなたかご教授お願いします。
387デフォルトの名無しさん:2005/11/07(月) 11:49:50
>382
特定しますた
388デフォルトの名無しさん:2005/11/07(月) 11:59:28
>>386
引き数を破壊してはいけないということは、
char * strinverse(const char * s);
という解釈でいいのかな?
で、戻り値としてはヒープ領域を返す方法と静的領域を返す方法とあるけどどっちがいい?
#それにしても、不思議な関数名だね。
389386:2005/11/07(月) 12:28:17
>>388
早速のレスありがとうございます。
その解釈でOKです。
ヒープ領域を返す方法でよろしくお願いします。
390デフォルトの名無しさん:2005/11/07(月) 12:33:01
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *strinverse(char *s)
{
    char *t;
    size_t size;
    unsigned int i;

    size=strlen(s)+1;
    t=(char *)malloc(size);
    for (i=0 ; i<size-1 ; i++)
    {
        t[i]=s[size-2-i];
    }
    t[size-1]='\0';

    return t;
}

int main()
{
    char *s="hello, world";
    char *t;
    t=strinverse(s);
    printf("%s\n", t);
    printf("%s\n", s);
    free(t);
    return 0;
}
391デフォルトの名無しさん:2005/11/07(月) 13:31:21
>>386
str[a-z].*という識別子はstring.hとstdlib.hで外部名を持つ識別子として予約済みだから
そんな名前の外部関数を新たに定義するのは規約違反なんだが

string.hとstdlib.hをインクルードせずにstrinverseを内部関数として定義して
「おまえの出した課題は間違っている」ということを教官に伝えるのが吉
引っかけかもしれんし
392デフォルトの名無しさん:2005/11/07(月) 14:25:20
なにこの課題?
最悪な関数だな
こういうのって普通は呼び出し側が用意した領域にコピーさせるんじゃないの?
393382:2005/11/07(月) 15:01:08
>>384
再確認したけどやっぱり動かないっぽいですorz
数字入力してEnterしてもなにも起こらないです。
コンパイルはできるのですが…。

>>385
一応教官の大まかな指示どおりやってみたつもりなんですが、
自分の勉強不足でして…。

>>387
たぶん特定しますたw
394デフォルトの名無しさん:2005/11/07(月) 15:06:31
>>393
とりあえずfgets+sscanfで作り直せ
危なすぎる
395デフォルトの名無しさん:2005/11/07(月) 15:12:09
ちゃんと数値を入力しているのだろうか。
ちゃんと標準入力を閉じているのだろうか。
396382:2005/11/07(月) 15:34:16
>>394
これでいいんでしょうか?

#include <stdio.h>
main(void)
{
int max, min, i, d, s, t;
char buf[80];
max = d, min = d, t = d;

fgets(buf, 80, stdin);
sscanf(buf, "%d", &d);
for (i=0; scanf("%d",&d)!=EOF; i++){
if (max < d) max = d;if (min > d) min = d; t = t + d;
}
s = t/i;
printf("max=%d,min=%d, ave = %d\n", max, min, s);

}
scanf("%d",&d)!=EOFは教官の指示なので外せません。
これでも動きませんorz

>>395
詳しくご教授お願いします。。。
397387:2005/11/07(月) 15:46:03
>396
382ので問題なく動くよ〜
多分EOFの意味が判ってないのが原因
398デフォルトの名無しさん:2005/11/07(月) 15:49:31
>>382,393
つか scanf()がEOFを返すのは特殊な場合(?)だから、
普通に入力をEnterなどで区切って打つだけじゃ、
そのforループから先には永久に進まないだろうに?
わたしゃCPadやらWin用の開発環境を持ってないので
誰か補足してやってくれ。
(Winなら Ctrl+Z ? なんて言っていいのかどうかも知らん)
399デフォルトの名無しさん:2005/11/07(月) 15:57:36
>>391
>str[a-z].*という識別子はstring.hとstdlib.hで外部名を持つ識別子として予約済みだから
>そんな名前の外部関数を新たに定義するのは規約違反なんだが
例えば、自分のプログラムに strike_a_fool() なんて作ると
「規約違反」になってしまうとは知ラナカタアルヨ。
それは何の規約に違反するのか教えてくれまいか? 調べがつかないのだが。
400デフォルトの名無しさん:2005/11/07(月) 16:02:07
>>382
入力する数値を一端ファイルに保存してそこからリダイレクトしてみる
終了時にCtrl+Zで良いとは思うが、駄目だったらってことで
401デフォルトの名無しさん:2005/11/07(月) 16:13:16
文字列strの中に、文字cが含まれていれば(複数ある場合はもっとも先頭側とする)、その添字を返し、含まれていなければ-1を返す関数

int str_char(const char str[],int c)を作成せよ。 注:メイン関数で標準入力から文字列strと文字cを読み込んだあと、課題関数内で文字str
の中を1文字ずつ走査していく。その繰り返し処理内で目的の文字cを発見した場合に添字(文字strの何番目に文字cが含まれているか)を返せばよい。

402デフォルトの名無しさん:2005/11/07(月) 16:15:03
一応、自分で作ったのは
#include <stdio.h>

int str_char(const char str[], int c)
{
int i;
for (i=0; str[i]!='\0';i++)
if (str[i]==c)
return (i);
return(-1);
}

までです。
その後のint main関数内がわかりません。よろしくお願いします。
403386:2005/11/07(月) 16:15:14
>>390
どうもありがとうございます。


>>391
マジすか!?わかりました。
後で教官に伝えておきます。
404デフォルトの名無しさん:2005/11/07(月) 16:22:24
>>401
テンプレも読めない屑はこれでも提出しとけ

int str_char(const char str[], int c)
{
(strchr(str, c)!=NULL)?return strchr(str,c)-str:return -1;
}
405デフォルトの名無しさん:2005/11/07(月) 16:22:52
どうも、>>386の教官です
腹いせに>>386は落第にしときますんで
406382:2005/11/07(月) 16:23:42
ああ、俺はなんていう勘違いを・・・orz
やっと理解できました。
先入観とは怖いもので。。。

本当に皆様ありがとうございました。
サンクスです。
407デフォルトの名無しさん:2005/11/07(月) 16:28:22
>>391
俺がJIS X 3010:2003のうちそのようなことが書いてありそうなところを探してみても、
そんな記述は見当たらなかった。すまんがどこに書いてあるのか教えてくれないか。
408デフォルトの名無しさん:2005/11/07(月) 16:29:00
>>399

JISX3010 プログラム言語C

7.1.3 予約済み識別子 ……

− 7.(今後のライブラリの方針を含む。)で規定する外部結合をもつすべての識別子は、外部結合をもつ識別子としての使用に対して常に予約済みとする
   :
プログラムが識別子を宣言又は定義し, その文脈においてその識別子が予約済みである場合(7.1.4 で許されたもの以外), 又は予約済みの識別子をマクロ名として定義する場合, その動作は未定義とする。……


7.26 今後のライブラリの方針 …… 7.26.1〜7.26.13で規定するすべての外部名は, プログラムに取り込むヘッダの集合に関わらず, 予約済みとする。

7.26.10 一般ユーティリティ<stdlib.h> strに続き英小文字1文字で始まる関数名を, <stdlib.h>ヘッダの宣言に追加してもよい。

7.26.11 文字列操作<string.h> str, mem 又はwcsに続き英小文字1文字で始まる関数名を, <string.h>ヘッダの宣言に追加してもよい。


「エキスパートCプログラミング」やC-FAQの書籍版にもっとわかりやすい説明が載ってる
409407:2005/11/07(月) 16:33:32
_| ̄|○
(7.26は読んでいなかった)
410386:2005/11/07(月) 16:48:09
>>405
落第は勘弁してくださいw
411デフォルトの名無しさん:2005/11/07(月) 16:59:24
http://www.jisc.go.jp/app/pager?%23jps.JPSH0020D:JPSO0010:/JPS/JPSO0020.jsp=
ここの一番上の欄で"X3010"を検索する


14993KBのPDF orz
412デフォルトの名無しさん:2005/11/07(月) 17:01:07
>>408
それを持ち出すならきちんと規約違反と未定義(undefined)の区別
(または区別のあるなし)をきちんとしてくれよ。
413デフォルトの名無しさん:2005/11/07(月) 17:01:40
>>411
そういう風に直接URLを張ると他人からはhttp://www.jisc.go.jp/app/pagerの内容が表示される罠
414デフォルトの名無しさん:2005/11/07(月) 17:10:46
Janeでリンク踏んだらうまく表示された
リファラ見てるのかな
415デフォルトの名無しさん:2005/11/07(月) 17:46:43
>>411
Fxじゃ表示されないし、かといってIEじゃなかなか出てこないわでイライラした
つーか、JISって規格書だろ?なんで普通に落とせるようにしとかないんだ
416デフォルトの名無しさん:2005/11/07(月) 17:53:58
417デフォルトの名無しさん:2005/11/07(月) 17:59:54
>>416
勝手に国内用の規格決めておいて、じゃあ規格ってどんな内容?って時には
金を出せか・・・

まぁPDF程度、Etherealでパケット見りゃ落とせるんだけどな
418デフォルトの名無しさん:2005/11/07(月) 18:00:13
途中で間違えなければ無料でPDFをダウンロードできる
かなり理不尽だからよほど注意深くやらないと無理だけど
419デフォルトの名無しさん:2005/11/07(月) 18:14:04
ヒント:キャッシュ
420デフォルトの名無しさん:2005/11/07(月) 18:15:04
おまいらひょっとして右クリックからダウンロード出来ることも知らないのか?
421デフォルトの名無しさん:2005/11/07(月) 18:32:22
豚切スマソ;;
漏れの宿題について誰か回答キボン;;
キーボードから2つの数nとrを入力すると、(r ≦n )
n個のものからr個を取り出す組み合わせの数、nCrを求め表示するプログラム
を作るんだが・・・分かるヤシいるか?
422デフォルトの名無しさん:2005/11/07(月) 18:35:22
>>421
>>1


しかしJIS規格書、落としても印刷できないのが鬱陶しいな
423デフォルトの名無しさん:2005/11/07(月) 18:36:17
>>421
>>1も読めない質問の態度も悪いクソ野郎に答える奴はマゾだな
424デフォルトの名無しさん:2005/11/07(月) 18:42:11
>>422-423
お前らも一回>>1を読むべきだと思う。
425デフォルトの名無しさん:2005/11/07(月) 18:52:13
>>421
#include <stdio.h>

int combination(int n, int r)
{
  int i;
  int val = 1;
  for(i = n; i > n - r; i--)
    val *= i;
  for(i = r; i > 0; i--)
    val /= i;
  return val;
}

int main(void)
{
  int n, r;
  printf("input n and r\n");
  scanf("%d %d", &n, &r);
  printf("nCr = %d\n", combination(n, r));
}

一応これでできるが、結果がintの範囲内でも途中でオーバーフローすることがあるので注意。
426デフォルトの名無しさん ◆.bx/RmFBek :2005/11/07(月) 19:12:34
よろしくお願いします!!
[1] :数値解析
[2] :ルンゲクッタ法により、dy/dx = (ycos(x)+1)/(x+3)のxの値を求めよ。ただし
xの初期値: a=5
xの終点 : b=10
y(0)=1
きざみ : h=0.01
[3] 環境
Windows XP , lcc , C言語
[4] 期限: H17.11.8
[5] その他:プログラムの仕方のところに書いてあったことを書きます。
<スキームの例>
1:初期値の設定、刻みの設定、計算範囲の設定を行う。
2:xの値をきざみだけ増分子、そのxにおけるyの値をルンゲクッタ法の公式に基づいて計算する。
3:xの値が計算範囲を超えるまで 2 をくりかえす。
<ソースプログラム例>
#include
float f(float y,float x);
void main(void){
float a=・・・, b= ・・・, ・・・←初期設定(読み込んでも良い)
FILE *fp; ←ファイルへの入出力を設定
while( ) ← xが計算範囲内であるか
printf("%f",a); ←念のため ディスプレイにも出力(x)
fprintf(fp,"%f",a); ←ファイルに出力(x)
printf("%f",y); ←念のため ディスプレイにも出力(y)
fprintf(fp,"%f",y); ←ファイルに出力(y)
・・・ ←g1からg4 の計算,yの値の更新,yの値の更新
}
  ←ファイルクローズ
}
427デフォルトの名無しさん:2005/11/07(月) 19:56:04
:仕様書無しさん :2005/11/07(月) 19:47:39

http://homepage1.nifty.com/rucio/main/VBdotNet/AboutVB/WhatsVBdotNet.htm

Visual Basic.NETではどのようなアプリケーションが作れるのか
 

Visual Basic.NETではWindows上、Web上、モバイル上で動作するさまざまな種類のアプリケーションが作成できます。

ユーティリティやちょっとしたツール、データベースを操作するアプリケーション、ゲームなどアイディアしだいでさまざまなものが作れます。DirectXと連動して3Dやポリゴンを利用したゲームを作ることもできます。

ただし、プレイステーションなどの家庭用ゲーム機のゲームのほとんどはC++という言語で開発されていることに注意してください。このような本格的なゲームプログラマを目指している方はC++を勉強してください。

けれどVBに熟達すればC++にも通じるようになります。(とはいえC++が目的ならはじめからC++を勉強した方が早いです。)
428デフォルトの名無しさん:2005/11/07(月) 20:22:20
[1] 授業単元: コンピュータ基礎
[2] 三つの整数値を読み込んで、その最小値を求めて表示するプログラムを
  条件演算子を用いて作成せよ。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 今週の水曜まで
[5] その他の制限:

429デフォルトの名無しさん:2005/11/07(月) 20:24:23
>>428
VIPPERスレにN個の整数を読み込んで・・・
のプログラムが張られてるからそれを参考にしろ

毎日同じコード作ってられるか!
430デフォルトの名無しさん:2005/11/07(月) 20:33:58
>>428
#include <stdio.h>
int main(int argc, char **argv)
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
printf("最小値=%d\n", (a < b && a < c) ? a : (b < c) ? b : c);
return 0;
}
431デフォルトの名無しさん:2005/11/07(月) 21:29:31
>>426
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1047.c
ちょっと手抜き入ってるけど

修正した方がいいと思われる箇所
・丸め誤差に対する対応
・わかりやすい変数名に変えたりとか
・エラーメッセージww
432デフォルトの名無しさん:2005/11/07(月) 21:58:37
C++のクラス内のメソッドへのポインタを、外部のCで書かれた関数へのポインタにキャストするって
できますか?
int (*func)(int, void*) = (int (*)(int, void*))&MainClass::setData;
こうするとerror: convertingのエラーが出てしまいます。
433デフォルトの名無しさん:2005/11/07(月) 22:02:31
>>432
無理です。
それから、スレ違いです。
434426:2005/11/07(月) 22:21:08
>>431
ありがとうございます!!
実は このプログラムでエクセルの「runngekutta」というファイルに
データが書き込まれるようにしたいのですけど、どうすればいいですか?
また、データがエクセルに書き込みされる際、x,yが 違うセルに
表示されるようにしたいのですけど どうすればいいでしょうか?
435デフォルトの名無しさん:2005/11/07(月) 22:50:48
EXCELの書式(*.XLS)は知らないので
runngekutta.csvに書き出す方法(CSVならEXCELで読めると思う)で説明する

#define out_file "Nullpoga.txt"

#define out_file "runngekutta.csv"

カンマ区切りでも読み込めると思うがタブ区切りにしたいなら
printf,fprintf内で
"%f , %f\n"

"%f \t %f\n"
と変更する
(csvの読み込み方はEXCELのマニュアルなどを参考にしてください
一応C/C++のプログラミングに関するスレなのでそれ以外に関しては他で)
Excel総合相談所 39
http://pc8.2ch.net/test/read.cgi/bsoft/1131287690/l50
436434:2005/11/07(月) 23:10:00
>>435
ありがとうございました。
すべて解決しました!!助かりました!!
明日の提出に間に合います!!(感涙)
437as:2005/11/08(火) 06:26:14
[1] 授業単元:構造体,call by reference
[2] 問題文(含コード&リンク):
構造体配列(メンバ: date,temp,hum,thi)に以下のデータを初期化し、date、temp.、
hum.、温室指数(THI)を計算しメンバとして登録するユーザ関数と指数値が70以下ならば
「過ごしやすい日」70から75以下なら「少し不快な日」75から80以下なら
「不快な日」80を越えたら「とても不快な日」と表示するユーザ関数を含むプログラム
kadai1-1a.c(mainのファイル) kadai1-1b.c(温室指数を計算するファイル)
kadai1-1c.c(温室指数の高い順に結果を表示するファイル) kadai1-1d.c(コメントを表示するファイル)
kisyou.h(構造体型の作成ヘッダファイル)を作成しなさい。
438as:2005/11/08(火) 06:26:40
データ
date temp. hum.
07/29 25.2 65.0
07/30 32.3 62.0
07/31 29.2 60.0
08/01 25.6 75.0
08/02 24.3 80.0
温室指数を求める式

THI=0.81*temp.+0.01*hum*(0.99*temp.-14.3)+46.3

表示結果
date temp. hum. THI
07/29 25.2 65.0 83.4
07/30 32.3 62.0 78.7
07/31 29.2 60.0 75.3
08/01 25.6 75.0 73.8
08/02 24.3 80.0 73.6

07/29は、少し不快な日だった
07/30は、とても不快な日だった
07/31は、不快な日だった
08/01は、不快な日だった
08/02は、少し不快な日だった

 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン:わかりません
 [3.3] 言語: C言語
[4] 期限: 11/8(火)お昼1時まで
[5] その他の制限: 初心者でもわかりやすく。

よろしくお願いします
439デフォルトの名無しさん:2005/11/08(火) 10:12:40
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1048.zip

変数名ひどすぎ
文字コードがS-JISなので別途EUCに変換する必要が出るかも
C99なら大丈夫だがC90だと警告がでる
440as:2005/11/08(火) 13:31:38
問題、解いてくれる人はいませんか?
441デフォルトの名無しさん:2005/11/08(火) 13:50:29
>>440
>>439が解いてるが。
442as:2005/11/08(火) 13:54:45
すいません。
>>439さん、ありがとうございました!!助かりました
443デフォルトの名無しさん:2005/11/08(火) 15:34:55
[1] 授業単元:プログラミング
[2] 環境
 [2.1] OS: Linux
 [2.2] コンパイラバージョン: gcc
 [2.3] 言語: C
[3] 期限11月10日午後4時
[4] 問題文:
与えられたデータをクイックソートで降順にソートさせるとともに、それらの統計量(メジアン、平均、分散、標準偏差)を
求めるプログラムを作成し、実行せよ。ただし、プログラムは以下の仕様を満たすものとする。
<仕様>
1、データは、
gakusei[]={165.4,158.2,170.8,156.7,175.1,172.9,120.8,130.4,180.0,178.5,
185.0.163.8,175.1,162.1,159.2,149.6,190.3,119.5,152.3,160.7}とする
2、最初にソート前のデータを表示させた後、ソート後のデータを表示させること。
3、データソートは、降順でのみ行うこと(すなわち昇順でソートした後配列の要素を逆順に入れ替えないこと
4、メジアン、平均、分散、は関数1個で計算させること。また、main関数で計算した全統計量を表示させること。
<出力例>
Data before sorting
165.4 158.2 170.8 156.7 175.1 172.9 120.8 130.4 180.0 178.5
185.0 163.8 175.1 162.1 159.2 149.6 190.3 119.5 152.3 160.7
Sorted data
190.3 185.0 180.8 178.5 175.1 175.1 172.9 170.8 165.4 163.8
162.1 160.0 159.2 158.2 156.7 152.3 149.6 130.4 120.8 119.5
Median:160.21←この値が正解だとは限らない
Average:170.35←この値が正解だとは限らない
Variance:324.00←この値が正解だとは限らない
Standard deviationi:18.00←この値が正解だとは限らない

以上ですよろしくお願いします(TдT)
444デフォルトの名無しさん:2005/11/08(火) 16:07:52
まだC99バカが粘着してるようだな。迷惑だから去れって。
445デフォルトの名無しさん:2005/11/08(火) 16:30:56
C99馬鹿って439?asって人の問題、自分も解けなかったw
446421:2005/11/08(火) 16:39:37
>>421です。
すいませんでした。改めてお願いします。
[1] 授業単元:情報処理
[2] キーボードから2つの数nとrを入力すると、(r ≦n )
  n個のものからr個を取り出す組み合わせの数、nCrを求め表示するるプログラムを作りなさい.
[3] 環境
 [3.1] OS:UNIX
 [3.2] コンパイラ名とバージョン: g++
 [3.3] 言語: C++
[4] 11/9まで
[5] その他の制限:
447 ◆3kGpgyOOmo :2005/11/08(火) 16:40:13
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):0.1を繰り返し足して特定の整数値まで足す
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC 6.0
 [3.3] 言語:C++
[4] 期限:2005年11月9日10:00
[5] その他の制限:浮動小数点数の丸めは使わない(多分)

#include<stdio.h>
int func(int n)
{
double i=0;
while(1)
{
i+=0.1;
if(i==n)
return i;

}
}
void main(void)
{
int i=10;
printf("%dまで足した結果は%d\n",i,func(i));
}
例えばこれでやると当然10では止まらないわけですが、
習ってないので恐らく丸め以外で解決しないといけないと思われます。
期限が1日しかないので申し訳ないですがご教授ください。
448デフォルトの名無しさん:2005/11/08(火) 16:50:06
>>447
#include<stdio.h>

double func(int n)
{
    double i=0, sum=0;
    for (i=0 ; i<=n ; i+=0.1)
    {
        sum+=i;
    }
    return sum;
}

void main(void)
{
    int i=10;
    printf("%dまで足した結果は%f\n",i,func(i));
}
449デフォルトの名無しさん:2005/11/08(火) 16:50:12
不等号じゃだめなの?
450デフォルトの名無しさん:2005/11/08(火) 16:53:39
>>446
#include <stdio.h>
int gcd(int a, int b) {
  int r;
  while (r = (a % b)) a = b, b = r;
  return b;
}
int choose(int n, int r) {
  int x = 1, y = 1, g, i;
  for (i = 1; i <= r; ++i) 
    x *= (n-i+1), y *= i, g = gcd(x,y), x /= g, y /= g;
  return x / y;
}
int main() {
  int n, r;
  scanf("%d %d", &n, &r);
  printf("nCr = %d\n", choose(n,r));
}
451デフォルトの名無しさん:2005/11/08(火) 16:57:22
>>447
なんか変な課題だがひょっとして浮動小数点演算の誤差を実感させるためか・・・?
452デフォルトの名無しさん:2005/11/08(火) 16:58:03
何故にchoose(´Д`; )
453446:2005/11/08(火) 16:58:48
>>448,450
素早い返答ありがとうございます。
不等号でもいいとは思うのですが…

本当にありがとうございました。
454421:2005/11/08(火) 16:59:35
>>450
ありがとうございました。
455446:2005/11/08(火) 17:00:34
>>451
そのようで。0.1を10回足しても1にはならんというのを説明した後に、
じゃあ実際に0.1を10回足して1にするプログラムを作ってみろ、
みたいな流れで出た課題なので。
456デフォルトの名無しさん:2005/11/08(火) 17:01:59
>>455
10倍してintに直して計算しろって意図かも
457450:2005/11/08(火) 17:05:55
>>452 n choose r とか読まなかったっけ・・・?
458446:2005/11/08(火) 17:07:22
>>456
かもしれないです。
10倍して整数値で計算して元に戻す。

これだとプログラムはどうなるんだろ…
家にC++環境が無くて大学だと2chに書き込めないorz
459デフォルトの名無しさん:2005/11/08(火) 17:08:50
>>446ってこういうことかと勘違いしてたぜ

#include <stdio.h>
#include <stdlib.h>
int nCr(int n, int r)
{
    int kekka=1;
    int i;
    for (i=n ; i>=r ; i--)
    {
        kekka*=i;
    }

    return kekka;
}


void main(void)
{
    int n,r,i;
    scanf("%d", &n);
    scanf("%d", &r);
    if (r>n)
        exit(EXIT_FAILURE);
    printf("%d\n", nCr(n, r));
    return EXIT_SUCCESS;
}
460447:2005/11/08(火) 17:12:21
って446じゃなくて447でした。
453,455,458は全部自分です、スイマセン…
461デフォルトの名無しさん:2005/11/08(火) 17:12:28
>>458
#include <stdio.h>
#include <stdlib.h>
double func(int n)
{
    int sum=0;
    int i;
    for (i=0 ; i<=n*10 ; i++)
    {
        sum+=i;
    }

    return sum/10;
}


int main()
{
    int n=10;
    printf("%f\n", func(n));
    return EXIT_SUCCESS;
}
462デフォルトの名無しさん:2005/11/08(火) 17:13:01
>>457
高校どこ?
なんか面白いな(・∀・)
463デフォルトの名無しさん:2005/11/08(火) 17:16:20
>>443
質問があるんだが

>>4、メジアン、平均、分散、は関数1個で計算させること

てのは一つの関数内で全部計算させることを指すのか
一つずつ関数を作るのか

前者だとしたら教員が馬鹿だな

464450:2005/11/08(火) 17:16:54
>>462 大学生ですよ.スレ違いなのでこのへんで.
465デフォルトの名無しさん:2005/11/08(火) 17:18:20
>>457
つ[combination]
466デフォルトの名無しさん:2005/11/08(火) 17:18:44
>>458
>>447をソースを見た感じだとこういう事じゃないかと
#include <stdio.h>
#include <stdlib.h>
int func(int n)
{
    int sum=0;
    int i;
    while(1)
    {
        sum++;
        if(sum==n*10)
            break;
    }
    return sum/10;
}


int main()
{
    int n=10;
    printf("%d\n", func(n));
    return EXIT_SUCCESS;
}
467デフォルトの名無しさん:2005/11/08(火) 17:25:00
>>465 ググれ
"n combination r" の検索結果 約 16 件
"n choose r" の検索結果 約 751 件
468デフォルトの名無しさん:2005/11/08(火) 17:30:27
"n choose r" の検索結果のうち 日本語のページ 約 21 件中 1 - 15 件目 (0.92 秒)
469デフォルトの名無しさん:2005/11/08(火) 17:33:03
>>467
あんたは関数名に"n choose r"とつけるのか?
漏れは素直にcombinationとつけるがな。
470デフォルトの名無しさん:2005/11/08(火) 17:35:13
471デフォルトの名無しさん:2005/11/08(火) 17:38:34
>>469 昔の Mathematica は Choose[n,r] だった。今は Binom[n,r] になってる。
472デフォルトの名無しさん:2005/11/08(火) 17:40:20
アルゴリズム事典の類ではどうなってんの?
おまいらの手持ちの本でもアリゴリズム紹介サイトでもいいから教えろ
473デフォルトの名無しさん:2005/11/08(火) 17:49:36
普通はcombinationだろうな
nCrは組み合わせの数なんだし
474デフォルトの名無しさん:2005/11/08(火) 17:51:10
tex: n \choose r
R: choose(n,r)

Google電卓: n choose r
475デフォルトの名無しさん:2005/11/08(火) 17:56:12
"permutation choose" の検索結果 約 29 件
"permutation combination" の検索結果 約 931 件

ttp://www.saliu.com/permutations.html
476デフォルトの名無しさん:2005/11/08(火) 17:57:04
matlab: C = nchoosek(n,k)

http://mathworld.wolfram.com/BinomialCoefficient.html
>The symbol nCk and (n,k) are used to denote a binomial coefficient, and are sometimes read as "n choose k".

そろそろやめようぜ
477>>443(1/4):2005/11/08(火) 17:57:06
#include <stdio.h>
#include <math.h>
double get_median (double* _data, int _start, int _end);
double get_average (double* _data, int _start, int _end);
double get_variance (double* _data, int _start, int _end);
double get_deviation(double* _data, int _start, int _end);
void quicksort (double* data, int left, int right);


int main()
{
int i;
double gakusei[20]={
165.4, 158.2, 170.8, 156.7, 175.1,
172.9, 120.8, 130.4, 180.0, 178.5,
185.0, 163.8, 175.1, 162.1, 159.2,
149.6, 190.3, 119.5, 152.3, 160.7};
printf("++Deta before Sorting++\n");
478>>443(2/4):2005/11/08(火) 17:57:39

for(i=0;i<20;i++)
{
printf("%3.1f ",gakusei[i]);
if((i+1)%10==0)printf("\n");
}
quicksort(gakusei,0,19);
printf("++Sorting Data++\n");
for(i=0;i<20;i++)
{
printf("%3.1f ",gakusei[i]);
if((i+1)%10==0)printf("\n");
}
printf("++Data Analyze++\n");
printf("Median:%lf\n",get_median(gakusei,0,20));
printf("Average:%lf\n",get_average(gakusei,0,20));
printf("Variance:%lf\n",get_variance(gakusei,0,20));
printf("Deviation:%lf\n",get_deviation(gakusei,0,20));
return 0;
}
479>>443(3/4):2005/11/08(火) 17:58:09
double get_median (double* _data, int _start, int _end){
int median=(int)(_end-_start)/2;
return _data[median];}
double get_average (double* _data, int _start, int _end){
int i;
double t=0;
for(i=_start;i<_end;i++)t+=_data[i];
return t/(_end-_start);}
double get_variance (double* _data, int _start, int _end){
int i;
double v=0.0;
double n=(double)_end-_start;
double ave = get_average(_data,_start,_end);
for(i=_start;i<_end;i++)v+=pow(_data[i]-ave,2);
return v/n;}
double get_deviation(double* _data, int _start, int _end){
return get_variance(_data,_start,_end)/(_end-_start);}
480>>443(4/4):2005/11/08(火) 17:59:36
void quicksort( double* data , int left , int right ) {
int i , j ;
double temp ;
while ( right > left ) {i = left ;j = right ;
do {
while ( i < right ) {
if ( data[i] > data[right] )break ;
i ++ ;}
while ( j > left ) {
if ( data[j] < data[right] )break ;
j -- ;}
if ( i < j ) {temp = data[i] ;data[i] = data[j] ;data[j] = temp ;}
} while ( i < j ) ;
temp = data[i] ;
data[i] = data[right] ;
data[right] = temp ;
if ( i - left > right - i )quicksort( data , i + 1 , right-- ) ;
else quicksort( data , left++ , i - 1 ) ;}}
481>>443:2005/11/08(火) 18:00:37
result

++Deta before Sorting++
165.4 158.2 170.8 156.7 175.1 172.9 120.8 130.4 180.0 178.5
185.0 163.8 175.1 162.1 159.2 149.6 190.3 119.5 152.3 160.7
++Sorting Data++
119.5 120.8 130.4 149.6 152.3 156.7 158.2 159.2 160.7 162.1
163.8 165.4 170.8 172.9 175.1 175.1 178.5 180.0 185.0 190.3
++Data Analyze++
Median:163.800000
Average:161.320000
Variance:363.666600
Deviation:18.183330
482デフォルトの名無しさん:2005/11/08(火) 18:40:12
訂正
if ( data[i] > data[right] )break ;
if ( data[j] < data[right] )break ;
の不等号をそれぞれ逆に

get_medianは
double get_median (double* _data, int _start, int _end){
int median=(int)(_end-_start)/2;
if(median%2==0)return (_data[median]+_data[median-1])/2.0;
return _data[median];}


483○×:2005/11/08(火) 18:40:13
>>1045さん、ありがとうございます。
484デフォルトの名無しさん:2005/11/08(火) 18:47:28
お願いします。
[1] 授業単元: 情報処理
[2] 問題文(含コード&リンク): 整数の変数XとYを準備し、キーボードからXとYに数値を入力する。
X月Y日が1月1日から数えて何日目であるかを求める手続きを開発し、
2005年のX月Y日が何曜日かを表示するプログラムを作成せよ。
ただし、XとYはきちんとした月日をキーボードから入力する。
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: g++
 [3.3] 言語: C++
[4] 期限: できる限り早いと助かります
[5] その他の制限: ヒントとして・switch 文やif 文を駆使するとできる。
                ・2005年の1月1日は土曜日である。
                ・曜日は日数を7で割った余りと関係あり。

とあります。
よろしくお願いします。
485デフォルトの名無しさん:2005/11/08(火) 18:59:56
>>484
対応するのは2005年だけでいいのか?
それともうるう年か否かを指定してそれにも対応できるようにするのか?
486デフォルトの名無しさん:2005/11/08(火) 19:02:07
>>485
2005年のみででお願いします。
487デフォルトの名無しさん:2005/11/08(火) 19:20:38
>>486
int date2days(int month, int day)
{
static char days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

for (month--;month>0;month--)
day += days[i];

return day;
}

2005年(とゆうか非うるう年)専用
脳内コンパイラな上、論理エラーが有るかも知れん
他の部分はmod7出せば直ぐだから自力で頑張ってみれ

とゆうかこんなのじゃC++の恩恵が無いな
488デフォルトの名無しさん:2005/11/08(火) 19:29:21
>>487
switchやifを使ってではできないですよね?
489デフォルトの名無しさん:2005/11/08(火) 19:40:55
>>488
可能だが、冗長だしメモリ効率も実行効率も悪くなるぞ?
とりあえず全部書き直すのが面倒だから>>487の流用でfor以降をこれに

switch (month) {
case 12: day += days[11];
case 11: day += days[10];
case 10: day += days[9];
省略
case 2: day += days[1];
case 1: return day;
}
490デフォルトの名無しさん:2005/11/08(火) 19:43:38
>>486
んじゃムリヤリC++っぽく
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>


int main()
{
    int month, day;

    std::cin >> month >> day;

    boost::gregorian::date d1(2005, 1, 1);
    boost::gregorian::date d2(2005, month, day);
    boost::gregorian::date_duration dd(d2 - d1);

    std::cout << dd.days() << ", " << d2.day_of_week() << std::endl;

    return 0;
}
491デフォルトの名無しさん:2005/11/08(火) 20:33:59
ライブラリ使っちゃだめだろ
しかもboost
492デフォルトの名無しさん:2005/11/08(火) 20:38:51
とりあえず一部C++の恩恵を受けつつswitch文も使って、あ、ifは使ってないや
#include <iostream>
#include <numeric>
using namespace std;
int date2days(int month, int day)
{
  static char days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
  return accumulate(days, days + month, day); // numeric
}
enum Day { SUN,MON,TUE,WED,THU,FRI,SAT };
ostream& operator<<(ostream& os, Day d) {
  switch (d) {
  case SUN: return os << "sun.";
  case MON: return os << "mon.";
  case TUE: return os << "tue.";
  case WED: return os << "wed.";
  case THU: return os << "thu.";
  case FRI: return os << "fri.";
  case SAT: return os << "sat.";
  default: return os;
  }
}
Day get_day(int days) { return Day((days + 5) % 7); }

int main()
{
  int   month, date;
  cin >> month >> date;
  int   days(date2days(month, date));
  Day   day(get_day(days));
  cout << days << ", " << day << endl;
}
493デフォルトの名無しさん:2005/11/08(火) 21:06:19
んじゃ、date2days()をC++らしく。
#include <iostream>

template<int m>static inline int month() {return m;}
template<>static inline int month<1>() {return 0;}
template<>static inline int month<2>() {return 31;}
template<>static inline int month<3>() {return 59;}
template<>static inline int month<4>() {return 90;}
template<>static inline int month<5>() {return 120;}
template<>static inline int month<6>() {return 151;}
template<>static inline int month<7>() {return 181;}
template<>static inline int month<8>() {return 212;}
template<>static inline int month<9>() {return 243;}
template<>static inline int month<10>() {return 273;}
template<>static inline int month<11>() {return 304;}
template<>static inline int month<12>() {return 334;}

template<int m>static inline int date2days(int d)
{
return month<m>() + d;
}

int main()
{
std::cout << date2days<12>(31) << std::endl;
std::cout << date2days<3>(5) << std::endl;
return 0;
}
494デフォルトの名無しさん:2005/11/08(火) 21:16:35
[1] 授業単元:画像処理
[2] 問題文(含コード&リンク):入力した画像(RAW形式)から1画素おきに画素を取り出して、
新しい画像(縦横1/2の大きさになる)を作成する。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: 不明
 [3.3] 言語: C++
[4] 期限: [無期限]
[5] その他の制限: 画素値8ビットの正値(0〜255)
         入出力画像(縦横それぞれ256画素)のファイル形式はRAW形式。
         画素値を得るときにget,put関数を使用。
         パラメーターをコマンドラインから与える
         →プログラム名 入力ファイル 出力ファイル の順

    どなたかご教授お願いします。
495デフォルトの名無しさん:2005/11/08(火) 21:16:40
static inline int date2days(int m, int d)
{
switch (m) {
case 12: d += 30;
case 11: d += 31;
case 10: d += 30;
case 9: d += 31;
case 8: d += 31;
case 7: d += 30;
case 6: d += 31;
case 5: d += 30;
case 4: d += 31;
case 3: d += 28;
case 2: d += 31;
case 1: break;
}
return d;
}
496デフォルトの名無しさん:2005/11/08(火) 21:33:57
>>496
2*2のブロックを取り出して
その平均値なりなんなりに置き換えて
新しい画像に書き出せばいい

がんがれ
497496:2005/11/08(火) 21:34:31
うほ
アンカーミス

>>494
498デフォルトの名無しさん:2005/11/08(火) 21:45:14
[1] 授業単元: 情報科学
[2] 問題文(含コード&リンク): 関数の役割や有効性、デメリットなどを検討せよ。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0
 [3.3] 言語: C
[4] 期限: 特に無し、
[5] その他の制限: 特になし、1〜2文で結構ですので、どなたかご教授願います。
499デフォルトの名無しさん:2005/11/08(火) 21:49:36
ある一定の命令群を関数単位にまとめることで、その命令群を再利用することができる。
ただし関数を呼び出す命令にも時間(なんだっけ?)がかかる。
500デフォルトの名無しさん:2005/11/08(火) 21:51:11
メリット
機能ごとにまとめることで再利用性を高め、可読性も向上する
デメリット
スタック等の利用でプログラムサイズが増え、処理速度も落ちる
501デフォルトの名無しさん:2005/11/08(火) 21:52:36
オーバーヘッドか!
502デフォルトの名無しさん:2005/11/08(火) 21:57:39
>>495
month2daysのほうがわかりやすいんじゃ
503デフォルトの名無しさん:2005/11/08(火) 22:01:19
>>495
return d%7;

にすれば一気に何曜日かもとめられる


504デフォルトの名無しさん:2005/11/08(火) 22:01:35
>>494
RAW形式ってバイナリって意味か?それともデジカメの?
505デフォルトの名無しさん:2005/11/08(火) 22:21:19
>>502
その関数名最初にうpしたの俺だ(;´Д`)

>>493
テンプレート特化とはまた面白いことするなw
しかしそれを484が提出すると面倒なことになりかねないという諸刃の剣
506デフォルトの名無しさん:2005/11/08(火) 22:27:28
>>493
せめてtemplate<> static inline int month<3>() {return month<2>() + 28;}みたいにしようよ。
507デフォルトの名無しさん:2005/11/08(火) 22:32:46
実際>>492みたいに配列を使えばすげー簡単にできるんだよね

無理にswitch文とかを使う必要があるのか、と

static char days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 };
static char* weeks[] = {"FRI","SUT","SUN","MON","TUE","WED","THU"};
void d2w(int m, int d){printf("%s\n",weeks[days[m-1]+d]);}

ためしてないけどこれでできるだろ
508494:2005/11/08(火) 22:33:20
>>496
ありがとうございます。

>>504
説明不足ですいません、バイナリファイルです。
ご教授宜しくお願いします。
509デフォルトの名無しさん:2005/11/08(火) 22:33:20
やべ
weeks[(days[m-1]+d)%7]ね
510デフォルトの名無しさん:2005/11/08(火) 22:41:59
>>508
RAW形式はメーカーによって仕様がバラバラなんだけど。
511デフォルトの名無しさん:2005/11/08(火) 22:42:07
こんばんは、
関数の役割や、有効性、デメリットなどを教えていただけますでしょうか?
512デフォルトの名無しさん:2005/11/08(火) 22:43:58
511です、重複スレすみません。間違いました。
レスがちゃんと書いてなかったと思ってしまいました。
513デフォルトの名無しさん:2005/11/08(火) 22:46:53
>>507
days[] ={0,3,3,6,1,4,6,2,5,0,3,5};
ならそれでも動くな

課題は満たしてないが
514デフォルトの名無しさん:2005/11/08(火) 22:47:25
>>500
ありがとうございました。
515494:2005/11/08(火) 22:52:38
>>510
使ってるRAW形式画像は、画像の左側からラスタ順に画素値が並んでいるものです。
教科書等に度々載っている女性の画像。
516デフォルトの名無しさん:2005/11/08(火) 22:53:24
>>515
サンプルうpしてみ?
517デフォルトの名無しさん:2005/11/08(火) 22:58:30
get put関数なんだが、C標準ライブラリにはないが、
ofstreamのメンバー関数でいいか?

あれぇー 昔はあったような気がするんだけど...
そうだよなぁ、freadとfwriteでバイナリファイルいじっちゃうよな。

まあ、N88Basicのbitblt関数もどきによく使ってたなんてことは
over25のお年寄りにしかわからなくていい。
518デフォルトの名無しさん:2005/11/08(火) 23:00:57
チラs(ry
519デフォルトの名無しさん:2005/11/08(火) 23:01:21
>>516
すんません、今手元に用意できません。。
520デフォルトの名無しさん:2005/11/08(火) 23:07:28
>>507,513
>X月Y日が1月1日から数えて何日目であるかを求める手続きを開発し、

>>517 ノシ 23だけど。
521デフォルトの名無しさん:2005/11/08(火) 23:08:04
RAW形式なんだが、pgmって後ろについてなかったか?
522デフォルトの名無しさん:2005/11/08(火) 23:08:20
>>517
自分、今年からC++始めた初心者なので、あまりうまく説明できるか分かりませんが・・・
char型で1画素ずつgetしてって感じです。
523デフォルトの名無しさん:2005/11/08(火) 23:10:21
>>521
拡張子は.rawです。
524デフォルトの名無しさん:2005/11/08(火) 23:12:43
標準ライブラリ関数(?)にはgetという関数ないかも。

でもって、getc/ putcならある。
C++だったら、


ofstream fo( "〜", ios::out | ios::binary );
char c;
fo.get(c);
fo.close();

上?下?
525デフォルトの名無しさん:2005/11/08(火) 23:17:51
どーでもいいけど、この画像かな?
http://images.google.co.jp/images?q=lenna&hl=ja
526デフォルトの名無しさん:2005/11/08(火) 23:18:54
なにそれ、画像処理の定番の絵なの?
527デフォルトの名無しさん:2005/11/08(火) 23:19:01
istreamクラスのget()メンバ関数、ostreamクラスのput()メンバ関数
を、とありました。
528デフォルトの名無しさん:2005/11/08(火) 23:19:54
ご教授を、とかいってるけど
丸投げじゃねーか
529デフォルトの名無しさん:2005/11/08(火) 23:21:07
サンプルは上げて欲しい。(女の子の絵だからじゃなくて)フォーマットの確認のために。
場所はttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
まあ。そんなんで。
530デフォルトの名無しさん:2005/11/08(火) 23:27:46
[1] 授業単元:画像処理実習
[2] 問題文(含コード&リンク):
画像を2値化する関数を作成しよう

対象画像
その1)横20×縦15の乱数を用いた画像(値の範囲は0から9)
その2)横20×縦15の大きさで
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
... ... ... ...
のように滑らかに変化している画像(値の範囲は0〜9)

しきい値を与えて画像を2値化(0または1)し、0であれば’ ’
1であれば‘*‘の文字で表示する。

例)0 0 0 0 0 1 1 1 1 1 ...であれば
       * * * * *... のように
[3] 環境
 [3.1] OS:Soralis
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C言語
[4] 期限: 2005年11月9日AM8:00
[5] その他の制限: 特にありません

よろしくお願いします。
531530:2005/11/08(火) 23:29:02
すみません。*の位置がずれました。
*は1の下にきます。
532デフォルトの名無しさん:2005/11/08(火) 23:32:23
>>527 get()ってことは、バイト数(画素数)分、ループさせるのね・・・read()つかったほーがよさげだけど。
>>530 画像の与え方がわからないので・・・サンプルが欲しいです。
533デフォルトの名無しさん:2005/11/08(火) 23:46:25
>>532
read()は今まで使ったことがないんですけど、
課題の条件としては必ずしも、get(),put()を使えという制限ははありませんでした。
紛らわしくてすいません。
534デフォルトの名無しさん:2005/11/08(火) 23:52:56
いまうpする
535デフォルトの名無しさん:2005/11/08(火) 23:57:17
  _   ∩
( ゚∀゚)彡 おっ(ry
 ⊂彡
536デフォルトの名無しさん:2005/11/09(水) 00:01:02
おっぱいのほうが良かったか、ショボーン... じゃあうpやめとく。
537デフォルトの名無しさん:2005/11/09(水) 00:13:00
つーか、どこにうpすればいいんだ?
538デフォルトの名無しさん:2005/11/09(水) 00:17:43
typedef struct data{
char name[100];
int kamoku;
}data_t;

こんな構造体があって、nameとkamoku2つの値で対象にして
ソートを行う場合はどうやって考えればいいのでしょうか?

4,3,9,6,1とかこのような1次元のデータのソートならわかるのですが
2つのデータが関連しあってソートする方法がわかりません
539デフォルトの名無しさん:2005/11/09(水) 00:23:00
nameを優先させたいなら
(a) kamokuで比較しながらソートした後、nameで比較しながらソートする。
もしくは
(b) nameで比較する。もし値が同じであればkamokuで比較する。
540デフォルトの名無しさん:2005/11/09(水) 00:32:41
>>494 寝たか?
ソース
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1050.txt

データ
lenna.pgm で検索してくれ。多分すぐ見つかる。
バイナリ形式のRAWなんだが、先にヘッダ(ファイル形式と幅・高さ・解像度)を足すと
pgmという形式として扱えるので、これでやった。
もし画像を見たかったら、susie + pbm/pgm/ppm pluginで確認できる。
後はソースを適当にいじってくれ。
引数処理は何も手をつけてないし。
541デフォルトの名無しさん:2005/11/09(水) 00:33:35
>>530

void f(UNKNOWNDATATYPE* data, int n, int min)
{
  while(n-- > 0){
    *data = *data >= min;
    data++;
  }
}
542:2005/11/09(水) 00:40:42
私は、HSPでプログラミングをやってるのですが、
裁判のゲームを作っていて、死刑の場合は、控訴しますか?
と言うダイアログがでてきて、無罪の場合は、画面が、消えるようにしたいのですが、
どなたか、知っていましたら、教えてください?
543デフォルトの名無しさん:2005/11/09(水) 00:42:18
宿題じゃないので、HSPスレにいっとくれ。
544デフォルトの名無しさん:2005/11/09(水) 00:44:37
関誠テラカワイス!!!!!!!!!
545デフォルトの名無しさん:2005/11/09(水) 00:50:09
#include <stdio.h>

void pointput(int n , int m){
if(n >= m) printf("*"); else printf(" ");
}

void main(){
int x,y;
int m;
int type = 0; /* 0=rand(0-9) other=as x*/
scanf("%d",&m);

int image[15][20];

for(y=0;y<15;y++){
for(x=0;x<20;x++){
if(type == 0){
image[y][x]=rand() % 10;
} else {
image[y][x] = (int ) x * 9 / 20;
}
}
}

for(y=0;y<15;y++){
for(x=0;x<20;x++){
pointput(image[y][x] , m);
}
}
}
546デフォルトの名無しさん:2005/11/09(水) 01:38:20
>>540
ご丁寧にありがとうございました。とても助かりました。

547 ◆7WXtpC4RL6 :2005/11/09(水) 01:50:22
[1]アルゴリズム
[2]クイックソート関数(qsort)をC言語で作りなさい
#include <stdio.h>
int main(void);
void qsort(int s, int r);
int a[]={10, 7, 15, 30, 5, 9, 13, 3};
int main(void) {
int i, j, n, h, t;
n = 8;

qsort(0, n);

printf("\n");
for(i=0; i<n; i++) {
printf("i=%d, a=%d\n", i, a[i]);
}
return(0);
}
[3]Microsoft Windows XP Service Pack2 RTM/DJGPP/C
[4]今日の朝まで
548547 ◆7WXtpC4RL6 :2005/11/09(水) 01:51:04
問題のヒントより。

void qsort(int s, int r) {
int i, j, pivot, t, v;
if(s >= r) {
return;
}
i=s;
j=r-1;
pivot=a[r];
/* ここを考える */
t=a[i];
a[i]=a[r];
a[r]=t;
v=i;
qsort(s, v-1);
qsort(v+1, r);
}
549547 ◆7WXtpC4RL6 :2005/11/09(水) 01:51:45
色々調べて
a[r] = a[s];
v = s;
for (int i = s + 1; i <= r; i++) {
if (a[i] < pivot) {
v = v + 1;
t = v;
v = i;
i = t;
}
}
a[s] = a[v];
a[v] = pivot;
とかやっても駄目だったorz
誰かお助け下さいm(_ _)m
550デフォルトの名無しさん:2005/11/09(水) 01:54:51
またも殺人予告が書き込まれた!今頃になって>151を名乗る人物の書き込みが>>370に!

以下問題スレのコピペ

152 名前:名無氏物語 投稿日:2005/11/07(月) 20:26 ID:Vzu7Ck1O
>>151

調子に乗るなよブタ。お前両目を潰されたいのか。
それなら明日、お前を見つけ次第殴り殺してやろう。
図に乗るなら痛みで教えてやる。お前のようなデブオタには粛清が
必要だ。殺してやる。

154 名前:名無氏物語 投稿日:2005/11/07(月) 21:02 ID:Vzu7Ck1O
キチガイ豚はどうした? 書き込みもしなくなったか?

お前みたいなキモデブは間違って生まれてきた存在だ。そういう付け上がった
蛆虫には痛みで教えてやるよ。怪我を負わせてやらなきゃその生意気な
頭は直らないみたいだからな。お前が倒れこむまでやってやる。
明日月曜日だ。見つけ次第お前を殺す。確実にできるのは金曜日だろう。
血を流させてやるぞ……


155 名前:名無氏物語 投稿日:2005/11/07(月) 21:34 ID:m6VYPATx
明日、火曜日だよ(´・ω・`)

二松学舎大学文学部中国文学科
http://academy4.2ch.net/test/read.cgi/kobun/1130329380/l50
551デフォルトの名無しさん:2005/11/09(水) 01:59:55
552547 ◆7WXtpC4RL6 :2005/11/09(水) 02:06:28
>>551
さっそくのレスありがとうございますm(_ _"m)ペコリ
まだdoと言うのをC言語では習ってないため使うことが出来ません(>_<)
というよりC言語にもdoってあったんですね(;´▽`A``

doを使わない方法で、/* 〜 */の部分に当てはめるにはどうすればいいのでしょうか?
553デフォルトの名無しさん:2005/11/09(水) 02:23:41
w
554デフォルトの名無しさん:2005/11/09(水) 02:33:38
void qsort(int s, int r) {
int i, j, pivot, t, v;
if(s >= r) {
return;
}
i=s;
j=r-1;
pivot=a[r];
//
while(i<j){
while(i <=j && a[i] <= pivot)i++;
while(i <=j && a[j] > pivot)j--;
if(i<j){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//
t=a[i];
a[i]=a[r];
a[r]=t;
v=i;
qsort(s, v-1);
qsort(v+1, r);
}

qsort(0,n)じゃなくてqsort(0,n-1)でよびださないと無理だよ
課題出した奴が間違ってる
555デフォルトの名無しさん:2005/11/09(水) 02:36:00
qsort(0,8)だと

pivot=a[8];になってout of array boundsになるかゴミ値がまじる

あとvってのもなんのために用意してんのか分からん
556547 ◆7WXtpC4RL6 :2005/11/09(水) 02:52:33
>>554
問題用紙を確認したらn-1でしたので書き写しミスでしたorz

C言語難しい(;´▽`A``
頑張ってすらすら書けるようになりたいです・・・。
557547 ◆7WXtpC4RL6 :2005/11/09(水) 02:54:53
>>555
たしかにvは謎ですね・・・。
メモリ的にはqsort(s, i-1);qsort(i+1, r);のほうがいいですよね

夜分遅くにお騒がせしてすいませんでした。
本当にありがとうございました。
558デフォルトの名無しさん:2005/11/09(水) 09:38:03
[1]
情報処理
[2]
(1) 3 桁の整数で,各桁の数字の3 乗和がもとの数と等しくなるものをすべて求めなさい。
(2) n が整数の時,n 以外のn の約数の和がn に等しくなるもの(完全数といいます) を小さい順にできるだ
けたくさん求めなさい。(例: 1+2+3=6)
[3]
 [3.1] Windows
 [3.3] C
[4]
11月11日13時まで
[5]
どこまで習っているか書いておきます
if、whilefor、配列、泡立ち法 関数

よろしくお願いいたします。
559558:2005/11/09(水) 09:39:36
訂正です。
[5] のwhileとforの間に「、」が抜けました。すみません。
560デフォルトの名無しさん:2005/11/09(水) 10:08:26
>>558
(1)
#include<stdio.h>

int main(void){
    int i,m,n,o;
    for(i=100;i<999;i++){
        m=i/100,n=(i/10)%10,o=i%10;
        if(i==m*m*m+n*n*n+o*o*o) printf("%d ",i);
    }
    return 0;
}
561デフォルトの名無しさん:2005/11/09(水) 10:15:54
>>560
999が抜けてる
562デフォルトの名無しさん:2005/11/09(水) 11:07:57
[1]プログラミング入門編
[2]
@キーボードから3個の整数を入力し,入力したデータ
の平均値(小数点以下切り上げ)に対して‘#’を表示
するプログラムを作成せよ.
A‘#’の表示はいくつでも表示できるようにする.ただ
し,平均値が0の時はエラーを表示する.
B繰り返し処理としてforを用いる。
[3]秀丸,コマンドプロンプト
[4]あと二時間ぐらい
[5]初心者っぽくお願いします。
よろしくお願いします
563デフォルトの名無しさん:2005/11/09(水) 11:23:06
>>562
意味がわからん
#を出すってどういうことだ?説明汁
564デフォルトの名無しさん:2005/11/09(水) 11:33:48
‘#’の文字を表示するプログラムを作成せよ.
てことでした。説明不足ですいません
565デフォルトの名無しさん:2005/11/09(水) 11:39:05
>>562
#include <stdio.h>

int main()
{
    int n1,n2,n3,sum,avg,i;
    scanf("%d", &n1);
    scanf("%d", &n2);    
    scanf("%d", &n3);
    sum=n1+n2+n3;
    if(sum%3 > 0)
        sum+=3;
    avg=sum/3;
    for(i=0 ; i<avg ; i++)
        putchar('#');
    return 0;
}
566デフォルトの名無しさん:2005/11/09(水) 11:41:36
あ、エラーって表示すんの忘れてた
#include <stdio.h>

int main()
{
    int n1,n2,n3,sum,avg,i;
    scanf("%d", &n1);
    scanf("%d", &n2);    
    scanf("%d", &n3);
    sum=n1+n2+n3;
    if(sum%3 > 0)
        sum+=3;
    avg=sum/3;
    if (avg==0)
    {
        puts("エラー");
        return 1;
    }
    for(i=0 ; i<avg ; i++)
        putchar('#');
    return 0;
}
567デフォルトの名無しさん:2005/11/09(水) 11:59:16
#include <stdio.h>
int main(){
int a, b, c, i, ans;
printf("3個の整数を入力してください\n");
scanf("%d%d%d", &a, &b, &c);
ans = (a + b + c + 2) / 3;
if ( ans == 0 ) printf("Error\n");
for (i = 0; i < ans; i++) printf("#");
return 0;
}
568デフォルトの名無しさん:2005/11/09(水) 12:07:44
>>558  (2)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1051.c
windowsということでintが32bit(-2^31〜2^31-1)のものを想定
64bitだと2^31超えたあたりでおかしくなる場合がある
http://ja.wikipedia.org/wiki/%E5%AE%8C%E5%85%A8%E6%95%B0
2から1つ1つ調べて10分以内に33550336をたたき出すのを目標にした

インチキ(2カ所)に関しては以下のことがわからなかったら外した方がいい
2187=2^7
自身を含めた約数の和は
(1+3+9+27+81+243+729+2187)
=(3^8-1)/(3-1)
=3^7*(3/(3-1))*(1-3^(-8))
(p^nの自身を含めた約数の和 p素数)<p^n*(p/(p-1))
7*11*13*17*19*23*29<2^31-1<7*11*13*17*19*23*29*31
(7/6)*(11/10)*(13/12)*(17/16)*(19/18)*(23/22)*(29/28)*(31/30)<2
569デフォルトの名無しさん:2005/11/09(水) 12:23:18
[1] 授業単元:オブジェクト指向言語
[2] 問題文(含コード&リンク):
  キーボードから入力した文字列に対して、入力した文字が右から何番目にあるかを求めるプログラムを作成せよ
  メインプログラムは以下を使うこと
  #include <stdio.h>
int search(char, char*);
int main(void){
int i, res;
char line[80];
char letter;
printf("文字列を入力して下さい:");
gets(line);
printf("検索したい文字を入力して下さい:");
  scanf("%c", &letter);
res = search(letter, line);
printf("%c:%d of %s\n", letter,res,line);
return 0; }
int search(char let, char *line){
/* この部分を作成せよ */
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:
 [3.3] 言語:C言語
[4] 期限: 2005年11月9日18:00まで
さっぱりわからなくて、何卒よろしくおねがいします。
570デフォルトの名無しさん:2005/11/09(水) 12:34:31
>>569
main関数は省略。
問題文では見つかれない場合を想定してないのでとりあえず-1を返すことにした

int search(char let, char *line){
    char*p=NULL;
    for(;*line;++line)
        if(*line==let)p=line;
    if(p)return line-p;
    else return -1;
}
571デフォルトの名無しさん:2005/11/09(水) 12:36:04
int search(char let, char *line){
    int r=0,t=0;
    while(line[r])
        if(line[r++]==let)t=r;
    if(t)return r-t+1;
    return -1;
}

>文字列を入力して下さい:123456
>検索したい文字を入力して下さい:6
>6:1 of 123456

なければ-1
572デフォルトの名無しさん:2005/11/09(水) 12:42:40
手抜きで行こう
#include<string.h>
int search(char let, char *line){
    if((line = strrchr(line,let))!=NULL)return strlen(line);
    return -1;
}
573デフォルトの名無しさん:2005/11/09(水) 12:46:47
574 ◆7VMqzPxNvk :2005/11/09(水) 13:56:32
[1] 授業単元: 情報数値計算法
[2] 問題文(含コード&リンク):
課題1
連立一次方程式をガウスの消去法を解きなさい。
・最低5元(多いほど評価を高くする)
・方程式の入力を工夫しよう
・ピボット選択を必ず必要とする方程式にすること
・与えた連立一次方程式を明記すること
・結果を示し、その点検を行うこと

課題2
連立一次方程式をガウス・ザイデル法で解きなさい
・最低5次元とする(多いほど高く評価する)
・与えた連立方程式を明記すること
・結果を示し、その検証を行うこと。また、kに対する残差の関係をグラフ化すると望ましい
・ヤコビ法と効果的な比較を検討しなさい
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Cygwin
 [3.3] 言語: C
[4] 期限: 2005年11月20日17:00まで
      さっぱりできませんorz
なにとぞよろしくお願いします。    
575デフォルトの名無しさん:2005/11/09(水) 14:00:09
[1] 授業単元:コンピュータプログラミング
[2] 問題文(含コード&リンク):
二つの実数をキーボードから入力し、二つの実数が
等しくなければ、
z = x(x+y) / y(x-y)
の値を計算し、二つの実数が等しければ、
z = y / x(x+y)
を計算するようなプログラムを書きなさい。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年11月9日18:00まで
[5] その他の制限:
教科書を見ながらやったんですがエラーばっかり起きます。
泣きそうです。よろしくお願いします。

576デフォルトの名無しさん:2005/11/09(水) 14:08:09
>>575
#include <stdio.h>
#include <stdlib.h>

int main()
{
    float x, y, z;
    scanf("%f", &x);
    scanf("%f", &y);
    if(x==y)
        z = y / x * (x+y);
    else
        z = x * (x+y) / y * (x-y);

    printf("%f\n", z);
    return EXIT_SUCCESS;
}
577デフォルトの名無しさん:2005/11/09(水) 14:16:08
>>576
ご丁寧にありがとうございます。本当に助かります。
また分からなくなったらよろしくお願いします。
578デフォルトの名無しさん:2005/11/09(水) 14:24:54
>>576は多分間違い
#include <stdio.h>

int input(double * p_var, const char * msg) {
  for (;;) {
    char        buf[256];
    char        *input_status;
    int         data_status;
    printf("%s> ", msg);

    input_status = fgets(buf, sizeof(buf), stdin);
    if (input_status == NULL) return -1;

    data_status = sscanf(buf, "%lf", p_var);
    if (data_status == 1) return 0;
  }
}

int main(void)
{
  double        x, y, z;
  if (input(&x, "x") != 0 || input(&y, "y") != 0) {
    fprintf(stderr, "\nerror\n");
    return -1;
  }

  z = (x != y) ? (x * (x + y)) / (y * (x - y)) : 1 / (x + y);

  printf("z ... %f\n", z);
  return 0;
}
579デフォルトの名無しさん:2005/11/09(水) 14:33:47
>>575
もしかしたらお前の計算したいのは
z = x*(x+y) / y*(x-y)
じゃなくて
z = (x*(x+y)) / (y*(x-y))
じゃないか?
もしそうなら、>>576のプログラムは間違っているから気をつけろよ
580579:2005/11/09(水) 14:36:59
一応>>576を修正したやつを張っておく

#include <stdio.h>

int main(){
float x, y, z;
scanf("%f", &x);
scanf("%f", &y);
if(x==y)
z = y / (x * (x+y));
else
z = (x * (x+y)) / (y * (x-y));

printf("%f\n", z);
}
581デフォルトの名無しさん:2005/11/09(水) 14:47:30
>578 >579 >580
本当にありがとうございます。
その部分は私もどちらに解釈すればいいか迷っていて、
今さっき出題者に聞いてみたところ、
この課題のテーマは分岐処理ができるかどうかだからどっちでもいい、
とのことでした。
説明不足ですいませんでした。
582デフォルトの名無しさん:2005/11/09(水) 15:12:45
>>581
出題者もいいかげんだなぁ…コレって結構大事なことだと思うんだが…
583デフォルトの名無しさん:2005/11/09(水) 15:36:18
その教師教職から降ろせよ
584デフォルトの名無しさん:2005/11/09(水) 18:21:13
内容:
[1] 授業単元: プログラム
[2] 問題文(含コード&リンク): 次のプログラムを完成させて
と表示するようにせよ。

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: Borland C++ Compiler 5.5
 [3.3] 言語: C言語
[4] 期限: 11月12日
[5]ポインターを使う
どなたかよろしくお願いします

585584:2005/11/09(水) 18:22:29
>>584 プログラムの付けたし
#include<stdio.h>

int main(){

int a[5] = {1, 2, 3, 4, 5};
int b[5];
int *x, *y;
int i;

x = ?;
y = ?;

while( ? ) {
?;
?;
?;
}

for (i = 0; i < 5; i++) {

printf("%d ", b[i]);}

return 0;}

5 4 3 2 1  
586デフォルトの名無しさん:2005/11/09(水) 18:42:01
x = a;
y = b+4;

while(x!=a+5) {
*(y--)=*(x++);
;
;
}

あまった。
587デフォルトの名無しさん:2005/11/09(水) 19:26:05
>>584
まるで試験問題だな
それにしたって程度が低いが

そんなの1から作らせればいいだろうに
588584:2005/11/09(水) 19:51:47
>>586 
どうも、ありがとうございました。m(_ _)m



589ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:41:57
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):サンプルプログラムに次の機能を追加せよ。
1、テキストの文字数、単語数、行数を調べる機能を追加
2、1行の長さが任意にとれるように改良
3、指定した文字列を検索・置換する機能
サンプルプログラムは以下
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:gcc 2.9
 [3.3] 言語:C
[4] 期限:2005年11月10日12時
[5] その他の制限:特になし

期限がもう今日になってしまったので
できるだけ早く、よろしくお願いします。
590ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:44:51
#include <stdio.h>
#define LSIZE 200
typedef struct LINE {
struct LINE *np,*pp;
char *text;
} * LP;
LP cp,tp;
LP newline(char *text)
{
LP t;
t=(LP)malloc(sizeof(struct LINE));
t->text=(char*)malloc(LSIZE);
t->text[0]=0;
t->np=t->pp=NULL;
strcpy(t->text,text);
return t;
}
591ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:45:37
void input()
{
char buf[LSIZE];
LP t;
while(1){
fgets(buf,LSIZE,stdin);
if(buf[0]=='.')
break;
t=newline(buf);
if(cp->pp==NULL)
tp=t;
else
cp->pp->np=t;
t->pp=cp->pp;
t->np=cp;
cp->pp=t;
}
}
592ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:47:33
void print()
{
LP t;
t=tp;
while(1){
if(t->np==NULL)
break;
if(t==cp)
printf("*");
else
printf(" ");
printf("%s",t->text);
t=t->np;
}
}
593ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:48:13
void save()
{
LP t;
FILE *fp;
t=tp;
if((fp = fopen("text.txt","w")) == NULL){
printf("\aファイルをオープンできません。\n");
exit(1);
}

while(1){
if(t->np==NULL)
break;
fprintf(fp,"%s",t->text);
t=t->np;
}
printf("ファイルをコピーしました。\n");

fclose(fp);
}
594ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:51:16
void load()
{
LP t;
FILE *fp;
char buf[LSIZE];
t=tp;
if((fp = fopen("text.txt","r")) == NULL){
printf("\aファイルをオープンできません。\n");
exit(1);
}
while(1){
if(fgets(buf,LSIZE,fp)==NULL)
break;
t=newline(buf);
if(cp->pp==NULL)
tp=t;
else
cp->pp->np=t;
t->pp=cp->pp;
t->np=cp;
cp->pp=t;
}
printf("ファイルを読み込みました。\n");
fclose(fp);
}
595デフォルトの名無しさん:2005/11/10(木) 00:52:21
そのサンプルプログラムを書いたのが講師だとしたら、マジで終わってるなw
596ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:52:27



main()
{
char buf[10];

tp=cp=newline("");
while(1){
printf(": ");
fgets(buf,20,stdin);
switch(buf[0]){
case 'n':
if(cp->np!=NULL)
cp=cp->pp;
break;
case 'p':
if(cp->pp!=NULL)
cp=cp->pp;
break;
case 't':
print();
break;
597ダメグラミング ◆tyeDwq8hds :2005/11/10(木) 00:53:35
case 'i':
input();
break;
case 'q':
return;
case 's':
save();
break;
case 'l':
load();
break;
}
}
}
以上です。長すぎのサンプルですみません。ちなみに講師が書いてますw
598デフォルトの名無しさん:2005/11/10(木) 02:39:13
> ダメグラミング
メンドイので、>>1のアップローダに貼りなおし
599デフォルトの名無しさん:2005/11/10(木) 07:46:17
うはwwwいま気がついた。

あー、とりあえず
「これではfree関数呼ばないでメモリを開放していないので、望ましくない。
 で、バグとりしてたら動かなくなった」といってソースもって行かずにいけ!!

先生はまあちょっと怒って「動かないなりにまあもってこいよ」というが、
とりあえず寿命は延びる。
600デフォルトの名無しさん:2005/11/10(木) 08:25:48
char buf[10];
fgets(buf,20,stdin);

恐ろしいものを見てしまったぜ!ぶはっ!
601デフォルトの名無しさん:2005/11/10(木) 09:36:36
>>600
うは、ヒドスwwwwww
602デフォルトの名無しさん:2005/11/10(木) 09:57:47
初めて一週間の香具師でももっとまともなソース書くよなぁ…
603デフォルトの名無しさん:2005/11/10(木) 11:00:13
[1] 授業単元:プログラミング演習U
[2] 問題文:
文字列中の英字の小文字は大文字に、大文字は小文字にする関数を実現せよ。


ヒント1:
システムに組み込まれた関数を使う場合
#include

if(isupper(c)) 大文字

if(islower(c)) 小文字

ヒント2:
大文字Aのアスキーコード(0x41)と小文字aのアスキーコード(0x61)
の差が32であることを利用する。
c = c + 32

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:11/11まで
[5] その他の制限:初心者にもわかりやすいようにお願いします。

どなたかご教授お願いします。
604デフォルトの名無しさん:2005/11/10(木) 11:15:39
>>603
#include <stdio.h>
#include <ctype.h>

char ToUpperOrLower(char ch)
{
    if(isupper(ch))
    {
        return ch+32;
    }
    else if(islower(ch))
    {
        return ch-32;
    }
    else
    {
        return ch;
    }
}

int main()
{
    putchar(ToUpperOrLower('a'));
    putchar(ToUpperOrLower('z'));
    putchar(ToUpperOrLower('A'));
    putchar(ToUpperOrLower('Z'));
    putchar(ToUpperOrLower('@'));
    putchar(ToUpperOrLower('['));
    putchar(ToUpperOrLower(' '));
    putchar(ToUpperOrLower('{'));
    return 0;
}
605デフォルトの名無しさん:2005/11/10(木) 11:48:04
[1] 授業単元: プログラミング演習II
[2] ある整数値を入力し、その値分の整数型データ用のメモリ領域を動的に確保せよ。
   次に確保した各領域に、順に 1, 2, 3, … の整数を代入した後、それらの値を逆順に表示するプログラムを作成せよ。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ:gcc
 [3.3] 言語: C
[4] 期限: 2005年11月10日14:10
[5] その他の制限:ポインタを習い始めたばかりです
606デフォルトの名無しさん:2005/11/10(木) 11:49:43
>>605
成蹊大から乙
607デフォルトの名無しさん:2005/11/10(木) 11:51:21
>>603 多分どのコードでも動くというか普通にctype.h使った方が…
#include <stdio.h> 
void str_change_ul(char []);
int main(void){
    char a[]="jsjyjstFHDSSERtshtr@$%f74hthr";
    printf("%s\n",a);
    str_change_ul(a);
    printf("%s\n",a);
    return 0;
}

void str_change_ul(char a[]){
    char l[]="abcdefghijklmnopqrstuvwxyz",
         u[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i=0,j,c;
    while(a[i]){
        j=0;
        /* n文字目が小文字なら1、大文字なら2それ以外なら0を */
        while(u[j]){
            c=(a[i]==l[j]) | ((a[i]==u[j])<<1);
            if(c)break;
            j++;
        }
        switch(c){
            case 1: a[i]=u[j];break;/* 小→大 */
            case 2: a[i]=l[j];break;/* 大→小 */
            default:;
        }
        i++;
    }
}
608デフォルトの名無しさん:2005/11/10(木) 12:01:25
>>605
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, size;
    int *pm;
    scanf("%d", &size);
    pm=malloc(sizeof(int) * size);
    for(i=0 ; i<size ; i++)
        pm[i]=i;
    for(i=size-1 ; i>=0 ; i--)
        printf("%d\n", pm[i]);
    free(pm);

    return 0;
}
609.:2005/11/10(木) 12:18:22
[1] 授業単元: プログラミング演習II
[2] テキストファイルのファイル名と幾つかの文字列を入力し、テキストファイルの中から指定された文字列を削除する(抜き出す)プログラムを作りなさい。
  例
  ・テキストファイル(C:kadai2.txt)の内容
  I lile summer. You like soccer.
・プログラム名をkadai2.exeとして作成した場合、以下のように実行します。
  C:\kadai2 C:\kadai2.tet like soccer[Enter]
・最初の"kadai2"がプログラム名です。"C:\kadai2.txt"が1つ目の引数で入力ファイル名を表します。それに続く2つ目以降の引数が抜き出(削除する)文字列となります。
   削除する文字列の数は決まっていません。このように実行する事により、“C:\kadai2.txt”の内容は以下のようになります。
   ・テキストファイル(C:kadai2.txt)の内容
   I summer. You .
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ:gcc
 [3.3] 言語: C
[4] 期限: 2005年11月10日16:10
[5] その他の制限:
・ソースファイルはensyu2.cとします。main関数のみのプログラムでも構いませんが、処理が複雑になるようでしたら機能単位に関数化することも考慮してみてください。
・引数が足りない場合はエラーメッセージを表示するようにしてください。
・上記の例ではファイルの内容は1行のみでしたが、複数行の場合にも対応してください。その際、1行の長さ(文字数)には特に制限はありません。
・入力ファイルの内容はASCIIコードの英数字記号のみで、漢字などの2バイトコードはないものとします。
610デフォルトの名無しさん:2005/11/10(木) 12:44:20
・改行を挟む単語については反応しなくていいか?
・複数の単語を指定する際、2つの単語で重複部分がある場合
どうするのか?

例)C:\kadai2.exe C:\kadai2.txt ABCD CDF

ABCDF ABCDFE BCDFI
 という行があった場合
1) E BI
(文字ごとに検索フラグを立てチェックされた文字を削除)
2)F FE BI
(最初に反応した単語で削除)
3)ABCDF ABCDFE BCDFI
(単語としてチェックして、その単語を含み元の単語より長いのは削除しない)

時間内にできるかどうかわからないけど一応聞いておきたい
611610:2005/11/10(木) 12:56:35
>>610 補足
2)で
C:\kadai2.exe C:\kadai2.txt CDF ABCD
とした場合
ABCDF ABCDFE BCDFI 

AB ABE BI
 になります
612.:2005/11/10(木) 13:03:51
>>610
・改行を挟む単語についでは反応しなくてもかまいません。
・指定された文字列を削除したいので、単語としてチェックし、その単語を含み元の単語より長いのは削除しません。
宜しくお願いします。
613.:2005/11/10(木) 13:10:08
609です。
>>610
例としてテキストファイルの内容を
I winter like summer. It is dislike because I like you hot one.
とします。
C:\kadai2 C:\kadai2.txt You dislike winter [Enter]
と実行しますとテキストファイルの内容が以下のようになるプログラムです。
I like summer. It is because I like hot one.
614.:2005/11/10(木) 13:11:45
609です。
C:\kadai2 C:\kadai2.txt You dislike winter [Enter] ではなく
C:\kadai2 C:\kadai2.txt you dislike winter [Enter] です。

615デフォルトの名無しさん:2005/11/10(木) 13:18:05
別ファイルじゃなくて書き換えなのか
難しいな
616616 ◆ZsO5GY4bU. :2005/11/10(木) 13:36:57
【質問テンプレ】
[1] 授業単元:卒業論文(卒業研究)
[2] 問題文(含コード&リンク):

  次のPDFファイルに出てくる(1),(2)の式を
  C言語の式で表す。
  どなたか分かる方居たら宜しくお願いします。

  なお、PDFは開きたくない方も居るでしょうから、
  JPGも用意しました。
  赤枠で囲んである部分です(JPGのみ)。

http://www-or.amp.i.kyoto-u.ac.jp/research/solvers/2pp.pdf
http://matsuya.dyndns.tv/2ch/img-box/img20051110133301.jpg

[3] 環境
 [3.1] OS:Windows
 [3.2] VC 6.0
 [3.3] 言語:C,C++どちらでも可
[4] 期限:2005年11月
[5] その他の制限:なし
617デフォルトの名無しさん:2005/11/10(木) 13:46:13
>>609
//ファイル書き換え?シラネ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_SIZE 4096

void search_and_delete(char *src, char *word)
{
    int word_pos=0;
    int word_size;

    word_size=strlen(word);

    while (*src!='\0')
    {
        if (*src==word[word_pos])
        {
            word_pos++;
            if (word_pos==word_size)
            {
                src++;
                strncpy( src-word_size, src, strlen(src-word_size) );
            }
        }
        else
        {
            word_pos=0;
618デフォルトの名無しさん:2005/11/10(木) 13:46:43
        }
        src++;
    }
    return;
}

int main(int argc, char *argv[])
{
    char buf[BUF_SIZE];
    FILE *fp;
    int i;

    if (argc<3)
    {
        return EXIT_FAILURE;
    }

    fp=fopen(argv[1], "r");
    if (fp==NULL)
    {
        return EXIT_FAILURE;
    }

    while (fgets(buf, sizeof(buf), fp)!=NULL)
    {
        for (i=2 ; i<argc ; i++)
        {
            search_and_delete(buf, argv[i]);
        }
        printf("%s", buf);
    }
619デフォルトの名無しさん:2005/11/10(木) 13:47:14

    fclose(fp);
}
620デフォルトの名無しさん:2005/11/10(木) 14:46:33
//少し訂正、表示→ファイル書き換え
//ひょっとしてfgetsじゃダメなのか

    char *out_buf;
(中略)
    out_buf=malloc(1);
    strcpy(out_buf, "");
    while (fgets(buf, sizeof(buf), fp)!=NULL)
    {
        
        for (i=2 ; i<argc ; i++)
        {
            search_and_delete(buf, argv[i]);
        }
        out_buf=realloc(out_buf, strlen(out_buf)+strlen(buf)+1);
        strcat(out_buf, buf);
    }
    fclose(fp);

    fp=fopen(argv[1], "w");
    if (fp==NULL)
    {
        return EXIT_FAILURE;
    }
    fputs(out_buf, fp);
    fclose(fp);
621603:2005/11/10(木) 14:55:36
>>604
>>607
ありがとうございます。
604さんので正常に動作しました。
助かりました〜。
622デフォルトの名無しさん:2005/11/10(木) 15:16:57
[1] 授業単元 : 文系のためのプログラミング
[2] 問題文
アルファベット2〜4文字と数字2〜4文字のみで構成された文字列をアルファベットと数字に分解して、それぞれをprintfを用いて表示せよ。
ただし、文字列はアルファベット→数字の順で構成されていると考えるものとする。
[3] 環境
 [3.1] OS : Linux Redhat
 [3.2] コンパイラ : gcc ver???
 [3.3] 言語 : C言語のみ
[4] 期限 : 2005年11月11日 08:40
[5] その他の制限 : ポインタで文字列を弄くっていますので、そのあたりまでの知識でお願いします。
623デフォルトの名無しさん:2005/11/10(木) 15:34:48
>>622
#include <stdio.h>
#include <ctype.h>

int main()
{
    char *src="w3i35l32ad";
    char num[10], alpha[10];
    int num_pos=0, alpha_pos=0;

    while (*src!='\0')
    {
        if (isalpha(*src))
        {
            alpha[alpha_pos]=*src;
            alpha_pos++;
            alpha[alpha_pos]='\0';
        }
        else if (isdigit(*src))
        {
            num[num_pos]=*src;
            num_pos++;
            num[num_pos]='\0';
        }
        src++;
    }
    printf("alpha:%s\n", alpha);
    printf("num:%s\n", num);

    return 0;
}
624.:2005/11/10(木) 16:19:21
609です。
617〜620さんありがとうございました。
大変参考になりました。
625デフォルトの名無しさん:2005/11/10(木) 17:04:10
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
テキスト内の文章を文節に分割するプログラムをCで書け。テキストはファイルに
書かれており、プログラムへの入力はそのファイルをそのファイルを与えるもの
とする。

例)ファイルをdata.txt、プログラムをprog.cとした場合。
data.txt
私は自転車に乗っています。

prog data.txt
私は
自転車に
乗っています


[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: ???
 [3.3] 言語: C言語
[4] 期限: 2005年11月14日12:00まで
[5] その他の制限: #include<stling.h>、strcmpを使用する。
          S-JISを考えてで漢字か平仮名かを区別するようにする。

どなたか教えていただけないでしょうかm(__)m
626デフォルトの名無しさん:2005/11/10(木) 17:09:40
身長を高い順に表示させるプログラムなんですがセグメンテーション違反が出てしまいます。
どこが違うんでしょうか?

// 身長の高い順に要素を挿入する時に,リストのどこに挿入すればよいかを決める関数
NODE *lookupPreviousNodeByHeightOrder(NODE *top, int height)
{
NODE *p;

p = top;
while (p->next != NULL) {
//if (p->next->height == height) { return p->next; }
if (p->next->height <= height) { return p; }
p = p->next;
}
return p;
}


627デフォルトの名無しさん:2005/11/10(木) 17:10:13
続きです。
// 身長の高い順に要素を挿入する関数
void insertNodeByHeightOrder(NODE *top, char string[], char gender, int height)
{
NODE *p, *q;

p = lookupPreviousNodeByHeightOrder(top, height);
if (p == NULL) { return; }
q = makeNewNode(string, gender, height);
q->next = p->next;
p->next = q;
}


// *top1 と *top2 で示される 2 本のリストから,身長の高い順のリストを 1 本作る関数
NODE *mergeListsByHeightOrder(NODE *top1, NODE *top2)
{
NODE *temp,*p,*q;
p=top1->next;
q=top2->next;
while(p->next != NULL) {
insertNodeByHeightOrder(temp, p->name, p->gender, p->height);
p=p->next;
}
while(p->next != NULL) {
insertNodeByHeightOrder(temp, q->name, q->gender, q->height);
q=q->next;
}
return temp;
}
628デフォルトの名無しさん:2005/11/10(木) 17:27:58
629デフォルトの名無しさん:2005/11/10(木) 17:33:56
>>626-627
まずは落ち着いて>>1を読んでほしい
あと構造体NODEがどう宣言されてるかすらもわからない
それだけでは原因を特定できるとは思えない

長くなるのは目に見えてるからソースの一部分だけでなく全体を
zipに固めるなどしてアップローダーにあげてほしい
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
話はそれからだ
630デフォルトの名無しさん:2005/11/10(木) 17:53:37
[1] 授業単元:構造体、typedef、単方向リスト
アップローダーというのがわからなかったのでとりあえずNODEの
宣言はこうです。
NODE *initList(void);
NODE *makeNewNode(char[], char, int);
NODE *lookupPreviousNodeByLexicographicOrder(NODE*, char[]);
631デフォルトの名無しさん:2005/11/10(木) 17:58:09
上の部分です
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME_LENGHT 30 // 名前の長さ (改行文字を含めて 30 文字もあれば十分)
#define HEIGHT_LENGTH 5 // 身長の桁数 (改行文字を含めて 5 桁もあれば十分)

typedef struct a_node {
char name[NAME_LENGHT]; // 名前
char gender; // 性別 (男は M, 女 は F,ダミー は D)
int height; // 身長 (整数で cm)
struct a_node *next;
} NODE;

void chop(char[]);
NODE *initList(void);
NODE *makeNewNode(char[], char, int);
NODE *lookupPreviousNodeByLexicographicOrder(NODE*, char[]);
void insertNodeByLexicographicOrder(NODE*, char[], char, int);
void printList(NODE*);

/* 以下の関数を作って下さい */
// NODE *lookupPreviousNodeByHeightOrder(NODE*, int);
// void insertNodeByHeightOrder(NODE*, char[], char, int);
// NODE *mergeListsByHeightOrder(NODE*, NODE*);


632デフォルトの名無しさん:2005/11/10(木) 17:59:23
int main(void)
{
NODE *top1, *top2; // 男女混合身長高い順リスト用に *top3 を追加して下さい
char buffer1[NAME_LENGHT], buffer2[HEIGHT_LENGTH];

top1 = initList(); // 男性用名前辞書式順リストの初期化
top2 = initList(); // 女性用名前辞書式順リストの初期化

// 男性の名前と身長の入力,リストの作成
printf("\nMake List1 for Males.\n");
printf("To end this construction of List1, input \".\" as Name.\n");
while (1) {
printf("Name: ");
fgets(buffer1, NAME_LENGHT, stdin);
if (buffer1[0] == '.') { break; } // 名前が "." なら,入力終了
chop(buffer1); // fgets で拾ってしまった改行文字 '\n' を削除する
printf("Height: ");
fgets(buffer2, HEIGHT_LENGTH, stdin);
insertNodeByLexicographicOrder(top1, buffer1, 'M', atoi(buffer2));
}
633デフォルトの名無しさん:2005/11/10(木) 18:00:00

// 女性の名前と身長の入力,リストの作成
printf("\nMake List2 for Females.\n");
printf("To end this construction of List2, input \".\" as Name.\n");
while (1) {
printf("Name: ");
fgets(buffer1, NAME_LENGHT, stdin);
if (buffer1[0] == '.') { break; } // 名前が "." なら,入力終了
chop(buffer1); // fgets で拾ってしまった改行文字 '\n' を削除する
printf("Height: ");
fgets(buffer2, HEIGHT_LENGTH, stdin);
insertNodeByLexicographicOrder(top2, buffer1, 'F', atoi(buffer2));
}
// 男性用名辞書式順リストの表示
printf("\nList1:\n");
printList(top1);

// 女性用名前辞書式順リストの表示
printf("List2:\n");
printList(top2);

// 男女混合身長高い順リストの作成
// top3 = mergeListsByHeightOrder(top1, top2);

// 男女混合身長高い順リストの表示
// printf("Merged List:\n");
// printList(top3);

exit(0);
}
634デフォルトの名無しさん:2005/11/10(木) 18:01:25
// fgets で拾ってしまった改行文字 '\n' を削除するための関数
void chop(char string[])
{
int i;

for (i = 0; string[i] != '\0'; i++) {
if ((string[i] == '\n') || (string[i] == '\r')) { string[i] = '\0'; }
}
}

635デフォルトの名無しさん:2005/11/10(木) 18:04:12
ほんとにわかんないです

636デフォルトの名無しさん:2005/11/10(木) 18:18:35
[1] 授業単元:構造体 typedef 単方向リスト
[2] 問題文(含コード&リンク):名前と身長を入力すると身長の高い順に表示させる
[3] 環境
 [3.1] OS: Linux
 [4] 期限: [無期限]
637デフォルトの名無しさん:2005/11/10(木) 18:35:19
>>616 正直、詰め込み問題は初見なんで間違えてるかも。
N >= 1で動くと思う。 
無駄な部分やCらしくない部分があるが、いちおう数式どおり。

int pmax(int x, int y, int k) /* 引数の部分がπやね */
{
  int cost = p(1, k, x); /* pの算出方法がわからないので、関数は自分で作ってね */
  int tmp;
  for (i = 2; i <= N; i++) { /* Nっていうのは長方形の数ね */
    tmp = p(i, k, x);
    if (tmp > cost)
      cost = tmp;
  }
  return cost;
}
638デフォルトの名無しさん:2005/11/10(木) 19:35:40
>>630
関数が足りんからコンパイル通らん
セグフォでててもいいからコンパイル通るのをうp汁

それとどの関数で起きてるかぐらい特定できないか?
Linux使えるなら、gdbでmain辺りにbp仕掛けてステップしていけば分かるだろ
639デフォルトの名無しさん:2005/11/10(木) 19:58:29
【質問テンプレ】
[1] 授業単元: 先輩の卒論?だと思う
[2] 問題文
http://kjm.kir.jp/pc/?p=4977.jpg
http://kjm.kir.jp/pc/?p=4978.jpg
[3] 環境
 [3.1] OS: (FreeBSD)
 [3.2] コンパイラ名とバージョン: gccすいません。バージョンはわかりませんが古くないです。
 [3.3] 言語: C言語
[4] 期限: 明日学校に行くまでです。(昼くらい)
[5] その他の制限: 配列の使い方がよくわからなくて悩んでいます。
ttp://www.hucc.hokudai.ac.jp/~a10019/kosyu/pdfs/SR8000DMP_text.pdf
ここを参考しましたができなかったです。
640デフォルトの名無しさん:2005/11/10(木) 20:10:41
[1] 授業単元: 情報工学
[2] 問題文(含コード&リンク):
名前、身長、体重、年齢からなる構造体データを、年齢の昇順に並べかえて
出力しなさい。まず、表のデータを順番通りに、各人の年齢を比較しながら
並べかえを行い、出力する。なお、同年齢の場合は、入力順に出力する。
ファイルI/O、構造体、main関数へのコマンドライン入力、ソート関数への
構造体の受け渡しを使用、理解すること。
また、コマンドラインから次の指定を可能とする。
>コマンド名 入力ファイル名 「出力ファイル名」
データは入力ファイルから入力する。出力ファイル名が指定されている場合は
、結果を出力ファイルに、ない場合標準出力に出力する。
また、ソート部分は関数とする。
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: bcc
 [3.3] 言語: C
[4] 期限: 2005年11月14日14:00まで
[5] その他の制限: 特にありません。
できれば簡単にバブルソートでおねがいします。
よろしくおねがいします。
641デフォルトの名無しさん:2005/11/10(木) 20:16:47
>>640
標準ライブラリのqsort使っちゃダメか?
642デフォルトの名無しさん:2005/11/10(木) 20:18:02
あぁ、安定ソートじゃなきゃダメか・・・
>>641は無視してくれ
643デフォルトの名無しさん:2005/11/10(木) 20:20:40
不安定なソートだったら、主キーが一致したら、登録番号で比較すればいいじゃない。
644デフォルトの名無しさん:2005/11/10(木) 20:24:58
>>640
入力ファイルのフォーマットは?
身長・体重はintでいいのか?
645デフォルトの名無しさん:2005/11/10(木) 21:08:42
>>644
はい。int型です。説明が足りなくて、申し訳ないです。
646デフォルトの名無しさん:2005/11/10(木) 21:20:07
[1] 授業単元:プログラミング演習2
[2] 問題文(含コード&リンク):@入力した文字列から指定した文字を検索するプログラミングをポインタ変数を用いて作成せよ。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: Microsoft VisualC++6.0
 [3.3] 言語: C++
[4] 期限: ([2005年11月21日00:00まで]
よろしくお願い申し上げまする。
647デフォルトの名無しさん:2005/11/10(木) 21:26:50
floatとdoubleの違いがいまいち良く分からないのですが
648デフォルトの名無しさん:2005/11/10(木) 21:34:23
>>647 計算精度(=有効桁数、使用メモリ)が違う。計算速度も違うことが多い。メモリの制限受けてるとか言うことがなければ黙ってdouble。
649デフォルトの名無しさん:2005/11/10(木) 21:36:10
>>645
入力ファイルにはどんな形で書いてあるんだ?
CSVなのかタブ区切りなのか
650デフォルトの名無しさん:2005/11/10(木) 21:50:58
>>649
名前 身長 体重 年齢
ああああ 165 60 21
AAAA 175 67 22


このような形でお願いします。
651デフォルトの名無しさん:2005/11/10(木) 22:03:46
1] 授業単元:プログラミング論
[2] 問題文(含コード&リンク):以下は3人の国語、数学、英語の成績をまとめたものである。
               これらをキーボードから入力し、それぞれの科目の平均値を求めるプログラムを作成せよ
               ただし、国語、数学、英語の点数をまとめて格納できる構造体を作り、利用すること
                 
               A :45 60 90 
               B :60 50 70
               C :40 80 50          
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:
 [3.3] 言語: C言語
[4] 期限:2005年11月11日18時まで

やってみたけどわからなくて、よろしくおねがいします。
652デフォルトの名無しさん:2005/11/10(木) 22:05:46
>>639
あまり専門的杉なこと聞かれてもまずわからんよ
653616 ◆ZsO5GY4bU. :2005/11/10(木) 22:40:48
>>637

616の質問は、数学板の質問スレでスルーされて
同板の質問スレでレス貰えなかった人のための
救済スレでもスルーされたものでした。

なので、ダメ元で質問してみたのですが、
本当にありがとうございます。卒研がんばります。
654デフォルトの名無しさん:2005/11/10(木) 22:51:22
ちょwwwまてwww
655デフォルトの名無しさん:2005/11/10(木) 22:52:38
>>650
ちょっと躓いててエラー処理が未完成だが、もし早い方がいいなら
それでもうpするがどうする?

それと以下ので躓いてるので誰かヘルプ
入力ファイルから、変換指定子"%s %d %d %d%*c"使ってfscanfで読み取って
戻り値をチェックさせようとしてるんだが
gdbで覗いてもちゃんと4つ全部に代入されてるにもかかわらず
1しか帰ってこないんだが何故・・・?
656デフォルトの名無しさん:2005/11/10(木) 23:02:04
>>655
%s で全部消費されるだろ。
657デフォルトの名無しさん:2005/11/10(木) 23:02:48
658デフォルトの名無しさん:2005/11/10(木) 23:14:01
>>656
ググったりK&Rの該当箇所読み直したりman見てみたりしたがどうにもよくわからない・・・
できれば詳しくお願いしたい
659デフォルトの名無しさん:2005/11/10(木) 23:21:32
あー。質問側だとよく指摘されるネタを回答側に言うのもなんだが・・・
ソースコードぷりーず。>fscanf()の人
660デフォルトの名無しさん:2005/11/10(木) 23:27:34
>>659
スマソ、すっかり忘れてた・・・_| ̄|○
問題箇所のソースです。とりあえずgdbで追いかけて行って
fscanfの全引数にデータが正しく代入されてるのは確認済みです

while (j = fscanf(in, "%s %d %d %d%*c", &persons[i].name,
   &persons[i].height, &persons[i].weight, &persons[i].age) != EOF) {
   if (j != 4) {
      ここでエラー処理
   }
   i++;
}

personsは構造体personの配列
struct person {
   char name[30];
   int height;
   int weight;
   int age;
}

FILE *inは以下のファイル
test 165 60 21
AAAA 175 67 22
661デフォルトの名無しさん:2005/11/10(木) 23:45:39
#include <stdio.h>

int main(void)
{
  struct person {
    char name[30];
    int height;
    int weight;
    int age;
  } persons[20];
  int i, j;
  i = 0;
  j = fscanf(stdin, "%s %d %d %d%*c", persons[i].name,
        &persons[i].height, &persons[i].weight, &persons[i].age);
  printf("%d", j);
  return 0;
}
上で確認するとテストデータでは4が得られる。
んで、原因は問題になってる行のwhileの式が変だから。
意味がj = (fscanf(...) != EOF)ってなってるね。
正しくは(j = fscanf(...)) != EOFってしなきゃ。
662デフォルトの名無しさん:2005/11/10(木) 23:46:50
[1] 授業単元:情報基礎論
[2] 問題文:1からユーザーの入力した数までの合計値を求めて表示する
      javascriptプログラムを作りなさい。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:
 [3.3] 言語:C言語
[4] 期限: 2005年11月11日深夜2時まで
[5] その他の制限:

授業の宿題明日までなんですがわからなくて・・・
よろしくお願いします。
663デフォルトの名無しさん:2005/11/10(木) 23:48:11
>javascriptプログラムを作りなさい。
>言語:C言語

よくわかりません。問題を整理しましょう。
664デフォルトの名無しさん:2005/11/10(木) 23:52:27
>>661
そういうことか・・・いつもはそう書いてたんだけど
ふと比較演算子って代入より優先度低かったような気がして
確認もせずにやったのが裏目に出た_| ̄|○

とゆうことで完成版
>>650
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1056.txt
665デフォルトの名無しさん:2005/11/10(木) 23:53:39
>>663
今日からCを学ぶスレに来てスレ違いで追い出された奴だから放置推奨
666デフォルトの名無しさん:2005/11/10(木) 23:57:10
>>662
#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", (n*n+n) >> 1);

    return 0;
}
667デフォルトの名無しさん:2005/11/10(木) 23:59:25
662
<HTML><HEAD><TITLE>例8</TITLE></HEAD>
<BODY>
<FORM NAME="TEST">
調べたい数=
<INPUT TYPE="TEXT"NAME="NYURYOKU"onChange=
"x=TEST.NYURYOKU.value;
TEST.KEKKA.value=Math.sqrt(x);">
<HR>
あなたが入力した数の平方根は
<INPUT TYPE="TEXT"NAME="KEKKA">
です。
</FORM>
</BODY></HTML>
と、
<HTML><HEAD><TITLE>例8</TITLE></HEAD>
<BODY>
<SCRIPT language="javascript">
x=5;
y=1;
s=0;
while(y<=x){
s=s+y;
y=y+1;
}
alert("1から"+x+"までの合計は"+s+"です。");
</SCRIPT>
</BODY></HTML>
を組み合わせて作るらしいのですが。。。
ド初心者で右も左もわかりません。
スレあってますか?すいませんm(__)m
668デフォルトの名無しさん:2005/11/11(金) 00:07:13
あ、はぐれメタルの剣だ。これは拾って。
では、大きなパンを置いて。
はぐれメタルの剣を通路をふさぐネネさんの脇から通路に投げてと。

えーっと。ごめんなさい。
669デフォルトの名無しさん:2005/11/11(金) 00:28:29
>>667
'ファイル名をsum.vbsにして保存、ダブルクリックで実行
x = InputBox("数を入力してください")
WScript.Echo(x*(x+1)/2)
670デフォルトの名無しさん:2005/11/11(金) 00:32:13
>>667
とりあえず、C言語とjavascriptの違いを調べてみろ。
話はそれからだ。

わからなければ、ググってみろ。
671デフォルトの名無しさん:2005/11/11(金) 00:34:17
おまいら!今日からC言語を学んでいくぞー!パート2
http://pc8.2ch.net/test/read.cgi/tech/1128637438/728-

答えでてるみたいだぞ
672デフォルトの名無しさん:2005/11/11(金) 00:46:04
>>651
#include <stdio.h>
#include <string.h>

int main()
{
    typedef struct SEISEKI
    {
        int kokugo;
        int suugaku;
        int eigo;
    } SEISEKI;

    int i;

    SEISEKI seiseki[4];

    memset(seiseki,0,sizeof(seiseki));
    for (i=0 ; i<3 ; i++)
    {
        scanf("%d", &seiseki[i].kokugo);
        scanf("%d", &seiseki[i].suugaku);
        scanf("%d", &seiseki[i].eigo);
        seiseki[3].kokugo+=seiseki[i].kokugo;
        seiseki[3].suugaku+=seiseki[i].suugaku;
        seiseki[3].eigo+=seiseki[i].eigo;
    }
    printf("%d", seiseki[3].kokugo);
    printf("%d", seiseki[3].suugaku);
    printf("%d", seiseki[3].eigo);
    return 0;
}
673デフォルトの名無しさん:2005/11/11(金) 02:12:22
662・667
お騒がせしました。
勉強して出直します・・m(__)m
674デフォルトの名無しさん:2005/11/11(金) 02:22:10
[1] プログラミング基礎
[2] 干支は十干、十二支からなっています。十干は10年周期、十二支は12年
  周期で回っていますから、最小公倍数60年で1周します。
   十干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸
   十二支:子、丑、寅、卯、辰、巳、午、未、申、戌、亥
  今年(2005)は「乙酉」、来年(2006)は「丙戌」です。
  西暦を与えて、干支を表示するプログラムをswitchを使って作成しなさい
[3] 環境
 [3.1] WindowsXP
 [3.3] C言語
[4] 2005年11月11日10:00まで
[5] switchは必ず使わないといけない宿題なんで・・・こちらC言語習い立て
  ですので簡単なプログラムにしてもらえると幸いです。
  
  皆さんよろしくお願いします
675デフォルトの名無しさん:2005/11/11(金) 02:50:10
switch必須だと冗長なソースに…

main(){
int year;
char text[32];
while(1){
printf("西暦を入力:");
scanf("%d", &year);

switch((year+6)%10){
case 0: strcpy(text, "甲"); break;

case 9: strcpy(text, "癸"); break;
}
switch((year+8)%12){
case 0: strcat(text, "子"); break;

case 11: strcat(text, "亥"); break;
}
puts(text);
}
}
676デフォルトの名無しさん:2005/11/11(金) 03:11:03
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク): eibun.txtから英文を読み込み、その英文が何語あるか表示するプログラムを作成せよ。
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
[3.3]言語: C
[4] 期限:11月12日まで
よろしくお願いします。
677デフォルトの名無しさん:2005/11/11(金) 03:49:28
>>676
#include <stdio.h>
#include <string.h>

#define BUF_SIZE 4096

int count_word(char *buf)
{
    int count=1;
    char *pTok;

    pTok=strtok(buf, " ");
    while(strtok(NULL, " ")!=NULL)
    {
        count++;
    }
    return count;
}

int main()
{
    const char *filename="eibun.txt";
    FILE *fp;
    char buf[BUF_SIZE];
    int count=0;

    fp=fopen(filename, "r");
    if (fp==NULL)
    {
        return 1;
    }
678デフォルトの名無しさん:2005/11/11(金) 03:49:51
    while(fgets(buf, sizeof(buf), fp)!=NULL)
    {
        count+=count_word(buf);
    }
    fclose(fp);

    printf("%d\n", count);

    return 0;
}
679デフォルトの名無しさん:2005/11/11(金) 06:02:37
>>674
一応Windows(sjis)で作ったけどさりげなくとんでもない落とし穴があるな
#include <stdio.h> 

int main(void){
    int y,i,j;
    /* 申=90 5C(SJIS)なので \(5C)をかませること EUCなどでは不要になるかと */
    char k[]="甲乙丙丁戊己庚辛壬癸",s[]="子丑寅卯辰巳午未申\酉戌亥",m[5];
    printf("西暦を入力:"); 
    scanf("%d", &y);
    i=(2*y+12)%20;j=(2*y+16)%24;/*6-8*/
    switch(y<1){/* まさに卑怯  */
        case 1:
            printf("正の数を入れてください\n");
            break;
        default:
            sprintf(m,"%c%c%c%c",k[i],k[i+1],s[j],s[j+1]);
            printf("西暦%d年の干支は %s です\n",y,m);       
        }
    return 0;
}
680デフォルトの名無しさん:2005/11/11(金) 06:39:17
>>677
BUF_SIZE 以上の改行無しセンテンスがあった場合、語句が分割されないか
681デフォルトの名無しさん:2005/11/11(金) 06:48:10
それくらい宿題だからいいじゃん?
682デフォルトの名無しさん:2005/11/11(金) 06:53:33
俺もそう思うけどeibun.txtがどんな内容か分からんから言って見たまでさ
683デフォルトの名無しさん:2005/11/11(金) 07:10:28
>>664
随分遅くなりましたが、本当にありがとうございました。
684デフォルトの名無しさん:2005/11/11(金) 07:26:52
これなら動くか。

#include <stdio.h>
int word_count(FILE *fp)
{
char c;
int wc = 0, win = 0;
while((c = fgetc(fp)) != EOF) {
switch(c) {
case '\n':
case ' ':
case '\t': if(win) {wc++; win = 0;} break;
default: win = 1; break;
}
}
return win ? ++wc : wc;
}

int main(int argc, char **argv)
{
char *filename = "eibun.txt";
FILE *fp;

if(!(fp = fopen(filename, "r"))) {
fprintf(stderr, "can't open file, %s", filename);
return -1;
}
printf("%d\n", word_count(fp));
fclose(fp);
return 0;
}
685デフォルトの名無しさん:2005/11/11(金) 08:21:06
>>657
先生ありがとうございます!
freeっていうのは初めて見ました。
686デフォルトの名無しさん:2005/11/11(金) 10:59:31
>>675
>>679
回答ありがとうございました。
687デフォルトの名無しさん:2005/11/11(金) 11:29:27
freeは大切だから覚えておくと良いぞ。
688デフォルトの名無しさん:2005/11/11(金) 17:51:29
>>676
//指摘があったので修正
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
    const char *filename="eibun.txt";
    char ch;
    FILE *fp;
    int counting=0;
    int count=0;

    if ( (fp=fopen(filename, "r"))==NULL )
    {
        return 1;
    }

    while ( (ch=fgetc(fp))!=EOF )
    {
        if ( isalnum(ch) )
        {
            if (counting==0)
            {
                counting=1;
                count++;
            }
        }
        else
        {
689デフォルトの名無しさん:2005/11/11(金) 17:51:50
            counting=0;
        }
    }

    fclose(fp);
    
    printf("%d\n", count);

    return 0;
}
690デフォルトの名無しさん:2005/11/11(金) 18:20:49
>>http://pc8.2ch.net/test/read.cgi/tech/1131691023/8
#include <stdio.h>

int main()
{
    FILE *fp;
    char ch;
    if ((fp=fopen(__FILE__, "r"))==NULL)
        return 1;
    while((ch=fgetc(fp))!=EOF)
        putchar(ch);
    fclose(fp);
    return 0;
}
691デフォルトの名無しさん:2005/11/11(金) 18:28:41
[1] 授業単元: 基礎プログラミング演習
[2]
キーボード入力から入力されたローマ字表記の名前を文字配列に読み込み(読み込む最大の文字数をNとする)
その名前に含まれる母音(a,i,u,e,o,A,I,U,E,O)の個数を出力せよ
(例) Syuuta Aoki ・・・・6
[3] 環境
 [3.1] Linux
 [3.2] コンパイラのコマンド名は gcc です。
 [3.3] C言語
[4] 期限:2005年11月15日まで
[5] その他の制限:文字列入力ではfgets()を使用すること。str で始まる関数は知っていても使わないこと。

何とぞお手やわらかにお願いします。
692デフォルトの名無しさん:2005/11/11(金) 18:37:43
>>691
#include <stdio.h>

#define N 80

int main()
{
    const char *boin="aiueoAIUEO";
    char name[N+1];
    int i=0, j;
    int count=0;

    gets(name);
    while (name[i]!='\0')
    {
        j=0;
        while (boin[j]!='\0')
        {
            if (name[i]==boin[j])
                count++;
            j++;
        }
        i++;
    }
    printf("%d\n", count);

    return 0;
}
693デフォルトの名無しさん:2005/11/11(金) 18:40:38
失礼、fgetsをgetsと見間違えていた
fgets(name, N, stdin);
694デフォルトの名無しさん:2005/11/11(金) 19:07:28
>>692
どうもありがとうございます。
「const 修飾子とポインタ」という形はまだ見たことないありませんでしたが、とても参考になりました。
これからもがんばってくださいませ〜
695デフォルトの名無しさん:2005/11/11(金) 19:07:53
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1062.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: できれば日曜日まででお願いします
[5] その他の制限:
ランダム生成プログラム
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1059.txt

一応両方とも書いたのですが、まだindex(索引)を作っていない状態です。
シェルソートの方はコンパイラは通るのですが、500程度のデータを入れるとcore dumpします。
そのあたりの原因も指摘、修正していただけたら幸いです。
シェルソート:ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1060.txt
挿入ソート:ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1061.txt
よろしくお願いします。
696デフォルトの名無しさん:2005/11/11(金) 19:39:25
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
素数を求めるプログラムを作成せよ。素数を求める範囲を標準入力から入力すること。
求めた素数はファイルdata.txtに出力すること。main関数の他に引数として与えた数が素数なら1、素数でないなら
0を返す関数を作成すること。
[3] 環境
 [3.1] OS: Win
 [3.2] Borland BCC
 [3.3] 言語: C
[4] 期限: 今週中


お願いします
697デフォルトの名無しさん:2005/11/11(金) 20:32:57
>>696
#include <stdio.h>

int issosu(int v) {
int i;
for(i=2;v>=i*i;i++){
if (v%i==0) return 0;
}
return 1;
}

main(){
int v,i;
FILE* f=fopen("data.txt", "wt");
printf("素数を求める範囲:");
scanf("%d", &v);
if (v >= 2) {
fprintf(f, "2\n");
for(i=3;i<=v;i++){
if (issosu(i)) fprintf(f, "%d\n", i);
}
}
fclose(f);
}
698デフォルトの名無しさん:2005/11/11(金) 20:35:09
ミス
× for(i=3;i<=v;i++){
〇 for(i=3;i<=v;i+=2){
699デフォルトの名無しさん:2005/11/11(金) 20:36:55
>>696
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char     *sieve;

void init_sieve(int max)
{
  int   i, j;
  sieve = calloc(sizeof(*sieve), max + 1);

  for (i = 2; i * i <= max; i++)
    if (!sieve[i]) for (j = i + i; j <= max; j += i) sieve[j] = 1;
}

int is_prime(int val) { return sieve ? !sieve[val] : -1; }
int main(void)
{
  int   min, max;
  FILE  *fp = fopen("data.txt", "w");
  printf("min> "), scanf("%d", &min);
  printf("max> "), scanf("%d", &max);
  init_sieve(max);
  for (; min <= max; min++) if (is_prime(min)) fprintf(fp, " %d", min);

  fclose(fp);
  free(sieve);
  return 0;
}
700デフォルトの名無しさん:2005/11/11(金) 20:46:35
>>697
>>408に追加
7.26.2 文字操作<ctype.h> isに続き英小文字1文字又はtoに続き英小文字1文字で始まる関数名を<ctype.h>ヘッダの宣言に追加してもよい。
701デフォルトの名無しさん:2005/11/11(金) 20:48:41
ってほかにも間違えまくってるな>697。もういいや。
702デフォルトの名無しさん:2005/11/11(金) 22:02:04
[1] 授業単元:c言語応用実習
[2] 問題文:コンソール上で動くアプリケーションの作成
BRAIN PANIC

・ランダムに並べられた数字を決められた時間内に暗記。
・数字が消えてから20秒以内に応えられなければタイムオーバー。
・1桁でも間違えればその場で失格。

【規 定】
●第1ステージ  9桁 (3秒)
●第2ステージ 12桁 (5秒)
●第3ステージ 15桁 (7秒)

[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Borland C++ 5.5
 [3.3] 言語: C
[4] 期限: 2005年11月13日まで
[5] その他の制限:
プログラムステップ数200行以上
main以外の関数を作成し、モジュール分割すること
構造化されていたり、標準ライブラリ関数、ポインタ等使用していれば尚良

よろしくお願いいたします
703はる:2005/11/11(金) 22:19:51
sam{

}

って、いったい何をするのでしょうか?
704デフォルトの名無しさん:2005/11/11(金) 22:23:53
[1] 授業単元: プログラミング言語論

[2] 問題文(含コード&リンク):
C言語を用いて標準入力から4 5 + 2 *など
逆ポーランド記法(後置記法)で結果を標準出力する。
また負の整数を表すときは"N"を用いて
−7 → N7 と表記して計算ができるようにする。
演算子は"+","-"を"*","/","%"より優先させる。
4 5 + 2 * は 4 5+2* と入力しても同じ結果が出る。

[3] 環境
 [3.1] OS: WindowsXP
 [3.2] Borland BCC
 [3.3] 言語: C
[4] 期限: 今週中

お願いします・・・
自力ではどうしてもうまくいきません・・・
モジュール分割をせず一括でのソースを希望します。
賢者様どうかお助けください・・・
705デフォルトの名無しさん:2005/11/11(金) 22:28:14
>>703
asm{}じゃないの?
706はる:2005/11/11(金) 22:29:17
…そうです…ごめん…。
707デフォルトの名無しさん:2005/11/11(金) 22:35:11
>>704
逆ポーランドを計算すればいいのか?
スタックを作って数字はひたすらプッシュ、演算子が来たら
2個ポップして演算後、再プッシュ
708デフォルトの名無しさん:2005/11/11(金) 22:43:13
void
delay(unsigned int nMilliseconds)
{
#define CYCLES_PER_MS 260
unsigned long nCycles = nMilliseconds * CYCLES_PER_MS;
while(nCycles--);
}

これがわかりません…
教えてください!!お願いします
709704:2005/11/11(金) 22:46:37
>>707
そうなんです。
6 3 - 2 * 4 + 8 * 2 3 4 + + *
だと
答えは574になります。
よろしくお願いします・・・
710デフォルトの名無しさん:2005/11/11(金) 22:46:43
>>708
俺もわかりません。
つーかテンプレ読め。
711デフォルトの名無しさん:2005/11/11(金) 22:50:25
>>706
インラインアセンブラ でググれ
712704:2005/11/11(金) 22:52:10
>>709
ではすみません計算を間違えました・・・
答えは720です。
作成言語がC言語ならどんな手を用いても
モジュール分割以外ならなんでもかまいません・・・
よろしくお願いします。
713デフォルトの名無しさん:2005/11/11(金) 22:52:31
>>708 昔BASICやってた頃を思い出させる、そんな関数。
714デフォルトの名無しさん:2005/11/11(金) 22:56:15
>>712
モジュール分割以外ってどういうことよ?
715デフォルトの名無しさん:2005/11/11(金) 22:58:54
716デフォルトの名無しさん:2005/11/11(金) 23:00:42
717704:2005/11/11(金) 23:14:43
>>712
ようするに***.cファイルをいくつかに分けて
コンパイルしなければならない方法です。
例えば
標準入力した文字列を整数に変換する関数を
atoi.c
としてその変換した数字を計算する
calc.c
などそれぞれの機能に分割して
それぞれをコンパイルして結合するようなのではなく
一つの***.cファイルで実現してほしいということです。

標準入力で文字列を数字として変換するには
scaf関数を用いてもかまいません。

説明不足でも申し訳ありません・・・
718デフォルトの名無しさん:2005/11/12(土) 00:08:47
>>717
適当適当適当

#include<stdio.h>
#include<ctype.h>
int main(){
    int c;
    int st[80];
    int*p=st;
    while((c=getchar())!=EOF){
        if(c=='\n')printf("%d\n",*--p),p=st;
        else if(isspace(c))continue;
        else if(isdigit(c))ungetc(c,stdin),scanf("%d",p++);
        else if(c=='N')ungetc('-',stdin),scanf("%d",p++);
        else if(c=='+')--p,p[-1]+=*p;
        else if(c=='-')--p,p[-1]-=*p;
        else if(c=='*')--p,p[-1]*=*p;
        else if(c=='/')--p,p[-1]/=*p;
        else if(c=='%')--p,p[-1]%=*p;
    }
    return 0;
}
719704:2005/11/12(土) 00:37:10
>>718
最高です!!
ありがとうございました。m(_ _)m
もう少し動作確認して
何か手直しできればさらに手を加えて
提出させていただきます。
ほんとうにありがとうございました!
720simano:2005/11/12(土) 01:16:54
SN比の求め方がわかりません。
pgmファイルの求め方がわかりませんのでプログラムお願いします。
/* SN比*/
g = 0.0;
f = 0.0;
for (y = 0; y <= ysize ; y++){
for (x = 0; x <= xsize ; x++){
g = g + a[x][y] * a[x][y];
f = f + (a[x][y] - b[x][y]) * (a[x][y] - b[x][y]);
}
}
h = 20 * log(sqrt(g/f));
printf(" %lf\n",h);
exit(0);
}
まではわかります
急いでます
721デフォルトの名無しさん:2005/11/12(土) 01:25:58
おま、どんなけマルチしてんだよwww
722デフォルトの名無しさん:2005/11/12(土) 01:27:49
不覚にもワロタ
723島野:2005/11/12(土) 01:38:50
なぜですか?
724デフォルトの名無しさん:2005/11/12(土) 01:47:00
マルチンポはいけまんね。
725島野:2005/11/12(土) 01:49:55
いい加減にしてください
急いでるんです
速レスで
726デフォルトの名無しさん:2005/11/12(土) 01:55:39
>>725氏ね
727デフォルトの名無しさん:2005/11/12(土) 02:05:29
マルチの相手してみよう。

pgmフォーマットって流行なんか?
a[x][y]じゃなくて、pget(a, x, y)ってな書き方のやつはどっかディスクの中にあるが。

まあ・・・>>720>>1を読め。
あと、アップローダにpgmファイルをzipで圧縮してupせよ。
728simano:2005/11/12(土) 02:16:20
ありがとうございます>>727さま。
ソースを全行載せたいのですが入りきりません。
分けて張り付けてもいいでしょうか。
729simano:2005/11/12(土) 02:17:19
ヴォケどもさっさと答えんかいカス
730デフォルトの名無しさん:2005/11/12(土) 02:18:10
関連ファイルは>>1のアップローダーにzipで圧縮して添付してくれ。
あと、質問は>>1のテンプレに従ってくれ。
731simano:2005/11/12(土) 02:19:18
>>729のsimanoは僕じゃないっ!!
邪魔しないでください!!
732デフォルトの名無しさん:2005/11/12(土) 02:20:41
早くうpしろ。もう寝るぞ。
733simano:2005/11/12(土) 02:23:19
>>732さん、待って!!
やり方わかったのですぐにうpします。
734マイクロソフト:2005/11/12(土) 02:24:08
L"<HTML><HEAD>\n"
L"<META http-equiv=content-type content='text/html; charset=unicode'>\n"
L"<HTML><HEAD>\n"
L"<META http-equiv=content-type content='text/html; charset=unicode'>\n"
L"<HTML><HEAD>\n"
L"<META http-equiv=content-type content='text/html; charset=unicode'>\n"
L"<HTML><HEAD>\n"
L"<META http-equiv=content-type content='text/html; charset=unicode'>\n"
L"<HTML><HEAD>\n"
L"<META http-equiv=content-type content='text/html; charset=unicode'>\n"
735デフォルトの名無しさん:2005/11/12(土) 02:24:37
>>702
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1064.txt
画面消すのどうやるんだったか。分からんかったのでそこは自分でやってくれ
それから200ステップは無理
736デフォルトの名無しさん:2005/11/12(土) 02:26:18
エスケープシーケンス・・・かな・・俺もやり方わすれた。
737デフォルトの名無しさん:2005/11/12(土) 02:29:20
>>702
200以下ならまだしも、以上って訳の分からん課題だな
行数と標準ライブラリ関数の使用頻度は基本的に反比例なのに
行数は増やせ、標準ライブラリも使えって意味不明

課題出した奴の頭に蛆でも沸いてるんじゃねーの?
738simano:2005/11/12(土) 02:32:37
自己解決しました。
本当にありがとうございました
739デフォルトの名無しさん:2005/11/12(土) 02:33:43
ではまた明日〜
740simano:2005/11/12(土) 02:35:57
>>738やめて!!
>>732さん、解決できてません。
ほんとに助けてください!
ソースファイルはうpしておきました。
741735:2005/11/12(土) 02:37:57
あー待機時間固定にしてしもた。適当に修正しておいて
>>737
ハゲド
742島野& ◆1OmGRVIH2. :2005/11/12(土) 02:40:38
>>732さんずっと寝ないで返事待ってるので助けてください。。。
あと>>738マジ止めて
743デフォルトの名無しさん:2005/11/12(土) 02:42:42
>>740
まずは問題の全文を貼っておけ
744simano:2005/11/12(土) 02:45:06
>>743
好きな画像を用いてフィルタ処理をした画像とのSN比を
求めよ。
という問題です。
ありがとうございます。
745デフォルトの名無しさん:2005/11/12(土) 02:49:50
とりあえず好きな画像をうpしておけ
746デフォルトの名無しさん:2005/11/12(土) 02:51:36
あー・・・画像も上げてくれ。
たぶん、PGMのバイナリだと思うけど、フォーマットの確認がしたい。
747simano:2005/11/12(土) 02:55:08
>>745
画像うpしましたっ!!
欲をいえば、どのpgm画像でも処理し、
SN比が求められるようにしてほしいのですが…
お願いします。
748デフォルトの名無しさん:2005/11/12(土) 02:57:14
だめだこりゃ
749デフォルトの名無しさん:2005/11/12(土) 03:01:19
拡張子がzipになってるが、.tar.gz形式のようだ。
750デフォルトの名無しさん:2005/11/12(土) 03:01:21
次いってみよう
751simano:2005/11/12(土) 03:03:34
>>745さん、
どんな画像でもいいんです!
SN比が求められればいいんで。
宜しくお願いします。
752simano:2005/11/12(土) 03:08:41
>>745さん、
zipファイルうpしました!!
もう、あなたにかけてます!
753デフォルトの名無しさん:2005/11/12(土) 03:16:30
>>702
>・数字が消えてから20秒以内に応えられなければタイムオーバー。

これって回答入力後に20秒経過しているかチェックするの?
それとも20秒経過したら強制的に入力を打ち切るの?
754デフォルトの名無しさん:2005/11/12(土) 03:17:00
どうみても精子です。
本当にありがとうございました。
755デフォルトの名無しさん:2005/11/12(土) 03:39:13
そんなに飛ばないよ
756735:2005/11/12(土) 03:43:55
修正&抜けてたタイムオーバー処理追加
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1071.txt
757デフォルトの名無しさん:2005/11/12(土) 04:05:35
>>702
超ド素人なのですが勉強のためにボクもやってみました
へたくそで申し訳ないです(><)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1073.zip
758デフォルトの名無しさん:2005/11/12(土) 04:10:55
なにこの汚いソース
759デフォルトの名無しさん:2005/11/12(土) 04:12:27
俺たちだけじゃないのか?
760デフォルトの名無しさん:2005/11/12(土) 04:19:13
>>757
何でそんなもん真面目に書いてるんだアホ
761デフォルトの名無しさん:2005/11/12(土) 04:21:36
うちのXPProじゃ"\x1b[2J"で画面クリアされね。環境の問題なのか?
762デフォルトの名無しさん:2005/11/12(土) 04:24:13
NT/2000/XPはエスケープシーケンス非対応
763デフォルトの名無しさん:2005/11/12(土) 04:34:10
thxなるほど。なんか設定いるみたいだな
764デフォルトの名無しさん:2005/11/12(土) 04:37:59
hosyu?
765 ◆cPZirqiTPI :2005/11/12(土) 04:38:20
[1] 授業単元:実験
[2] :
l(多くても20)個の箱にm個の玉を重複ありかつランダムに入れる。(l≧m)
p個の玉が入った箱が何箱かを全て出力するプログラムを作る。
例えば出力が
0個の玉が入った箱は?箱  (日本語としてはおかしいですがプログラムが直接の課題ではないのでいいです)
1個の玉が入った箱は?箱

m個の玉が入った箱は?箱
となるようなものです(?は0が入ってもいいですし、0箱は表示しなくてもいいです。l,m,pは0もしくは自然数です。)
[3] 環境
 [3.1] OS: Windows どちらでも
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: できたらC。C++(Cよりさらに理解できてません)でもいいです。
[4] 期限: 2005年11月13日(日)ぐらい(これを元にレポートを出します)
[5] その他の制限: なし


どなたかご教授お願いします。
766デフォルトの名無しさん:2005/11/12(土) 04:42:09
そんなフリーウェアを作った奴はクソだなw
767 ◆cPZirqiTPI :2005/11/12(土) 04:48:14
一応自分で書いてみたプログラムです。方向性を間違っているかもしれませんが。
このプログラムは無視してくださっていいです。
後、m個の玉を重複あり(1つの箱に複数個はいることもあります)かつ一個ずつランダムにです。
また、m、nに0や負の数を入力することはないのでそれらに関するエラーは気にしなくていいです。
どうか宜しくお願いします。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int sai, l, m;
printf("玉の数を入力して下さい。: ");
scanf("%d",&m);
printf("箱の数を入力して下さい。: ");
scanf("%d",&l);
srand((unsigned)time(NULL));/* 追加部分 */
for(i = 0; i < m; i++)
{
sai = rand() % l + 1;
printf("入った箱は = %d\n",sai);
}
return 0;
}
768デフォルトの名無しさん:2005/11/12(土) 04:58:45
ttp://www.iba.k.u-tokyo.ac.jp/~iba/C/report1.html
この問題の2と4が解けないので教えてください
環境はMacで、コンパイラはgccだったと思います
言語はCです
期限は11/23です
よろしくお願いします
769デフォルトの名無しさん:2005/11/12(土) 05:35:11
>>768
ということは、問題1と3は出来たってこと?
最低2問やればいいみたいだしもういいじゃん・・・



しっかし・・・漏れにはさっぱりわからん・・・
770デフォルトの名無しさん:2005/11/12(土) 05:41:11
>>765

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int i, j, sai, l, m, n, *box;
printf("玉の数を入力して下さい。: "); scanf("%d",&m); n = m;
printf("箱の数を入力して下さい。: "); scanf("%d",&l);
if(!(box = (int*)malloc(sizeof(int)*l))) return -1;
memset(box, 0, sizeof(int)*l);
srand((unsigned)time(NULL));/* 追加部分 */
while(n>0) {
sai = rand() % l;
box[sai] = rand() % (n+1);
n -= box[sai];
}
for(i=0;i<=m;i++) {
for(j=n=0;j<l;j++) {if(box[j]==i) n++;}
printf("%d個の玉が入った箱は%d箱\n", i, n);
}
return 0;
}
771770:2005/11/12(土) 05:56:35
>>765
>>770を試してみたらまともに動かんかった上に
やりたいこととずれている様な気がしたので訂正。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<memory.h>
int main()
{
int i, j, l, m, n, *box;

printf("玉の数を入力して下さい。: "); scanf("%d",&m); n = m;
printf("箱の数を入力して下さい。: "); scanf("%d",&l);
if(!(box = (int*)malloc(sizeof(int)*l))) return -1;
memset(box, 0, sizeof(int)*l);
srand((unsigned)time(NULL));/* 追加部分 */
while(n>0) {box[rand() % l]++; n--;}
for(i=0;i<=m;i++) {
for(j=n=0;j<l;j++) {if(box[j]==i) n++;}
if(n>0) printf("%d個の玉が入った箱は%d箱\n", i, n);
}
return 0;
}
772デフォルトの名無しさん:2005/11/12(土) 06:19:16
>>768
2は脳みそがまだ起きてないので概要だけ。
a,bの乱数を求めて、a,bで単位ベクトルを作る。
んで、cに(0,1]の乱数求める
ベクトルのどちらかの数を選ぶ→d
cとdの間に1があればそれは線と針が交差してることになる。

4は^演算子つかってa^b^c != 0 なら勝ちパターン、そうでなかったらお茶を濁すってゆうプログラムにする。
(勝ちパターンでの指し方)
3つ山が残っている→最ものこってる山から2のべき乗個でできるだけ多く取る
山が2つ残っている→2つの山が同じ数になるように取る
山が1つ→全部とる
(負けパターンでの指し方)
まあ・・・相手のミスを狙ってどれか一つから取る。
773デフォルトの名無しさん:2005/11/12(土) 06:22:42
3つ山のこってるときの答えがまちがってるかも。
ようは、a ^ b ^ cが0になるように数を選べばいいわけだけど。
774デフォルトの名無しさん:2005/11/12(土) 06:36:10
>>768
4)は先手後手の選択権はプレイヤーにあるの?まぁ、comなら必勝になっちまうか
775デフォルトの名無しさん:2005/11/12(土) 07:12:41
伊庭さんなら何やっても単位来るよ. で,(4) は三組み (a,b,c) において,
・a xor b < c なら c を a xor b になるまで取る.
・b xor c < a なら a を b xor c になるまで取る.
・c xor a < b なら b を c xor a になるまで取る.

で絶対に ok.こう取ったとき,新しい (a,b,c) について a xor b xor c = 0 になるのは自明.
もっとも残ってる山から……という取り方が出来ないのは,(a,b,c) = (7,8,9) を見ればわかる(7 xor 8 = 16).
776デフォルトの名無しさん:2005/11/12(土) 08:00:56
2)やってみたけど、sqrt使わない方法がわからない。数学詳しい人よろしく。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

main(){
int i,j,s,n,m;
double v[2];
double len2;
while(1){
m=0;
scanf("%d %d", &s, &n);
srand(s);
for(i=0;i<n;i++) {
do {
for(j=0;j<2;j++) v[j] = rand();
len2 = v[0]*v[0]+v[1]*v[1];
} while(len2>RAND_MAX*(double)RAND_MAX);
if (sqrt(len2)*rand()/RAND_MAX < v[0]) m++;
}
printf("%f\n", (2.0*n)/(double)m);
}
}
777デフォルトの名無しさん:2005/11/12(土) 11:43:17
>>776 「針を落とす数値実験」っぽさが足りなくね?


ところで 問3 の最後を考慮すると, 問2 は無限の領域(平面)に一様に落とさないと
いけないみたいだけど,それをちゃんとシミュレートするのはややこしいと思うんだけどなあ.
778776:2005/11/12(土) 16:48:53
>>777
無限の領域を直接シミュレーションする方法があるのなら
私も是非知りたいもんですが。
779デフォルトの名無しさん:2005/11/12(土) 18:20:13
>>735>>737>>753>>757
本当にありがとうございます
>>753
強制的に打ち切りです

200いかないなら付加機能つけろと言うことらしいです
780デフォルトの名無しさん:2005/11/12(土) 18:30:11
>>735
画面消すのは
system("cls");/* 画面のクリア */
で、できるらしいです
781デフォルトの名無しさん:2005/11/12(土) 18:47:27
>>778 つ 一点コンパクト化
782702:2005/11/12(土) 19:43:39
・1桁でも間違えればその場で失格。
と言うのはポインタかなんか使って、回答の下(もしくは上)に問題を一桁ずつ表示して、
左側から一桁ずつ判定して、間違った時点でprintf("m9(^Д^)プギャー\n");
ってことらしいです。
20秒は経過した時点で回答に移ると言うことらしいです
783デフォルトの名無しさん:2005/11/12(土) 21:06:45
20秒経過したら...って、DOSで実装するのは結構面倒な話なんだが。
理由はキースキャンもタイマー割り込みも標準Cでは用意されていないから。
(であってる?多分嘘かも)

(1)タイマー割り込みでチェック。
 一定時間ごとにチェックを行う。その時点で入力が終了していなければアウト。
(2)キースキャンでチェック。
 常にぐるぐるキーが押されている状態を読み取るのと時間を確認。

これって本当にCの宿題?だったら、申し訳ないが授業でのコードを晒してくれ。
784デフォルトの名無しさん:2005/11/12(土) 21:35:29
>>781
乱数からPI求めるのに一点コンパクト化とかわけがわからない。
実際にプログラムして見せて。
785デフォルトの名無しさん:2005/11/12(土) 21:53:24
>>784
>>776

領域の状態が周期的に変わるなら一周期分だけで計算すればいい
まあどの標準にも準拠してない変なコードだが大抵のコンパイラは通すだろ
786デフォルトの名無しさん:2005/11/12(土) 22:34:35
[1] 授業単元: basic プログラミング
[2]
キーボード入力から文字配列に読み込み(読み込む最大の文字数をNとする)
文字列に含まれる各文字の文字コードを出力するプログラムを作成せよ。
(例) cat と入力した場合、
 c...99
 a...97
 t...116
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラのコマンド名は gcc です
 [3.3] C言語
[4] 期限:2005年11月22日まで
[5] その他の制限:文字列入力ではfgets()を使用すること。また、str で始まる関数は知っていても使わないこと。

何とぞお手やわらかにお願いします。
787デフォルトの名無しさん:2005/11/12(土) 22:42:45
>>786
#include <stdio.h>

#define N 4096

int main()
{
    char buf[N];
    int i=0;

    fgets(buf, sizeof(buf), stdin);

    while (buf[i] != '\0')
    {
        printf("%d\n", buf[i]);
        i++;
    }

    return 0;
}
788デフォルトの名無しさん:2005/11/12(土) 22:44:02
>>786
#include <stdio.h>
#define N 80

int main(void)
{
char src[N+1];
fgets(src, N+1, stdin);
for (;src!='\0';src++)
printf("%c...%d\n", *src, *src);
return 0;
}
789デフォルトの名無しさん:2005/11/12(土) 22:47:06
>>788
コンパイラ通してみたら間違ってた・・・_| ̄|○
#include <stdio.h>
#define N 80

int main(void)
{
char src[N+1], *ptr;
fgets(src, N+1, stdin);
for (ptr=src;*ptr!='\0';ptr++)
printf("%c...%d\n", *ptr, *ptr);
return 0;
}
790デフォルトの名無しさん:2005/11/12(土) 22:47:16
>>787
>>788
お二方ともどうもありがとうございます。
これが一番基本だったみたいですね・・・参考にして他のをがんばってみます
791デフォルトの名無しさん:2005/11/12(土) 23:12:04
フリーでコンパイルして実行できるツールをくださいませ
792デフォルトの名無しさん:2005/11/12(土) 23:13:18
gcc+Cygwin
793デフォルトの名無しさん:2005/11/12(土) 23:14:20
VC++
794デフォルトの名無しさん:2005/11/12(土) 23:31:15
下のようなランダムな数を代入した二次元配列が存在します。
{
{3,5,1}
{8,10,4}
{7,32,9}
}

3,5,1
3,5,4
3,5,9
3,10,1



のように、すべての数の組み合わせを表示しなさい。

お願いします。
795デフォルトの名無しさん:2005/11/12(土) 23:43:30
std::next_permutation使えば一発だな。
>>796
796デフォルトの名無しさん:2005/11/12(土) 23:44:05
>>794
#include<stdio.h>
int main(){
    int a[3][3]={
        {3,5,1},
        {8,10,4},
        {7,32,9},
    };
    int i;
    for(i=0;i<27;++i)
        printf("%d,%d,%d\n",a[i/9%3][0],a[i/3%3][1],a[i%3][2]);
}
797デフォルトの名無しさん:2005/11/12(土) 23:53:18
>>795
>>796
thx
798デフォルトの名無しさん:2005/11/12(土) 23:53:35
素直に3重ループの方が速かろ
799デフォルトの名無しさん:2005/11/12(土) 23:55:34
>>795
kwsk
この場合は使えるの?
800 ◆cPZirqiTPI :2005/11/13(日) 00:53:32
>>765 です

>>770 >>771 氏 本当にどうもありがとうございます。
早急に作っていただいたのに、遅くなって申し訳ありませんでした。
今から実行します。
801デフォルトの名無しさん:2005/11/13(日) 01:47:27
情報が大量にあると疲れるゼ!
802デフォルトの名無しさん:2005/11/13(日) 04:13:03
一部だけを読むべきですね
803デフォルトの名無しさん:2005/11/13(日) 05:17:13
>>801
そんな私も反省しますorz
804デフォルトの名無しさん:2005/11/13(日) 05:48:20
無限平面でシミュレートできないのはそれが非コンパクトだからでしょ.
無限遠点を加えて球面にするか,>>785 みたいに mod を取ってトーラスにするかして
コンパクトにしてからシミュレートすればいい.
805753:2005/11/13(日) 08:16:19
>>702
VCで組んで動作確認まではしたが、そちらの環境で動くかどうかは分からん。
とりあえずうpしといた。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1076.txt
806805:2005/11/13(日) 09:01:48
モジュール分割してなかったから適当に分割したものを上げといた。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1077.txt
807訃報:K仲川さんが、:2005/11/13(日) 09:11:45
 昨日、くも膜下出血で亡くなられました。
 喪主などは、まだ決まっていません。
808デフォルトの名無しさん:2005/11/13(日) 10:11:11
>>702
>>805
なるほど!kbhit()なんてもんあったか。
とりあえずソース増やすために、以下の改良を加えてみた。
(1)何桁でも対応できるようにmallocで問題領域確保
(2)全問正解したら「おめでとー」を出す。

あとは...
(a)問題が出ているときにキーボード入力できるズルに対応する。
(b)履歴を残す。(ランキング)
(c)エスケープシーケンスを使って、経過時間を表示する。

こんな感じかな?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1078.txt
809デフォルトの名無しさん:2005/11/13(日) 10:19:28
>>798 は、誰にレスしてんだ?
810デフォルトの名無しさん:2005/11/13(日) 10:27:56
>>809
>>796と思われ。

要するに、解りやすかろうにということでは?しらねーが。
811デフォルトの名無しさん:2005/11/13(日) 14:07:01
超絶ドシロウトです…どなたか答えて下さい!!

[1] 授業単元: プログラミング(4)
[2] 問題文:クラスを用いて、名簿管理プログラムを作成せよ
       @管理の対象:名前・学籍番号・性別・生年月日・グループ番号(1〜3) 
        A管理方法:各データを入力・名前で検索・入力したデータを出力・グループ番号で検索
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン:Microsolt Visual C++ 6.0
 [3.3] 言語:C++
[4] 期限: [2005年11月14日14:30まで]
[5] その他の制限:クラスと構造体の違い、コンストラクタとデストラクタ、継承、多重定義あたりまでは授業で扱ってます
 仮想関数や多態性、演算子オーバーロードについても触れていますが、いかんせん理解出来ておらず…
812デフォルトの名無しさん:2005/11/13(日) 20:19:34
MFCつかってもいいの?
813デフォルトの名無しさん:2005/11/13(日) 20:22:04
>>811
GUIを使うの?
814デフォルトの名無しさん:2005/11/13(日) 20:54:08
[1] 授業単元:アルゴリズム
[2] 問題文:AVL木のヘッダーファイルを作成し、適当なmain関数を作って正しいかどうかを検証しろ

[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C++ or C
[4] 期限: 2005年11月14日まで
[5] その他の制限:
機能は挿入関数と検索関数だけでよい。
できれば削除関数もつくる。

全く手付かずですorz
815デフォルトの名無しさん:2005/11/13(日) 21:51:18
[1] 授業単元:プログラミング演習
[2]
キーボード入力から文字列を2つの文字配列に読み込み、
この2つの文字列のうち辞書順(ASCII文字順)で先に来る文字列を出力するプログラムを作成せよ
(例) cat と dog を入力した場合
  cat
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラのコマンド名は gcc です
 [3.3] C言語
[4] 期限:2005年11月15日まで
[5] その他の制限:文字列入力ではfgets()を使用すること。また、str で始まる関数は知っていても使わないこと。

何とぞお手やわらかにお願いします。
816デフォルトの名無しさん:2005/11/13(日) 22:11:38
>>815
#include <stdio.h>
int less(char *p, char *q) {
  if (*p == '\0') return 0;
  if (*q == '\0') return 1;
  if (*p != *q) return (*p < *q);
  return less(p+1, q+1);
}
int main() {
  char s1[256], s2[256];
  fgets(s1, 256, stdin), fgets(s2, 256, stdin);
  printf("%s", less(s1, s2) ? s1 : s2);
}
817デフォルトの名無しさん:2005/11/13(日) 22:13:54
#include<stdio.h>

int main(){
char word1[20];
char word2[20];
char *p1,*p2;
p1 = word1 ; p2 = word2;

int a;
scanf("%s%s",word1,word2);

for( ; *p1 && *p1 == *p2 ; p1++ , p2++);
a = *p1 - *p2;



if(a < 0)
printf("%sのほうが小さい\n",word1);
else if(a == 0)
printf("等しい\n");
else
printf("%sのほうが小さい\n",word2);
}

818817:2005/11/13(日) 22:15:03
>>815

すまそ、よく読んでなかったですorz
819816:2005/11/13(日) 22:24:36
スマソ less の '\0' と比較してる二行の結果の 0 と 1 を逆にしてください
820811:2005/11/13(日) 22:29:19
MFC?GUI?
なんだかもうよく分からんですOTL
何か違うのですか?
821811:2005/11/13(日) 22:33:39
たぶんMFCだと思われます…
822デフォルトの名無しさん:2005/11/13(日) 22:34:25
>>820
真っ黒な画面に文字だけがでるのがCUI
IEとかみたいにウインドウがあるのがGUI

マウスが使えるか使えないかの違いと考えればいい


まぁなにが言いたいかというと余計なこといった>>812氏ね
823デフォルトの名無しさん:2005/11/13(日) 22:43:37
>>816
どうもありがとうございます

>>817
もしよければあなたの答えも教えてくださいませ
816さんの少し難しいので・・・
824デフォルトの名無しさん:2005/11/13(日) 22:43:49
>>822
嘘教えるな
825デフォルトの名無しさん:2005/11/13(日) 22:48:22
Console or Graphic
User
Interface
826デフォルトの名無しさん:2005/11/13(日) 23:42:19
AVL木って高さ調節するやつだよな
大学か専門か知らんが結構面倒なもん出すな
827デフォルトの名無しさん:2005/11/14(月) 00:16:59
>>823
fgets使わず、scanf使ってる部分を変えればいいだけでしょ
828デフォルトの名無しさん:2005/11/14(月) 00:51:00
>>814
ttp://home.att.ne.jp/apple/wizard/ のやつを貼り付けて出したら?
829デフォルトの名無しさん:2005/11/14(月) 02:39:50
[1] 授業単元: プログラミング2
[2] 問題文(含コード&リンク):
下に示すプログラムはシェルソートのプログラムである。
このプログラムに索引(インデックス)の機能を追加せよ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 11月14まで
[5] その他の制限:
教科書を見ると、大きなデータの整理を行う場合、記憶領域を効率的に使うために
索引を組み込むといった風に書いているのですが、授業で習ったわけではないので作り方がよく分かりません…
よろしくお願いします。

830デフォルトの名無しさん:2005/11/14(月) 02:40:29
シェルソートのプログラム
#include <stdio.h>
#define N 500 /* 配列Aの最大サイズ */

/* 関数の宣言 */
void shellsort(int *A, int n);

main(){
/* シェルソートのテストプログラム */
int A[N];
int n, i;
FILE *file;

file=fopen("sortdata", "r"); /* データの読込み */
fscanf(file, "%d", &n);
if(n>N){
printf("Illegal array size n = %d for N = %d\n", n, N);
exit();
}
printf("n = %d\nA = ", n);
for(i=0; i<n; i++) fscanf(file, "%d", &A[i]);
for(i=0; i<n; i++) printf("%d ", A[i]);
printf("\nA = ");
shellsort(A, n); /* シェルソートによる整列 */
for(i=0; i<n; i++) printf("%d ",A[i]);
printf("\n");
return(0);
}

831829:2005/11/14(月) 02:40:56
続き
void shellsort(int *A, int n){
/* 配列A[0],...,A[n-1]をシェルソートにより整列 */
int i, j, h, a;

h=1;
do {h=3*h+1;} while(h<=n); /* 初期hの計算 */
do{
h=h/3; /* この反復に使うh */
for(i=h; i<n; i++){ /* G[i%h]へ挿入ソート */
a=A[i];
j=i;
while(a<A[j-h] && j-h>=0){
A[j]=A[j-h];
j=j-h;
}
A[j]=a;
}
}
while(h>1);
}
832805:2005/11/14(月) 03:16:54
833デフォルトの名無しさん:2005/11/14(月) 04:02:34
[1] 授業単元:基礎プログラミング演習
[2]
a,bに適当な数字を読み込み、この答えを求めるプログラムを作成せよ。

N-1
a[i] * b[i]
i=0

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラのコマンド名は gcc です
 [3.3] C言語
[4] 期限:2005年11月15日まで
[5] その他の制限:

配列のシグマのやり方を教えてください


834デフォルトの名無しさん:2005/11/14(月) 04:05:53
[1] 授業単元: C言語プログラム
[2] 問題文(含コード&リンク):初項をb0=bとし、漸化式bn+1=2bn/3+b/(3bn^2)で与えられる数列において、
                  bに数値を与えb0,b1,・・・b10を表示するプログラムを作成せよ。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: bcc5.5
 [3.3] 言語: C言語
[4] 期限: 11月14日まで
[5] その他の制限: 特になし

一通り作って、コンパイルして実行できるんですが、bに数値をいれてエンター押すと、
エラーで途中で止まってしまいます。どうしてでしょうか?教えてください。
835デフォルトの名無しさん:2005/11/14(月) 04:07:56
#include <stdio.h>
void main(void)
{
double k,l;
int m;
printf("bに値を入力してください");
printf("b = "); scanf("%lf",&k);

for(m=1;m<=10;m++)
printf("b%d = %lf\n",m,l=2*k/3+k/(3*k*k),k=l);

}
ちなみにこんなカンジで作りました。
836デフォルトの名無しさん:2005/11/14(月) 04:16:56
>>835
>printf("b%d = %lf\n",m,l=2*k/3+k/(3*k*k),k=l);
%dと%lfの2つしかないのに……
837デフォルトの名無しさん:2005/11/14(月) 04:28:13
>>836
k=lは出力する必要は無いので、書いてないんですが・・・
ダメでしょうか?同じようなプログラムで、
#include <stdio.h>
void main(void)
{
float a,b;
int c;
printf("aに値を入力してください");
printf("a = "); scanf("%f",&a);

for(c=1;c<=10;c++)
printf("a%d = %f\n",c,b=a/2+a/(2*a),a=b);
}
は、問題なく動くので、大丈夫かと思ったんですが・・・^^;
838デフォルトの名無しさん:2005/11/14(月) 04:45:05
>
駄目です。
関数の引数は評価する順番が決まってないので、それに依存しては遺憾とです。

hoge(printf("A"), printf("B"), printf("C"));
とやって出力順が「ABC」「CBA」「BAC」等どうなるかは未定義です。

>printf("a%d = %f\n",c,b=a/2+a/(2*a),a=b);
だとb=a/2+a/(2*a)より前にa=bが実行されるかも試練とです。
839デフォルトの名無しさん:2005/11/14(月) 04:47:06
>>837
gdbで追ったら漸化式の評価前にk=lが行われてる
printfの引数評価順序は未定義
代入したいなら外で代入しろ

つーか、これぐらいgdbで追えば直ぐわかるだろ
840デフォルトの名無しさん:2005/11/14(月) 04:50:17
>>838
そこまでやっといて何故最後にヒロシです…と言わないのか
841デフォルトの名無しさん:2005/11/14(月) 04:51:20
>>838
>>839
そうなんですか・・・ありがとうございます^^;もう一度作り直してみます。
842764:2005/11/14(月) 06:22:36
>>794です。
>>796>>794のようなやり方で提出したらダメだといわれましたorz
ループをネストさせて作れってことで、おそらく、>>798のようなことだと思うのですが、
>>796のコードが頭をよぎって作れませんorz

誰かサンプルを示してください。
843デフォルトの名無しさん:2005/11/14(月) 06:23:06
>>842
名前が764になってますが、794の間違いです。
844デフォルトの名無しさん:2005/11/14(月) 07:17:18
>>842
#include<stdio.h>

int main()
{
    int a[3][3]={
        {3,5,1},
        {8,10,4},
        {7,32,9},
    };
    int i,j,k;

    for(i=0 ; i<3 ; i++)
    {
        for(j=0 ; j<3 ; j++)
        {
            for(k=0 ; k<3 ; k++)
            {
                printf("%d,%d,%d\n",a[i][0],a[j][1],a[k][2]);
            }
        }
    }

    return 0;
}
845お願いします。 ◆mmsZIKhkp. :2005/11/14(月) 08:05:28
[1] 授業単元: プログラミングU
[2] 問題文(含コード&リンク):
数を用い、読み込んだ英大文字以降のアルファベットを出力する。

文字列strの中に、文字cが含まれていれば(複数存在する場合は、最も先頭側とする)、
その文字へのポインタを返し、含まれていなければNULLを返す関数
char *str_chr(const char *str,int c) { /*・・・*/ }
を作成せよ。
今回はその関数を用い、読み込んだ英大文字以降のアルファベットを表示するプログラムを作成する。

講義で紹介した資料とプログラム、及びヒントはこちらヒント!!
STEP 1 : 文字列strから文字cを検索し最初に存在する文字へのポインタを返す関数*str_char()を作成する。
STEP 2 : STEP1で作成した関
以上の各STEPの動作を行うプログラム、または質問に対する解答の穴埋めをしなさい。(次レスに書きます)


[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: Borland C++ Compiler 5.5
 [3.3] 言語: C
[4] 期限: 2005年11月17日00:00まで
[5] その他の制限:
プログラム自体を習い始めて半年です。
配列、ポインタ、文字列の基礎は習いました。
846続き ◆mmsZIKhkp. :2005/11/14(月) 08:12:19
解答欄です。

#include <stdio.h>

char *str_chr(const char *str, int c)
{

(* ここに解答を書き加える *)

}

int main(void)
{
char str[10], *p;
char uletter[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

printf("英大文字を入力してください:");
scanf("%s",str);

p = str_chr(uletter,str[0]);
if(p != NULL) puts(p);
else puts("入力された文字は英大文字ではありません");

return(0);
}

4行くらい書き足して終わる、簡単な問題と思っていましたが、どうもエラーが消えません。
根本的な勘違いをしている可能性が高いと思うので、
正答を教えてくれないでしょうか。
847続き ◆mmsZIKhkp. :2005/11/14(月) 08:15:02
すいません、>>845[2] 問題文の一行目
『数を用い、読み込んだ英大文字以降のアルファベットを出力する。』

は間違いです。

文字列strの中に…からが問題文でした。
848デフォルトの名無しさん:2005/11/14(月) 08:17:48
自分で考えたエラーが出るコードを載せてみてくれ
849832:2005/11/14(月) 08:20:35
>>814
削除関数にバグがあったんで改修した。こっち使ってくれ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1080.zip
850デフォルトの名無しさん:2005/11/14(月) 08:27:48
>>847
char *p = str;
while(*p != '\0' || *p != (char)c) p++;
return (*p != '\0') ? p : NULL;
851814:2005/11/14(月) 08:34:36
849>>
どうもありがとうございます。
AVL木に関してわかりやすく解説しているページはありませんか?
よければ教えてください
852デフォルトの名無しさん:2005/11/14(月) 08:48:18
>>851
ここ見て組んだ訳じゃないからうpしたものとやってること違うかも知れんが
結構わかり易く解説してある。
ttp://www.geocities.jp/m_hiroi/zsaru/zfix10.html
853デフォルトの名無しさん:2005/11/14(月) 09:44:22
[1] 授業単元: 応用プログラミング
[2] 問題:
指定されたファイルに、for whike if cout cin int double string が何個ずつ含まれているかを調べ、
グラフに表示するプログラムを作成せよ。ただし、プログラムは以下の二つの関数を定義して作成すること
get_freq:ファイルからデータを読み込み、各単語が含まれている回数を求めるint型関数
int get_freq(string[],int[],ifstream&);
返り値:指定された単語がまったく含まれていなければ0
    それ以外なら1を返す
第一引数:単語の配列 第二引数:各単語の頻度を入れる配列 第三引数:入力ストリームの参照引数
draw_graph:実行例(次のレスで書きます)のようなグラフを書くvoid型の関数
void draw_graph(string[],int[]);
第一引数:単語の配列 第二引数:各単語の頻度を入れる配列

[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: cygwin
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: [05年11月16日9:00まで]
[5] その他の制限: 書き出しは
#include<iostream>
using namespace std;から始めます。
854デフォルトの名無しさん:2005/11/14(月) 09:45:15
実行例
Input file name--->kadai.cpp
*** result ***
for:****
while:**
if:*
cout:**
cin:*
int:
double:****
string:***
855853:2005/11/14(月) 09:47:24
すいません書き漏らしました
言語はC++です
856デフォルトの名無しさん:2005/11/14(月) 10:03:49
>850
constが何をするキーワードかは習ったか?
習ってなかったら教官を小一時間問い詰めてみてくれ。

char *str_chr(const char *str, int c)
{
while(*str && *str != c)
str++;
return *str ? (char *)str : NULL;
}
857デフォルトの名無しさん:2005/11/14(月) 10:17:20
[1]授業単元: C++
[2]問題
以下の MyVector クラスは, 2次元のベクトルを表すクラスです. ベクトルの各成分を得るメンバ関数と, 長さを得るメンバ関数を持っています. このクラスを派生し, 3次元のベクトルを表すクラス MyVector3 を適切に定義して下さい.
class MyVector {
protected:
double vx;
double vy;
public:
MyVector(double x=0, double y=0) { vx = x; vy = y; }
virtual ~MyVector() { }
virtual double length() { return sqrt(vx*vx + vy*vy); }
double get_vx() { return vx; }
double get_vy() { return vy; }
};
[3]
[3.1]WinXP
[3.2]Microsoft Visual Studio.NET2003
[3.3]C++
[4]11月28日午後5時まで
[5]書き出し
  #include <iostream>
  #include <string>でお願いします。

858デフォルトの名無しさん:2005/11/14(月) 10:33:43
>>857
手元にコンパイラないので試せないから間違ってたらスマソ

class threeVector : public MyVector {
double vz;
public:
threeVector(double x=0, double y=0, double z=0) {
vx = x; vy = y; vz = z; }
~threeVector() {}
double length() { return sqrt(vx*vx + vy*vy + vz*vz); }
double get_vz() { return vz; }
};
859デフォルトの名無しさん:2005/11/14(月) 10:35:14
>>858
問題文でクラス名指定してあるの無視してた・・・読み替えてくれorz
860デフォルトの名無しさん:2005/11/14(月) 10:41:33
[1] 授業単元:プログラム入門
[2] 問題:
標準入力から1文字の入力を受け取り、大文字アルファベット、小文字アルファベット、数字、その他
のいずれかであるか判別し、標準出力に出力せよ。
ただし、標準入力からの入力は反復構造により繰り返すものとし、空白文字が入力された時点で終了とする。
この際、改行文字の注意せよ
[3] 環境
 [3.1] OS: Unix
 [3.2] コンパイラ :gcc
 [3.3] 言語: C
[4] 期限: 11月15日12時まで
[5] その他の制限: 配列・ポインタはまだならっていません。

よろしくお願いいたします。
861デフォルトの名無しさん:2005/11/14(月) 10:43:03
すいません、
「いずれかであるか」

「いずれであるか」
でしたorz
862デフォルトの名無しさん:2005/11/14(月) 10:47:20
>>875
の訂正
できればmain文も書いて下さると助かります。
遅れてすみません
863デフォルトの名無しさん:2005/11/14(月) 10:50:45
>>860
#include <stdio.h>
#include <ctype.h>

int main(void)
{
char ch;
int i;

for (;;) {
ch = getchar();
scanf("%*[^\n]%*c");

if (isspace(ch)) break;

if (isdigit(ch))
puts("数字っぽいよ");
else if (isupper(ch))
puts("大文字だってさ");
else if (islower(ch))
puts("小文字ですよ");
else
puts("どれでもないよ");
}
return 0;
}
864デフォルトの名無しさん:2005/11/14(月) 10:53:54
>>862
の訂正
>>857でした
たびたびすいません
865デフォルトの名無しさん:2005/11/14(月) 10:57:26
>>864
mainで何をすればいいんだ?
866デフォルトの名無しさん:2005/11/14(月) 11:05:44
>>863
ありがとうございます。
#include <ctype.h>やisspace、isdigit(ch)
などまだは習っておりませんでした。
この表記を使用しない、基礎的な文法で作れる↑のプログラムを
教えてもらえないでしょうか?
867デフォルトの名無しさん:2005/11/14(月) 11:10:21
>>865
とりあえず動けばなんでもいいです
868デフォルトの名無しさん:2005/11/14(月) 11:11:48
>>866
それぞれを以下のように置換
ただしASCII環境のみな

isspace()→ ch == '\s'
isdigit()→ (ch >= '0') && (ch <= '9')
isupper()→ (ch >= 'A') && (ch <= 'Z')
islower()→ (ch >= 'a') && (ch <= 'z')
869デフォルトの名無しさん:2005/11/14(月) 11:25:25
[1] 授業単元:アルゴリズム
[2] 問題文(含コード&リンク): 乱数(個数は自由。ただし自然数に限る)を発生させ、2分木を表示させる。表示のさせ方は親と子、左右の関係がわかれば問わない。
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Microsoft Visual C++ 6.0
 [3.3] 言語: C++
[4] 期限: 11月18日(金)12:00
[5] 特に制限はありませんが、プログラムに注釈をつけて何をやっているか解説していただけるとありがたいです。
もちろんなくても結構ですが。

よろしくお願いします。
870デフォルトの名無しさん:2005/11/14(月) 11:25:51
>isspace()→ ch == '\s'
ch == ' '
じゃないか?
871デフォルトの名無しさん:2005/11/14(月) 11:32:16
>>870
スマソ、RegExとごっちゃになってた・・・
872558:2005/11/14(月) 11:34:32
>560.568
わけあってPCに触れられない環境にあったので返信遅れました。
今更ですがありがとうございます、助かりました!
873デフォルトの名無しさん:2005/11/14(月) 11:51:37
[1] 授業単元:C言語研究
[2] 問題
以下のクラス Person に, 正しいコピーコンストラクタとコピー代入演算子(=演算子) を実装して下さい. また, デフォルトコンストラクタを持つよう改良して下さい. デフォルトコンストラクタでは, 年齢を0に, 名前を自分の名前にして下さい.
#include <iostream>
#include <string>
using namespace std;

class Person {
int age;
char* name;
public:
Person(int a, char* n) {
age = a;
name = new char[strlen(n)+1];
if (name == NULL) {
cout << "メモリ確保失敗" << endl;
exit(1);
}
strcpy(name, n);
}
int get_age() const { return age; }
const char* get_name() const { return name; }
};
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Microsoft Visual studio
 [3.3] 言語: C++
[4] 期限: 11月21日
[5] 特に制限はありませんが、名前のところは山田太郎でお願いします。
874デフォルトの名無しさん:2005/11/14(月) 12:12:36
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
明治(m),大正(t),昭和(s),平成(h),の年号を西暦に変換するプログラムを作れ。
年号(例,t12)はキーボードからmain関数で入力し、結果もmain関数で印字。
年号の変換はユーザー関数でswitch文を使い変換すること。
西暦の変換は、明治(+1867),大正(+1911),
昭和(+1925),平成(+1988)
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: できるだけはやくおねがいします。
その他の制限: ユーザー関数まで習っています。
875デフォルトの名無しさん:2005/11/14(月) 12:17:48
>>873
// get your name
static inline const char * YourName() {return "山田太郎";}
// default constractor
Person() : age(0) {name = new char[strlen(YourName()) + 1]; strcpy(name, YourName());}
// copy constractor
Person(const Person & src) : age(src.age) {new char[strlen(src.name) + 1]; strcpy(name, src.name);}
// I was exhausted.
876デフォルトの名無しさん:2005/11/14(月) 12:21:01
>>874
int UserFunction(const char * yearString)
{
switch(*yearString++) {
case 'm': return atoi(yearString) + 1867;
case 't': return atoi(yearString) + 1911;
case 's': return atoi(yearString) + 1925;
case 'h': return atoi(yearString) + 1988;
default: return 0;
}
877デフォルトの名無しさん:2005/11/14(月) 12:25:38
int UserFunction(const char * yearString)
{
int year = atoi(yearString + 1);
switch(*yearString) {
case 'h': year += 1988 - 1925;
case 's': year += 1925 - 1911;
case 't': year += 1911 - 1867;
case 'm': year += 1867;
default: return year;
}
/* あ、>876と仕様が違うw つか、main()が無いじゃん */
878デフォルトの名無しさん:2005/11/14(月) 12:37:52
[1] 授業単元:コンピュータプログラミング
[2] 問題文(含コード&リンク):
1 + 1/2 + 1/3 + ... + 1/100
を計算するプログラムを書きなさい。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 11月16日の12時まで
[5] その他の制限:特に制限はないです。
よろしくお願いします。
879デフォルトの名無しさん:2005/11/14(月) 12:38:54
>>853

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

#define MAX_BUFFER 255
int get_freq(string[],int[],ifstream&);
void draw_graph(string[],int[]);

int main(int argc, char* argv[])
{
ifstream fin;
string key_word[8] = {"for","if","while","cout","cin","int","double","string"};
int key_count[8] = {0};
fin.open(argv[1]);
if(!fin)
{
cout << "error: cannot open file '" << argv[1] << "'" << endl;
return -1;
}
get_freq(key_word,key_count,fin);
draw_graph(key_word,key_count);

fin.close();
return 0;
}
880879(2/3):2005/11/14(月) 12:39:30
int get_freq(string _word[], int _count[], ifstream& fin)
{
char buf[MAX_BUFFER];
char* bp;
while(!fin.eof())
{
fin >> buf;
for(int i=0; i<8; i++)
{
bp = buf;
while(true)
{
bp = strstr(bp,_word[i].c_str());
if(bp!=NULL)
{
bp+=strlen(_word[i].c_str());
_count[i]++;
}
else break;
}
}
}
return 1;
}
881879(3/3):2005/11/14(月) 12:40:08
void draw_graph(string _word[], int _count[])
{
for(int i=0; i<8; i++)
{
cout.width(7);
cout.setf(ios::left);
cout << _word[i];
cout.unsetf(ios::left);
cout << ":";
for(int j=0; j<_count[i];j++)cout << "*";
cout << endl;
}
}
882702:2005/11/14(月) 12:41:17
>>753>>808氏ありがとうございます
しかし、何が何でも200行以上書けと言われました。
とりあえず、適当にくっつけて144行にはなったのですが詰まってしまいました
お力をお貸しいただければありがたいです。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1081.txt
883デフォルトの名無しさん:2005/11/14(月) 12:44:55
>>878

#include <stdio.h>
int main(void)
{
double t=0;
int i;
for(i=1;i<=100;i++)t+=1.0/i;
printf("%lf\n",t);
return 0;
}

こんくらい自力でやろうぜ
史上まれに見る易問だぜ
884デフォルトの名無しさん:2005/11/14(月) 13:12:51
>>883
C99とは限らないのでprintf("%f\n", t);とすべき。
いや寧ろ、小数点以下6桁なんて半端なこと言わずに"%g"でも使っとけ。
885>>869(1/2):2005/11/14(月) 13:15:49
#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;
class tree{
private:
int data;
public:
tree* left;
tree* right;
tree(int _data){data=_data;left=NULL;right=NULL;};
~tree(){;};
void inorder(void){
cout << "(";
if(left!=NULL)left->inorder();
else cout << "$";
cout << "," << data << ",";
if(right!=NULL)right->inorder();
else cout << "$";
cout << ")";
}
};
886>>869(1/2):2005/11/14(月) 13:17:28
int main(){
srand((unsigned)time(NULL));
tree* root = new tree(rand()%20);
tree* node[5];
for(int i=0;i<5;i++)node[i] = new tree(rand()%20);
root->left = node[0];
root->right = node[1];
root->left->right = node[2];
root->left->left = node[3];
root->right->left = node[4];
root->inorder();
delete(root);
for(int i=0;i<5;i++)delete(node[i]);
return 0;
}

順序もないただの二分木だから挿入が面倒だ
887デフォルトの名無しさん:2005/11/14(月) 14:11:47
>>882
問題の残り表示時間とか回答の残り時間カウントダウンとかどう??
888デフォルトの名無しさん:2005/11/14(月) 16:48:22
>>883 >>884
ありがとうございます。助かりました。
889デフォルトの名無しさん:2005/11/14(月) 16:49:26
[1] 授業単元:プログラミング実習T
[2] 問題文(含コード&リンク):
給与計算
社員番号  本給   役職手当  交通費   支給合計  所得税  差引支給
(no)   (honkyu)  (teate)  (koutuu)  (sikyutot)  (tax)  (sashihiki)
0010   903,000  100,000   8,200
0013   210,000    0   12,000  
0213   480,000  50,000    4,800
0345   610,000  50,000    8,800
0418   150,000    0    9,200
支給合計=本給+役職手当+交通費
差引支給=支給合計-所得税
所得税=支給合計に金額に応じて税率を掛けたもの(小数点以下切捨て)
税率
支給額 1,000,000以上 600,000以上 400,000以上 200,000以上 200,000未満
税率  0.42       0.32     0.21    0.08    0.0
5人の支給明細の外部ファイルから読み込みと支給明細の一覧表の作成はmain関数で、
所得税の計算はユーザー関数で2次元配列を使って行いなさい。
フローチャート、プログラム、結果をプリントして提出しなさい。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C言語
[4] 期限: [2005年11月20日まで]
[5] その他の制限:
ユーザー関数まで習っています。
なにとぞよろしくお願いいたします。
890デフォルトの名無しさん:2005/11/14(月) 17:17:45
>>885
ありがとうございました。
結果の表示についていまひとつわからないので、教えていただけるとありがたいです。

例:((($,6,$),19,($,11,$)),8,(($,14,$),2,$))
891デフォルトの名無しさん:2005/11/14(月) 17:25:12
[1] 授業単元:Cプログラム
[2] 問題文(含コード&リンク):入力した数字を文字に変換し、
文字列に格納して出力する。
(例:数字の195を入力したら文字の195に変換し、文字列の格納して出力する。)
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc 2.96
 [3.3] 言語: C
[4] 期限: [2005年11月14日16:00まで]
[5] その他の制限: なし

よろしくお願いします。
892>>891:2005/11/14(月) 18:25:07
#include <stdio.h>

int main(int argc, char* argv[])
{
int num = 0;
char str[64] = {'\0'};
char buff[64] = {'\0'};

scanf("%d",&num);

//_itoa
int i=0,s = num;
for(;s != 0;s /= 10,++i) buff[i] = '0' + s % 10;
for(;i>0;++s,--i) str[i-1] = buff[s];

printf("%s\n",str);
return 0;
}
893デフォルトの名無しさん:2005/11/14(月) 18:50:18
[1] 授業単元:プログラミング演習2
[2] 問題文
int main(void){
char str[] = "meijo";
char *ptr = str;
}
以上のような変数宣言をしたときの
・ポインタ変数のアドレス
・ポインタ変数が参照する配列変数の先頭アドレス
・ポインタ変数に格納されている値
・ポインタ変数の参照先データ
をそれぞれポインタ変数を用いてポインタの位置を文字数分まで1つずつ進めながら
16進数で確認するプログラムを作成せよ。ただし、ポインタの位置を変化させても値が変化しないものについては、
1回だけ表示すれば良い。

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: Microsoft VisualC++6.0
 [3.3] 言語: C++
[4] 期限:速ければ速いほど助かります。
894デフォルトの名無しさん:2005/11/14(月) 20:01:37
>>893
#include <cstdio>
int main(void)
{
    using namespace std;
    char str[] = "meijo";
    char* ptr = str;
    printf("ポインタ変数のアドレス: %x\n", &ptr);
    for (int i = 0; i < sizeof(str); ++i)
    {
        printf("ポインタ変数に格納されている値: %x\n", &(*ptr));
        printf("ポインタ変数の参照先データ: %x\n", *ptr);
        ++ptr;
    }
    return 0;
}
895デフォルトの名無しさん:2005/11/14(月) 20:14:25
>>889
フローチャートはここではあまり答えてもらえないぞ。
そういう俺も答えない。
896デフォルトの名無しさん:2005/11/14(月) 20:21:58
[1] 授業単元:演習U
[2] 問題文
入力した文字列から指定した文字を検索するプログラムをポインタ変数を用いて作成せよ。
[実行例]
文字列を入力してください:Exercise
検索文字を入力してください:e

文字列"Exercise"に"e"は
3番目
8番目
にあります。

[実行例]
文字列を入力してください:meijo
検索文字を入力してください:a

そんな文字は入っていない!

[環境]
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: Microsoft VisualC++6.0
 [3.3] 言語: C++
[4] 期限:速ければ速いほど助かります。

>>894
ありがとうございます。助かりました。
もう1つ載せても大丈夫でしょうか?
897デフォルトの名無しさん:2005/11/14(月) 20:50:17
>>896
>>894ではないが、訊かずにどんどん投げろ
#include <stdio.h>

int main(void)
{
char str[1024], key;
int i, first;
printf("文字列を入力してください:");
scanf("%s", str);
printf("検索文字を入力してください:");
scanf("%c", &key);
first = 1;
for( i = 0 ; str[i] ; i++ ) {
if( str[i] != key ) continue;
if( first ) printf("文字列\"%s\"に\"%c\"は\n", str, key);
printf("%d番目\n", i + 1);
}
if( first ) puts("そんな文字は入っていない!");
else puts("にあります。\n");
return 0;
}
898デフォルトの名無しさん:2005/11/14(月) 20:58:15
>>892
C++で動作確認しました。
C用には一部修正を要しましたが、動作確認しました。
どうもありがとうございます。
899デフォルトの名無しさん:2005/11/14(月) 21:06:03
>>897
動かないよ。あとポインタ使えって要求があるぞ
900889:2005/11/14(月) 21:07:35
本題のプログラムだけお願いします。
問題丸写しで書き込んだのでよけいな物が
混じってました。すみません
901デフォルトの名無しさん:2005/11/14(月) 21:30:15
これなら動くと思う。
#include <stdio.h>
int main(void)
{
char str[1024], key, *p;
int i, first;
printf("文字列を入力してください:");
fgets(str, 1024, stdin);
printf("検索文字を入力してください:");
scanf("%c", &key);
first = 1;
for( i = 0, p = str ; *p ; p++, i++ ) {
if( *p != key ) continue;
if( first ) printf("文字列\"%s\"に\"%c\"は\n", str, key);
printf("%d番目\n", i + 1);
}
if( first ) puts("そんな文字は入っていない!");
else puts("にあります。\n");
return 0;
}
902デフォルトの名無しさん:2005/11/14(月) 22:31:39
- fgets(str, 1024, stdin);
+ fgets(str, 1024, stdin);
+ str[strlen(str) - 1] = '\0';

- if( first ) puts("そんな文字は入っていない!");
+ if( first ) { puts("そんな文字は入っていない!"); first = 0;}
903デフォルトの名無しさん:2005/11/14(月) 22:36:49
904903:2005/11/14(月) 22:47:23
#103 {400000,0.08},{600000,0.21},{1000000,0.32}

#103 {200000,0.0},{400000,0.08},{600000,0.21},{1000000,0.32}
905デフォルトの名無しさん:2005/11/14(月) 22:48:33
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):

void del_digit(char *str) { /*・・・*/ }
を添字演算子を使わずに作成せよ。
(例えば"Ru3ru4ti5a7"と受け取ったら"Rurutia"とする)

[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 11月18日まで

添字を使ったらできるのですが添字なしだといろいろ考えてみましたが
うまくいきません。どなたかご教授願えないでしょうか。

906デフォルトの名無しさん:2005/11/14(月) 22:54:50
>>879
ありがとうございます。
ただ、コンパイルして走らせたところいきなり
cout << "error: cannot open file '" << argv[1] << "'" << endl;
部分が実行されてしまうのですがどうしたらいいでしょう?
907889:2005/11/14(月) 22:59:54
>>903
ありがとうございます。
しかし見てみるとあり得ないくらい難しいですね。
こんなのをやれとは教授もおかしな人です、、、、、
908702:2005/11/14(月) 23:01:12
>>887
すみません。どうやったら出来るのでしょうか??
良く分かりませんので、教えていただければ幸いですm(__)m
909デフォルトの名無しさん:2005/11/14(月) 23:01:42
del_digit(char *str) {char *from, *to; for (from = to = str; *from; from++) if (isdigit(*from)) *to++ = from; }
910デフォルトの名無しさん:2005/11/14(月) 23:03:09
>>901
最後のif文が必ず実行されてしまいます。
検索文字が見つからなかった場合のみ表示させるためにはどうすれば良いですか?
911デフォルトの名無しさん:2005/11/14(月) 23:04:05
>>903
void f(char *p, char *q) {
if (*p == '\0') *q = *p;
else if (isdigit(*p)) f(p+1,q);
else *q = *p, f(p+1,q+1);
}
void del_digit(char *str) { f(str, str); }
912デフォルトの名無しさん:2005/11/14(月) 23:11:16
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1083.c
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1085.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1086.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 11/21


よろしくお願いします
913デフォルトの名無しさん:2005/11/14(月) 23:20:23
914デフォルトの名無しさん:2005/11/14(月) 23:29:49
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1087.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1088.txt
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 11/21


よろしくお願いします
915デフォルトの名無しさん:2005/11/14(月) 23:34:18
>>907
別にたいしたこと無いぞ
それを難しいと思うのは勉強不足
916デフォルトの名無しさん:2005/11/14(月) 23:41:59
[1] 授業単元:アルゴリズム研究
[2] 問題文(含コード&リンク):問 以下はBlock sortingの簡単な例である。これを参考に、文字を入力(最大10文字まで)してBlock Sortingの考え方で結果を出力するプログラムを作れ。
ACABをBlock sortingで変換
@まず元のデータを一文字ずつ左側にシフトさせる。1、ACAB→2、CABA→3、ABAC→4、BACA 
Aこの4つのデータを辞書順にソート 3、ABAC、1、ACAB、4、BACA、2、CABA 
B各データの最後の文字を上から出力し、元のデータがある番号を出力する。 結果:CBAA 元データの列番号 2 
[3] 環境
 [3.1]windows2000
 [3.2]コンパイラ borland C++bulider6.0
 [3.3] 言語: C
[4] 期限: 今週水曜日まで
[5] その他の制限: 最近、簡単な探索(線形探索や2分探索)と簡単なソート(バブルソートやクイックソート)を最近習いました。
それの応用でこの課題が出たのですが、難しくてできませんでした orz
分かる方がいましたらどうぞよろしくお願いします。
917デフォルトの名無しさん:2005/11/14(月) 23:49:59
[1] 授業単元:アルゴリズムと構造
[2] 問題文(含コード&リンク):
標準入力された文字列の、最初に空白が出現する場所を求める関数プログラムを作りなさい。

入出力例
入力:It was rain today.
出力:3

入力: It was rain today.(1文字目に空白)
出力:1

入力:rain(空白無し)
出力:not found


[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン:不明
 [3.3] 言語:C++
[4] 期限:2005年11月19日
[5] その他の制限:なし

どうもうまくできません;
918デフォルトの名無しさん:2005/11/14(月) 23:55:34
int findspace(char*src){
int n;
if(src==NULL) return 0;
for(n=0;n<strlen(src);n++){
if(src[n]==' ') return n+1;
}
return 0;
}

もしかして、not foundって文字列を返すのか(`д´)
919デフォルトの名無しさん:2005/11/14(月) 23:56:09
>>902
'strlen':定義されていない識別子です。
となります。
どうしたらエラー取れますか?
すみません素人で(汗)
920デフォルトの名無しさん:2005/11/15(火) 00:03:05
>>919
#include<string.h> を
#include<stdio.h> の次の行に入れる
921デフォルトの名無しさん:2005/11/15(火) 00:03:14
>>909
それじゃできませんでした
922デフォルトの名無しさん:2005/11/15(火) 00:05:04
http://pc8.2ch.net/test/read.cgi/tech/1131282679/l50

237 :デフォルトの名無しさん :2005/11/14(月) 23:38:29
さあ話をそらしにかかりました
923デフォルトの名無しさん:2005/11/15(火) 00:05:20
>>919
まだ strlen 習っていないなら、その行消してもいいけどね。改行コード削ってるだけだから。少し見た目が変になるけど
924デフォルトの名無しさん:2005/11/15(火) 00:12:47
>>902
#include <stdio.h>
int main(void)
{
char str[1024], key, *p;
int i, first;
printf("文字列を入力してください:");
fgets(str, 1024, stdin);
printf("検索文字を入力してください:");
scanf("%c", &key);
first = 1;
for( i = 0, p = str ; *p ; p++, i++ ) {
if( *p != key ) continue;
if( first ) printf("文字列\"%s\"に\"%c\"は\n", str, key);
printf("%d番目\n", i + 1);
}
if(first){
puts("そんな文字は入っていない!");
first = 0;
}
else puts("にあります。\n");
return 0;
}
なんですが、まだ実行結果が↓
文字列を入力してください:imagin
検索文字を入力してください:i
文字列"imagin"に"i"は
1番目
文字列"imagin"に"i"は
5番目
そんな文字は入っていない!
Press any key to continue
925デフォルトの名無しさん:2005/11/15(火) 00:13:39
>>923
末尾に改行文字が必ず入っているわけではない。
926デフォルトの名無しさん:2005/11/15(火) 00:21:03
■幸福のコピペ(チョピペ)■
他のスレに貼り付けると□□□□■□□□□■□□□
□■■隠された文字が■浮き出るよ□□■■■□□□□
http://pc8.2ch.net/test/read.cgi/tech/1131282679/l50
□□□■■□■■□□□□□■■□□■■□■□□
237 :デフォルトの名無しさん :2005/11/14(月) 23:38:29
さあ話をそらしにかかりました□□□□■□□□■■□
□■■□□■□□□□■■□□■□□□□□■■□
927デフォルトの名無しさん:2005/11/15(火) 00:27:05
>>925
うん。そうだね。でも今回の問題じゃ、1023以上も入力される事は無いだろうと思ったの
928デフォルトの名無しさん:2005/11/15(火) 00:30:13
>>927
いや、改行を伴わずに入力が終了するケース(例えばリダイレクト)もあるから。
929デフォルトの名無しさん:2005/11/15(火) 00:41:56
fgetsで末尾が改行にならない手順をおしえろ
環境はwindowsです
よろしくお願いします
930デフォルトの名無しさん:2005/11/15(火) 00:46:11
>>929
>1
宿題じゃないなら該当スレへ。
931デフォルトの名無しさん:2005/11/15(火) 00:46:57
>>912
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1090.c

ちょっと関数使って外出すハメになったけど…
932デフォルトの名無しさん:2005/11/15(火) 00:53:55
>>928
分かった俺の負けだ。正直そこまで考慮にいれていなかった
933デフォルトの名無しさん:2005/11/15(火) 01:08:33
>>932
いや、勝ち負けの問題じゃないよ。
こういう遣り取りは周りも知識の獲得になるし、我々も再確認になるからね。
934デフォルトの名無しさん:2005/11/15(火) 01:29:40
>>924
#include <stdio.h>
int main(void)
{
char str[1024], key, *p;
int i, first;
printf("文字列を入力してください:");
fgets(str, 1024, stdin);
printf("検索文字を入力してください:");
scanf("%c", &key);
first = 1;
for( i = 0, p = str ; *p ; p++, i++ ) {
if( *p != key ) continue;
if( first ) { printf("文字列\"%s\"に\"%c\"は\n", str, key); first=0; } // ここが変わってる
printf("%d番目\n", i + 1);
}
if(first) puts("そんな文字は入っていない!"); // この辺が変わってる
else puts("にあります。\n");
return 0;
}
935デフォルトの名無しさん:2005/11/15(火) 02:48:37
遅レスだぜ〜

>>906
ファイル名は標準入力から読み取るのではなく
コマンドラインから受ける

つまり test.exe test.cpp
みたいにしてじっこうする

>>890
たとえば
($,3,$)だったら
3がルートで左が$、右が$
$はダミー

(($,3,2),8,(4,12,$))だったら
8がルートで左が3、さらにその右が2
8の右が12でさらにその左が4
936デフォルトの名無しさん:2005/11/15(火) 02:51:28
>>914
#define NOWIN 0
int win_check(int** ban,int player)
{
int i, j, win1, win2;
/* 縦と横の並びをチェック */
for( i = 0 ; i < BAN ; i++ ) {
win1 = win2 = WIN;
for( j = 0 ; j < BAN ; j++ ) {
if( *(*(ban+i)+j) != player ) win1 = NOWIN;
if( *(*(ban+j)+i) != player ) win2 = NOWIN;
}
if( win1 == WIN || win2 == WIN) return WIN;
}
/* 斜めの並びをチェック */
win1 = win2 = WIN;
for( i = 0 ; i < BAN ; i++ ) {
if( *(*(ban+i)+i) != player ) win1 = NOWIN;
if( *(*(ban+i)+i+BAN-1) != player ) win2 = NOWIN;
}
if( win1 == WIN || win2 == WIN) return WIN;
return NOWIN;
}
937931:2005/11/15(火) 06:27:27
>>912

>>931 は
・(0,0)は0
・周囲が0で囲まれている
ことが前提上なので
左上部分で
1 0 0  や 0 0 1
0 0 0      0  0  1
1 1 0      1  1  1
などには弱いです
縦横が34(32+2)になってるからそれを見越してるのかもしれませんが
一応注を入れておいてください
938917:2005/11/15(火) 06:48:18
>>918
遅レスですが、「Not found」ではなくか「0」でも可です…
(むしろ0の方がいいかも?
939デフォルトの名無しさん:2005/11/15(火) 06:52:07
940デフォルトの名無しさん:2005/11/15(火) 10:28:11
>>935
実行例みたく標準入力にしたいのですが
cin>>〜
で普通に書き換えてしまってokでしょうか?
941≠935:2005/11/15(火) 13:36:48
>>940
それだったら、fin.open()の前にcinでファイル名を取得すればいいんでない?
942デフォルトの名無しさん:2005/11/15(火) 13:51:46
宿題じゃないのですが、a=001 n=111 のとき ++a &= n; は一般的にどうなりますか?
943デフォルトの名無しさん:2005/11/15(火) 13:54:14
>>942
やってみたらどうなりましたか?
944デフォルトの名無しさん:2005/11/15(火) 13:58:15
++によって a=010 になる気がします。とするなら++a &= n; に意味があると思えないのです
945デフォルトの名無しさん:2005/11/15(火) 14:02:40
>>942
一般的に、エラーになります。
946940:2005/11/15(火) 14:04:36
自己解決しました。
>>941様もありがとうございました。
947デフォルトの名無しさん:2005/11/15(火) 15:09:01
>>937
読み込むときに0で囲んで、書き出すときに削れば解決。
948名無し:2005/11/15(火) 16:32:18
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(void)
{
char expr[80];
int i, op1=0, op2=0, len, flag = 0;

fgets(expr, 80, stdin);
len = strlen(expr) - 1;
expr[len] = '\0';

949名無し:2005/11/15(火) 16:34:21
>>948続き
for (i=0;i<len;i++) {
if (isdigit(expr[i])) {
if (!(flag & 1)) {
op1 = op1*10 + (expr[i] - '0');
} else {
op2 = op2*10 + (expr[i] - '0');
}
continue;
}
if (expr[i] == '+') {
flag |= 1;
flag |= (1<<1);
continue;
} else if (expr[i] == '-') {
flag |= 1;
flag |= (1<<2);
continue;
} else if (expr[i] == '=') {
if (flag & (1<<1)) {
printf("%s %d\n", expr, op1+op2);
} else {
printf("%s %d\n", expr, op1-op2);
}
break;
}
950名無し:2005/11/15(火) 16:35:17
>>949続き
/* Error handling */
puts("Syntax Error!");
return -1;
}
return 0;
}
以前、作っていただいたプログラムなのですが、
このプログラムの詳細(手順、操作内容など)教えていただけないでしょか?
よろしくお願いします。
951デフォルトの名無しさん:2005/11/15(火) 16:48:51
以前ってどのレス?
952デフォルトの名無しさん:2005/11/15(火) 17:11:23

[1] 授業単元:プログラミング
[2] 問題文(s構造体配列のプログラムであるがこのプログラムには間違いがあるので間違いを述べなさい):
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: VC6.0
 [3.3] 言語: C
[4] 期限:11月20日

#include<stdio.h>
main(){
int idx;
struct s_type{
int i;
long l;
}s[10];

for (idx=0;idx<10;idx++){
s.i[idx]=0;
s.l[idx]=0;
}
}
どなたかよろしくお願いします。
953デフォルトの名無しさん:2005/11/15(火) 17:19:00
>#include<stdio.h>
>main(){
戻り値の型がない。
>int idx;
>struct s_type{
>int i;
>long l;
>}s[10];

>for (idx=0;idx<10;idx++){
>s.i[idx]=0;
[]演算子の使い方がおかしい。
>s.l[idx]=0;
[]演算子の使い方がおかしい。
>}
>}
戻り値がない。
954デフォルトの名無しさん:2005/11/15(火) 17:23:16
[1] 授業単元:プログラム
[2] 問題文(含コード&リンク):
配列a[ ]のすべての要素に1を代入する。
この代入する部分を独立させ配列名とアドレスが一致してることを利用するやりかたで書け。
(配列で渡してポインタで受け取る)
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2005年11月16日まで
[5] その他の制限:なし
よろしくおねがいします
955デフォルトの名無しさん:2005/11/15(火) 17:50:01
どういうことだろうか
956デフォルトの名無しさん:2005/11/15(火) 17:57:00
>>954
#include <stdio.h>

void fill(int *p, int n)
{
    int i;
    for (int i = 0; i < n: i++)
    {
        p[i] = 1;
    }
}

#define N 16
int main(void)
{
    int i;
    int array[N];
    fill(array, N);
    for (int i = 0; i < n: i++)
    {
        printf("array[%d] == %d\n", i, array[i]);
    }
    return 0;
}
957デフォルトの名無しさん:2005/11/15(火) 17:58:20
最近、冗長なプログラムが読みやすいプログラムだ、とか思ってるひと多くない?
958デフォルトの名無しさん:2005/11/15(火) 18:21:16
int iの重複は冗長だと思うがこんなもんだろ
具体的に指摘できるところある?
959名無し:2005/11/15(火) 18:30:27
>>951
C/C++の宿題を片付けます 51代目の時です
960デフォルトの名無しさん:2005/11/15(火) 18:49:26
961デフォルトの名無しさん:2005/11/15(火) 18:59:02
[問題4/中級]文字列 MOJI に代入されている文字の中から、数字(0から9)だけ
を取り出して、それを小さい順に表示するプログラムを作りなさい。
例えば、MOJI[]="9B2C3ADC31" ならば 12339 と表示する。

「問題6/上級]次の問題の中から、どれか1つを選び、プログラムを作成して答えを
求めなさい。
(問題6−1)太郎君が9歳になるまで,花子さんの年齢が太郎君の年齢の整数倍にな
る年がちょうど7回ある。このとき、太郎君と花子さんの年齢差はいくつか?
 

962952:2005/11/15(火) 19:01:15
>>953
ありがとうございます。
申し訳ありませんがよかったら正しい書き方を教えていただけませんでしょうか?
お願いします。
963デフォルトの名無しさん:2005/11/15(火) 19:02:56
>>956 は冗長とは思わんけど、fill って名前で 1 を代入する関数を作るのは犯罪だと思う。fill_one とかにしようよ。
964デフォルトの名無しさん:2005/11/15(火) 19:04:12
そういう問題か?
965デフォルトの名無しさん:2005/11/15(火) 19:06:31
>>961 問題4
#include <stdio.h>
#include <ctype.h>
int main() {
  char *p, MOJI[] = "9B2C3ADC31";
  int i, j, tbl[10];
  for (i = 0; i < 10; ++i) tbl[i] = 0;
  for (p = MOJI; *p != '\0'; ++p) 
    if (isdigit(*p)) ++tbl[*p-'0'];
  for (i = 0; i < 10; ++i) 
    for (j = 0; j < tbl[i]; ++j) printf("%d", i);
}
966デフォルトの名無しさん:2005/11/15(火) 19:08:28
>>965
>>961はマルチ。放置汁
967デフォルトの名無しさん:2005/11/15(火) 19:15:42
>>966 スマソ&サンクス
968963:2005/11/15(火) 19:18:05
>>964 分かると思うけど 963 ≠ 957 だよ。指摘とか書いてたのでものすごく気になったとこだけ指摘してみた。割り込んでごめんね。
969デフォルトの名無しさん:2005/11/15(火) 19:42:22
#include <stdio.h>
int main(void)
{
int i,j,a;

for (i=1;i<=5;i++)

{ j=i*i;

{for (a=1;a<=j;a++)

printf("たま〜"); }

printf("%d\n",j);}

return 0;
}

よろぴく
970デフォルトの名無しさん:2005/11/15(火) 19:44:05
ok
971デフォルトの名無しさん:2005/11/15(火) 20:08:42
「問題]九九の計算ドリルです。メインプログラムから、次の2つの関数を呼
び出しています。各関数を指示通りに作成し、プログラムを完成させなさい。
(1)関数 kakezan
 x と y を使って、この問題の配点と「九九の問題」を表示させなさい。配点とは、
この問題ができたときに獲得する点数です。易しい問題のときは配点を小さく、難しい
問題のときは配点を大きくしなさい。(配点は、この関数の終わりに return tensu;
で返すこと。)
(2)関数 hyouka
 問題数、得点、回答時間を評価し、適切なメッセージを表示する関数を作成しなさい。

972デフォルトの名無しさん:2005/11/15(火) 20:09:25
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

/* 関数プロトタイプ宣言 */
int kakezan(int x, int y);
void hyouka(int mondai,int tokuten,int byou2);

/* メインプログラム */
void main()
{
int x,y,kotae,tensu,mondai=0,tokuten=0,yes=1;
int byou1,byou2;
srand(time(0));

while (yes) { /* yes の値が 1 のとき繰り返す */
mondai++; /* 問題数のカウント */
x=rand()%9+1; /* x は1〜9までの乱数 */
y=rand()%9+1; /* y は1〜9までの乱数 */

973デフォルトの名無しさん:2005/11/15(火) 20:10:14
byou1=time(0); /* 回答前の時間(秒) */
tensu=kakezan(x,y); /* tensu は配点、kakezan は関数 */
scanf("%d",&kotae); /* kotae は入力した答え */
byou2=time(0)-byou1; /* 回答するのに要した時間(秒) */

if(x*y==kotae) /* 入力した答えが正解かどうか? */
{printf("---> 正解です\n"); tokuten+=tensu; }
else printf("---> 間違いです\n");
/* tokuten は、正解の時に配点分を加算する */
/* hyouka は関数(問題数・得点・回答時間) */
hyouka(mondai,tokuten,byou2);

printf("続けますか?<1:はい 2:いいえ>");
scanf("%d",&yes);
if(yes!=1) {printf("おしまい\n"); return;}
}}

974デフォルトの名無しさん:2005/11/15(火) 20:10:44
/* 九九の問題を表示し配点を返す kakezan */
int kakezan(int x, int y)
{ int tensu;
?????
return tensu; }

/* 問題数・得点・回答時間を評価して表示 hyouka */
void hyouka(int mondai,int tokuten,int byou2)
{ ????? }
どうしてもわからないので教えてください。
975デフォルトの名無しさん:2005/11/15(火) 20:14:09
>>1を101回読め
976974:2005/11/15(火) 20:34:58
事故解けうしました。
977デフォルトの名無しさん:2005/11/15(火) 20:56:46
どうしても分からないのに自己解決
978デフォルトの名無しさん:2005/11/15(火) 21:38:49
[1] 授業単元:プログラミング処理
[2] 問題文(含コード&リンク):ファイルから連立方程式を読み込み、行列の計算を利用して解を求めるプログラムを作成する。
[3] 環境
 [3.1] OS:標準環境はソラリス8
 [3.2] コンパイラ名とバージョン:gcc バージョンは申し訳ないですが判りません。
 [3.3] 言語:C言語です。
[4] 期限:2006年1月11日まで
[5] その他の制限:解はLU分解法とガウスザイデル法でそれぞれ求める。読み込むファイルはax1+bx2+…=y1のa,b…をすべて一行に記入し、スペースで区切る。

二次元配列を動的確保するサブ関数とファイルからstrtok関数などを用いた一行の要素を二次元配列の行要素にそれぞれ格納するサブ関数がわかりません。
よろしくお願いします。
979デフォルトの名無しさん:2005/11/15(火) 21:41:48
【質問テンプレ】
[1] 授業単元: 不明
[2] 問題文(含コード&リンク): @キーボードから文字列を入力し(入力は繰り返しできるように)、結果を表示するプログラムを作成。
入力終了を判定する文字列(endなど)が入力されたら処理を終了。
A @番に入力した文字列を、逆転した文字列に変換するサブ関数を加えて処理し、結果を表示するプログラムを作成。(入力は繰り返す@と同じ)
B "harumi","Ryouko","Syouko","keiko","Akina","Miyu"これらの名前を2次元配列で初期化し、アルファベット順にソートして表示。(大文字小文字をまぜてます。main()関数のみ使用)
C "harumi","Ryouko","Syouko","keiko","Akina","Miyu"これらの名前を文字列ポインタで初期化し、Bで作成したプログラム(ソートのね)をポインタで作成。(main()関数のみ使用)
[3] 環境
 [3.1] OS: UNIX
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語: C
[4] 期限: [2005年11月16日10:30まで]
[5] その他の制限: プログラムにはGOTO文を使用してはいけない。
980名無し:2005/11/15(火) 22:34:01
>>948 >>949 >>950
はどのような構造になっているのですか?
981デフォルトの名無しさん:2005/11/15(火) 23:19:50
文字列ポインタのみで初期化、っつったら
いちいちmallocして一個一個代入していけっつーのか

めんどいぞ
982デフォルトの名無しさん:2005/11/15(火) 23:43:20
[1] 授業単元: ヒューマンインターフェイス
[2] 問題文(含コード&リンク):
構造体を用いて、50音順に並んだ辞書ファイル(26万弱)を読み込み簡単な変換

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: bcc32
 [3.3] 言語: C
[4] 期限:16日正午
[5] その他の制限:

typedef struct _node{
charyomi[100];
charhyouki[100];
charhinshi[100];
}NODE;

お願いしたいことは、上記構造体のポインタを格納をする配列の作り方を教えていただきたいです。

NODE *p[260000];
とかしても実行してくれません・・・
983デフォルトの名無しさん:2005/11/15(火) 23:48:16
>>981
たぶん、その解釈じゃなくて、char*a[]と書けっちゅうてるだけじゃね?
984名無し:2005/11/15(火) 23:49:24
>>980
flagの意味がわからないのですが
985デフォルトの名無しさん:2005/11/15(火) 23:51:25
>>982
typedef struct _node{
charyomi[100];
charhyouki[100];
charhinshi[100];
}NODE,*PNODE;

PNODE p[260000];

でもできれば動的に
PNODE* p = malloc(260000)
にした方がいいかも。
986デフォルトの名無しさん:2005/11/15(火) 23:54:28
>>985
malloc(sizeof(PNODE) * ...
987985:2005/11/16(水) 00:07:58
>>986
(*^ー゚)b グッジョブ!!
988984:2005/11/16(水) 00:12:20
985-987

サンクス
989デフォルトの名無しさん:2005/11/16(水) 00:17:44
printfで表示するときに中央寄せにしたいのですが、どうすればいいんですか?
990デフォルトの名無しさん:2005/11/16(水) 00:19:16
自分で余白を計算して整形する。
すれ違い。
991デフォルトの名無しさん:2005/11/16(水) 00:57:51
>>984
旗。

>>988
あんたが>984なのだとしたら、阿呆なのか?

>>989
中央寄せの定義をしてくれ。
992デフォルトの名無しさん:2005/11/16(水) 01:00:06
>>979
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1098.c

こういうことでいいのかな?
違う、とかいわれても作り直す気はさらさらないけど
993デフォルトの名無しさん:2005/11/16(水) 01:03:18
表示幅がn、文字列がsだとしたら
for(i=0;i<(strlen(s)-n)/2;i++)printf(" ");

こんな漢字か?
printf("%-5s",s);
みたいな昨日はないよ
994979:2005/11/16(水) 01:48:54
さっさと答えろやボケナス共。
995デフォルトの名無しさん:2005/11/16(水) 02:02:13
>>992
MAX〜〜とかはいらないような気がします・・私もどう伝えたらいいのか分からないのですが、
初歩的な解き方でいいんです〜〜初歩的な解き方ができない私は一体・・すいません;;ありがとうございました。
これを参考に頑張ってみます。
996デフォルトの名無しさん:2005/11/16(水) 02:20:42
おまいが出された課題のレベルは下の下の上くらいだ
#defineは下の下の中くらいで習うはずだ

教官に文句いってやれ
997デフォルトの名無しさん:2005/11/16(水) 04:52:15
次スレは?
998ボケナスA:2005/11/16(水) 07:15:51
なんでオレが居るのを知ってるんだ? >>994
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void reverse(char *c){/* A */ char *p;
for(p=c+strlen(c);p>=c;p--) if(isprint(*p))printf("%c",*p);printf("\n");
}

int main(int argc, char* argv[]){
// char c[100]; /* @ A */
// for(;fgets(c,sizeof(c),stdin)!=NULL&&strcmp(c,"end\n");printf("%s",c));/* @ */
// for(;fgets(c,sizeof(c),stdin)!=NULL&&strcmp(c,"end\n");reverse(c));/* A */
/* B */
/*
char name[7][7]={"harumi", "Ryouko", "Syouko", "keiko", "Akina", "Miyu", };
for(int i=0;i<6;i++)
for(int j=i;j<6;j++)
if(strcmp(name[i],name[j])>0)
{strcpy(name[6],name[i]);strcpy(name[i],name[j]);strcpy(name[j],name[6]); }
for(i=0;i<6;printf("%d %s\n",i,name[i++]));
*/
/* C */
char *name[6]={"harumi", "Ryouko", "Syouko", "keiko", "Akina", "Miyu", },*tmp;
for(int i=0;i<6;i++)
for(int j=i;j<6;j++)
if(strcmp(name[i],name[j])>0){
tmp=name[i];name[i]=name[j];name[j]=tmp;
}
for(i=0;i<6;printf("%d %s\n",i,name[i++]));
return 0;
}
999ボケナスB:2005/11/16(水) 07:22:46
ばかだなぁ、>>992 で回答済みじゃないか
1000ボケナスC:2005/11/16(水) 07:23:40
っつーことで、ボケナス軍団(一人)が1000ゲット。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。