宿題手伝います

このエントリーをはてなブックマークに追加
1Rina
夏休みなので厨対策に新スレ立てました.
前スレ:http://pc3.2ch.net/test/read.cgi/tech/1026138039/

前スレより抜粋.

1 :かおる :02/07/08 23:20
こんにちは。えれなの妹のかおるです。

前スレは恭祐さんの「ほう、宿題とはな。」です。
http://pc.2ch.net/test/read.cgi/tech/1024592344/
それ以前の人たちは、>>2-10あたりにかかれるでしょう。

宿題とか手伝いますけど、以下の事項は守ってほしいです。
・マルチポストは厳禁です。
・キーワードが分かっているなら、http://www.google.co.jp を活用すること
・質問内容がちゃんと日本語になっていること
・言語名を入れること。
・自分の力で頑張ってみたことを伝えられる人。
・どこまでわかったのかを書くこと。
以上です。このスレだけのおつきあいですが、よろしくおながいします。

2 :デフォルトの名無しさん :02/07/08 23:21
手助けはするな、助言はしてやれ。

3 :かおる :02/07/08 23:22
登場人物&過去スレ 1/2

●お姉さん
あなたの宿題、お姉さんが答えます
http://piza.2ch.net/tech/kako/972/972032579.html
で登場。

●麻衣
お兄ちゃんの宿題、私が答えるよ
http://pc.2ch.net/tech/kako/982/982853418.html
で初登場。可愛い妹キャラ

●お兄ちゃん(名称不明)
宿題見てやるよ
http://pc.2ch.net/tech/kako/1003/10038/1003838158.html
で初登場。しかし、女性がいいという影の圧力により
1以外には登場せず。

●怜
宿題みてあげるっ
http://pc.2ch.net/test/read.cgi/tech/1007902384/l50
で初登場。お兄ちゃんの恋人。
結構親切に答えてくれる年上キャラ。
にげっとかな?
>>1

対応が早いね。
4Rina ◆tI333vNE :02/07/27 16:49
1です.
前スレ常駐してたわけではないので,
常連さんで気がついたリンクあったら書き足しておいてください.
>>4
前スレの内積、
 if (n == 0) {
  return 0.0;
 }
↑これいらなくない?
6Rina ◆tI333vNE :02/07/27 16:53
ちなみにRinaはJavaとCとPHPぐらいしかできません.
C/C++の宿題は専用スレがあるのでこちらへどうぞ.
  http://pc3.2ch.net/test/read.cgi/tech/1021862587/l50
7Rina ◆tI333vNE :02/07/27 16:54
>>5 ボタン押してから気がついたので突っ込まないようにw
前スレは『かおる』ですが何か?
9おねがいします!:02/07/27 17:28
大学の課題でどーしてもわからないのがあります。
(問題)数を12個読み込む。それぞれが車の月間売り上げ数だとする。
売り上げが一番多かった月、売り上げが一番伸びた月を見つけて印刷する
プログラム(Hanbai)を書きなさい。というものです。おそらく配列を使う
らしいのですが。言語はjavaです。

言語はjavaです。
印刷するの?
>>10
多分日本人に理解しやすいように和訳してくれてるんだと思われ。
一月の売上の伸びが分からないという罠
13おねがいします!:02/07/27 17:55
印刷というか多分それを書き出すプログラム?なのかなあ。
自分でもよくわかりません。はあーー。
(・∀・)
>>14
ワラタ
>>9
どこがわからないんだ。(複数可)
1) 数の読み込み
2) 12個の読み込み
3) 売り上げの一番多かった月の見つけ方
4) 売り上げの一番伸びた月の見つけ方
5) 3) 4) の結果の印刷(標準出力への表示でいいのか?)の仕方
6) Javaのコンパイル、実行
7) Javaのソースの書き方

配列は1)2)で読み込んだ月間売り上げ数を保持するのに使用し、
それを3)4)で使う。
売り上げの伸びって前月比? だと>>12の問題がある。
>>17
無論、1月は除外でしょ?って解釈は駄目なん?
>>18
つーことを明確にしてない問題が欠陥仕様。
「仕様が不明確です」と言うかどうかも採点対象という罠
21デフォルトの名無しさん:02/07/27 19:02
書き込もうと思ったら改行が多すぎって突っ込まれた罠.
すまん、sage忘れた. 意ってきます.
普段Javaをメインで使っている人物が、今は出払っている罠
24Rina ◆tI333vNE :02/07/27 19:17
いや、テケトーに作ったのがあるんだけど書き込めない…(汗
いっそ改行とっぱらって書き込もうか…。
>>24
いくつかのレスに分けたらよいのでは?
26Rina ◆tI333vNE :02/07/27 19:20
import java.io.*;

//エラー処理は一切してない.
public class Hanbai {
/**
* 12ヶ月分のデータを読む.
*
* データフォーマットの指定がなかったので, 1行につき1月分の
* 売り上げが書き込まれたテキストファイルだと仮定.
*/
public static int[] readData(String dataFileName) {
BufferedReader in = null;
// 開ける
try {
FileReader fileReader =
new FileReader(dataFileName);
in = new BufferedReader(fileReader);
} catch (Exception e) {
e.printStackTrace();
System.out.println("も、もうだめぽ…");
System.exit(1);
}

// 読む
int[] result = new int[12];
for (int i = 0 ; i < result.length ; i++) {
try {
String tmp = in.readLine();
result[i] = Integer.parseInt(tmp);
} catch (Exception e) {
e.printStackTrace();
System.out.println("データファイルがなってねーよ, ハゲ");
System.exit(1);
}
}

// 閉じる
try {
in.close();
} catch (Exception e) {
// do nothing.
}

return result;
}
27Rina ◆tI333vNE :02/07/27 19:21
// main
public static void main(String[] args) {
int[] tmp = readData("datafile");

printMax(tmp);

printMaxDiff(tmp);
}

/**
* 最大売り上げの月を表示
*/
public static void printMax(int[] data) {
System.out.println("売り上げが最大なのは");
System.out.print(" ");

int max = data[0];
for (int i = 1 ; i < data.length ; i++) {
if (data[i] > max) {
max = data[i];
}
}

for (int i = 0 ; i < data.length ; i++) {
if (data[i] == max) {
System.out.print((i + 1) + "月 ");
}
}
System.out.println();
}


/**
* 差分が最大な月を求める.
*/
public static void printMaxDiff(int[] data) {
System.out.println("売り上げの伸びが最大なのは");

int maxDiff = data[1] - data[0];
for (int i = 1 ; i < data.length - 1 ; i++) {
int diff = data[i + 1] - data[i];
if ( diff > maxDiff) {
maxDiff = diff;
}
}

for (int i = 0 ; i < data.length - 1 ; i++) {
if ((data[i + 1] - data[i]) == maxDiff) {
System.out.println(" " + (i + 1) + "月 -> " + (i + 2) + "月");
}
}
}
}
けっこう長くなるんだね。
29Rina ◆tI333vNE :02/07/27 19:27
もっと短く, かつ効率的にできるけどやってない.
コメントの分もあると思われ.
必要なら>>9がやるでしょう.
てか、配列使う必要性あんの?
31おねがいします!:02/07/27 19:44
ありがとうございます!!
かなり助かりました。ちょっと感動。。。
32Rina ◆tI333vNE :02/07/27 19:51
使わない方法教えて, 気になる.
使った方がコードの見通しがいいと思ったんだけど.
>>32
最大値の候補だけ保持しとくとか?
>>33
売上の最大の月が複数あったらどうすんだ ? 結局配列が必要だよ。
35Rina ◆tI333vNE :02/07/27 20:11
>>34
だよね…あせったよw
36デフォルトの名無しさん:02/07/27 20:13
>>35
脱げ
37Rina ◆tI333vNE :02/07/27 20:26
マジですか(汗
当方、ぶちゃいくなので止めといたほうがいいと思われ.
>>37
ブス専もいるんだよ。この世には。
39Rina ◆tI333vNE :02/07/27 20:30
ガクガクブルブルΣ((((゜Д゜)))ガクガクブルブル
>配列
Collections Framework を使えということではないか?
41Rina@Nethack ◆tI333vNE :02/07/27 20:41
…納得.
42Rina ◆tI333vNE :02/07/27 22:51
実は私が厨だというワナ
43おねがいします!:02/07/27 22:52
もう一つ。日付けを2つ記入して、その間の日数を書き出すプログラム(Nissuu.Java)を作りなさい。
という問題です。何度もごめんなさい。
実行例はこんなかんじらしい。
日付けを2つ記入してください。
何年? 2002
何月? 7
何日? 27
何年? 2003
何月? 7
何日? 27
日数は365日です。
その年はうるう年かどうかを考えなきゃいけないし。。。
何月は何日あるのかということは、
int month[]=new int[12];
month[0]=31; month[1]=28; month[2]=31; month[3]=30;
month[4]=31; month[5]=30; month[6]=31; month[7]=31;
month[8]=30; month[9]=31; month[10]=30; month[11]=31;
でたぶん配列を使うのかなー。
こうしておくとX月Y日が1月1日から数えて何日目かは、
days=0;
for(i=0; i< x-1; i++)days= days+month[i];
days=days+y-1;
2002年の4月1日と2002年の7月27日の間に何日あるかは、2002年の
4月1日が1月1日からP日あって、2002年の7月27日がQ日あるとすると
Q-Pで求まると書いてあります。
>>43
素直にtimeに頼りなさい。
45Rina ◆tI333vNE :02/07/27 23:01
今Windows起動しててJavaかけないんで
http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/util/Calendar.html
これで我慢してください。
46▽・w・▽:02/07/27 23:15
いつのまにか新しくなってる・・。
>>43
それだけ分かってれば書けるだろ?
何が分からないんだ?
48おね:02/07/27 23:52
閏年の時はどうすればいいかわからなかった(泣)
49Rina ◆tI333vNE :02/07/27 23:58
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
// うるう年
}
何故Winを起動しえいたらJavaが書けないのだ?
51Rina ◆tI333vNE :02/07/28 00:25
>>50
Windows版のSDKが入ってなかったり、デュアルブートだから
再起動が面倒だったり、Meadowの使い心地がイマイチだったり。
>>51
この程度のコードにコンパイル確認なんかいらんだろ。
53Rina ◆tI333vNE :02/07/28 00:28
メモ帳で打つのも嫌。
ごめんなさい、emacsマンセーなんです。
xyzzyを薦めてみる・・・
>>53
俺なんかココでお試しコード書くときは、このテキストエリアに
直書きするぞ(藁
56デフォルトの名無しさん:02/07/28 00:45
環境に優しい>>55のいるスレ
57Rina ◆tI333vNE :02/07/28 00:46
>>54
これいいね。五目並べまでついてるのは笑ったw

んじゃー早速コードを。

import java.util.*;

public class Nissuu {
public static void main(String[] args) {
hoge();
}

public abstract void hoge();
}

これを継承すれば問題ない。

・・・すんません、ネタです。ご飯食べたら書きますので
何卒ご容赦を。
58デフォルトの名無しさん:02/07/28 00:59
Cです。

int i;
if(&i) ;

この条件式が必ず真となることを証明せよ。


全然分かりません・・・
59デフォルトの名無しさん:02/07/28 01:03
>>58

・auto変数はスタックに確保される
・そのアドレスは当然ながら、NULL(0)ではない
if(&i)はif(&i!=0)と等価です。
0はpointerとしてはヌルポインタを表すため、&iがヌルポインタで
ないことを判定しているわけです。ヌルポインタはいかなるオブジェクトも
指し示さないポインタであることが保証されているためiというオブジェクト
を指す&iとは絶対に一致しません。よってif(&i)は真となります。
>>58

つーか、こんなのを課題に出す意図がちょっと不明。
「C言語」そのものを学ぶことにどういう必要性があるんだろう?
>>61
どういう授業の課題かにもよるんじゃない?
63Rina ◆tI333vNE :02/07/28 01:19
Athron1G,メモリ256での結果。
Java>gcc>.NET 71回
Java=gcc>.Net 6回
gcc>Java>.Net 23回

とりあえず100回やってみました。

じゃークライアントから電話掛かってきたのでお仕事いってきます。
…行きたくない。
64Rina ◆tI333vNE :02/07/28 01:21
誤爆しました、逝ってきます。
>>63
スレチガイ
>>1に長文書くな
このスレ立てた香具師は回線で首吊って氏ね
>>66
さっきまでいたけどお仕事に出かけていったよ
68デフォルトの名無しさん:02/07/28 03:16
強気な女(・∀・)イイ!!
>>1
ケコーンしてください。
66はRinaに構ってもらいたいんだね、きっと (・∀・)ニヤニヤ
まあ、ネカ(以下略
Rinaさんって女性なの?
じつは稲川亮二→R・inaとか?
>じつは稲川亮二→R・inaとか?
いやーん
73デフォルトの名無しさん:02/07/28 06:20
すいません私も丸書きさせてもらいます。本当に分かりません。
誰か助けてください。
「x円(x>=0)を1円玉、5円玉、10円玉、50円玉、100円玉、500円玉 
で両替する方が何通りあるかを調べるプログラムを作成せよ。」
0円を両替する方法は1通り、マイナスの金額を両替する方法は0通りにしろ
とのヒントがついています。どなたかよろしくお願いします。
言語は?
75デフォルトの名無しさん:02/07/28 06:22
すいません73、C言語です
500円から割っていって、その個数を1ずつ減らしていけば
いいんじゃない...?
7773:02/07/28 06:34
すいません、、、なんとか書いていただけないでしょうか。
ずうずうしいこと言って本当にすいません。
数式書いてよ。
そしたら、実装するよ。
79こんなんどう?:02/07/28 06:48
#include <stdio.h>


int ryogae(int x, int coin, int d)
{
if( coin <= 1 ) return 1;

int c = 0;

int max_i = x / coin;

int i;
for(i = 0; i <= max_i; ++i)
{
c += ryogae(x - coin * i, coin / d, 7 - d);
}

return c;
}


int ryogaesousuu(int x)
{
if( x <= 0 ) return 1;

return ryogae(x, 500, 5);
}


int main()
{
int x = 0;

scanf("%d", &x);

printf("%d\n", ryogaesousuu(x));

return 0;
}
8079:02/07/28 06:50
あ、だめっぽいすまん
8179:02/07/28 06:52
いや、あっているとおもう
82分かりやすさ優先:02/07/28 06:53
>>73
#include <stdio.h>

int exchange(int x){
int c=0,y1,y5,y10,y50,y100,y500;

if(c<0) return 0 ;

for(y500=0;y500<=x;y500+=500)
for(y100=0;y500+y100<=x;y100+=100)
for(y50=0;y500+y100+y50<=x;y50+=50)
for(y10=0;y500+y100+y50+y10<=x;y10+=10)
for(y5=0;y500+y100+y50+y10+y5<=x;y5+=5)
for(y1=0;y500+y100+y50+y10+y5+y1<=x;y1+=1)
if(y500+y100+y50+y10+y5+y1==x) c++;

return c ;
}

int main(){
int x;
printf("いくら?");scanf("%d",&x);
printf("%d通り\n",exchange(x)) ;
return 0 ;
}
#include <stdio.h>
#include <stdlib.h>

static int coins[] = { 1, 5, 10, 50, 100, 500 };
static int n_coins = sizeof(coins)/sizeof(coins[0]);

int countup( int x, int n ) {
if ( x == 0 ) return 1;
if ( x < 0 || n < 0 ) return 0;
return countup( x - coins[n], n ) + countup( x, n - 1 );
}

int main( int argc, char **argv ) {
int x, ans;
if ( argc != 2 )
return 1;
x = atoi( argv[1] );
if ( x < 0 )
ans = 0;
else
ans = countup( x, n_coins - 1 );
printf( "%d\n", ans );
return 0;
}
8479:02/07/28 06:59
いまさらながら、さっきの直した。
#include <stdio.h>

int ryogae(int x, int coin, int d)
{
if( coin <= 1 ) return 1;

int c = 0;

int max_i = x / coin;

int i;
for(i = 0; i <= max_i; ++i) c += ryogae(x - coin * i, coin / d, 7 - d);

return c;
}

int ryogaesousuu(int x) { if( x < 0 ) return 0; return ryogae(x, 500, 5); }

int main()
{
int x = 0;

scanf("%d", &x);

printf("%d\n", ryogaesousuu(x));

return 0;
}
forの6重ループ。
ここに直で書いてたら、もう出てたという罠。
8683:02/07/28 07:02
if ( x < 0 )
ans = 0;
else
これいらないやゴメン
8779:02/07/28 07:06
>他の回答者さんたち
テストがてら、各xに対する組み合わせ数でもはりませんか?
8883:02/07/28 07:10
あってるかな?
x = 10 => 4
x = 50 => 37
x = 100 => 159
x = 150 => 451
x = 500 => 19162
8979:02/07/28 07:13
>>88(>>83)
同じになりました!
9082:02/07/28 07:15
x=10 => 4
x=50 => 37
x=100 => 159
x=150 => 451
x=500 => 19162
9179:02/07/28 07:18
をを!いいかんじ。
ただ、>>73はどこにいったのか?
9282:02/07/28 07:19
しかしなんというか…、つっこみたくなる
> 7 - d
9379:02/07/28 07:19
>>92
だめっすか?
9483:02/07/28 07:21
(;´∀`)=3 よかった。ってSchemeで書いてあった見本をCに翻訳しただけなんだけど
x = 1000 => 248908
5000とか入れると止まっちゃうねえ。もっと速いアルゴリズムないのかな
9582:02/07/28 07:21
いや…、よく気づくね
9679:02/07/28 07:23
>>95
思いついたときはうれしかったっす。
再帰と7-dによる>>79と、6重ループの>>82では、
どっちが評価高いんでしょ。
cの宿題的には、>>79もありかもネ。
9879:02/07/28 07:27
速さは>>82が一番だろうね。
9982:02/07/28 07:33
いやいや>>82は一番遅い。

82を5重ループにすれば、
オーダーで言えば再帰にしろループにしろ
全てカウントするタイプだからどれも同じ程度
10082:02/07/28 07:36
と思ったら>>83もそのままだと>>82程度だった
10179:02/07/28 07:37
他人の宿題ながら、なんだか楽しかった。
10273:02/07/28 07:39
すいません73です。徹夜でこの問題考えていたもんでいつの間にか机につっぷしてました。
 
10373:02/07/28 07:44
みなさんこんな時間に本当にありがとう!!!
しかも私意識飛んじゃってて本当にすいませんでした。
10483:02/07/28 07:47
   ||
 ∧||∧
(  ⌒ ヽ 
 ∪  ノ 計ってみたらダントツで遅かった.......鬱氏
  ∪∪
二日酔いで昼過ぎに起きたら、
今日締め切りのレポートが完成して机の上に置いてあった。
という心境だな。
10679:02/07/28 07:56
わしも徹夜でしたので体力使い果たしました。
寝ます
10773:02/07/28 07:58
うっ、、、返す言葉もございません。
10882:02/07/28 07:59
速さ云々はたいした問題じゃないな
解析的に求まるし

おやすみ
10973:02/07/28 08:02
本当にありがとうです。
>>73
どうでもいいけど徹夜で考える前に google で調べてみたの?

"小銭の払い方 C"

で検索してみ。
>>110
かかるのか・・・?
112質問です:02/07/28 10:22
質問です。下のプログラムと同じ結果を表示するように、
グローバル変数を用いて書くのってどうやりますか?

#include<stdio.h>
int func(int *a,int *b)
{
*a-=3;
*b+=3;
return(*a+*b);
}
void main(void)
{
int a=5,b=5,c;

c=func(&a,&b);
printf("a:%d,b:%d,c:%d\n",a,b,c);
}
>>112
素直にポインタマスターしなさい。
114デフォルトの名無しさん:02/07/28 10:28
お聞きしたいことがあります。
流れ図というのは必ずしも最適なものではないということなのですが、何故なのでしょうか?
また、流れ図が最適でないのなら何を利用すればいいのでしょうか?
よろしくお願いします。
115デフォルトの名無しさん:02/07/28 10:43
>>112
#include<stdio.h>

int a=5,b=5,c;
int func(int *a,int *b)
{
*a-=3;
*b+=3;
return(*a+*b);
}
void main(void)
{
c=func(&a,&b);
printf("a:%d,b:%d,c:%d\n",a,b,c);
}
116 :02/07/28 10:44
>>112
#include <stdio.h>
int global;
int main() {
 puts("a:2,b:8,c:10");
 return 0;
}
117デフォルトの名無しさん:02/07/28 10:45
>>114
まずはその「最適」の意味を教えてくれ。
>>116
詰めが甘いな。>>112の main の返り血が
void になっているのに気が付いていたか?
119116:02/07/28 10:52
>>118
同じ結果が表示されることしか要求されていないはずだが?
>>119
同じ結果が表示される事を「保証した」文章(=規格)ってある?
121デフォルトの名無しさん:02/07/28 11:17
<2つの配列に含まれる共通の要素をプリントするプログラム>
配列aに10個のデータを入力しそれを大きい順番に並べ、その中に同じ値のものがあれば
消去して,空いたスペースに次の要素をシフトするという部分を関数するのがわかりません。
下のプログラムを完成させてやってください。お願いします。
#include<stdio.h>
#define SIZE 10
int main(void)
{
int a[SIZE],b[SIZE];
int i,j,work,k;

for(i=0;i<SIZE;i++)
{printf("a=");scanf("%d",&a[i]);}

for(k=0;k<SIZE;k++)
{printf("b=");scanf("%d",&b[k]);}

for(i=0;i<SIZE-1;i++)
{for(j=i+1;j<SIZE;j++)
{if(a[i]<a[j]){work=a[i];a[i]=a[j];a[j]=work;}}}

for(i=0;i<SIZE;i++)
{printf("%d ",a[i]);}

printf("\n");

for(k=0;k<SIZE;k++)
{printf("%d ",b[k]);}

printf("\n");

printf("共通の要素は");
for(i=0;i<SIZE;i++)
{for(k=0;k<SIZE;k++)
{if(a[i]==b[k])

{printf("%d ",a[i]);}}}}
>>83をループに改良してみた。
速度的にひけをとらないはず。
2000円札もへっちゃらだよう。
x = 10 => 4
x = 50 => 37
x = 100 => 159
x = 150 => 451
x = 500 => 19162
x = 1000 => 248908
x = 5000 => 285913936

int countup(int x, int *coin) {
int n = 0;
if (*coin == 1) return 1;
for (; x > 0; x -= *coin)
n += countup(x, coin+1);
return (x == 0) ? n+1 : n;
}

int ryogae(int x) {
int coins[] = {500, 100, 50, 10, 5, 1};

return countup(x, coins);
}
123デフォルトの名無しさん:02/07/28 11:43
i番目以降をシフト。
void shift(int i) {
for (; i < SIZE-1; i++)
a[i] = a[i+1];
a[i] = ...; /* <= 最後を埋める値。 */
}
124デフォルトの名無しさん:02/07/28 12:29
誰もいないの? >>121はこんなもんでどう?
#include <stdio.h>
#define SIZE 10
void input(char *s, int *p) {
int i = 0; for(;i<SIZE;i++) { printf(s); scanf("%d",&p[i]); } }
void sort(int *p) {
int i, j; for (i = 0; i < SIZE; i++) for (j = i+1; j < SIZE; j++)
if(p[i]<p[j]) {int work = p[i]; p[i]=p[j]; p[j]=work; } }
void display(int *p) {
int i = 0; for (; i < SIZE; i++) printf("%d ", p[i]); printf("\n"); }
void shift(int *p) {
int i = 1; for (; i < SIZE; i++) while (p[i-1] != p[i])
{ int j = i; for (; j < SIZE-1; j++) p[j] = p[j+1]; p[j] = 0;} }
void answer(int *p, int *q) {
int i, k; printf("共通の要素は"); for(i=0; i< SIZE; i++)
for (k=0; k< SIZE; k++) if (p[i] == q[k] && p[i] != 0)
printf("%d ", p[i]); }
int main(void) {
int a[SIZE],b[SIZE];
input("a=", a); input("b=", b);
sort(a); sort(b);
display(a); display(b);
shift(a); shift(b);
answer(a, b);
}
125デフォルトの名無しさん:02/07/28 12:34
>123
121のプログラムに入れ込んでもらえませんか?あほですんまそん。
>>125
宿題肩代わりスレではない。
127デフォルトの名無しさん:02/07/28 13:07
>>125
>>124
void shift(int *p) {
int i = 1; for (; i < SIZE; i++) while (p[i-1] != p[i])
{ int j = i; for (; j < SIZE-1; j++) p[j] = p[j+1]; p[j] = 0;} }
を使って shift(a); を置けば。
128127:02/07/28 13:14
void shift(int *p) {
int i = 1; for (; i < SIZE; i++) while (p[i-1] == p[i] && p[i] != 0)
{ int j = i; for (; j < SIZE-1; j++) p[j] = p[j+1]; p[j] = 0;} }
だな。
129121:02/07/28 13:17
>>124 どうもです。でもきちんと実行できませんでした。
>>126 そのとおりです。すみません。
>>127 おき方がわからないんです。
130127:02/07/28 13:26
shift はソートしたあとにしか動かないので
sort(a); shift(a); でないとダメ。
shift 直したら124は動いたよ。テストしなかったな。>>124

1 2 3 4 5 6 7 8 9 1
1 2 3 4 5 1 2 3 4 5
↑sort shift の前、入力したまんま
↓結果
9 8 7 6 5 4 3 2 1 0
5 4 3 2 1 0 0 0 0 0
共通の要素は5 4 3 2 1

これでいいんでしょう?
131127:02/07/28 13:33
関数の置き方がわからないのか?
使う前にmainの前に void shift(int *p) { .... } を置いて
main の中で shift(a); ってやればいいんだけど。
よく分からんので124を直したの書いておくよ。
#include <stdio.h>
#define SIZE 10
void input(char *s, int *p) {
int i = 0; for(;i<SIZE;i++) { printf(s); scanf("%d",&p[i]); } }
void sort(int *p) {
int i, j; for (i = 0; i < SIZE; i++) for (j = i+1; j < SIZE; j++)
if(p[i]<p[j]) {int work = p[i]; p[i]=p[j]; p[j]=work; } }
void display(int *p) {
int i = 0; for (; i < SIZE; i++) printf("%d ", p[i]); printf("\n"); }
void shift(int *p) {
int i = 1; for (; i < SIZE; i++) while (p[i-1] == p[i] && p[i] != 0)
{ int j = i; for (; j < SIZE-1; j++) p[j] = p[j+1]; p[j] = 0;} }
void answer(int *p, int *q) {
int i, k; printf("共通の要素は"); for(i=0; i< SIZE; i++)
for (k=0; k< SIZE; k++) if (p[i] == q[k] && p[i] != 0)
printf("%d ", p[i]); }
int main(void) {
int a[SIZE],b[SIZE];
input("a=", a); input("b=", b);
display(a); display(b);
sort(a); sort(b);
shift(a); shift(b);
display(a); display(b);
answer(a, b);
}
>>131
インデント付けろとはいわんが空行くらい入れてください・・・。
133121:02/07/28 13:34
>>130
 そうです!でも0はいりません。すみません、説明不足でした。
134127:02/07/28 13:55
>>133
うーん、この宿題は0が入力されたらどうするの?(0も有効なの?)
0を無視していいなら表示するときに飛ばせばいいと思うけど。
そうでなかったら、配列の長さを変数で保持して、shiftで減らすとか・・・。

>>132
上の修正ができたら、空行いれるよ。
つーか、文句は124に言ってくれ。
135121:02/07/28 14:04
>>134入力された0は有効です。
 例 1、3、5、0、7、5
        ↓
   7、5、3、1、0 
136127:02/07/28 14:16
できたよ。テストしてね。
1 0 3 4 2 1 6 3 0 2
0 5 2 1 6 4 7 1 0 0
6 4 3 2 1 0
7 6 5 4 2 1 0
共通の要素は6 4 2 1 0

#include <stdio.h>
#define SIZE 10

void input(char *s, int *p) {
int i = 0;

for(;i<SIZE;i++) {
printf(s);
scanf("%d",&p[i]);
}
}

void sort(int *p) {
int i, j;

for (i = 0; i < SIZE; i++)
for (j = i+1; j < SIZE; j++)
if(p[i]<p[j]) {
int work = p[i];
p[i]=p[j];
p[j]=work;
}
}

void display(int *p, int p_size) {
int i = 0;

for (; i < p_size; i++)
printf("%d ", p[i]);
printf("\n");
}
137127:02/07/28 14:16


void shift(int *p, int *p_size) {
int i = 1;

for (; i < *p_size; i++)
while (p[i-1] == p[i]) {
int j = i;
for (; j < SIZE-1; j++)
p[j] = p[j+1];
p[j] = 12346789; /* チェック用 */
--*p_size;
}
}

void answer(int *p, int p_size, int *q, int q_size) {
int i, k;

printf("共通の要素は");
for(i=0; i< p_size; i++)
for (k=0; k< q_size; k++)
if (p[i] == q[k])
printf("%d ", p[i]);
}

int main(void) {
int a[SIZE],b[SIZE];
int a_size = SIZE, b_size = SIZE;

input("a=", a); input("b=", b);
display(a, a_size); display(b, b_size);

sort(a); sort(b);
shift(a, &a_size); shift(b, &b_size);
display(a, a_size); display(b, b_size);

answer(a, a_size, b, b_size);

return 0;
}
138121:02/07/28 14:24
>>127 ありがとうございました!完璧です!
139127:02/07/28 14:27
137のshiftだと12345678 で全部入力されてると
動かないよなあ。でも直せん。
140デフォルトの名無しさん:02/07/28 14:32
C言語で任意の整数を定義するにはどうしたらいいのでしょうか?
141127:02/07/28 14:35
これでお茶をにごしとこう。
void shift(int *p, int *p_size) {
int i = 1, check = p[0] + 1;

for (; i < *p_size; i++)
while (p[i-1] == p[i]) {
int j = i;
for (; j < SIZE-1; j++)
p[j] = p[j+1];
p[j] = check; /* チェック用 */
--*p_size;
}
}
>>140
無理です。それは無限長のデータです。

>>140
とりあえずは文字列として表現するのが手っ取り早い。

char *add(char *a1, char *a2);

main(){add("123", "456");}

みたいな(中身を書くのは面倒臭いから勘弁。
また関数が返す値は関数内部で新規にメモリを
確保したとこに書く(形に実装したほうが手離れが良い?)から、
使用後は free するのをお忘れなく)。

それが嫌(速度・メモリ etc. の為)なら
その部分だけアセンブラで書くのが吉。
144140:02/07/28 15:13
>>142,>>143
レスどうもです
まだかなーりの初学者なのでアセンブラとかもよくわかりませんが
143を参考にやってみます
ありがとうございました
145デフォルトの名無しさん:02/07/28 16:21
原点を通る直線に関して線対称な位置に三角形を移動させるプログラムを作りたいんですけど
完成しません。どなたかお助けを!
(1)三角形の頂点の座標を入力させ、それらの値をa[3][2]に代入する。
(2)直線lがx軸となす角theta(=t)をたずね、それをラジアンに換算した値を変数phiに代入する。
(3)配列bは2×2の行列で頂点(x,y)は点(x',y')に移し、(2)で得られたphiから配列bの
   要素を求める。
   (ちなみにx'=xcos2t+ysin2t y'=xsin2t-ycos2t)
(4)配列a,bを用いて対称変換後の頂点の座標を計算し、結果を配列c[3][2]に代入する。
(5)配列aと配列cの要素をプリントする。
  #include <stdio.h>
#include <math.h>
void kan(float x[3][2],float y[2][2],float z[3][2])
#define pai 3.14
int main(void)
{
int i;
float a[3][2],b[2][2],c[3][2],theta,phi;

for(i=0;i<3;i++)
{
scanf("%d,%d",&a[i][0],&a[i][1]);
}

scanf("%d",&theta);

phi=(pai*theta)/180;

b[0][0]=cos(2*phi);
b[0][1]=sin(2*phi);
b[1][0]=sin(2*phi);
b[1][1]=-cos(2*phi);
kan(a,b,c);
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("%f",a[i][j]);
}
printf("/n");
}
void kan (float x[3][2],float y[2][2],float z[3][2])
{
int i;
for(i=0;i<3;i++)
{
z[i][0]=y[0][0]*x[i][0]+y[0][1]*x[i][1];
z[i][1]=y[1][0]*x[i][0]+y[1][1]*x[i][1];
}
}
146 ◆aCDPDEl2 :02/07/28 16:25
この問題は俺が一番初めに答えてみせる。
147 ◆aCDPDEl2 :02/07/28 17:42
誰かほかにやってる人いる?
>145
完成してるやん
あとはcを表示するだけちゃうの?
149 ◆aCDPDEl2 :02/07/28 18:04
#include <stdio.h>
#include <math.h>
#define pai 3.14

int main(void){
int i;
float a[2][3],b[2][2],c[2][3],theta,phi;
for(i=0;i<3;i++){
printf("%d個目の点を入力してください\n x = ",i+1);
scanf("%f",&a[i][0]);
printf(" y = ");
scanf("%f",&a[i][1]);
}
printf("θ = ");
scanf("%f",&theta);
phi=(pai*theta)/180.0;
b[0][0]=cos(2*phi);
b[0][1]=sin(2*phi);
b[1][0]=sin(2*phi);
b[1][1]=-cos(2*phi);

for(i=0;i<3;i++){
c[i][0]=b[0][0]*a[i][0]+b[0][1]*a[i][1];
c[i][1]=b[1][0]*a[i][0]+b[1][1]*a[i][1];
}

for(i=0;i<3;i++){
printf("(%10f,%10f)→(%10f,%10f)\n",a[i][0],a[i][1],c[i][0],c[i][1]);
}

return 0;
}
150148:02/07/28 18:06
あ、あとscanfの%d→%fかな
151 ◆aCDPDEl2 :02/07/28 18:10
で、>>149はbを使ってることになるのかな?
あと、△形かどうかの判定は無くて良し?
152 ◆aCDPDEl2 :02/07/28 18:40
次の宿題カモーン
153 ◆aCDPDEl2 :02/07/28 18:41
age
154デフォルトの名無しさん:02/07/28 18:54
C言語
2^50を求めて表示させなさい。
いつも通りprintfだけで終わるヨカソ
>154
貴様の処理系で sizeof long はいくつ?
もしあれば sizeof long long も。話はそれからじゃない?
157デフォルトの名無しさん:02/07/28 19:06
>>156
うちはWinXP、学校はNT。
bccで試したところ、longは4バイトです。
long longはエラーになったので多分ないです。
158 ◆aCDPDEl2 :02/07/28 19:08
>>154 この問題は俺が一番初めに解く。
159154:02/07/28 19:11
>>158
よろしくおながいします。

ご飯食べてくるのでしばらく消えます。
double ans = pow(2.0, 50.0);
じゃだめなの?
cout << 2i64*2*2*2*2*2*2*2*2*2*
    2*2*2*2*2*2*2*2*2*2*
    2*2*2*2*2*2*2*2*2*2*
    2*2*2*2*2*2*2*2*2*2*
    2*2*2*2*2*2*2*2*2*2 << endl;
162 ◆aCDPDEl2 :02/07/28 19:38
>>160 それでいいっぽい。
163デフォルトの名無しさん:02/07/28 19:48
8503589813642624になったけど
#include <stdio.h>
#include <math.h>

#define SIZE 10
#define VAC 100000
typedef int bignum[SIZE];

void regular_bignum(bignum n)
{
int i;
for (i=0; i < SIZE-1; i++)
if (n[i] >= VAC) {
n[i+1] += n[i] / VAC;
n[i] %= VAC;
}
}

void write_bignum(bignum n)
{
int i = SIZE-1;

regular_bignum(n);

for (; i>=0; i--)
if (n[i] != 0) {
printf("%u", n[i]);
i--;
break;
}
for (; i>=0; i--)
printf("%05u", n[i] % VAC);
printf("\n");
}

void make_bignum(bignum b, int n)
{
int i;

b[0] = n;
for (i=1; i < SIZE; i++)
b[i] = 0;
}

164163:02/07/28 19:48

void mul(bignum b, int n)
{
int i;

for (i=0; i<SIZE; i++) {
b[i] *= n;
regular_bignum(b);
}
}

int main(void)
{
int i;
bignum b;

make_bignum(b, 1);

for(i=0; i<50; i++)
mul(b, 2);

write_bignum(b);

return 0;
}
165 ◆aCDPDEl2 :02/07/28 19:55
1125899906842624じゃない?
166163:02/07/28 20:01
間違えた。
下ので
1125899906842624
になったす。
void mul(bignum b, int n)
{
int i;

for (i=0; i<SIZE; i++)
b[i] *= n;
regular_bignum(b);
}
sizeof long long == 8 な環境なので

#include <stdio.h>

int main()
{
printf("%lld\n", 1LL<<50);
}

をやったら 1125899906842624 となりますた。
関数電卓でやっても 1.125899e+15 です。

163 は下の方が一致してるよね。上位桁の扱いに問題がありそう。
うわ、書いてる間にちゃんと訂正されてた。鬱。
169 ◆aCDPDEl2 :02/07/28 20:46
次はまだか?
170デフォルトの名無しさん:02/07/28 21:09
>>149 遅レスすみません。やっと自分のミスがわかりました!ありがとうございました!
171デフォルトの名無しさん:02/07/28 21:27
<!--#exec cgi="counter.cgi"--> をもとに、画像の数字を使ったカウンターは
どう作ればいいんですか?
172デフォルトの名無しさん:02/07/28 21:29
星スタンプで宿題免除です。
↑ロリ発見
174デフォルトの名無しさん:02/07/28 21:53
解るヤシも同類。

モチロンオレモナー
175 ◆aCDPDEl2 :02/07/28 21:55
俺の分かる(Cの易しいやつ)宿題カモーン
176デフォルトの名無しさん:02/07/28 21:59
切羽詰ってます。助けてください!
3×3のマスの中にチェスのナイトが置かれている。
(1) 3×3の配列aを定義して、すべての要素を0に初期化。ナイトの位置は1で、空欄は0で配列に記録。
スクリーン上には、□で空欄を、★でナイトの現在位置を表示する。(ナイトの最初の位置はプログラマーが選択してよい)
(2) チェスのナイトは、将棋の桂馬と同じ動きをするが、前だけでなく左右や後ろにも桂馬飛びができる。
そこで、3×3の配列bとcを宣言して、それぞれに現在位置(i,j)から移動できるマスの番号を2桁の整数で入力する。
移動できるマスが(3,1)ならば31と入力する。(この問題では移動できるマスは常に2つなので配列bとcを使います。)
(3) 現在のナイトがいる配列bの要素を10で割った商と余りを利用して、移動できるマスを(i,j)の形でプリントする。
同様に、配列cの要素をプリントする。
(4) ユーザーからの入力を読み、上の(3)で求めた(i,j)のどちらかならばナイトを移動して、新しい状態をプリントする。
入力が-1,-1ならばプログラムを終了する。
(5) 上の(3)と(4)を繰りかえす。
条件:配列aを引数として、現在ナイトがいる場所をプリントする関数を作製すること。
177 ◆aCDPDEl2 :02/07/28 22:05
うっ!問題の意味がわからない。
178154:02/07/28 22:06
みなさまありがとうございます。

>>160
doubleでできるんですね。。。

>>163
いまいち理解できてませんが、ありがとうございます。
これからじっくり読みます。
>>176
で、どう助けろと??
180 ◆aCDPDEl2 :02/07/28 22:10
(2) チェスのナイトは、将棋の桂馬と同じ動きをするが、前だけでなく左右や後ろにも桂馬飛びができる。
そこで、3×3の配列bとcを宣言して、それぞれに現在位置(i,j)から移動できるマスの番号を2桁の整数で入力する。
移動できるマスが(3,1)ならば31と入力する。(この問題では移動できるマスは常に2つなので配列bとcを使います。)

ここの意味が分からん。
とりあえずナイトを真中に置いたら手詰まりだってことはわかった。
>>176
よし、助け船を出そう。

こう回答しとけ。
「設計自体が悪いので却下します」

それが角が立つので嫌だというならこういうのもあるぞ。
「一体貴方はプログラマを育成したいのですか?
それともキーパンチャーを育成したいのですか?」
どうでもいいけど、コード貼り付ける時
全角スペースで字下げしてくれないかなぁ…
読み辛いです
ダメならいいけどさ
184145:02/07/28 22:23
>>149 3個目の点の値を入力して実行すると値が変わるんですけどどうすればいいですか?
185 ◆aCDPDEl2 :02/07/28 22:24
paiの値をより正確にすればいいと思う。
186デフォルトの名無しさん:02/07/28 22:26
ナップサック問題です。「総重量が与えられた値以下という制約の中で、価値の和を最大にするように荷物を選択する」というものです。

問題1
荷物| a  b  c  d  e
――+――――――――――
重量| 4 5 2 1 6
価値|450 570 225 110 670


重量制限8
ってな感じです。


解けます?ほかのスレから持ってきたんだけど解答がでなくて…

ttp://pc3.2ch.net/test/read.cgi/tech/1027353004/
で、いくつかプログラムが出てるんですけど、いかがでしょうか?
こちらの方のほうがスキルありそうなので…
187デフォルトの名無しさん:02/07/28 22:30
マルチスレッドかマルチプロセスどちらかを使ってCでシェルソート作れ
って言われたんですがCでマルチスレッドってどうやるんですか?

調べてみたら、内のNTくんだとforkという関数?を
使えるらしいところまでは分かりました。

また、シェルソート自体のコードは検索して見つけたので
printfを使いながら力技で勉強中です。
>>180
こういう事だと思われ。
しかし、やる気が失せるぐらい(出題者の)センスが悪いな。

int a[3][3]={
1,0,0,
0,0,0,
0,0,0,
};

int b[3][3]={
12, 2,12,
20,-1, 0,
21, 0,10,
};
int c[3][3]={
21,22, 1,
22,-1, 2,
10,20, 1,
};
すごいと思われるjava appletを作って!
190 ◆aCDPDEl2 :02/07/28 22:38
>>188 なるほど。
191デフォルトの名無しさん:02/07/28 22:38
>>189
それが宿題か?
>>191 いえす。
>>186
キーワード「線形計画法」でいくらでもでてくるYO!!
http://lecture.ecc.u-tokyo.ac.jp/~okatu/planning/30lp.html
とか
194デフォルトの名無しさん:02/07/28 22:56
>>193
あれ? ナップザック問題って「線形計画法」で解くんだっけ?
>>194
動的計画法では?
動的
197195:02/07/28 22:58
かぶった
しかも、レス付け間違えた
>>186

#include <stdio.h>

#define LIMIT 8
#define N 5
#define MIN_SIZE 1

void main(void)
{
 static struct body
 {
  char *name;
  int size;
  long price;
 } a[]={{"a",4,450},{"b",5,570},{"c",2,225},
    {"d",1,110},{"e",6,670}};

 long newvalue,value[LIMIT+1];
 int item[LIMIT+1],i,s,p;

 for(s = 0;s <= LIMIT;s++)
 {
  value[s]=0;
 }

 for(i = 0;i < N;i++)
 {
  for(s = a[i].size;s <= LIMIT;s++)
  {
   p = s - a[i].size;
   newvalue = value[p] + a[i].price;
   if(newvalue > value[s])
   {
    value[s] = newvalue;
    item[s]=i;
   }
  }
 }

 printf(" 品 目 重量 価格\n");
 for(s = LIMIT,p=0;s >= MIN_SIZE;s-=a[item[s]].size)
 {
  printf("%10s %5d %5ld\n",a[item[s]].name,a[item[s]].size,a[item[s]].price);
  p += a[item[s]].size;
 }
 printf(" 合 計 %5d %5ld\n",p,value[LIMIT]);
}

参考文献:改訂 C言語によるはじめてのアルゴリズム入門(河西朝雄 著,技術評論社)
199 ◆aCDPDEl2 :02/07/28 23:14
#include<stdio.h>

int main(void){
int i,j,x,y,next;

int a[3][3]={{1,0,0},
{0,0,0},
{0,0,0}};
int b[3][3]={{12,20,10},
{2,-1, 0},
{2, 0, 1}};
int c[3][3]={{21,22,21},
{22,-1,20},
{12, 2,10}};

while(1){
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[i][j]==0){ printf("□"); }
else{
x=i;
y=j;
printf("★");}
}
printf("\n");
}

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

for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(a[i][j]==1) printf("(%d,%d)",c[i][j]/10,c[i][j]%10);
}
}
printf("\n next : ");

scanf("%d",&next);

if(next==b[x][y]){
a[x][y]=0;
a[b[x][y]/10][b[x][y]%10]=1;
}else if(next==c[x][y]){
a[x][y]=0;
a[c[x][y]/10][c[x][y]%10]=1;
}else if(next==-1)break;
}
return 0;
}
200デフォルトの名無しさん:02/07/28 23:16
長いですがお願いします。どうしてもわかりません。助けてください。
データが0と1しか含まないと仮定して以下の方法で圧縮されたデータを解凍
するプログラムを作成してください。
圧縮前 0 0 0 1 1 1 0 0 0 0
圧縮後 3 , 3 , 4 \n

1、読んだ数字の数を数えるカウンターの値を1に初期化して、文字を読む前
  に整数型の変数numを0に初期化します。
2、データは3,3,4のようにカンマ区切りでファイルに記憶されており、左端
  は必ず0から始まっているいるものとしています。従って入力データの種類
  は以下の3種類です。
  (1)1から9までの数字
  (2)カンマ
  (3)行末記号。EOLともよばれ、\nのことです。
  そこで、getcharコマンドで、入力データの1行目を1文字ずつ読み取ります。
  読んだ文字がカンマか行末記号で無い間は、numを10倍した値に、呼んだ文字を
  数字に変更して加えます。(読んだ文字を数字に変更するには、文字の'0'を引きます。)
   num=0×10+5(numの値は5になります)
   num=5×10+9(numに値は59になります)
3、読んだ数字を配列aに代入し、カウンターの値に1を加えます。
4、読んだ文字が行末記号になるまで2から3までを繰り返します。
5、配列aの要素の値だけ、0や1を交互にプリントとします。データが入っている配列の要素数
  は、カウンターで数えてあります。
6、上の方法を繰り返して後19行処理しています。(入力データファイルには20行のデータが
  あります。)
7、配列aを引数といて、0もたは1の数をプリントする関数を作成してください。
8、サンプルデータsample3を入力としてプログラムを実行してください。

サンプルデータ
62,
35,4,23
30,14,18
32,2,6,2,20
33,2,4,2,21
34,2,2,2,22
34,6,12,4,6
1,5,26,4,2,4,8,2,3,2,5
6,4,20,5,4,5,5,2,5,2,4
11,3,14,4,10,4,2,2,7,2,3
13,5,9,3,14,5,9,2,2
16,4,5,3,18,3,10,2,1
18,9,20,4,8,2,1
20,6,22,4,6,2,2
22,4,22,4,3,3,4
23,4,20,8,7
25,3,18,3,13
28,4,10,4,16
32,10,20
62
    
201すごい手抜き:02/07/28 23:25
>>189
public class sugoi extends java.applet.Applet {}
202デフォルトの名無しさん:02/07/28 23:29
>>185 それでもなりませんでした。たとえばx=5,y=6と入れれば(5,6)と出るはずなんですが
(0.50・・,0.86・・)となるんですが・・・
203 ◆aCDPDEl2 :02/07/28 23:35
>>202 θの値は?
204デフォルトの名無しさん:02/07/28 23:41
>>203 30度です。
205 ◆aCDPDEl2 :02/07/28 23:45
θ=30なら、(5,6)→(7.696857, 1.326041)になるけど?
sin30=0.5
cos30=0.86・・・
207 ◆aCDPDEl2 :02/07/28 23:49
>>206 何を言ってるのかさっぱりわからん。

何を求めたいんだ?(5、6)という点がθ=30のときに
どこへ移るかを求めるんじゃないの?
208デフォルトの名無しさん:02/07/28 23:55
>>205それが3つめの点のときだけx=5,y=6といれても(5,6)→(7.69,1.32)とならずに
(0.5・・,0.86・・)→(1.000,0.000)になるんです。
209デフォルトの名無しさん:02/07/28 23:58
int data[MAX_DATA];
int data_n;
int f=1;

while(data_n){
  for(i=0;i<data[data_n];i++){
    printf("%d ",f);
  }
  data_n--;
  f ^= 1;
}
210 ◆aCDPDEl2 :02/07/28 23:58
(0.5・・,0.86・・)→(1.000,0.000)でいいんじゃない?
211デフォルトの名無しさん:02/07/29 00:03
>>210そうなんですか?しばらく考えてみます。
>>211
float a[2][3],b[2][2],c[2][3],theta,phi;

float a[3][2],b[2][2],c[3][2],theta,phi;
213デフォルトの名無しさん:02/07/29 00:20
>>212どうもです!次々とすみませんが、配列a,b,cを引数として、配列cに
   データを代入する関数を使うにはどうすればいいんですか?
214 ◆aCDPDEl2 :02/07/29 00:28
void asdf(float a[2][3], float b[2][2] , float c[2][3]){
int i;
for(i=0;i<3;i++){
c[i][0]=b[0][0]*a[i][0]+b[0][1]*a[i][1];
c[i][1]=b[1][0]*a[i][0]+b[1][1]*a[i][1];
}
}

asdf(a,b,c);
>209
f~=1が渋めだけどdata_nの初期化が抜けてるやん 70点
宿題のソースはここに置いてね
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433

スレ立ててみました。良かったら使ってくださいませ。

かなり長いソースでもOK。全角スペースで再インデントする必要もなし!
添付ファイルもできちゃうゾ!
217デフォルトの名無しさん:02/07/29 00:40
198さんのとおりにやったんだけど、うまくいきませんでした。
んで自分でちょっといじくったらセグメンテーション違反って結果が。。。

初心者で申し訳ないのですが、一体どうすればいいのでしょうか?
>>214
>>149もそうだけど、なしてa[2][3]にするの?
219 ◆aCDPDEl2 :02/07/29 00:52
>>218 別に[3][2]でもいいけど
行列を考えたときそのほうがわかりやすかったからでふ。
220 ◆aCDPDEl2 :02/07/29 00:53
なんかおかしぃ
221213:02/07/29 00:54
>>214関数の入れ方がわからないんですけど・・・。すみません。
222 ◆aCDPDEl2 :02/07/29 00:55
[3][2]のほうがわかりやすいね。
223 ◆aCDPDEl2 :02/07/29 01:07
#include <stdio.h>
#include <math.h>
#define pai 3.14

void asdf(float a[3][2], float b[2][2] , float c[3][2]){
int i;
for(i=0;i<3;i++){
c[i][0]=b[0][0]*a[i][0]+b[0][1]*a[i][1];
c[i][1]=b[1][0]*a[i][0]+b[1][1]*a[i][1];
}
}

int main(void){
int i;
float a[3][2],b[2][2],c[3][2],theta,phi;
for(i=0;i<3;i++){
printf("%d個目の点を入力してください\n x = ",i+1);
scanf("%f",&a[i][0]);
printf(" y = ");
scanf("%f",&a[i][1]);
}
printf("θ = ");
scanf("%f",&theta);
phi=(pai*theta)/180.0;
b[0][0]=cos(2*phi);
b[0][1]=sin(2*phi);
b[1][0]=sin(2*phi);
b[1][1]=-cos(2*phi);

/* for(i=0;i<3;i++){
c[i][0]=b[0][0]*a[i][0]+b[0][1]*a[i][1];
c[i][1]=b[1][0]*a[i][0]+b[1][1]*a[i][1];
}*/


asdf(a,b,c);
for(i=0;i<3;i++){
printf("(%10f,%10f)→(%10f,%10f)\n",a[i][0],a[i][1],c[i][0],c[i][1]);
}

return 0;
}

これであってるかな?
224213:02/07/29 01:13
>>223ありがとうございます!助かりました!
225グチ:02/07/29 02:02
C使いはじめてから十数年、全部構造体の配列でやってるなぁ。
だから、多次元配列なんて一度も使ったこと無いんだ。

だいたい、ミスってても分かりづらいからバグの温床になるんだよな。
経験上、他人のソースをレビューしてて真っ先に注目するのってソレ。
一番ありがちなのは次元を間違えて別領域書き潰し。
スタックぶっ潰してるから、関数から戻ったときに訳のわからんアクセス
違反でアボート。

Cではヤメにしない?多次元配列。
移植性損なわずに、ベクトル演算できるわけでもなし。
少なくとも宿題レベルで必要無いと言い切りたい。
226225 改行規制くらった:02/07/29 02:02

例えば >>223 のソースならこんな風にさ。

#include <stdio.h>
#include <math.h>
#define pai 3.14

typedef struct {
float x;
float y;
} point;

typedef struct {
float a00,a01,a10,a11;
} matrix;

void asdf(point pnt[3], matrix mat , point res[3]){
int i;
for(i=0;i<3;i++){
res[i].x = mat.a00*pnt[i].x+mat.a01*pnt[i].y;
res[i].y = mat.a10*pnt[i].x+mat.a11*pnt[i].y;
}
}

int main(void){
int i;
float theta,phi;
matrix mat;
point pnt[3];
point res[3];
for(i=0;i<3;i++){
printf("%d個目の点を入力してください\n x = ",i+1);
scanf("%f",&pnt[i].x);
printf(" y = ");
scanf("%f",&pnt[i].y);
}
printf("θ = ");
scanf("%f",&theta);
phi=(pai*theta)/180.0;
mat.a00 = cos(2*phi);
mat.a01 = sin(2*phi);
mat.a10 = sin(2*phi);
mat.a11 = -cos(2*phi);

asdf(pnt,mat,res);
for(i=0;i<3;i++){
printf("(%10f,%10f)→(%10f,%10f)\n",
pnt[i].x, pnt[i].y, res[i].x, res[i].y );
}

return 0;
}
あ、宿題の元テキスト >>145 見たら配列使うような指示が・・・
>>226

>>216 に貼れば改行制限がゆるいし、インデントも保持されるよ。
2次元くらいなら問題ないと思うけどね。図にもできるし。
3次元以上は使わないけど。
まあ、実際のメモリを考えると2次元もおかしいんだけど。
230200:02/07/29 02:17
200ですがどなたかおねがいします・・・
231デフォルトの名無しさん:02/07/29 02:18
>>226
俺がその問題解いてたときは
#define SIZE 2
typedef float point[SIZE];
typedef float matrix[SIZE][SIZE];
ってして、point関係の関数作ってあまり考えなくても
いいようにしてたよ。
232231:02/07/29 02:19
>>200 いまからやってみるよ。
233名無しさん@XEmacs:02/07/29 02:24
>200

君にはPythonで十分だ。

foo.py
----------------------------------------------
import sys
import string

for line in sys.stdin.readlines():
list = string.split(string.strip( line ) , ',' )
even = 1
for data in list:
even += 1
sys.stdout.write( chr( ord('0' ) + even % 2 ) * int(data) )
sys.stdout.write( '\n' )
-----------------------------------------------
data.txt
62
35,4,23
30,14,18
32,2,6,2,20
33,2,4,2,21
34,2,2,2,22
34,6,12,4,6
1,5,26,4,2,4,8,2,3,2,5
6,4,20,5,4,5,5,2,5,2,4
11,3,14,4,10,4,2,2,7,2,3
13,5,9,3,14,5,9,2,2
16,4,5,3,18,3,10,2,1
18,9,20,4,8,2,1
20,6,22,4,6,2,2
22,4,22,4,3,3,4
23,4,20,8,7
25,3,18,3,13
28,4,10,4,16
32,10,20
62

-------------------------------
python foo.py < data.txt
>>200
じゃC++
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <boost/tokenizer.hpp>
#include <boost/lexical_cast.hpp>

main(){
std::string s ;
while(std::getline(std::cin,s,'\n'),std::cin){
bool f=false ;
typedef boost::tokenizer<boost::char_separator<char> > tokenizer ;
boost::char_separator<char> sep(",") ;
tokenizer tok(s,sep) ;
for(tokenizer::iterator ti=tok.begin();ti!=tok.end();ti++,f=!f) try {
std::fill_n(std::ostream_iterator<bool>(std::cout),boost::lexical_cast<int>(*ti),f) ;
} catch(...) {}
std::cout << std::endl ;
}
}
235200:02/07/29 03:05
>>233 >>234 Cは・・・?
>200
じゃあ、Ruby

while line = gets
  i = 1
  puts line.split(',').map{|n| i *= -1; (i == 1 ? '1' : '0') * n.to_i}.join
end
237231:02/07/29 03:11
やっとできた。ループがカッコ悪いのでだれか直して。
#include <stdio.h>
#define SIZE 10000

int a[SIZE];
int counter = 1;

void write_a(int *a)
{
int i, j, x=0;

for (i=1; i<counter; i++) {
for (j=a[i]; j--;)
printf("%d ", x);
x = (x) ? 0 : 1;
}
printf("\n");
}

int main(void)
{
int ch;
int num;

do {
counter = 1;
do {
num = 0;
while ((ch = getchar()) != ',' && ch != '\n' && ch != EOF) {
num *= 10;
num += ch - '0';
}
a[counter++] = num;
} while (ch != '\n' && ch != EOF);
write_a(a);
} while (ch != EOF);

return 0;
}
>>200
#include <stdio.h>
#include <ctype.h>

int main(){
int c, prev=0 ;
int flag=0 ;
while(c=getchar(),c!=EOF){
if(isdigit(c))
prev = prev*10+(c-'0') ;
else if(c==',' || c=='\n') {
while(prev--) printf("%d",flag) ;
prev = 0 ;
flag = !flag ;

if(c=='\n') {
printf("\n") ;
flag = 0 ;
}
}
}
return 0 ;
}
239238:02/07/29 03:28
しまった配列を使えというのか
240 :02/07/29 03:30
>>200
じゃ、awk。

BEGIN{FS=","}
{
for (i = 1; i <= NF; i++)
for (j = 0; j < $i; j++)
printf("%d", 1 - (i % 2));
print "";
}
>>237
こんなところか。ただ、ファイルの末尾が\nでないと最終行が出力されない既知のバグあり(w
#include <stdio.h> 
#define SIZE 10000 

static int a[SIZE]; 

void write_a(int *a, int counter) 

  int i, j, x=0; 

  for (i=0; i < counter; i++) { 
    //    printf("%d ", a[i]); 
    for (j = 0; j < a[i]; j++)
      printf("%d", x); 
    x = (x) ? 0 : 1; 
  } 
  printf("\n"); 
}

int main(void) 

  int ch; 
  int num = 0; 
  int counter = 0; 

  while ((ch = getchar()) != EOF) {
    switch (ch) {
    case ',':
      a[counter++] = num;
      num = 0;
      break;
    case '\n':
      a[counter++] = num;
      write_a(a, counter);
      counter = 0;
      num = 0;
      break;
    default:
      num *= 10; 
      num += ch - '0';
      break;
    }
  }
  return 0; 
242名無しさん@XEmacs:02/07/29 03:39
んじゃ pike

int main()
{
while(string s=Stdio.stdin.gets()){
string x;
int count = 1;
foreach( s/",",x ){
count++;
write( (string)(count%2) * (int)x );
}
write("\n");
}
}

243241:02/07/29 03:39
つか、もう全然違うものになってしまったな(w
しかもバグ取りに使ったprintf残ってるし(恥
244Rina ◆tI333vNE :02/07/29 04:06
夜中に目が覚めてチラっと見にきたらレスの数がが増えまくってる…。
おそるべし2ch…。
245241:02/07/29 04:08
>>244
ちみも>>200の問題をC以外で解きなされ(w
java applet つくって。
>>176

#include <stdio.h>

int a[3][3]={{1,0,0},
{0,0,0},
{0,0,0}};
int b[3][3]={{12,20,10},
{2,-1, 0},
{2, 0, 1}};
int c[3][3]={{21,22,21},
{22,-1,20},
{12, 2,10}};

void print_moveto(int b[3][3], int x, int y)
{
printf("(%d,%d)", b[x][y] / 10, b[x][y] % 10);
}

void print_knight(void)
{
int i, j, x=3, y=3;

for (i=0; i<3; i++) {
for (j=0; j<3; j++)
if (a[i][j] == 1) {
x = i; y = j;
printf("★");
} else {
printf("□");
}
printf("\n");
}

printf("move to ");
print_moveto(b, x, y);
printf(" or ");
print_moveto(c, x, y);
printf(".\n");
}
248246:02/07/29 05:55

int check(int b[3][3], int x, int y)
{
int i, j;

for (i=0; i<3; i++)
for(j=0; j<3; j++)
if (a[i][j] == 1) {
return (b[i][j] / 10 == x) && (b[i][j] % 10 == y);
}

return 0;
}

void move(int x, int y)
{
int i, j;

for (i=0; i<3; i++)
for(j=0; j<3; j++)
a[i][j] = 0;

a[x][y] = 1;
}

int moveto(void)
{
int x, y;

scanf("%d,%d", &x, &y);

if (x == -1 && y == -1)
return 0;

if (check(b, x, y)) { move(x, y); return 1;}
if (check(c, x, y)) { move(x, y); return 1;}

printf("cannot move to (%d,%d).\n", x, y);

return 1;
}

int main(void)
{
do print_knight();
while (moveto());

return 0;
}
249248=247:02/07/29 05:58
間違えた。
250Rina ◆tI333vNE :02/07/29 06:52
import java.io.*;
import java.util.*;

public class Main {
public static void main(String[] args)
throws Exception {
BufferedReader in = null;
{
FileReader fr = new FileReader(args[0]);
in = new BufferedReader(fr);
}

String line;
while( (line = in.readLine()) != null ) {
int c = 0;

StringTokenizer token = new StringTokenizer(line, ",");
while( token.hasMoreTokens() ) {
String tmp = token.nextToken();
int n = Integer.parseInt(tmp);
for (int i = 0 ; i < n ; i++) {
System.out.print( (c % 2) );
}

c++;
}
System.out.println();
}

}
}

これでいいの?
最早Javaとは呼べないソース…w
実行は
  $ java Main sample
でどうぞ。
>>246
>>201 なんかどだ?
252 ◆JAPH9PWA :02/07/29 11:29
Perlはまだだよね。
#!perl
$\ = "\n";
while(<>)
{
my $i = 1;
print join '', map { $i ^= 1; ($i ? 1 : 0) x $_ } split /,/;
}
253デフォルトの名無しさん:02/07/29 16:01
すみません。課題なのですが全くわかりません。誰か教えてください。お願いします。
データが0と1しか含まないと仮定して、以下の方法でプログラムを作成し
てください。
getcharコマンドで、入力データの1行目を読み取り、配列aに代入(1行に38文字あるが、最後の1文字は改行文字と仮定)してカウンターの値を1に初期化する。<最初に読んだ文字(a[0]の値)が続いている間は、カウンタ
ーの値輪1ずつ増やして読んだ文字が今までと違った(文字の連続が終わっ
た)時点でカウンターの値をプリントして1の場合にはそのまま数字をプリ
ントして0の場合には、符号をマイナスにしてプリントする。カウンター
の値を1に再初期化>して<>の間を繰り返す。2行目以降を同時に処理し
てください。
条 件:・配列aを引数として、0または1の数をプリントする関数を作成してください。
・サンプルデータは
 0000000000000000111100000000000000000
 0000000000011111111111111000000000000
 0000000000001100000000110000000000000
 0000000000000111000011100000000000000
 0000000000000011100111000000000000000
 0000000000000011100111000000000000000
 0000000000000001111110000000000000000
 0000000000000001111110000000000000000
 0000000000000111111111100000000000000
 0000000000011111000011111000000000000
 0000000001111000000000011110000000000
 0000000011100000000000000111000000000
 0000001110000000000000000001110000000
 0000111100000000000000000000111100000
 0001111000000000000000000000011110000
 0001111000000000000000000000011110000
 0000111100000000000000000000111100000
 0000001110000000000000000001110000000
 0000000001111111111111111111000000000
 0000000000000111111111100000000000000
 0000000000000000000000000000000000000

#include<stdio.h>
int main(void)
{
int i, j ,counter;
int a[20][38];
char ch;

for(i=0; i<21; i++){
for(j=0; j<38; j++){
a[i][j]=getchar();
}}
for(i=0; i<21; i++){
for(j=0; j<38; j++){
printf("%c",a[i][j]);
}}}

このプログラムの後に1行目は0が16個、1が4個、0が17個であるので16,4,17というように表示したいのですがで
きません。
16,4,17
11,14,12
:
:
:
:
と表示したいのです。どうぞお願いします。
254241:02/07/29 16:09
>>253
貴様、>>200だな(w
にしても「getcharコマンド」てのはなんかイヤな呼び方だなあ。
getchar関数か(実装にもよるが)getcharマクロと呼んでほしい。
出題者のセンス悪いぞ。

とかいってる間に解いてみようかな。

あ、そうそう、

for(i=0; i<21; i++){
for(j=0; j<38; j++){
a[i][j]=getchar();
}}

なんかの部分、最後の}}はよしとけ。ひとつずつ改行しとけ。
あとインデントちゃんとやってる?
つまり、

for(i=0; i<21; i++){
  for(j=0; j<38; j++){
    a[i][j]=getchar();
  }
}

みたいに書けってこと。
255254:02/07/29 16:10
う。名前が残ってた。
256200:02/07/29 16:14
>>237>>238>>241遅レスすみません。きちんと解いてくれた方ありがとうございました。
微妙に嫌がらせしてくれた方、微妙におもしろかったです!
257200:02/07/29 16:22
>>254どうも!241さん!(w
   そうですね。今度からそうします!
   この問題もよろしくおねがいします!
 
186のナップサック問題を未だに悩んでるんですが、198さんのプログラムを参考にいじってたらわけわかんなくなりました…

実行してもセグメンテーション違反と表示されてしまいます。
↓僕がいじったものを修正してくださいませんか?

#include <stdio.h>

#define LIMIT 8
#define NUMBER 5
#define MIN_SIZE 1

struct nimotu
 {
  char *name;
  int size;
  int price;
 } data[]={{"a",4,450},{"b",5,570},{"c",2,225},
    {"d",1,110},{"e",6,670}};

int main(void)
 int newvalue,value[LIMIT+1];
 int item[LIMIT+1],i,s,p;

 for(s = 0;s <= LIMIT;s++)
 {
  value[s]=0;
 }

 for(i = 0;i < N;i++)
 {
  for(s = data[i].size;s <= LIMIT;s++)
  {
   p = s - data[i].size;
   newvalue = value[p] + data[i].price;
   if(newvalue > value[s])
   {
    value[s] = newvalue;
    item[s]=i;
   }
  }
 }

 printf(" 品 目 重量 価格\n");
 for(s = LIMIT,p=0;s >= MIN_SIZE;s-=data[item[s]].size)
 {
  printf("%10s %5d %5d\n",data[item[s]].name,data[item[s]].size,data[item[s]].price);
  p += data[item[s]].size;
 }
 printf(" 合 計 %5d %5d\n",p,value[LIMIT]);
}

できればコメントつけていただくとうれしいのですが…
259254:02/07/29 16:29
>>253
とりあえずRubyで。

while line = gets
  puts line.scan(/1+|0+/).map{|s| s.length}.join(',')
end

次Cいくから待ってろ(w
260254:02/07/29 16:38
>>253
えーと、問題を見ると、配列aは
char a[38];
と定義するように見えるんだけど違うのかな。

Cのコードは問題に含まれてる? それとも君が書いた?
261200:02/07/29 16:49
>>254僕が書きました!
262254:02/07/29 16:53
>>261
なるほど。じゃあこれでいいのかな。
サンプルデータの一行目は
0000000000000000111100000000000000000
になってるけど、これは
-16,4,-17,
と出力したらいいんだよね。問題にはそうしろと書いてあるように読める。
#include <stdio.h>

static void print_a(const char *a, size_t size)
{
  char state = a[0];
  int i, count = 1;

  for (i = 1; i < size; i++) {
    if (a[i] != state) {
      if (state == '0') {
        count = -count;
      }
      printf("%d,", count);
      state = a[i];
      count = 1;
    }
    else {
      count++;
    }
  }
  printf("\n");
}

int main(int argc, char * argv[])
{
  char a[38];
  int i = 0, ch;

  while ((ch = getchar()) != EOF) {
    if (ch == '\n') {
      print_a(a, i);
      i = 0;
    }
    else {
      a[i++] = ch;
    }
  }
  if (i) {
    print_a(a, i);
  }
  return 0;
}
>>258
まずそのままではコンパイルすら通らなかったぞ

int main(void) のあとに { 追加
for(i = 0;i < N;i++) の N を NUMBER に変更

したら、普通に動いたが?以下出力

品 目 重量 価格
d 1 110
c 2 225
b 5 570
合 計 8 905
264200:02/07/29 17:18
>>254
ホントにありがとうございました。
265258:02/07/29 17:20
263さん。指摘どおりに修正しました。が!やはりセグメンテーション違反とでます…

#include <stdio.h>

#define LIMIT 8
#define NUMBER 5
#define MIN_SIZE 1

struct nimotu
 {
  char *name;
  int size;
  int price;
 } data[]={{"a",4,450},{"b",5,570},{"c",2,225},
    {"d",1,110},{"e",6,670}};

int main(void)
 {
int newvalue,value[LIMIT+1];
 int item[LIMIT+1],i,s,p;

 for(s = 0;s <= LIMIT;s++)
 {
  value[s]=0;
 }

 for(i = 0;i < NUMBER;i++)
 {
  for(s = data[i].size;s <= LIMIT;s++)
  {
   p = s - data[i].size;
   newvalue = value[p] + data[i].price;
   if(newvalue > value[s])
   {
    value[s] = newvalue;
    item[s]=i;
   }
  }
 }

 printf(" 品 目 重量 価格\n");
 for(s = LIMIT,p=0;s >= MIN_SIZE;s-=data[item[s]].size)
 {
  printf("%10s %5d %5d\n",data[item[s]].name,data[item[s]].size,data[item[s]].price);
  p += data[item[s]].size;
 }
 printf(" 合 計 %5d %5d\n",p,value[LIMIT]);
}


これに応じたコンパイルの仕方というのがあるのでしょうか?
gcc -oでやっているのですが、おかしいですか?
↑ちなみに意味もわかっていないものなので…
>>265
オレんとこでもちゃんと動いたけどな。
コンパイルの手順と実行結果を省略せずに貼ってみ。
つか、coreができたなら、gdbでも動かして
自分でデバグしろよ。
268258:02/07/29 17:43
266>>
ほんと素人ですいません…

コンパイルはgcc -o test test.cとやって別にエラーも出てきません。

で、実行結果は

品 目 重量 価格
    d 1 110
    c 2 225
セグメンテーション違反です

と表示されるんです。
>>268
こっちでも試してみたけど、違反は起きないなあ。
270デフォルトの名無しさん:02/07/29 17:48
MDIのアプリケーションなんかで(ワードとか)、
複数枚のウィンドウを表示してる状態でそのウィンドウを閉じると
その前にアクティブだったウィンドウにフォーカスが映りますよね。

あのように、その前にアクティブだったウィンドウのハンドル
って、どうやってとれば良いんでしょうか?
よろしくお願いします。<(__)>
271258:02/07/29 17:51
269さんありがとうございます。
でもやっぱり動かないんですよねぇ。

いったい何がいけないんだろう?
もう少しいろいろがんばってみます!
272デフォルトの名無しさん:02/07/29 17:54
全角スペースは半角に変えた?

#define LIMIT 8
#define NUMBER 5
#define MIN_SIZE 1

gcc -Wall -o test test.c
やってみて。
273258:02/07/29 18:00
272さん
それでコンパイルしてみたら

test.c:In function 'main':
test.c:warning:control reaches end of non-void function

と出ます。
>>272
そしたらコンパイル通らないだろ。
275272:02/07/29 18:02
>>273
それはmainの最後にreturn 0; をいれればいいだけ。
276258:02/07/29 18:07
return0;もつけて、実行するとやはりセグメンテーション違反って出ます(鬱)

こういう場合って書いてるプログラムのどこかがみなさんとちがう箇所とかがあるってことなんでしょうか?
スペースの空け方に問題があるとか…?
gcc -ggdb -g3 -o test test.c でコンパイル、
gdb test でデバッガから
runしてみ。
SEGVで止まったら
p s
p item
278272:02/07/29 18:21
全角スペースとったののせとくよ。
bccでは動いたけどなあ。
#include <stdio.h>

#define LIMIT 8
#define NUMBER 5
#define MIN_SIZE 1

struct nimotu
{
char *name;
int size;
int price;
} data[]={{"a",4,450},{"b",5,570},{"c",2,225},
{"d",1,110},{"e",6,670}};

int main(void)
{
int newvalue,value[LIMIT+1];
int item[LIMIT+1],i,s,p;

for(s = 0;s <= LIMIT;s++)
{
value[s]=0;
}

for(i = 0;i < NUMBER;i++)
{
for(s = data[i].size;s <= LIMIT;s++)
{
p = s - data[i].size;
newvalue = value[p] + data[i].price;
if(newvalue > value[s])
{
value[s] = newvalue;
item[s]=i;
}
}
}

printf(" 品 目 重量 価格\n");
for(s = LIMIT,p=0;s >= MIN_SIZE;s-=data[item[s]].size)
{
printf("%10s %5d %5d\n",data[item[s]].name,data[item[s]].size,data[item[s]].price);
p += data[item[s]].size;
}
printf(" 合 計 %5d %5d\n",p,value[LIMIT]);
}
279258:02/07/29 18:23
277さん
こんな風に表示されました

Program received signal SIGEGV,Segmentaion fault.
0x080485ca in main () at test.c:41
41 printf("%10s %5 %5d\n",data[item[s]].name,data[item[s]].size,data[item[s]].price);


と出ました。
原因は41行目ってことですね?
280272:02/07/29 18:24
item[s] が範囲外を指してるのかなあ。
がんばれ。
その printf の直前で念のため s と item[s] の値も
表示してみるといいかもしんない。
282198:02/07/29 18:29
>>278
見やすい方が良いかと、全角でインデント付けてみたけど、
かえって悪かったみたい。スマソ

>>279
漏れはVCだから、助けられないけどガンガレ
>>279
> 原因は41行目ってことですね?
そう。そこでp sとp itemしてみ。
プログラムよく読んでないから分からんけど、item[]を初期化してないなんてこたぁないよな?
285258:02/07/29 18:46
283さん
p sとp itemを行ったら

p s
$1=5

p item
$2={0,1073832704,3,2,-1073743552,1073795766,3,2,3}

と出ました。
いったいこれはどういうことなんでしょうか?
ほんとに何度もすいません
>>285
284の言う初期化し忘れだな。
for(s = 0;s <= LIMIT;s++) {
item[s] = 0;
}
を入れて。
287デフォルトの名無しさん:02/07/29 18:49
ところでこの問題って同じ荷物を二回選んでいいの?
そういう風に解いてるように見えるけど。
288258:02/07/29 18:56
キタ━━━━━━(゚∀゚)━━━━━━!!
なったぁ〜〜〜〜〜〜〜〜〜〜〜〜〜

ありがとうございます!

for(s = 0;s <= LIMIT;s++) {
item[s] = 0;
value[s]=0;
}

って書いたけどいいでしょうか?
問題ないならこれでオッケーなんですけど。

とにかくうれしいです!
いろいろ協力してくださったみなさんありがとうございます!
今心の底から本当に感謝しています。ちょと涙。

プログラムの勉強をはじめて間もない素人相手にこれだけの助言をいただけてうれしいです。
これからもっと自分でできるようにがんばります!
289258:02/07/29 19:15
荷物| a b c d e f g h i j
――+―――――――――――――――――
重量| 39 13 68 15 10 20 31 15 41 16
価値| 42 12 45 5 2 61 89 32 47 18

で重量制限121の問題になるとさっきのプログラムを

#define LIMIT 121
#define NUMBER 10
#define MIN_SIZE 10

にして
data[NUMBER]=・・・のとこに問題の数値を入力すればいいと思ってたら
実行結果が

f 20 61
f 20 61
f 20 61
f 20 61
f 20 61
合計120 366

ってなってしまいました…ガッテム
287さんの指摘する部分はこういうことなんでしょうか?
290287:02/07/29 19:16
>>289
はい。誠に悲しいことですが、アルゴリズムを根本から直さないと、
その現象は直りません。
291258:02/07/29 19:18
ガーン
そうなんですか…

その修正は難しいのでしょうか?
どのあたりを書き換えたらいいでしょうか?
よろしければ教えてください…
正直、どの辺を直せばいいってレベルじゃない気はする。
293デフォルトの名無しさん:02/07/29 19:22
うちのではitem初期化なしで
prime = 0 110 225 335 450 570 680 795 905
item = 4235264 3 2 3 0 1 3 2 3
になってたけど・・・
294258:02/07/29 19:26
もう全部書き換えるしかないってことですか…

293さんもう少し詳しく教えていただけませんか?
>>294
ほぼ全部書き直すことになると思います。
方針としては
●計算量を無視して、全ての組み合わせを試す。(サイズ10なら、2^10なので
なんとかなる)
●ちゃんとした手法(>>295で書いているような手法のどれか)を使う。
の二通りだと思います。
ほかのスレにあったのですが、考え方としてダメ?258じゃなけど
#include <stdlib.h>
#define LEN 5
#define MAX 8 

struct NIMOTU {
  char name;  char used;  int size;   int points; 
} data[LEN]={{'a',0,4,450},{'b',0,5,570},{'c',0,2,225},{'d',0,1,110},{'e',0,6,670}};

char solution[LEN];
int  max_points = -1;
int  max_size = 0;

int less(const void *x, const void *y) {
  int n, m;
  if ((n = ((struct NIMOTU *) x)->size) <= 0) n = 1;
  if ((m = ((struct NIMOTU *) y)->size) <= 0) m = 1;
  return ((struct NIMOTU *) y)->points/m - ((struct NIMOTU *) x)->points/n;
}

int eval(int i, int rest) {
  int j, s = 0;
  for (j = i; j < LEN; j++)
    if (data[j].size <= rest)
      s += data[j].points;
  return s;
}

void knap(int i, int size, int points) {
  int j;
  if (points + eval(i, MAX - size) <= max_points) {
    return;
  }
  if (max_points < points) {
    max_points = points;
    max_size = size;
    for (j = 0; j < LEN; j++)
      solution[j] = data[j].used;
  }
  if (i >= LEN)
    return;
  for (j = i; j < LEN; j++) { /* 重複を省く */
    if (size + data[j].size <= MAX) {
      data[j].used = 1;  /* 入れる */
      knap(i+1, size + data[j].size, points + data[j].points);
      data[j].used = 0;  /* 出す */
    }
  }
}

int main() {
  int i;
  qsort(data, LEN, sizeof(struct NIMOTU), less);
  knap(0, 0, 0);
  for (i = 0; i < LEN; i++)
    if (solution[i])
      printf("%c", data[i].name);
  printf("\nTotal size = %d, Total points = %d\n", max_size, max_points);
}
298258:02/07/29 19:52
上の参考のやつをみたのですが、かなり僕には厳しいです…

すべての組み合わせを試す方法でいきたのですが、どういうプログラムを書いていいのか方向性が見えません・・・

組み合わせってどうやって求めるのでしょうか?
またその重複を省く方法というのはどうすればいいのでしょうか?
>>298
って言うか、
同じのを入れてはいけないことになってんの?
その課題ではさ。
>>298
つまり、全ての荷物について、入れるか入れないかの二択をするわけです。
で、重量制限にかかっていないうちから、価値が最大になる組み合わせを見つける
わけです。
>258
これでいい?>すべての組み合わせを試す方法
#include <stdio.h>

#define LIMIT 121
#define N_STUFF (sizeof(stuff)/sizeof(stuff[0]))

static struct Stuff {
 char c;
 int weigh;
 int value;
} stuff[] = {
 { 'a', 39, 42 }, { 'b', 13, 12 }, { 'c', 68, 45 }, { 'd', 15, 5 }, { 'e', 10, 2 },
 { 'f', 20, 61 }, { 'g', 31, 89 }, { 'h', 15, 32 }, { 'i', 41, 47 }, { 'j', 16, 18 }
};

static int total_value[1 << N_STUFF];

int main(void) {
 int i, max_value = -1;
 for ( i = 0; i < (1 << N_STUFF); i++ ) {
  int j, total_weigh = 0;
  for ( j = 0; j < (int)N_STUFF; j++ ) {
   if ( i & (1 << j) ) {
    total_weigh += stuff[j].weigh;
    total_value[i] += stuff[j].value;
   }
  }
  if ( total_weigh > LIMIT )
   total_value[i] = -1;
  if ( total_value[i] > max_value )
   max_value = total_value[i];
 }
 for ( i = 0; i < (1 << N_STUFF); i++ ) {
  if ( total_value[i] == max_value ) {
   int j;
   printf( "Choise:" );
   for ( j = 0; j < (int)N_STUFF; j++ )
    if ( i & (1 << j) )
     printf( " %c", stuff[j].c );
   printf( "\ttotal value: %d\n", total_value[i] );
  }
 }
 return 0;
}
ていうかさ、いくら言っても素人なんだろ?
つくってやればいいじゃん。それで解決するだろ
#include <stdio.h>

#define LIMIT 8
#define NUMBER 5
#define MIN_SIZE 1

int ans[NUMBER];
int maxvalue;

struct nimotu
{
  char *name;
  int size;
  int price;
} data[]={{"a",4,450},{"b",5,570},{"c",2,225},
{"d",1,110},{"e",6,670}};

int cvalue(int index, int space, int value){
  int n, c1, c2;
  if(index == NUMBER){
     if(value > maxvalue){
       maxvalue = value;
       return 1;
     }
     return 0;
  }
  c1 = cvalue(index + 1, space, value);
  if(data[index].size > space){
    if(c1) ans[index] = 0;
    return c1;
  }else{
    c2 = cvalue(index + 1, space - data[index].size, value + data[index].price);
    if(c2){
      ans[index] = 1;
      return 1;
    }else{
      if(c1) ans[index] = 0;
      return c1;
    }
  }
}

int main(void)
{
  int i, value;
  int maxvalue = 0;
  cvalue(0, LIMIT, 0);

  printf(" 品 目 重量 価格\n");
  for(i = 0; i < NUMBER; i++){
    if(ans[i]) printf("%10s %5d %5d\n", data[i].name, data[i].size, data[i].price);
  }
  printf(" 合 計 %5d", maxvalue);
}
ぶひょ。
すでにつくってあげてた人がいた。スマソ

逝って来る
305301:02/07/29 20:04
ゲッ、Choceの綴り間違えた(w
あ、total weighも表示したかったら自分で改良してね
ってその前にこれで合ってるのか知らんけど
306258:02/07/29 20:04
301,303>>
ありがとうございます!
これを参考にもっとがんばってみます!
>>297
これって実質上、全検に毛の生えたようなもの
(ちょこっと枝狩りが付いている?)と解釈していいのか?

枝狩りが結構ヒューリスティックな方法(だと思う・・・)なので
まだ良く理解できん。

アルゴリズムの説明キボンヌ(特に eval の所)
308名無しのだれか:02/07/29 20:50
長いソースは >>216 のソース置き場をご利用いただけます。
309デフォルトの名無しさん:02/07/29 21:00
俺も作ってみた。
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=5&fi=no

品 目 重量 価格
a 39 42
f 20 61
g 31 89
h 15 32
j 16 18
合 計 121 242
310309:02/07/29 21:05
俺のコードは2重ループ。
一回目のループで最大値を求め、
二回目で最大値な組み合わせを求めたつもり。
311309:02/07/29 21:07
二重じゃなくて2回ループ
ただ全検するだけならこんなんで良いのでは?

#include <stdio.h>

#define item_NUM 5
#define MAXWEIGHT 8

struct { int weight, point; } item[ item_NUM ] =
  { {4,450,}, {5,570,}, {2,225,}, {1,110,}, {6,670,}, };

int main( void )
{
  int i, j;
  int maxpoint = -1, maxi = -1;

  for( i = 0 ; i < ( 1 << item_NUM ) ; i ++ ) {
    int weight = 0, point = 0;

    for( j = 0 ; j < item_NUM ; j ++ )
      if( ( i >> j ) & 1 ) {
        weight += item[ j ].weight;
        point += item[ j ].point;
      }
    if( weight <= MAXWEIGHT && maxpoint <= point ) {
      maxpoint = point;
      maxi = i;
    }
  }
  if( maxi == -1 )
    printf( "not found\n" );
  else {
    for( j = 0 ; j < item_NUM ; j ++ )
      if( ( maxi >> j ) & 1 )
        printf( "%c", 'A' + j );
    printf( " point=%d\n", maxpoint );
  }
  return 0;
}
>312
それって最適解が2つ以上あっても大丈夫か?
>>313
とりあえず1つだけ。
複数解を表示する必要があれば、その分の記憶域を確保すれば良い
(ちょっとコードをいじる必要があるが)。
315 ◆aCDPDEl2 :02/07/29 23:03
またきたよぉ。
誰よ?
317 ◆aCDPDEl2 :02/07/29 23:22
宿題をくれぇぇぇぇえええええ!!!!!!!!!!!!!!!!
applet 作って。
319 ◆aCDPDEl2 :02/07/29 23:40
Cの易しい問題カモーン
宿題というか、ム板プログラムコンテストでもする?
実行時間競うとか。
>>320
テーマは?
>>320
おまえら作ったプログラムをウプせよ
http://pc3.2ch.net/test/read.cgi/tech/1027938403/
てのがあるけど
うーん、
●実行時間を競うもの
●なんかのゲームを対戦させるもの

どっちがいいかな?
>323
実行時間で比較されるのはあんまし好きじゃないなあ。俺は保守性、可読性マンセーなんで
囚人のジレンマゲームとか、そういう類?
326デフォルトの名無しさん:02/07/30 01:17
宿題を出してみよう。暇な人はどうぞ。

次のような形式で地形(迷路)が表されている。
32
11
1111111110111111111111111111100G
10000000001111111111100000000011
11111011111110000000001111101111
11110000000000101111111111101111
10110111111111101111111111101111
10110000000000101110000011101111
10111111111110100000111000001101
10110000000000111011111100111101
10010111111111111011111110000001
11110111111000000000000000111111
S0000111111111111111111111111111

ここで、1が壁を表し、0は通路を表す。SはスタートでGはゴールを表している。
最初の32と11は、横・縦のサイズである。
このときスタートからゴールまでの最短距離を求めるプログラムをかけ。
縦横には移動できるが、斜めには移動できない。迷路のデータは標準入力から
入力するものとする。
#include <stdio.h>

#define item_NUM 5
#define MAXWEIGHT 8

struct { int weight, point; } item[ item_NUM ] =
{ {4,450,}, {5,570,}, {2,225,}, {1,110,}, {6,670,}, };

int main( void )
{
int i, j;
int maxpoint = -1, maxi = -1;

for( i = 0 ; i < ( 1 << item_NUM ) ; i ++ ) {
int weight = 0, point = 0;

for( j = 0 ; j < item_NUM ; j ++ )
if( ( i >> j ) & 1 ) {
weight += item[ j ].weight;
point += item[ j ].point;
}
if( weight <= MAXWEIGHT && maxpoint <= point ) {
maxpoint = point;
maxi = i;
}
}
if( maxi == -1 )
printf( "not found\n" );
else {
for( j = 0 ; j < item_NUM ; j ++ )
if( ( maxi >> j ) & 1 )
printf( "%c", 'A' + j );
printf( " point=%d\n", maxpoint );
}
return 0;
}

312が書いたプログラムなのだが、これでは組み合わせが表示されないうえに組み合わせたものの数だけ答えが表示されてしまう。
これを改善してみよう。

328 :02/07/30 01:42
>>324
つまり、クイックソートよりバカソートが好きと。
>>324
俺もだ。
>>328
クイックソートって再帰で書かれてるのがちょっとね。再帰で書かない方法
もあるけど、本見て再帰で書かれていて嫌になった事がアルヨ。
330324:02/07/30 02:28
>328
たかが十数個の要素をソーティングするのにqsort()つかったり、
ましてやクイックソート関数を自作するようなヤシは即頃すけど
331>>327:02/07/30 02:30
>>330
え、そう? 要素数10数個程度にこそqsortを使うけど。
要素数が数万とかそれくらいになってくるとさすがに自前でソートすることを考える。

確実に動くものを作っておいて性能に問題が出たときに改めて
そういうところを見直すもんだと思ってた。
せっかく便利な関数があるんだから使わないと損だよ(w

いや、無論ソート前にquick sortの苦手な配列になっていることが確実なら、
最初から自前のソートを実装するかもしらんが。
4321→1234みたいなソートね。

で、確かqsortってquick sortで実装することは求められてなかったんじゃなかったっけ。
331>>
327は夏厨なんだからもっとわかりやすく教えてやれよ。
334324:02/07/30 02:52
>332
数10と十数は大違いだから覚えとくように
要素数が20以下ならqsortより自前のbubble sortのほうが速い
>>334
>>330>>332もどっちも10数(十数)だけど?

要素数20以下つったら、バブルソートの方が速いつったって、
そんな少ない要素数ならどっちも誤差じゃないのかな。
ループのなかで何度も何度もソートするというなら、
そりゃ自前でソートするしアルゴリズムも検討するよ。
そうでなければ誤差だと思うけど考え方間違ってる?
336324:02/07/30 03:00
>335
>>>330>>332もどっちも10数(十数)だけど?
すまん。アホった

当然俺の言ってるのは
>ループのなかで何度も何度もソートするというなら
これだが?
>>336
了解、それなら納得です。
338Rina ◆tI333vNE :02/07/30 03:56
JavaならArrays.sort(). 要素数が少ない場合でも
なんかゴニョゴニョやって効率の良いソートをしてくれる…らしい.

Cならqsort(). ただし, 要素数が少ないってことがコーディングの
段階で分かってる場合はバブルソートをベタ書き(関数にしないってことね).
注釈で
  // 要素数が少ないのでバブルソート:N>=20になったらqsort() :)
って書いておく.

以上, うちのコーディング規約より.
339デフォルトの名無しさん:02/07/30 03:58
以下の二分法を利用してsinx=0の一つの解であるπの近似値を求めよ。
二分法では、次の中間値の定理を用いる。
「関数f(x)が区間[x0,x1]で連続であり、f(x0)*f(x1)<0であるとすると、f(x)=0は、区間(x0,x1)に根を持つ」
1.f(x0)*f(x1)<0となる適当な初期値x0,x1を与える。
2.くかん[x0,x1]の中点での関数の値と中間値の定理を利用することで、(少なくとも一つの)根が存在する範囲を区間[x0,x1]の半分に確定することができる。
3.そのような範囲の中点xmでの関数の絶対値|f(xm)|が十分に小さいときxmを方程式の根とする。
4.そうでないときは2,3の操作を繰り返し、範囲を徐々に狭めながら方程式の根を探す。

言語はcです。
全然わかんない、、、、どなたかプログラム書いてください
よろしくお願いします
340デフォルトの名無しさん:02/07/30 04:15
#include <stdio.h>
#include <math.h>

#define VERYSMALL 0.000001

int main(){
  float x0, x1, xm, sinx;;
  x0 = 1;
  x1 = 5;

  while (1){
    xm = (x0 + x1) / 2;
    sinx = sin(xm);
    if(sinx < VERYSMALL && sinx > -VERYSMALL){
      printf("%f\n", xm);
      break;
    }else{
      if(sinx * sin(x0) < 0){
        x1 = xm;
      }else{
        x0 = xm;
      }
    }
  }
}
341339:02/07/30 04:18
はやっっっっ!!!!
ありがとうございました!!
#include <stdio.h>
#include <math.h>

#define EPS 0.0000000001

double x0 = 3.0, x1 = 4.0;

int main(void)
{
double xm;

do {
xm = (x0 + x1) / 2.0;

if (sin(x0)*sin(xm) < 0)
x1 = xm;
else
x0 = xm;
} while (fabs(sin(xm)) > EPS);

printf("pi = %.10g\n", xm);

return 0;
}

いやん先越されたー。しょっくー
#include <stdio.h>
#include <math.h>

int main()
{
const double eps = 0.000001;

double x0, x, x1;

double sin_x;

x0 = 3;
x1 = 4;

while( x = ( x0 + x1 ) / 2, sin_x = sin(x), fabs(sin_x) >= eps ) *( sin_x > 0 ? &x0 : &x1 ) = x;

printf("pi is nearly equal to %lf", x);

return 0;
}
344339:02/07/30 04:30
もう一つお願いしてもよろしいでしょうか
「適当な実数aに対して、指数関数のテイラー展開を利用してeのa
乗の近似値を求めよ」
です。お願いできますでしょうか、、、、
こちらも言語はcです。
#include <stdio.h>
#include <math.h>

#define EPS 0.0000000001

double a = 7.0;

int main(void)
{
int n = 1;
double s = 1, ds = 1;

do {
ds /= n;
ds *= a;
n++;
s += ds;
} while (fabs(ds) > EPS);

printf("e^%g = %.15g\n", a, s);

return 0;
}
346339:02/07/30 04:42
ううっ、、、あんなに悩んでた問題が一瞬で、、、、、
ありがとうございました。
>>345
速いねぇ。
348Rina ◆tI333vNE :02/07/30 04:53
早すぎw
いちおう, 私が書いたのを.

#include<stdio.h>
#include<math.h>

#define EPS (1e-15)

#define x1 3.0
#define x2 4.0

/*
* @param a, b: x1, x2
* @param func: 計算用の関数
*/
double BesectionMethod(double a, double b, double (*func)()) {
double fa, fb;
double tmp;
double x;

do {
tmp = (a + b) / 2.0;
x = sin(tmp);

if ( fabs(x) < EPS ) {
return tmp;
}

if((*func)(a) * x < 0){
b = tmp;
} else {
a = tmp;
}
} while (1); /* infinity */
}

int main(void) {
printf("答え: %lf\n", BesectionMethod(x1, x2, sin));
}
>>348
汎用ですな。
実は同じ学校だったとかだったらおもしろいかも
351Rina ◆tI333vNE :02/07/30 04:59
Rina.mottou == 汎用

一番のりじゃなかったのが実は悔しいw
>>351
まあ、依頼レスを見た時刻にもよるけどねぇ。
それにしても345とかは速い。
353Rina ◆tI333vNE :02/07/30 05:02
にしても, 大の大人がこんな時間に何やってんだか…w
…とかいいつつ, 次の宿題に秘かに期待している自分がここに(苦笑
>>353
同意w
>>348
sin のままのとこあるよ。
あと (*func)(a) は func(a) でもいいね。

356Rina ◆tI333vNE :02/07/30 05:08
うわー、しまったw > sin(tmp)

一度π用に書いて, その後書き直したんで見落としちゃったか.
仕事中にやったら殺されるなw ガタガタブルブル(((゜Д゜)))ガタガタブルブル

関数ポインタって(*func)()じゃなくてfunc()でコールできるの?
それは初耳.
357Rina ◆tI333vNE :02/07/30 05:10
あ、func()でもコールできるんだねぇ…一つ賢くなりますた.
358339:02/07/30 05:10
調子に乗ってもう一問だけお願いいたします。
言語はcです。
「正の整数nに対して、0<=i<=nなるiのうち、gcd(i,n)=1となるiの個数をψ(n)とする。適当な正の整数mに関して、1<=a<=mなるすべてのaについて、(aのψ(n)乗)*(modm)、gcd(a,m)を計算せよ。」
ヒントで、「ψ(n)、gcd(a,b)、(aのk乗)*(modm)を計算する関数をそれぞれ定義するとよい。」
「aのk乗を計算する場合には、kの2進数展開を利用するとよい」
「(aのk乗)*(modm)を計算する際に、aのk乗を計算してから(modm)を計算しないこと」
とあります。よろしくお願いします。
modmの前の*の意味がわからん
360Rina ◆tI333vNE :02/07/30 05:14
そもそも何がしたいのか分からん<マテ
gcdって暗号だっけ…とりあえず数学のお勉強から始めますかw
>>351に期待age
361339:02/07/30 05:18
*は掛けるのつもりで書きました。
わたしもmod,gcdの意味さえ分からないです。
何とか調べますんでちょっと待ってください。
362Rina ◆tI333vNE :02/07/30 05:20
Rinaたんは今回は捨ての方向で(ぉい).
modはモジュロ、gcdは最大公約数だっけか?
ヒントの意味がまるでわからん。
364Rina ◆tI333vNE :02/07/30 05:25
うん, 確かそう.
modとgcdは作ったけど, 捨ての方向でw

いまノートで作業してる間横で, さっきまで使ってたマシンが
逝かれました…. 買い替えるかぁ….
365339:02/07/30 05:30
二つ目のヒントでしょうか
kの2進数展開とは、
aのk乗=(i=0からの)Πaの(ki*2のi乗)乗
k=(i=0からの)Σ(ki*2のi乗)
三つ目のヒントはaが大きな数の場合にすぐ破綻してしまうため
とあります。
ものすごくわかりにくい書き方しかできずすいません。
だれか〜本当にお願いします〜!!!
>仕事中にやったら殺されるなw ガタガタブルブル(((゜Д゜)))ガタガタブルブル
>
>関数ポインタって(*func)()じゃなくてfunc()でコールできるの?
>それは初耳.
おめ−、学生さんだろ。学生さんが悪いとはいわんが
なんで「仕事中」なんて書くんだ?
367Rina ◆tI333vNE :02/07/30 05:34
学生?私が?
…あの〜、いちおう社会人なんですけど(ヘタレですが).
368339:02/07/30 05:35
みんな〜捨てないで、、、
捨てないでくだせ〜〜〜〜〜
>>368
>*は掛けるのつもりで書きました
って、mod m はかけるものじゃないでしょ?
370339:02/07/30 05:46
ううううぁぁぁぁぁぁぁ!!!!!
そっっっそうか!!(mod m)のまえの*いらないですね
全く分かってないまま質問してすいません。。。。
371 :02/07/30 05:50
>>358
ひとまず・・・。

unsigned gcd(int x, int y)
{
 unsigned i = x >= 0 ? x : -x;
 unsigned j = y >= 0 ? y : -y;
 if (i < j) {
  unsigned t = i;
  i = j;
  j = t;
 }
 while (j) {
  unsigned k = j;
  j = i % j;
  i = k;
 }
 return i;
}

int psi(int n)
{
 int r = 0, i;
 for (i = 1; i < n; i++)
  if (gcd(i, n) == 1)
   r++;
 return r;
}
>>366
いや、まあ関数ポインタfuncが
(*func)();
ではなく、
func();
で呼べてしまうのがもともと気持ち悪いんであって。
funcが*funcと同値であるならば、**funcだって同値だし、
だったら(***************************************func)();
でも呼べてしまうわけで、さすがにこれは気持ち悪いでしょ。

それに昔のCだと当然のごとく(*func)();でしか呼べなかったんだし。
ま、不勉強は否めないにしてもな(w

そういう漏れはC99のことほとんどしらん。
373 :02/07/30 05:52
>>371
nが1のときのことを考えてなかった。

int psi(int n)
{
int r = 0, i;
for (i = 0; i <= n; i++)
if (gcd(i, n) == 1)
r++;
return r;
}
374Rina ◆tI333vNE :02/07/30 05:53
つまり, 今まで通り (*func)() 書いた方がいいってことですな.
375372:02/07/30 05:57
>>374
気持ち悪いにしても、意図は明確なんだしfunc();って書きましょうよ(w
376Rina ◆tI333vNE :02/07/30 06:02
>>375
あ, 可読性を重視してfunc()って書けってレスだったのね.
てっきり互換性を重視して(*func)()って書けって文章かと
早合点しちゃったよw
内容もスレ違いだし, 逝ってきます.
>>358
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=7&fi=no
こんな感じか?
2進数処理とかよくわからん。
>>358
int f( int a ) // (aのψ(n)乗)*(modm)を計算する関数
{ return 1; }

詳しくは「オイラーの定理」を検索しれ。
380 ◆aCDPDEl2 :02/07/30 07:12
おはよう。誰か>>326やってる人いる?
>>379
問題よく見れ
オイラーの定理

 自然数nに対して、1,2,3,…,nの中でnと互いに素な数の個数をφ(n)

 とすれば、(a,n)=1なる整数aに対して

     a^φ(n)≡1(mod n)

となる。

また、この時のφをオイラー関数と言う。
だめなやつ
385377:02/07/30 08:37
こうしろってこと?
pow_psi_mod(int a, int n, int m)
{
if (n == m && gcd(a, n) == 1) return 1;

return pow_mod(a, psi(n), m);
}
386326:02/07/30 12:08
>>384
こんな感じの巨大な地形にも対応させてと言って見ます、
32
10
0000000000100000100000000000000G
00000000000000001111111111001100
11011111111100001000000001110100
00000000000100001000000001000100
00000000000100000000000000000100
11111111011111111000000001000100
00000000000000001000000001000000
00000000000000001000000001000100
00000000000000001000000000000100
S0000000000000001000000000000000
387 ◆aCDPDEl2 :02/07/30 13:20
>>326=386 おはよう。俺にまかせとけ。一週間あればできそう。
388デフォルトの名無しさん:02/07/30 13:36
どなたかこのプログラム書いてください。
cの勉強を始め、いきなり壁に衝突、、、、助けてください。
「ディレクトリを指定すると、そのディレクトリのファイルの詳細一覧を表示するプログラムを作成せよ。なお「.」で始まるファイルも表示に含めること。」言語はcです。
次のようなヒントがあります。プログラム内でsystem()という関数を用いると、シェルを介してコマンドを実行できる。system()の引数として文字列を与えると、その文字列をコマンドとして実行する。
system()を用いるには、プログラムの先頭に#include<stdlib.h>を記述する必要がある。
また文字列操作関数を用いるには、同様に#include<string.h>を記述する必要があることに注意せよ
上のほうでやってたナップサック問題のプログラムなんですけど、わけわかんないんでコメントつけてもらえませんか?
#include <stdio.h>

#define LIMIT 121
#define NUMBER 10

struct nimotu { 
 char name;
 int weight;
 int value;
} nimotu[] = {
 { 'a', 39, 42 }, { 'b', 13, 12 }, { 'c', 68, 45 }, { 'd', 15, 5 }, { 'e', 10, 2 },
 { 'f', 20, 61 }, { 'g', 31, 89 }, { 'h', 15, 32 }, { 'i', 41, 47 }, { 'j', 16, 18 }
};

int total_value[1 << NUMBER];  /*[]の中身は?*/

int main(void) {
 int i, max_value = -1; /*なんで−1なのでしょう?*/
 for ( i = 0; i < (1 << NUMBER); i++ ) { /*ここの<<の部分*/
  int j, total_weight = 0;
  for ( j = 0; j < NUMBER; j++ ) { 
   if ( i & (1 << j) ) {        /*ここの<<の部分*/
    total_weight += mimotu[j].weight;
    total_value[i] += nimotu[j].value;
   }
  }
  if ( total_weight > LIMIT )
   total_value[i] = -1;
  if ( total_value[i] > max_value )
   max_value = total_value[i];
 }
 for ( i = 0; i < (1 << NUMBER); i++ ) { /*ここの<<*/ 
  if ( total_value[i] == max_value ) {
   int j;
   printf( "Choise:" );
   for ( j = 0; j < (int)NUMBER; j++ )
    if ( i & (1 << j) )
     printf( " %c", nimotu[j].c );
   printf( "total value: %d\n", total_value[i] );
  }
 }
 return 0;
}


疑問のところ特によろしくお願いします・・・
390デフォルトの名無しさん:02/07/30 13:53
>>388
unix linux cygwin dos? 実行環境(OSとか)を書きなさいよ。

詳細情報まで表示する ls -l (dir)コマンドを system で実行して
1行づつ(スペース or TAB) で切り分けて表示してみれ。
>>389
ビットシフト演算子がわからんだけ?
max_value = -1の理由は、これから
0よりも大きい数を入れていって、
それを最大値としていくから。
392デフォルトの名無しさん:02/07/30 13:59
2out-of5符号による表示。5ビットからなる符合で、その中の2ビットが1である
符号を2out-of5符号という。この条件を満足する符号語はちょうど10個存在するので、
0から9までの10種類の数字を表すことができる。たとえば数と符号を次のように対応
させる。
0=00011 1=00101 2=01001 3=10001 4=00110
5=01010 6=10010 7=01100 8=10100 9=11000
(1)ユーザーに、整数を2out-of5符号に変換するか、逆変換するかを尋ねる。(入力
が1ならば変換、2ならば逆変換とする。)
(2)変換の場合:3桁の整数をユーザーに入力させて、それを変数xに代入します。
(3)10で割った商と余りを利用して、xを3つの整数に分離します。
(4)それぞれの整数を2out-of5符号に変換して表示する。ヒント:2次元配列
a[10][5]の中にそれぞれの数の2out-of5符号を0や1で0入れておくと便利です。
(5)逆変換の場合:5桁の2進数を読み込んで、配列yに代入する。(1桁ずつよんでよい。)
(6)yの値を上の表と比較して、同じものがあればその数字をプリントする。該当する
ものがなければ「2out-of5符号ではありません。」とプリントする。
条件
1.配列yを2out-of5符号の配列と比較する部分を関数にする。

上の文章が問題です。自分で考えても全然わかりません。
お願いします。
393デフォルトの名無しさん:02/07/30 14:01
<`∀´>ウリナラマンセ
394デフォルトの名無しさん:02/07/30 14:02
>>388
で、
ttp://www.ncad.co.jp/~komata/c-kouza3.htm
に非常に良く似た課題に対する解説がある。参考になされ。
391>>
ビットシフト演算子もわからないのですが、全体的にどういう流れでどういうことをしているのかを知りたいのです。
ここはこういう計算をしてるみたいな…
396200:02/07/30 14:06
>>262
すみません。昨日といてもらった問題がちゃんと実行されないのですが
397人行知能:02/07/30 14:24
>>366
> すみません。昨日といてもらった問題がちゃんと実行されないのですが
エラー:「ちゃんと」という言葉が曖昧です。
エラー1、警告0、要求は受理されませませんでした。
>397
400309:02/07/30 16:10
>>389
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=6&fi=no
俺のやつはみてもらえたのだろうか?
がんばって書いたのだけれど・・・
401254:02/07/30 16:20
>>396
>>397も書いてるけど、「ちゃんと実行されない」の意味がわからない。

・コンパイルエラーになる
・コンパイルできたけど実行時エラーになる
・実行できたけど出力されたものが期待したものと違う
・それ以外

どれ? 前者ふたつのエラーの場合はエラーメッセージをコピペして。
後者ふたつの場合はもうちょっと状況を詳しく書いてみて。
一応こっちはコンパイル&実行して正しく動くことを確認してあるよ。
>358
一応必要な関数は書いたよ。問題は意味が分からんので却下
(aのψ(n)乗)(modm)
ここに出てくるnて何だよ?

#include <stdio.h>
#include <math.h>

int square( int x ) {
 return x * x;
}

/* (a^k)%m */
int expmod( int a, int k, int m ) {
 if ( k == 0 ) return 1;

 if ( k%2 == 0 )
  return ( square(expmod(a, k/2, m)) % m );
 else
  return ( (a * expmod(a, k-1, m)) % m );
}

int gcd( int x, int y ) {
 while ( y != 0 ) {
  int tmp = y;
  y = x % y;
  x = tmp;
 }
 return x;
}

int psi( int n ) {
 int i, ans = 0;
 for ( i = 0; i <= n; i++ )
  if ( gcd(i, n) == 1 ) ans++;
 return ans;
}
403デフォルトの名無しさん:02/07/30 17:01
>>401
コンパイルはできるんですが思う通り出力されないんですが
404200:02/07/30 17:04
#include <stdio.h>

static void print_a(const char *a, size_t size)
{
char state = a[0];
int i, count = 1;

for (i = 1; i < size; i++) {
if (a[i] != state) {
if (state == '0') {
count = -count;
}
printf("%d,", count);
state = a[i];
count = 1;
}
else {
count++;
}
}
printf("\n");
}

int main(int argc, char * argv[])
{
char a[38];
int i = 0, ch;

while ((ch = getchar()) != EOF) {
if (ch == '\n') {
print_a(a, i);
i = 0;
}
else {
a[i++] = ch;
}
}
if (i) {
print_a(a, i);
}
return 0;
}
405254:02/07/30 17:34
>>403
もちっと詳しく書いてもらえないとこっちとしても対処のしようがないよ。
・なにをして
・どうなった
・どうなってほしい
くらいは書いておくれ。

仕事が立て込んでるのでレスポンス悪いよ、すまんな。
406デフォルトの名無しさん:02/07/30 18:04
直接宿題とは関係ないんですが、プログラミングを勉強すると
将来どのようなことに役立つのでしょうか?今大学で教わって
いるのですが、学習意義がまだよくわかりません。
大雑把な質問ですみませんがどなたか教えてください。
僕は理工学部の二年生です。
>>406
プログラムできない奴よりはできる奴のほうが職業選択の
幅は広い
408384:02/07/30 18:09
俺さ。
厨房の時に「なんで三角関数なんて勉強するんだ?」って思ったんだよ。
工房の時に「なんで微分積分なんて勉強するんだ?」って思ったんだよ。
ところがさ。PGになって「なんで色々勉強しなかったんだ?」って思ったんだよ。
要するにさ。やりたいことが決まってるなら、それを勉強すれば良いと思うよ。
やりたいことが決まってないなら、なんでも勉強すると良いよ。
ということを若いころに言われた気がするけど、俺は理解していなかったからさ。
多分>>406も理解できないんじゃないかな。
>>406
理工学部であれば、将来何らかの技術職に就くつもりかな。
であれば、道具として計算機を使うだろう。
そのためにプログラミングを学ぶのは決して無駄じゃないと思うよ。
ちょっと条件を変えて同じような計算を何度もやったりとかなんて結構あるんじゃなかな。
電卓でいちいちその計算をなぞるよりも、ちょっとプログラム組んで自動化させたら楽だしね。

多分、技術職になれば嫌でもプログラミングを覚えないと仕事にならんと思う。
研究職ならなおさらだ。基礎体力だと思っておいたほうがいい。

それ以前にプログラミングは楽しいものだが、それは人によるか(w

大雑把な質問なんで大雑把な答を返してみた。
411406:02/07/30 18:25
>>407、409、410
ありごとうございました。とても参考になりました。
>>406
漏れも似たような境遇なんだけどさ、
正直なんでそう思えるのかがわからんよ。
将来ってか今必要じゃない?研究とかでさ。
漏れは逆になんでこんな基本的なことしか教えてくれないんだろう、と思ってるよ。
授業で習ったことだけじゃ研究に使うプログラムも満足に書けないからね。
理工系だろ?プログラム書けないっつーことは、英文科行ってて英語喋れない奴と同類だぜ?
>>406
おまえ自身が将来何の役にもたたなくて
存在意義がないと思う。
414200:02/07/30 18:48
0000000000000000111100000000000000000
を入力すると16,4,17,と出力して
 0000000000011111111111111000000000000
を入力すると11,14,12,と出力して以下同じように出力したいです
 0000000000001100000000110000000000000
 0000000000000111000011100000000000000
 0000000000000011100111000000000000000
 0000000000000011100111000000000000000
 0000000000000001111110000000000000000
 0000000000000001111110000000000000000
 0000000000000111111111100000000000000
 0000000000011111000011111000000000000
 0000000001111000000000011110000000000
 0000000011100000000000000111000000000
 0000001110000000000000000001110000000
 0000111100000000000000000000111100000
 0001111000000000000000000000011110000
 0001111000000000000000000000011110000
 0000111100000000000000000000111100000
 0000001110000000000000000001110000000
 0000000001111111111111111111000000000
 0000000000000111111111100000000000000
 0000000000000000000000000000000000000
要するに
16,4,17,
11,14,12,
:
:
と出力したいです
したいんですかそうですか
したいんですかたいへんですね
417200:02/07/30 18:55
>>401
0000000000000000111100000000000000000
を入力すると16,4,17,と出力して
 0000000000011111111111111000000000000
を入力すると11,14,12,と出力して以下同じように出力したいです
 0000000000001100000000110000000000000
 0000000000000111000011100000000000000
 0000000000000011100111000000000000000
 0000000000000011100111000000000000000
 0000000000000001111110000000000000000
 0000000000000001111110000000000000000
 0000000000000111111111100000000000000
 0000000000011111000011111000000000000
 0000000001111000000000011110000000000
 0000000011100000000000000111000000000
 0000001110000000000000000001110000000
 0000111100000000000000000000111100000
 0001111000000000000000000000011110000
 0001111000000000000000000000011110000
 0000111100000000000000000000111100000
 0000001110000000000000000001110000000
 0000000001111111111111111111000000000
 0000000000000111111111100000000000000
 0000000000000000000000000000000000000
要するに
16,4,17,
11,14,12,
:
:
と出力したいです
ほらよ。mainは前のままでいい。

static void print_a(const char *a, size_t size)
{
 char state = a[0];
 int i = 1, count = 1;

 for (i = 1; i < size; i++){
  if (a[i] != state) {
   printf("%d,", count);
   state = a[i];
   count = 1;
  }
  else{
   count++;
  }
 }
 if(size){
  printf("%d,\n",count);
 }
 else{
  printf("\n");
 }
}
>>200
答えてやるから二度とくるな

#include<stdio.h>

#defineBUF_SIZE(1024)

intmain( int argc, char *argv[] )
{
charbuf[BUF_SIZE], *cp, *pp;
intcnt, i, n;

while(1){
while(1){
gets( buf );
if( strlen(buf) )
break;
}
if( !strcmp( buf, "0" ) )
break;

for( pp = cp = buf, n = 0; cp = strchr( cp, ',' ); pp = ++cp, n++ ){
*cp = '\0';
cnt = atoi( pp );
if( !cnt )
break;
for( i = 0; i < cnt; i++ )
printf( "%d", (n%2)?1:0 );
}

printf( "\n" );
}

return 0;
}
tabが消えた
#include <stdio.h>
#define BUF_SIZE (1024)

int main( int argc, char *argv[] )
{
char buf[BUF_SIZE], *cp, *pp;
int cnt, i, n;

while(1){
while(1){
gets( buf );
if( strlen(buf) )
break;
}
if( !strcmp( buf, "0" ) )
break;

for( pp = cp = buf, n = 0; cp = strchr( cp, ',' ); pp = ++cp, n++ ){
*cp = '\0';
cnt = atoi( pp );
if( !cnt )
break;
for( i = 0; i < cnt; i++ )
printf( "%d", (n%2)?1:0 );
}

printf( "\n" );
}

return 0;
}
421254:02/07/30 19:18
>>414
うん、始めは>>200の逆の操作をすれば良いのかな、とおもってた。
そのつもりで、>>259のプログラムを書いたんだけどよくよく>>253を読んでみると、

>カウンターの値をプリントして1の場合にはそのまま数字をプリ
>ントして0の場合には、符号をマイナスにしてプリントする。

って書いてあるのよ。だから、0の連続では-符号つけて出してみた。
これ、問題が悪いよ。たぶん。お、おれは悪くない(必死だな)。

で、回答については既に出てるようなので略。
422デフォルトの名無しさん:02/07/30 19:58
C言語の課題です。わかりません。誰か、教えてください!!
『4000未満の4桁のアラビア数字を読み込んでローマ数字に変換せよ。
入力された数字を10で割った時の商と余りを利用せよ。
尚、アラビア数字、ローマ数字は、順に1=T、5=X、10=]、50=L、100=C、500=D、1000=Mとなる。
たとえば、MMDCL]XTT=1000+1000+500+100+50+10+5+1+1=2667です。
また、桁の数が4、9の場合は、引き算を適用します。たとえば、TX=5−1=4、T]=10−1=9です。
対話的に入力しますので、その入力誤りに対しては、再度入力するように表示して再入力させます。     』
なにが分からないのか明記せよ
424422:02/07/30 20:09
プログラムを作れません…。作成してください。お願いします!
いやだから、プログラムのどの部分がわからんのよ?
まさか、課題が出るような場所にいるのにコンパイルの仕方すらワカランとは言わないよな?
426422:02/07/30 20:18
コンパイルの仕方は、わかるんですが、コンパイルするまでのプログラムが、どう作ったらいいのかわからなくって…。
#include <stdio.h>

int main(void)
{
int i;

scanf("%d", &i);
if (i == 0x0a6b) {
puts("MMDCLXVII");
}
else {
puts("わかりません");
}
}

とりあえず、例に関しては正しい答えを返しますが、何か?
1.テキストエディタでソースファイルを開く
2.C言語のプログラムを書く

あとは、アンタの知ってるコンパイル。
ていうか、main()関数も書けないの?
どこまでできんのよ? はっきりしろよ。
>>426
入力を求めて、入力の誤りを検出してメッセージを出すくらいなら作れるんじゃないの?
それもダメ?
430デフォルトの名無しさん:02/07/30 20:29
すいません。自分の書き方がおかしかったです。2667ってのは、あくまで、ヒントの部分で、問題自体は、一行です。
『4000未満の4桁のアラビア数字を読み込んでローマ数字に変換せよ。
ヒント(入力された数字を10で割った時の商と余りを利用せよ。
尚、アラビア数字、ローマ数字は、順に1=T、5=X、10=]、50=L、100=C、500=D、1000=Mとなる。
たとえば、MMDCL]XTT=1000+1000+500+100+50+10+5+1+1=2667です。
また、桁の数が4、9の場合は、引き算を適用します。たとえば、TX=5−1=4、T]=10−1=9です。
対話的に入力しますので、その入力誤りに対しては、再度入力するように表示して再入力させます。   )  』
>>422
もしかして、「ローマ数字」が何なのかも知らなかったりしないか?
知っていれば問題文を丸写ししたりしないだろう。
自分の生まれた年(西暦)がローマ数字でどう表現されるか、答えられるか?
>>430
1) アラビア数字を読み込む
2) 4000未満でなければ、再度入力するよう表示して、1)へいく
3) 入力された数字を10で割ったときの商と余りを求めることで
  桁毎の数字を求める
  2667 : int → { 2, 6, 6, 7 } : int[4]
4) int roma[4][10] = { {略}, {略}, {略}, {"I", "II", "III", "IV", 略}};
  という配列と3)の結果を使ってローマ数字を表示する。

という方針で作るといいと思うよ。
433デフォルトの名無しさん:02/07/30 20:36
MCMLTTTTT(1982)ですかね…
434432:02/07/30 20:37
間違えた
4) char* roma[4][10] = { {略}, {略}, {略}, {"I", "II", "III", "IV", 略}};
  という配列と3)の結果を使ってローマ数字を表示する。
>>432
2)4000以上もしくは1000未満の数字が入力されたら
 再度入力するように表示して1)へいく

一応、問題に「4桁の数字」ってあるんで。
436432:02/07/30 20:56
更に間違えてた
4) char* roma[4][9] = { {略}, {略}, {略}, {"I", "II", "III", "IV", 略}};
  という配列と3)の結果を使ってローマ数字を表示する。
437430:02/07/30 20:56
438430:02/07/30 20:57
>>432
プログラム書いてください。
  彡 ビュー
     @@@@
    (゜д゜3
>>439
なんとなくそれっぽいものができたんですが、
ここでいきなり貼ったら教育的効果ゼロですかね。
441430:02/07/30 21:00
お願いします。
442manko_chinko ◆c2rpKRNM :02/07/30 21:01
>>441
エロ画像ください
443430:02/07/30 21:05
貼ってもらえませんか?自分には、解けそうにないんです。
444440:02/07/30 21:09
教育効果ゼロはいやなので、422 = 430 には少し課題を出したい気分。

まず、整数の入力を受け取り、
1000 未満でも 4000 以上でもないことを確認し
そのまま(ローマ数字に変換せず)画面に表示するコードくらい書いてみろ。

それがイヤならやっぱりエロ画像だな。
445430:02/07/30 21:24
>>430
やっぱり、わからないです。
>>445
わからないなりに何かやってみた?
もし何かやってみたのなら、そのコードを貼ってみれ。
447440:02/07/30 21:32
422 は学校の課題だとして、何かテキストがあったんだろう。
どんなテキストで、いままで何を習ってきたのか、
そのくらいは説明できないか?
448430:02/07/30 21:33
教えてください。
449ネタ:02/07/30 21:39
>>444 さて、何カ所間違いがあるでしょう?
void main(void)
{
int n;
scanf("%d", n);
if(1000 <= n < 4000) printf("%d\n", n);
}
450430:02/07/30 21:39
答えを聞いてるのに問題だされても・・・
Yとか使ったソースもらってて、学校の環境がUNIXとかで表示できなかったら
おもろいなぁ。つーか環境くらい書くもんだよ。>>430
プログラム書いてください。
お願いします。
やっぱり、わからないです。
教えてください。

マッシーンですか?
453デフォルトの名無しさん:02/07/30 21:42
さっさと終わらせろよ。
>>430
ここは
 宿題を「手伝う」スレッドです
宿題を答えるスレッドではありません。
>>422
できたよー

TABLE = {
  1 => 'I',
  5 => 'V',
  10 => 'X',
  50 => 'L',
  100 => 'C',
  500 => 'D',
  1000 => 'M',
  5000 => '',
  10000 => ''
}
  
def convert_one(value)
  value = value.to_i
  case value
  when 4
    '15'
  when 5
    '5'
  when 9
    '10'
  else
    if value < 4
      '1' * value
    elsif value < 9
      '5' + '1' * (value - 5)
    else
      raise
    end # if
  end # case
end # def

def int_to_roman(value)
  digit = 1
  result = []
  value.to_s.scan(/./).reverse.each do |d|
    result.push(convert_one(d).tr('150', "#{TABLE[digit]}#{TABLE[digit * 5]}#{TABLE[digit * 10]}"))
    digit *= 10
  end
  result.reverse.join
end # def

while line = gets
  value = line.to_i
  if value < 1000 || 4000 < value
    puts "1000〜4000の数字を入力しろや、な。"
  else
    puts int_to_roman(value)
  end # if
end

Rubyだけどな(w
参考にはなるんじゃないかな。
456デフォルトの名無しさん:02/07/30 21:47
複素数行列の積を求める関数と動作を確認するプログラムを作成せよ
行列積は、N*M行列とM*L行列の積を計算し、N*L行列を求める
ものである。
複素数は次の構造体型定義したcomplex型を用いる。また、複素数の和
、積を求める関数を作成し、それらを用いること。
typedef struct{
double re; /*実数部*/
double im; /*虚数部*/
}complex;
この問題がわかりません。よろしくお願いします。
ローマ数字はアルファベットの組み合わせで良いのか?
458デフォルトの名無しさん:02/07/30 21:52
宿題丸投げの場合はさ、学校・学部・学科・科目・先生の名前を書いてもらえると楽しいと思わない?
459430:02/07/30 21:53
>>457
読解力のない人ですか?
460デフォルトの名無しさん:02/07/30 21:55
>>430
すみません。読解力無いので、手伝えません。
そんなわけで、この宿題は終了〜。
>456
複素数値の入出力に関しては指定はないの?
「3.0 + 4.0 i」とか、「(3.0,4.0)」とか、これだけでも面倒。
それから、456 は(プログラムとは関係なしに)
行列の積の求め方とか、複素数についての知識とかはあるの?
>>422
できたけど。>>455では分からんのか?
>>461
禿道。
複素数や行列がわからないのか、structの意味がわからないのが、
プログラミングをしたことがないのか、
それがわからないと答えようがない。

答えそのものを書いちゃうって手はあるけどね。
>>422
#include <stdio.h>
main(){int n;struct{int c,n;}r[]={77,1000,68,500,67,100,76,50,88,10,86,5,73,1},
*p=r;for(scanf("%d",&n);n<3999&n>0;)n>=p->n?putchar(p->c),n-=p->n:p++;}
>>459 457は「ローマ数字は、[とか使うと環境依存なプログラムになって
やくにたたんときがあるけど、VIIIとしないでもいい環境なのか? 」って
意味だろ。
466デフォルトの名無しさん:02/07/30 22:02
>>422
>>455では、わからなかったです。
それと、430って名前いくつか騙られてるから、名無しのままにします
467デフォルトの名無しさん:02/07/30 22:04
>>466
どこまでわかって、どこがわからなかったのか、書け。
>>464
すげえ、アルゴリズムわかんねえ、とか思ってとりあえず実行してみたけど
これじゃダメじゃん(w
>>466
トリップつけれ
470デフォルトの名無しさん:02/07/30 22:08
466
ほとんど初めて見るのばっかです。
471デフォルトの名無しさん:02/07/30 22:09
トリップってなんでしょう?
472ともっち:02/07/30 22:09
実はともっちです。
473デフォルトの名無しさん:02/07/30 22:09
知るかいな!
474デフォルトの名無しさん:02/07/30 22:11
475200:02/07/30 22:15
>>418
コンパイルはできるんですが入力(00000011111100000のような)できません
476440:02/07/30 22:19
(特に解答者は)sage進行でいった方がいいと思うのは漏れだけ?

>422
432 のアイディアはぜんぜん参考にならない?
461 にも書いたけど、問題そのものがわからないのか、
それをプログラムにする段階でわからないのか、
そのくらいはハッキリしてくれないとどうにもならないし、
いくらなんでも18歳にもなればそのくらい答えられて当然でしょう。
477464:02/07/30 22:19
>>468 3999かな?4000ですよね。ボケてました。
478デフォルトの名無しさん:02/07/30 22:28
>>476
プログラムがわからないです。
>>478
なぜ、プログラムが分からないのに、プログラムの宿題があるの?
理解できない...。
480455:02/07/30 22:30
>>455でやってることを解説する。とりあえず何をすればプログラム作れるか理解してくれ。

まず一番下のwhileループから
・一行読み込んで、数字に変換し、入力チェックしている。
・条件に合えばint_to_roman関数を呼び出して整数値をローマ数字に変換している。

int_to_roman関数
・整数を受け取り、ローマ数字に変換する関数
・まず整数を一桁ずつに分解し、それぞれの桁について右側から
 「正規化したローマ数字表現」(後で解説する)を得る
・正規化したローマ数字表現を、その桁にあったローマ数字表現に変換する。
 たとえば、1の桁の場合、1->I、5->V、0->Xに置換する。
 10の桁だった場合は1->X、5→L、0->Cというふうに置換していく。
・これを一番左の桁に達するまで繰り返す
・得られたそれぞれの桁のローマ数字表現を結合して返す

convert_one関数
・一桁の整数を受け取り、「正規化したローマ数字表現」を返す。
・正規化したローマ数字表現とは、
 0 ->
 1 -> 1
 2 -> 11
 3 -> 111
 4 -> 15
 5 -> 5
 6 -> 51
 7 -> 511
 8 -> 5111
 9 -> 10
のようになっている(つか変にcaseとかで分けるより、テーブルから取り出したほうがよかったな)。

書いてはみたものの、わかりづらいなあ。日本語は難しいよ・・・
481440:02/07/30 22:30
>>464
コンパイルもしないで質問するけど、これって
4 を IV にしてくれないんじゃないですか?
>>479
出てない講義のレポートなんじゃねーの。
483デフォルトの名無しさん:02/07/30 22:31
英語でお願いします。
484440:02/07/30 22:31
>478
で、その、「プログラムがわからない」とは、
もっと具体的に説明できないの?
>>482
納得。それじゃどうしようもないね。終了?
>>477
いや、それもそうなんだけど、
たとえば、1004はMIVと表示しなければならないのに、
464のプログラムだとMIIIIになってしまう。
487464:02/07/30 22:35
>481
あひゃ!とうとう俺もボケ始めたらしい。さらば。
一人脱落。。。ラベル低いよ
489200:02/07/30 22:37
>>418
ありがとうござうました。コンパイルはできました。しかしうまくいきません
0000000000000000111100000000000000000
0000000000011111111111111000000000000
11,14,12
と実行されます。1行がでません。
490デフォルトの名無しさん:02/07/30 22:38
>>430
>>455以外の書き方でソース書いて下さい。
>>456
部分的に作ってみたよ。参考にしてね。
ただしコンパイルもしてみてないから間違ってるかもね。

void mul(struct complex *a, struct complex *b, struct complex *c, int n, int m, int l)
{
int i,j,k;
for(i=0;i<n;i++){
for(j=0;j<l;j++){
(c+i*l+j).re=0;
(c+i*l+j).im=0;
for(k=0;k<m;k++){
*(c+i*l+j)=addcomp(*(c+i*l+j),mulcomp(*(a+i*m+k),*(b+k*l+j));
}
}
}
}
492464:02/07/30 22:53
これで駄目なら…
#include <stdio.h>
main(){int(*p)()=putchar,n;struct{int c,n;}r[]={77,1000,68,500,67,100,76,50,88,
10,86,5,73,1,0,0},*t=r;for(scanf("%d",&n);n<4000&n>0;)n>=t->n?p(t->c),n-=t->n:t
->n==t[1].n*5&n>=t->n-t[1].n?p(t[1].c),p(t->c),n-=t->n+t[1].n:t++;}
>>492
ttp://www.ioccc.org/
にエントリすれ(w
>>492
妙な答えがでてきまつ。
495440:02/07/30 23:04
長すぎるってさ。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int *i = malloc(sizeof(int)),
j, k;

input_loop:
fscanf(stdin, "%d", i);
if (1000 > *i || *i > 0xf9f) goto input_loop;
j = *i;
free(i);

label1000:
if (j < 1000) goto label900;
putchar('M');
j = j - 1000;
goto label1000;
label900:
if (j < 900) goto label500;
putchar('C');
putchar('M');
for (k = 0; k < 900; ++k) --j;
label500:
if (j < 500) goto label400;
putchar('D');
j -= 500;
label400:
if (j < 400) goto label100;
putchar('C');
j = j- - -400;
putchar('D');
label100:
if (j < 100) goto label90;
putchar('C');
j = j - 100;
goto label100;

(次へ続く)
寝た方が良さそう。
497440:02/07/30 23:05
(前からの続き)

label90:
if (j < 90) goto label50;
putchar('X');
putchar('C');
j = j - 90;
label50:
if (j < 50) goto label40;
putchar('L');
j = j - 0x32;
label40:
if (j >= 40) {
putchar('X');
j -= 40;
putchar('L');
}
label10:
for (; j >= 10; j -= 10) putchar('X');
label9:
if (j != 9) goto label5;
(putchar('I')), j-=9, (putchar('X'));
label5:
if (j < 5) goto label4;
putchar('V');
j -= 5.0;
label4:
if (j == 4) putchar('I'), putchar('V');
else for (; j > 0; j--) putchar('I');

putchar('\n');
return 0;
}

仕様どおり動かないところがあったらじゃんじゃん指摘してくれ。
    うえーん 440がカコイイ!
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
            ∧_∧
          ( ´Д⊂ヽ
          ⊂    ノ
           人  Y
          し (_) ヤバスギル・・・
499デフォルトの名無しさん:02/07/30 23:09
>>491
ありがとうございます
一応、複素数、行列の考え方はわかってます。
出力は3.0 + 4.0 iのような形です。
複素数の積と和のプログラムはできたのですが
それを行列と組み合わせるのがわからないです。
よろしくお願いします。
500491:02/07/30 23:14
>>499
491が行列の積を求める部分だよ。積と和のプログラム
が出来たのなら関数名の部分を変えて、mainルーチンを
ちょちょっと書いてコンパイルすればいいのでは?
501440:02/07/30 23:20
>>498 サンクス! デモ デバッグガ タイヘン ダターヨ.
502デフォルトの名無しさん:02/07/30 23:25
#include <stdio.h>
#include <string.h>

int main(void)
{
int n;
char buf[1024] = "";
int i;

do scanf("%4d", &n);
while ((n > 4000) || (n < 1000));

for (i = n/1000; i--; )
strcat(buf, "M");
n %= 1000;

for (i = n/500; i--; )
strcat(buf, "D");
n %= 500;

for (i = n/100; i--; )
strcat(buf, "C");
n %= 100;

for (i = n/50; i--; )
strcat(buf, "L");
n %= 50;

for (i = n/10; i--; )
strcat(buf, "X");
n %= 10;

if ((n >= 1) && (n <=3))
for (i = 0; i < n; i++)
strcat(buf, "I");
if (n == 4)
strcat(buf, "IV");
if ((n >= 5) && (n <= 8)) {
strcat(buf, "V");
for (i = n-5; i--; )
strcat(buf, "I");
}
if (n == 9)
strcat(buf, "IX");

printf("%s", buf);

return 0;
}
503デフォルトの名無しさん:02/07/30 23:27
complex add(complex, complex);
complex mul(complex, complex);
を作って行列の計算するんじゃないの?

504440:02/07/30 23:36
>502
そのコードで 3444 を与えると結果はどうなる?
505デフォルトの名無しさん:02/07/30 23:39
MMMCCCCXXXXIVだが
MMMCDXLIVにするのか?
506440:02/07/30 23:41
>>495
数字の入力を受け付けてくれません。
ずっと入力待ちなんですが・・・。
508440:02/07/30 23:46
>507
とりあえず、OS とコンパイラの名称およびバージョン、
具体的なコンパイル・実行の手順について
少し詳しく書いてほしい。
手元では一応動いているので。
>>508
スマソ。ソースよく見たら1000未満は再入力だったのね。
できますた。
510デフォルトの名無しさん:02/07/30 23:51
#include <stdio.h>
#include <string.h>

void convert(char *buf, char *s, char *t, char *u, int n)
{
int i;

if ((n >= 1) && (n <=3))
for (i = 0; i < n; i++)
strcat(buf, s);
if (n == 4) {
strcat(buf, s);
strcat(buf, t);
}
if ((n >= 5) && (n <= 8)) {
strcat(buf, t);
for (i = n-5; i--; )
strcat(buf, s);
}
if (n == 9) {
strcat(buf, s);
strcat(buf, u);
}
}

int main(void)
{
int n;
char buf[1024] = "";
int i;

do scanf("%4d", &n);
while ((n > 4000) || (n < 1000));

for (i = n/1000; i--; )
strcat(buf, "M");
n %= 1000;

convert(buf, "C", "D", "M", n/100); n %= 100;
convert(buf, "X", "L", "C", n/10); n %= 10;
convert(buf, "I", "V", "X", n);

printf("%s", buf);

return 0;
}
511440:02/07/30 23:55
ナルホド。やっぱり再入力の時は「再入力しろやゴルァ」と表示すべきですかね。
その場合は

if (1000 > *i || *i > 0xf9f) {
fputs("再入力しろや(゚Д゚)ゴルァ\n", stdout);
goto input_loop;
}

と書き直せばいいはずです。
512464:02/07/31 00:03
やはり仕様はきちんと読まないと駄目ということで。
しかし完璧とはいえない。
あと>>440さん萌え。
#include <stdio.h>
main(){struct{int c,n;}r[]={77,1000,68,500,67,100,76,50,88,10,86,5,73,1,0,0},*t
=r;int(*p)()=putchar,n,i;while(scanf("%d",&n),n<0|n>3999);for(;n;)n>=t->n?p(t->
c),n-=t->n:(t->n==t[1].n*2&&(i=2)||t->n==t[1].n*5&&(i=1))&&n>=t->n-t[i].n?p(t[i
].c),p(t->c),n-=t->n-t[i].n:t++;}
ところで >422=430 は 495-497 を提出するのか?
514440:02/07/31 00:39
>464=512 ありがと。漏れも 464 のアイディアにはリスペクトしてもしきれない。
やっぱり「7行プログラミング」スレの出身者ですか?

>513 作者としてはぜひともそれを希望する。(w
とりあえずバグは未発見だから。

ところで、>440 で発表しようとしていたコードは
もう発表する必要なしですかね。
>432 さんのアイディアほぼそのままなので無用でしょうか。

なんか 495-497 を書いてからナチュラル・ハイになってきた。
515デフォルトの名無しさん:02/07/31 01:01
 3余り符号は、2進化10進符号に3を加えて得られる符号である。各符号は、次のような値をとる。

0=0011  1=0100  2=0101  3=0110  4=0111
5=1000  6=1001  7=1010  8=1011  9=1100

この符号を用いると、各桁の1と0を入れ替えたものが9の補数になる。
そこで、3桁の整数を読み込んで、3余り符号とその補数をプリントするプログラムを以下の方法で作製せよ。

(1)3桁の整数をユーザーに入力させて、それを変数xに代入します。

(2)10で割った商と余りを利用して、xを3つの整数に分離します。

(3)それぞれの整数を3余り符号変換して表示せよ。2次元配列a[10][4]の中に
   それぞれの数の3余り符号符号を0や1で0入れておくと便利です。

(4)9の補数を求めたい数字と配列を引数として、9の補数をプリントする関数
   を作製せよ。たとえば1の補数は8で、各桁の1と0を入れ替えた数になって
   います。

(5)上の(4)で作製した関数を用いて、3余り符号の補数を2進数でプリントせよ。

条件
 1.9の補数を求めたい数字と配列を引数として、9の補数をプリントする部分を関数に
   すること。

友達に聞いても誰もわかりませんでした。どうかこの問題を解いてください。お願いします。
デジャブ?
517464:02/07/31 01:11
>514
もちろん七行スレ出身、七行スレ育ちでチャキチャキの酔っ払いです(w
どうも夜になると頭が回らなくなるね。
518432:02/07/31 01:12
>>514
440さんおつかれでした。
なんか私がコードを書き始める前に、>>440 の書き込みがあったので、
完全におまかせモードに入っていました。
519デフォルトの名無しさん:02/07/31 01:15
問題を教えてもらおうとして、
問題を書いたのですが、改行が多すぎますといわれて
載せれません。どうしたらいいでしょうか?
520 :02/07/31 01:24
>>519
改行を減らせ。
>>515
例えば 345 と入力されたらどう表示されるの?

あと言語は?
5228クイン:02/07/31 01:30
問題は下のプログラムをすべての解を表示するようにする事です。
ただし、点対称・線対称の解は排除します。
では、よろしくお願いします。
#include <stdio.h>
#define N 8
void show(int board[])
{int i, j;
for(i = 0; i < N; i++) {
for (j = 0; j < N; j++) {putchar('+');putchar('-');putchar('-'); }
putchar('+');putchar('\n');

for (j = 0; j < N; j++) {putchar('|');
if (board[i] == j)
printf("★");
else
printf(" "); }
putchar('|');
putchar('\n'); }

for (j = 0; j < N; j++) {
putchar('+');putchar('-');putchar('-'); }putchar('+');putchar('\n');
exit(0);}
void solve(int board[], int n)
{ int i, j;

if (n == N) {
show(board);
}

for (i = 0; i < N; i++) {
for (j = 0; j < n; j++) {
if (board[j] == i)
goto cont;
if (board[j] - i == n - j)
goto cont;
if (i - board[j] == n - j)
goto cont;
}
board[n] = i;
solve(board, n + 1);

cont:; }}
int main(void)
{
int board[N];
int i;

for (i = 0; i < N; i++) {
board[i] = 0;
}

solve(board, 0);

exit(0);}
>>519

>>216 使えはよろし。
>>522
いったい何の授業の宿題なんだ。
5258クイン:02/07/31 01:37
>>524
C言語のプログラムの授業です。
8女王問題!
昔 MSX-FAN で高速なアルゴリズムを募集してたなー。
Z80 程度のおもちゃ(今では)であっさり答えが出てきたのには感動した。
527デフォルトの名無しさん:02/07/31 01:44
N王妃問題なら、
「C言語による最新アルゴリズム辞典」
に載ってるのでそれ参照。
8クイーンのソースなんてさまざまな言語であちこちに落ちてるだろ・・・
529515:02/07/31 01:59
>>521
c言語です。すみませんが自分もあまり問題が理解できていません。
530440:02/07/31 02:04
>518=432 ありがと!

それでは 432 さんのアイディアをもとにした
まともなコードをここに貼って、わたくしはまた名無しに戻ります。
(といいつつ、440 の時点よりコードがさらに進化している)

#include <stdio.h>

static const char *roma[4][10] = {
{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
{"", "M", "MM", "MMM"}
};

int main(void)
{
int i, arabic, digits[4];

for (;;) {
scanf("%d", &arabic);
if (1000 <= arabic && arabic < 4000)
break;
fprintf(stderr, "value must be in [1000,4000).\n");
}

for (i = 0; i < 4; ++i) {
digits[i] = arabic % 10;
arabic /= 10;
}

for (i = 3; i >=0; --i) {
printf(roma[i][digits[i]]);
}
putchar('\n');
return 0;
}
5318クイン:02/07/31 02:08
>>528
それはそうなんですが、理解できないうえに
与えたものを改良しろという問題なので・・・
すいません。
532521:02/07/31 02:27
>>529
その辺わかっていないと嘘教えられると困るよ。
問題文もまぎらわしいけど。

んじゃ、345 が入力されたら、
011001111000 3余り符号
100110000111 3余り符号の補数
と表示されるって解釈で話を進めるよ。

っていっても >>530 と似たようなプログラムになるはずなので、
まずこれを読んだ上での感想やわからない点などを
いってくれ。
533529:02/07/31 02:39
>>521
530のプログラムを見ましたが理解できませんでした。そちらの解釈通りで結構なので
プログラムを進めて下さい。お願いします。
>>522と全く同じ課題、ソースを持っている。
こんなとこで訊いてんじゃねえボケ。検索すればすぐ見つかるだろうが。
>>534
そういうときは黙って見守って、あとでコソーリ教官に報告しておくものだよ。
どうせこのスレは丸投げ厨にはまともな答えを返さないから。
536521:02/07/31 03:19
>>533
マルチしてんじゃん。せっかく対応してるのに…
なんかやる気失せた。
途中だけど、貼り付けてあげるからあとやれ。
537521:02/07/31 03:20
#include <stdio.h>

static const int a[10][4] = {
{ 0, 0, 1, 1 }, { 0, 1, 0, 0 }, { 0, 1, 0, 1 }, { 0, 1, 1, 0 }, { 0, 1, 1, 1 },
{ 1, 0, 0, 0 }, { 1, 0, 0, 1 }, { 1, 0, 1, 0 }, { 1, 0, 1, 1 }, { 1, 1, 0, 0 }
};

void print_fugo(int x, const int a[10][4])
{
int i, j, digits[3];
for (i = 0; i < 3; ++i) {
digits[i] = x % 10;
x /= 10;
}
for (i = 2; i >=0; --i) {
for (j = 0; j < 4; j++) {
putchar('0' + a[digits[i]][j]);
}
}
putchar('\n');
}

void print_hosu(int x, const int a[10][4])
{
int i, j, digits[3];
for (i = 0; i < 3; ++i) {
digits[i] = x % 10;
x /= 10;
}
for (i = 2; i >=0; --i) {
for (j = 0; j < 4; j++) {
putchar('0' + 1 - a[digits[i]][j]);
}
}
putchar('\n');
}

int main(void)
{
int x;
for (;;) {
scanf("%d", &x);
if (100 <= x && x <= 999)
break;
fprintf(stderr, "value must be in [100,999].\n");
}
print_fugo(x, a);
print_hosu(x, a);
return 0;
}
~
538Rina ◆tI333vNE :02/07/31 03:26
なんだかんだ言って, 今までやった分を張り付けてあげるところが
優しいねw
539515:02/07/31 03:33
>>529ありがとうございました。
540デフォルトの名無しさん:02/07/31 04:50
#include <stdio.h>

void convert(char c1, char c5, char c10, int n)
{
int i;

if ((n >= 1) && (n <=3))
for (i = 0; i < n; i++)
putchar(c1);
if (n == 4) {
putchar(c1);
putchar(c5);
}
if ((n >= 5) && (n <= 8)) {
putchar(c5);
for (i = n-5; i--; )
putchar(c1);
}
if (n == 9) {
putchar(c1);
putchar(c10);
}
}

int main(void)
{
int n;
int i;

while (scanf("%d", &n), (n > 4000) || (n < 1000))
printf("?");

for (i = n/1000; i--; )
putchar('M');
n %= 1000;

convert('C', 'D', 'M', n/100); n %= 100;
convert('X', 'L', 'C', n/10); n %= 10;
convert('I', 'V', 'X', n);

return 0;
}
541デフォルトの名無しさん:02/07/31 06:58
>>499
複素数の積と和はできたって言うけど、
Cスレで教えてもらったんじゃん。正直に言いなよ。
>>515
>>537 の方が条件に沿って作られている。
深夜の0時ごろにレスがぽんぽんつくわけないっつーのに。
#include <stdio.h>
void hyouji(int n,int i){
    if(i < 3)
        hyouji(n>>1,i+1);
    putchar('0'+(n&1));
}
void amari(int n){
    if(n/10)
        amari(n/10);
    hyouji(n%10+3,0);
    putchar(' ');
}
void hosu(int n,int a[]){
    if(n/10)
        hosu(n/10,a);
    hyouji(~(n%10+3),0);
    putchar(' ');
}
int main(int x, char *argv[]){
    do{
        puts("3桁の整数を入力してください");
        scanf("%d",&x);
    }while(x>999||x<100);
    puts("3余り符号は");
    amari(x);
    puts("\n3余り符号の補数は");
    hosu(x,(int*)*argv);
    return 0;
}
543デフォルトの名無しさん:02/07/31 08:13
#include <stdio.h>

char *a[] = { "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", };
int x[3];

int main(void)
{
int n, i;

do {
puts("三ケタの数字を入力してください");
scanf("%d", &n);
} while ((n > 999) || (n < 100));

for (i = 3; i--; n /= 10)
x[i] = n % 10;

for (i = 0; i < 3; i++)
printf("%s", a[x[i]]);
printf("\n");

for (i = 0; i < 3; i++) {
char *s = a[x[i]];
for (; *s; s++)
putchar((*s == '0') ? '1' : '0');
}

return 0;
}
544デフォルトの名無しさん:02/07/31 08:31
#include <stdio.h>

static const int a[10][4] = {
{ 0, 0, 1, 1 }, { 0, 1, 0, 0 }, { 0, 1, 0, 1 }, { 0, 1, 1, 0 }, { 0, 1, 1, 1 },
{ 1, 0, 0, 0 }, { 1, 0, 0, 1 }, { 1, 0, 1, 0 }, { 1, 0, 1, 1 }, { 1, 1, 0, 0 }
};
int x[3];

void print_fugo(int x)
{
int i;

for (i = 0; i < 4; i++)
putchar(a[x][i] ? '1' : '0');
}

void print_hosu(int x)
{
int i;

for (i = 0; i < 4; i++)
putchar(a[x][i] ? '0' : '1');
}

int main(void)
{
int n, i;

do {
puts("三ケタの数字を入力してください");
scanf("%d", &n);
} while ((n > 999) || (n < 100));

for (i = 3; i--; n /= 10)
x[i] = n % 10;

for (i = 0; i < 3; i++)
print_fugo(x[i]);
printf("\n");

for (i = 0; i < 3; i++)
print_hosu(x[i]);
printf("\n");

return 0;
}
545デフォルトの名無しさん:02/07/31 08:43
#include <stdio.h>

void print_fugo(int x)
{
int i = 4;

for (x += 3; i--; x <<= 1)
putchar((x & 8) ? '1' : '0');
}

void print_hosu(int x)
{
int i = 4;

for (x += 3; i--; x <<= 1)
putchar((x & 8) ? '0' : '1');
}

int main(void)
{
int n, i, x[3];

do {
puts("三ケタの数字を入力してください");
scanf("%d", &n);
} while ((n > 999) || (n < 100));

for (i = 3; i--; n /= 10)
x[i] = n % 10;

for (i = 0; i < 3; i++)
print_fugo(x[i]);
printf("\n");

for (i = 0; i < 3; i++)
print_hosu(x[i]);
printf("\n");

return 0;
}
546デフォルトの名無しさん:02/07/31 09:03
デバッグエラーがでます。何でですか?

typedef int (*PP_RECV)(SOCKET , char FAR * , int , int );
PP_RECV dd_recv;
HINSTANCE h_original;

int WINAPI d_recv(SOCKET s, char FAR * buf, int len, int flags){
   int int_buf=0;

   h_original = LoadLibrary( "c:\\windows\\system\\WSOCK32.DLL" );
   dd_recv = (PP_RECV)GetProcAddress( h_original, "recv" );

   int_buf =(*dd_recv)(s, buf,len, flags); //ここでデバッグエラーになる。

   FreeLibrary( h_original );
   return int_buf;
}
dd_recvが正しくないとか
>>546
ちゃんとエラーチェックせいや
549デフォルトの名無しさん:02/07/31 10:05
どこのエラーチェックですか?
夏はバカが増えるなぁ。
あーウザッ。
typedef int (*PP_RECV)(SOCKET , char FAR * , int , int );
ここ間違ってるとか
552デフォルトの名無しさん:02/07/31 10:40
typedef int (WINAPI *PP_RECV)(SOCKET , char FAR * , int , int );
553デフォルトの名無しさん:02/07/31 10:53
>>552
できました。
ありがとうございました。
554デフォルトの名無しさん:02/07/31 11:04
解説
ふつうのCの関数はcdeclだけど、APIはstdcallです。
WINAPIはstdcallになってます。

cdecl は、引数渡しに使ったスタックを呼び出した側がクリア。
stdcall は、引数渡しに使ったスタックは呼び出された側がクリア。

dd_recv = (PP_RECV)GetProcAddress( h_original, "recv" );
で(PP_RECV)はずすとコンパイルエラーださない?
555デフォルトの名無しさん:02/07/31 11:26
>>554
でます。
556521:02/07/31 12:38
ねらいがはずれた模様。

>>539
最後の最後まで失礼な奴…
557デフォルトの名無しさん:02/07/31 14:56
ラインエディタを改良する課題をやってます。(C言語)
ラインエディタ自体はソースがあります。
機能として
w:保存
q:終了
n:次のファイルへ
a:現在の行の後に行を追加
i:現在の行の前に行を挿入
d:行を削除
p:行を移動
-:前の行を表示
リターンのみ:次の行を表示

これに「3,10d」と入力すると
3行目から10行目までを削除する機能を付けるという課題です。
ようするにこの「3」と「10」をわけて受け取りたいのですが、そのへんがよくわかりません。
ここらへんをいじればいいと思われる所のソースを載せます。

char cbuf[256];
char *p;
int n;

*a = -1;
if (fgets(cbuf), 256, stdin)==NULL)
return(NULL);
p = cbuf;
if (isdigit(*p)) {
for (n = 0; isdigit(*p); p++) ←ここからがよくわかりません。
n = n * 10 + (*p - '0');  ←特にここ
*a = n;
}

コマンドをcbufに読み込んでその後の処理です。
あぁ、説明もあってるのか?(汗

的外れじゃないことを祈りつつよろしくお願いします。
>>557
そりゃ数字の文字列を整数にする処理だ。
終わった後が","かどうかとかやればできるんじゃないの?
559Rina ◆tI333vNE :02/07/31 15:10
一文字ずつ読み込んでるんじゃない?
int n;
char *p = "234";

for(n = 0 ; isdigit(*p) ; p++) {
printf("*p = \'%c\'\n", *p);
printf(" n = %d (before)\n", n);

n = n * 10 + (*p - '0');

printf(" n = %d (after)\n\n", n);
}
こんなコードを書いたら何やってるか分かると思う.
>>557
> n = n * 10 + (*p - '0');  ←特にここ
2つに分解して考えてみよう。
tmp = (*p - '0'); ←1文字を数値に変換する
n = n * 10 + tmp; ←nを10倍し、変換した数値を足す。
つまり「123」という文字列が来た場合
    tmp  n
1回目:1   1
2回目:2   12
3回目:3   123

となる。
>>557
始めにある程度分析しておかないと行き詰まるぞ。
dに関しては「3,10d」という入力例が出ているからいいけど、
他の機能がどう入力されるか予め明らかにしておいた方がいいぞ。
562デフォルトの名無しさん:02/07/31 15:27
#include <stdio.h>
#define IN 1;
#define OUT 0;

main()
{
int c, flag, nc;

flag = OUT;
nc = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\n' || c == '\t') {
if (flag == IN) {
flag = OUT;
}
}
else {
flag = IN;
nc++;
}
}

printf("%d\n", nc);
getchar();
}

↑これ、エラーでるんですけど、なんで?
見て分かると思いますが、C言語
なんでdefineにセミコロンが?
564デフォルトの名無しさん:02/07/31 15:32
>>563
サンキュー&ソーリー
ボクは糞でした(;´Д`)
>>562
おそらく
> #define IN 1;
> #define OUT 0;
で最後にセミコロンが入っているからだろうが
エラーメッセージぐらい書け。

あと、そのソースならflagは必要ないだろ?
continueを使えばもっとすっきり書けるはずだ。
566デフォルトの名無しさん :02/07/31 15:43
はじめまして、オラクル製品FORMSに関する質問です。
画面を移動する際、変数を渡したいのですが、どのように渡したらよいのか
わかりません。
グローバル変数ではなく、パラメーターを使って
との事なのですが、
パラメーターリストを作ることまではできたのですが、
そのパラメーターリストをどう使っていいのか
わかりません。

わかる方教えてください・・・(涙)
かわった宿題だなぁ
568デフォルトの名無しさん:02/07/31 15:47
>567
会社の研修用の宿題なんです(涙)
できなくて、ほんと泣いてます・・・。
569557:02/07/31 15:48
>>558-561
どうもありがとうございます!理解できました。
あとは自分でがんばってみます。
でも課題があと2つあるので、行き詰まったらまたお願いします。
570562:02/07/31 15:53
皆さん、ありがとうございます!宿題できました!

#include <stdio.h>
#define IN 1
#define OUT 0

main()
{
int c, flag, nc, i;
int dim[80];

for (i = 0; i < 80; i++) {
dim[i] = 0;
}

flag = OUT;
nc = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\n' || c == '\t') {
if (flag == IN) {
flag = OUT;
dim[nc + 1]++;
nc = 0;
}
}
else {
if (flag == OUT) {
flag = IN;
}else {
nc++;
}
}
}

for (i = 0; i < 80; i++) {
printf("%2d文字の単語 = %d\n", i, dim[i]);
}
getchar();
}
>570
別に貼らんでも。
572デフォルトの名無しさん:02/07/31 16:04
>566
たぶん、ウィンドウプロシージャみたいなのがあるでないの?
イベント割り込みみたいなー
573566:02/07/31 16:08
>572
どうなんでしょう?(すいません初心者なんでよくわからないんです・・・)

一応、ソース書いておいてみます。
DECLARE
PL_ID PARAMLIST;
PL_NAME VARCHAR2(10):='AA';
BEGIN

PL_ID:=CREATE_PARAMETER_LIST(PL_NAME);
ADD_PARAMETER(PL_ID,'BB',TEXT_PARAMETER,'CC');
CALL_FORM('MODULE4');
END;
574デフォルトの名無しさん:02/07/31 16:22
ねぇねぇ〜、ヒストグラムってなにさ?
詳しく教えてくれ。
>>574
折れ線グラフ
576572:02/07/31 16:26
>573
それって、変数定義してだけだろ????

いや、オラクルやったことないから分からんけど、
>画面を移動する際、変数を渡したいのですが、どのように渡したらよいのか
>わかりません。
画面を移動したり、キャレットがテキストボックスに表示されたりすると、
イベントが発生して、それをうけとるんじゃないの?
ORACLEのHPから、ドキュメントが見れるから、それ見れば?
ttp://otn.oracle.co.jp/document/products/forms/
これぐらい、自分で探せると思われ。
577557:02/07/31 16:44
すいません、さっそく。
>>557で書いた関数(command())の戻り値が*aなんですけど、この後この関数の戻り値で
行指定があったかどうかを判別してます。

cp = command(&a_no)
if (a_no > 0)

cpはswitch()に渡してます。(コマンド判別)

戻り値を引数にしてる???
ちなみに「3d」のような行指定は標準装備です。
わけわからんくなってきた・・・
578566:02/07/31 16:47
>576
もちろん、リファレンスは見てるのですが、
その解釈もできなくて・・・(涙)
イベントはcall_formで発生はさせています。
変数(とは違うと思うけど、この場合パラメータ)は宣言してるだけ
っていうのはわかってるんですが、
それをどう使っていいのかがわからないのです。
>>577
こっちも全然わからないんだが…

関数commandの定義はどうなってる?
char* command(int* a) てな感じ?

「3d」と入力された場合と、「3,10d」と入力された場合とで、
cp と a_no の内容はどうなる?
580557:02/07/31 18:44
>>579
char *cp;
int a_no;
「3d」の場合
char *command(int *);
cp = command(&a_no)
a_no = 3
cp=d
です。とりあえず、課題はクリアできそうです。バグだらけだけど・・・
「3,10d」の場合、(char *command int *a, int *b)
a_noとb_noにそれぞれ3と10が入るようにしました。
cpには「d」が入ります。(cp = command(&a_no, b_no)

command(&a_no)はいまだにわかりません。
>>580
cp = command(&a_no, &b_no)
こうじゃないのか。

>>557 の *a っていうのがどういうものかは
わかってる?
582557:02/07/31 19:07
>>581
>cp = command(&a_no, &b_no)
そうです。間違えました。

command関数の*aがcommand(&a_no)の&a_noにアドレスとして戻ってくるんですよね?あってます?
その&a_noをcommand()に引数として渡すということじゃないんですか?
ここが、ループ?って感じでわからないんです。
command関数で「3d」などのコマンドを標準入力から受けているので引数いらないですよね?
583デフォルトの名無しさん:02/07/31 19:22
>>418。もう一度挑戦してくれなせんか。
#include <stdio.h>

static void print_a(const char *a, size_t size)
{
 char state = a[0];
 int i = 1, count = 1;

 for (i = 1; i < size; i++){
  if (a[i] != state) {
   printf("%d,", count);
   state = a[i];
   count = 1;
  }
  else{
   count++;
  }
 }
 if(size){
  printf("%d,\n",count);
 }
 else{
  printf("\n");
 }
}

int main(int argc, char * argv[])
{
char a[38];
int i = 0, ch;

while ((ch = getchar()) != EOF) {
if (ch == '\n') {
print_a(a, i);
i = 0;
}
else {
a[i++] = ch;
}
}
if (i) {
print_a(a, i);
}
return 0;
}
コンパイルはできました。しかしうまくいきません
0000000000000000111100000000000000000
0000000000011111111111111000000000000
11,14,12
と実行されます。1行がでません。
584デフォルトの名無しさん:02/07/31 19:51
これは
1111110000011111
みたいなのはどうするの?
0,6,5,5
って出さなくていいの?
>>580
今すぐにとは言わんけど、ポインタの勉強したほうがいいかも。

ところで、完成したプログラムは"10,3d"とか入力しても平気?
"3,5d"とかやると、3,5,7行目が消えたりしない?(藁
586デフォルトの名無しさん:02/07/31 19:56
>>582
ちょっと飯食ってた。

> command関数の*aがcommand(&a_no)の&a_noにアドレスとして戻ってくるんですよね?あってます?

一番わかっていなさそうなのがこの辺だと思う。

戻ってはこない。あくまでも渡す。
何を渡すかというと &a_no つまり変数a_noのアドレス(位置)を渡している。

そこにある箱の中に行指定を入れといてくれやという感じ。

これでもわからなかったいってくれ。
588557:02/07/31 20:10
>>585
ズバリです!これだけの情報でそこまでわかるんですか!?
嗚呼、なんてアホな俺。課題の提出は明日。ハァ・・・
急にヤル気がなく(以下略
589584:02/07/31 20:13
うちではこれで動いたよ。
#include <stdio.h>

static void print_a(const char *a, size_t size)
{
char state = a[0];
int i = 1, count = 1;

if (a[0] != '0') printf("0,");

for (; i < size; i++) {
if (a[i] != state) {
printf("%d,", count);
state = a[i];
count = 1;
} else {
count++;
}
}
if(size){
printf("%d,\n",count);
} else{
printf("\n");
}
}

int main(int argc, char * argv[])
{
char a[38];
int i = 0, ch;

while ((ch = getchar()) != EOF) {
if (ch == '\n') {
print_a(a, i);
i = 0;
} else {
a[i++] = ch;
}
}
if (i) {
print_a(a, i);
}
return 0;
}
5908クイン:02/07/31 20:14
>>586
ほんとうにありがとうございました。
>>583
#include <stdio.h>
main(){int c,n=1,i=0;while((c=getchar())-EOF)c-'0'!=i?printf("%d",n),i=1-i,n=1,
putchar(c-'\n'?',':(i=0,'\n')):n++;}
592557:02/07/31 20:14
>>587
アドレスを確保しとくから処理が終わったらここに(&a_no)にいれてくれ
ってことですか?
うぅ、一回寝ようかな?頭回らなくなってきたし、座りっぱなでケツが痛ひ
>>592
処理が終わったらでなく、入れるタイミングはcommand()の方におまかせ。
今回の場合、command()の *a = -1; や *a = n; で a_no に -1 や nの値が入る。
594557:02/07/31 20:46
>>592
なるほど、わかったようなわからんような・・・うーむ

>>585
そこっ!そこさえわかれば。
どこでわかるんですか?
595585:02/07/31 20:54
>>594
全部で8行のテキストに対して"3,5d"だとすると
12345678
↓3行目を消す
1245678
↓4行目を消す
124678
↓5行目を消す
12468(マズー)
分かる?で、

12345678
5行目を消す
1234678
4行目を消す
123678
3行目を消す
12678(ウマー!)
後の行から消せばいい
3行目を3回消すって手もある
596デフォルトの名無しさん:02/07/31 20:57
for (i = 0; i < b-a; )
del(a);

for (i = a; i < b; i++)
del(i);

delは行を詰めるから、この二つは別もの。
597557:02/07/31 21:04
>>595
うおぉぉぉ!できたっ!!
ありがとうございます!

では、また次の課題でくるかもしれません。と言うかくるでしょうw
バイトいってきます。 イツネヨウカナァ
598585:02/07/31 21:25
>>597
この慌てぶりだと、今度は"3d"が機能しなくなってたりして…
599585:02/07/31 21:42
>>589
あなたの環境はなんですか?
600583:02/07/31 21:49
>>584
6,5,5でいいですよ
601589:02/07/31 22:18
>>599
bccです。

>>600
じゃあ、
if (a[0] != '0') printf("0,");
のところ消しといて。
602601:02/08/01 00:05
>>601
やっぱりできないです
>>591
それはなんですか?
603499:02/08/01 01:54
>>541
複素数の積と和は「C言語なら俺に聞け」で聞いてできるようになりました。
そこで教わった
complex add(complex alpha, complex beta)
{
complex gamma;
gamma.re = alpha.re + beta.re;
gamma.im = alpha.im + beta.im;
return gamma;
}

complex mul(complex alpha, complex beta)
{
complex gamma;
gamma.re = alpha.re*beta.re - alpha.im*beta.im;
gamma.im = alpha.im*beta.re + alpha.re*beta.im;
return gamma;
}
>>491で教わった関数を組み合わせてmain関数をどのように書けばいいのか
わかりません。よろしくお願いします。
604 :02/08/01 02:06
>>603
理解していないものを「できるようになった」とは言わないんじゃない?
605デフォルトの名無しさん:02/08/01 02:21
行列を入力して、計算して出力すればいいだけでは?
合ってるかどうか知らんぞ。

#include <stdio.h>

struct complex {
double re;
double im;
};

complex add(complex alpha, complex beta);
complex mul(complex alpha, complex beta);
void mat_mul(complex a[][2], complex b[][2], complex c[][2]);
void print_mat(complex a[][2], char *str);

int main(void)
{
struct complex a[][2] = {{{1.0, 1.0}, {2.0, 1.0}}, {{-1.0, 1.0}, {1.0, -1.0}}};
struct complex b[][2] = {{{3.0,-1.0}, {-1.0,1.0}}, {{ 1.0, 2.0}, {-2.0, 3.0}}};
struct complex c[2][2];

print_mat(a, "a");
print_mat(b, "b");

mat_mul(a, b, c);

print_mat(c, "a * b");
return 0;
}
void mat_mul(complex a[][2], complex b[][2], complex c[][2])
{
int i, j, k;
struct complex s, t;

for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++) {
s.re = s.im = 0.0;
for (k = 0; k < 2; k++) {
t = mul(a[i][k], b[k][j]);
s = add(s, t);
}
c[i][j] = s;
}
}

void print_mat(complex a[][2], char *str)
{
int i, j;

printf("%s = \n", str);
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
printf("%+f + %+fi ", a[i][j].re, a[i][j].im);
printf("\n");
}
}
void mat_mul(complex a[][2], complex b[][2], complex c[][2])
{
int i, j, k;
struct complex s, t;

for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++) {
s.re = s.im = 0.0;
for (k = 0; k < 2; k++) {
t = mul(a[i][k], b[k][j]);
s = add(s, t);
}
c[i][j] = s;
}
}

void print_mat(complex a[][2], char *str)
{
int i, j;

printf("%s = \n", str);
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
printf("%+f + %+fi ", a[i][j].re, a[i][j].im);
printf("\n");
}
}
スマソ。>>608はナシ。

complex add(complex alpha, complex beta)
{
complex gamma;

gamma.re = alpha.re + beta.re;
gamma.im = alpha.im + beta.im;

return gamma;
}

complex mul(complex alpha, complex beta)
{
complex gamma;

gamma.re = alpha.re*beta.re - alpha.im*beta.im;
gamma.im = alpha.im*beta.re + alpha.re*beta.im;

return gamma;
}
>>606-609
complexの前に全部structキーワードを付けてくれ。
>>610
それよりは
struct complex {
double re;
double im;
};

typedef struct {
double re;
double im;
} complex;
にすべきであろう。
612sucka:02/08/01 07:26
javacsripts, xml, xsl, htmlなどを使ったプログラム
ってどういうのがやりやすいでしょうか?
上の物を使って自由にプログラムしろって言われても・・・・なんですよ。
よきアドバイスもとむ。
613デフォルトの名無しさん:02/08/01 07:38
>>612
どれくらいの難易度のものを作ればいいのかよく分からんが、
html+javascriptでグラフィカルな電卓というのはどうだ。
614sucka:02/08/01 08:00
難易度は易しめ。xml、xslとか習って2ヶ月程度。
グラフィカルな電卓って言うと?
ってかどっかにXMLとJavascriptsのプログラミング
のexampleみたいなのないのかな。参考にしてー
615557:02/08/01 09:55
>>598
はい、"3d"なくなってました。なんか手のひらで弄ばれてる感じだw
一応それもクリアしました。

次は行指定じゃなく /単語/で検索後に処理ができるようにします。
/abc/p
で"abc"を含む行を表示。"d"についても同じです。
とりあえず、今からやってみますけどなんかヒントがあったらお願いします。

提出まであと7時間・・・
>>602
ちょっと3行でテストしてみてくれないか?
たぶん最後の1行鹿結果がでてこないと思うぞ。
もしそうならmainのなかをもう一度確認してごらん。
>>602
というか環境は何よ?
Cmachineなら今すぐやめな。
618557:02/08/01 11:39
>>615の/文字列/で文字列の取り出し方がよくわかりません。
どなたか教えてください。よろしくお願いします。
>>618
まぁ手抜きなんだけど。
if (strstr(行, 文字列) == NULL) {
 /* 見つからなかった */
} else {
 /* 見つかった */
}
620619:02/08/01 12:20
>>618
あれ、解釈みすったかな?

> /文字列/で文字列の取り出し方

i = 0;
while ("/文字列/"[i + 1] != '\0') {
 if ("/文字列/"[i + 1] == '/') break;
 buffer[i] = "/文字列/"[i + 1];
 i++;
}
buffer[i] = '\0';
621557:02/08/01 12:27
>>619
その前の処理がわからないんです。
コマンドラインかで
/任意の文字列/p
と入力したとき、コマンドから文字列を取り出してその後>>619の処理ですよね?
command()は>>557です。ここのcbufなりpから文字列だけを取り出したいのです。
>>621
なんか下手に改造するよりも、edのソースを(以下略)
623557:02/08/01 12:33
いちおう
if (*p == '/'){
++p;
while (*p != '/')
*str++ = *p++;
*str = '\0';
}
でやってみたんですができません。あと
/文字列
のように、/でくくるのを忘れた時の処理にも迷ってます。
処理としては間違ってないような
if (*p == '/'){
  ++p;
  while (*p != '/' && *p != '\n' && *p != '\0')
    *str++ = *p++;
  *str = '\0';
}
とでもすれば間違って読みすぎることは無いかな。
あとstrの中はどうなってる?printしてみれ
625557:02/08/01 12:51
>>624
何も入ってないです。しかも普通の動作もおかしくなりました。
うぅっ、あと4時間・・・
strはどう確保してる?
その周りのソースを貼れるかい?
その部分をはずしたら動作は戻るのかい?
てかifぶんの後にelseをつけてないとか。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433
628557:02/08/01 13:04
/abcd/を入力
p=abcd/ ,str=a"
p=bcd/ , str="
p=cd/, str="
p=d/, str=d"

どういうことでしょう?
まさかstr++していって、最初のポインタを保存してないってことはないよな。
630557:02/08/01 13:09
>>626
確保と言いますと?char *strですか?

>>627
そこはまだ考えてないので後で考えます。
とりあえずstrの挙動がわからないです。
if (*p == '/'){
  char *a = str;
  ++p;
  while (*p != '/' && *p != '\n' && *p != '\0')
    *a++ = *p++;
  *a = '\0';
}
どうだ?
632557:02/08/01 13:17
どこか根本的に間違ってる気がしてきた
633557:02/08/01 13:21
>>631
できました!ありがとうございます。
>char *a = str;
これが確保ということですか?
strを
char *str = malloc(256);
などと確保しておいて
その下に
char *a = str;
とすればaをいくらいじってもstrは変わらん。

strを書き換えると後で使うときになってそんな風になって非常に困る。
あ、確保ってのは
str[256]とかstr = malloc(256)とかね。
char *a = strってのは確保ではないな。
636499:02/08/01 14:21
>>606-611
stroage size of "a" isint known
っていうエラーがでるんですが、これはどういう意味なんでしょうか?
>>499
a[][2]では配列のサイズが確定できないということ。
配列の要素数を省略できるのは一番最後だけのはずなので、きちんと要素数を宣言すればいいよ。
桶?
638499:02/08/01 14:36
>>637
ありがとうございます。試してみます
639499:02/08/01 14:40
>>637
すいません、要素数の宣言とはa[][2]を例えばa[2][2]とかにすれば
いいということですか?
640637:02/08/01 14:44
ごめん、嘘だ。
正しくは最初だけが省略できる。
逝ってくる。
641499:02/08/01 14:54
>>640
あ、そうなんですか、そうなると
エラー stroage size of "a" isn't known
はどうしたらいいかまったくわからなくなってしまった。
>>641
そのエラーはソースのどのあたりで出てる?
>>499
ためしにやってみた。
構造体の宣言を

typedef struct {
double re;
double im;
} complex;

に変更とのこりのstructを全部取っただけで動いたけど?
>>643
うちでも動いた。
コンパイラは、

% gcc -v
Using builtin specs.
gcc version 2.95.4 20020320 [FreeBSD]
645499:02/08/01 15:13
>>643
言われたとおりやってみたらコンパイルはできました。
実行してみたら行列aと行列bの値はでるのですが、
aとbの積がでませんでした。
646デフォルトの名無しさん:02/08/01 15:15
1.オブジェクト指向型ソフトウェア開発のメリットとデメリットについて

2.Java言語の現状と今後の動向について

という課題に現在取り組んでます。
でもあまりわからないので、どういったことをかけばよいのか、
そして他の人の意見もほしくて投稿してます。
なにかないでしょうか?
647499:02/08/01 15:17
mainでmat_mul(a,b,c)が呼び出せてないみたいなんですが、
どうしたらいいのでしょうか
648デフォルトの名無しさん:02/08/01 15:19
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数:120141人 発行日:2002/07/25
どもどもー、ロスタイムに身悶える、とっても苦しいひろゆきですー。。。

昨年5月、珍走団に「文句があったらいつでも来い!バーカ!バーカ!」といいつつ、本当に来られたら、土下座をしてしまったおいらですが、実は他にもあるですよー。恥ずかしい話は、、、うぅうぅ
昨年6月のことですが、おいらに批判的なチョンに「ボコる」「焼き入れる」「殺す」と慣れないセリフを使って一生懸命脅してみたですけど、チョンってば全然ビビッってくれないで「相手になってやる!」なんて言うですよー、、、うぅうぅ
おいらってば焦って必死に逃げ回って激ヤセしちゃったですよー、、、うぅうぅ

“歴史は繰り返す”といいますが“おいらの歴史”も繰り返しまくりですよー、、、うぅうぅ
皆さんご存知のとおり、おいらってばネットや電話では結構勇敢なんですが、どうも面と向かってしまうとすっかりドテチンになっちゃうみたいなんですよー、、、うぅうぅ
でも今はなんとか気を取り直してチョンに反撃をはじめたですよー、、、えっへん
イタズラ電話やウィルス爆弾とか家族への嫌がらせとか色々やってますですー。。。

ところで、おいらの病的な臆病さの原因は「腕力に自信がないから」だけではないんですー、、、
それはそれは、、本当に、、本当に、、根深い問題があるんですよー、、、うぅうぅうぅ
臆病さだけではありません。決断力のなさも笑われ始めてます、、、うぅうぅ
元削除人の皆さん!あんまりおいらの秘密言いふらすのやめてよー、、、うぅうぅ

んじゃ!
>>648
意味不明。先生に問題の意味を確認してこい。
あれ?>>648 きてないよ。
なんだ、>>648はまたサボリか。
652499:02/08/01 15:54
#include <stdio.h>

typedef struct {
double re;
double im;
} complex;

complex add(complex alpha, complex beta);
complex mul(complex alpha, complex beta);
void mat_mul(complex a[][2], complex b[][2], complex c[][2]);
void print_mat(complex a[][2], char *str);

int main(void)
{
complex a[][2] = {{{1.0, 1.0}, {2.0, 1.0}}, {{-1.0, 1.0}, {1.0, -1.0}}};
complex b[][2] = {{{3.0,-1.0}, {-1.0,1.0}}, {{ 1.0, 2.0}, {-2.0, 3.0}}};
complex c[2][2];

print_mat(a, "a");
print_mat(b, "b");

mat_mul(a, b, c);

print_mat(c, "a * b");
return 0;
}
653499:02/08/01 15:54
void mat_mul(complex a[][2], complex b[][2], complex c[][2])
{
int i, j, k;
complex s, t;

for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++) {
s.re = s.im = 0.0;
for (k = 0; k < 2; k++) {
t = mul(a[i][k], b[k][j]);
s = add(s, t);
}
c[i][j] = s;
}
}

void print_mat(complex a[][2], char *str)
{
int i, j;

printf("%s = \n", str);
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
printf("%+f + %+fi ", a[i][j].re, a[i][j].im);
printf("\n");
}
}

complex add(complex alpha, complex beta)
{
complex gamma;

gamma.re = alpha.re + beta.re;
gamma.im = alpha.im + beta.im;

return gamma;
}
654499:02/08/01 15:55
complex mul(complex alpha, complex beta)
{
complex gamma;

gamma.re = alpha.re*beta.re - alpha.im*beta.im;
gamma.im = alpha.im*beta.re + alpha.re*beta.im;

return gamma;
}
これで実行すると、mat_mul呼び出す所でとまってしまいます。
>>654
とまる?
もっと状況を詳細に書いて。
656557:02/08/01 16:21
結局、時間が無いので未完成のまま提出してきます。
助言してくださった方々、どうもありがとうございました。
みんなが>>557ぐらいの気概があればこっちも楽だ。
658499:02/08/01 16:37
>>655
実行すると、
a =
+1.000000 + +1.000000i+2.000000 + +1.000000i
-1.000000 + +1.000000i+1.000000 + -1.000000i
b =
+3.000000 + -1.000000i-1.000000 + +1.000000i
+1.000000 + +2.000000i-2.000000 + +3.000000i
と出たところで止まってしまいます。
659499:02/08/01 16:49
>>655
一応動くようになりました。あと、このプログラムをn*m行列とm*l行列
を入力し、この積を計算してn*l行列を求めるようにできれば、完成なの
ですが、この場合どこを変えればできるようになるのでしょうか?
よろしくお願いします。
>>658
プログラムは終了していないという解釈でよいですか?

mat_mul()の t = mul(a[i][k], b[k][j]); ところに
i, j, kを表示するprintf()を埋め込んで実行し、
どう表示されたか教えて下さい。


661デフォルトの名無しさん:02/08/01 16:54
おいらのWin+Cygwin環境では
a + b =の結果まで出たぞ

662660:02/08/01 16:56
>>659
遅かったか。660 は忘れてくれ。
どう直したら動くようになったの?
663499:02/08/01 16:59
本当にちょっとしたミスでmat_mul関数内でiの所にjを書いてしまって
いました。本当にすいませんでした。
664デフォルトの名無しさん:02/08/01 17:01
>>661
> Win+Cygwin

CygwinってWindows以外で使えるのか?
>>663
>>653 にそういうところはなさそうだけど、
どうなってるの?

>>659
n, m, l はどういう扱いにするの?
固定にするの?それとも、入力するようにするの?
666499:02/08/01 17:37
>>665
プログラムの方は他のパソコンでやってまして、そっちで間違えてしまって
いました。
n,m,lですが、入力するようにしたいです。2*3と3*4や、3*2*と2*2など
n*mとm*lの形の行列の積に対応できるようにしたいです。
667デフォルトの名無しさん:02/08/01 18:00
C++で関数ポインタをやっているのですが、
クラス内の関数のポインタはどのように取得すればよいのでしょうか?

例えば
class CXXXX {
 void get();
 void (* funcPtr);
};

として
void CXXXX::get() {
 funcPtr = get;
}
では
error C2440: '=' : 'void (__thiscall CCommonProcess::* )(void)' から 'void (__cdecl *)(void)' に変換できません。
と出てしまいます。

他に
class CXXXX {
 void get();
 void (* CXXXX::funcPtr);
};

として
void CXXXX::get() {
 funcPtr = get;
}
も試してみたのですが、こちらも無理なようでした。

何か方法はあるのでしょうか?
668デフォルトの名無しさん:02/08/01 18:02
>>667
void (* funcPtr);って関数ポインタの宣言か?
>>666
おお!茨の道を進むと。

C言語では、n,m,lがコンパイル時に決定されていないような多次元配列を
扱うのは非常に面倒です。この場合よく使われるのは、以下の2つです。

・1次元配列を指すポインタの配列を使う
・1次元配列を2次元配列とみなして使う

前者は下準備が大変ですが、見た目はきれいに書けます。
後者は見た目は悪いですが、いろいろなと応用が効くように思います。

どちらにします?別に他のアイデアがあればそれでもかまいませんが。
670デフォルトの名無しさん:02/08/01 18:05
>>668
すいません。記述ミスです。
元々の記述はこちらの様になっていました。
 void (* funcPtr)();

二番目に書いた方法で解決すると思ったのですが、
こちらでもうまくいきません。

どうかよろしくお願いします
671デフォルトの名無しさん:02/08/01 18:08
>>669
課題の内容がポインタとデータ構造となっているので、できれば
ポインタを使うほうが良いです。
>>671
1次元の配列をn*m次元の配列として扱う一般的な方法。

a11 a12 a13
a21 a22 a23

という配列を一次元配列に入れてみる。各要素はintとすると、

int a[] = {a11, a12, a13, a21, a22, a23};

// 要素a[n,m]を返す関数。

int elem(int *a, int xsize, int n, int m)
{
 return *(a + n * x + m);
}

elem(a, 3, 2, 3); // a23が返ってくる

こんな感じで扱えばいい。
673デフォルトの名無しさん:02/08/01 18:49
672>>
どうもありがとうございます。
できれば、先ほどのプログラムも使用していきたいのですが、
それは可能なのでしょうか?
674デフォルトの名無しさん:02/08/01 18:55
行列積の関数は2×2固定なんだから
引数で渡すかしないと。

>>667
一応↓のようにしたらコンパイル通った。望み通りの結果になるかは知らんが
class A {
void get();
void (A::*funcPtr)();
};

void A::get() {
funcPtr = &A::get;
}
676669:02/08/01 18:58
>>671
では、前者の方ということですね。
先程もいったようにn,m,lがコンパイル時に決定されないので、
当然、行列のサイズもコンパイル時にはわかりません。
そのため、malloc()を使って動的に行列を確保するようにします。

double** allocate(int n, int m)
{
 double** p;
 double* t;
 int i;

 p = (double**)malloc(sizeof(double*) * n + sizeof(double) * n * m);
 t = (double*)&p[n];
 for (i = 0; i < n; i++) {
  p[i] = &t[i * m];
 }
 return p;
}

とりあえずこれが下準備部分となります。
677669:02/08/01 19:00
>>676
間違えました。
doubleを全てcomplexに修正してください。
678669:02/08/01 19:05
void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l)
というように変更し、2をnなりmなりlに置き換えてください。
print_mat()に関しても同様に修正してください。
679667:02/08/01 19:06
>>675
こちらでもコンパイルすることができました。
なんとか動くように頑張りたいと思います。
本当にありがとうございました。
680499:02/08/01 19:07
>>678
どうもありがとうございます。
さっそく試してみます。
681ぽえー:02/08/01 19:13
waveファイルの結合のアルゴリズムと手法を教えてください。
かなり、ネットで探したんですが、見つかりません。
682499:02/08/01 19:28
void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l)

{
int i, j, k;
complex s, t;

for (i = 0; i < n; i++)
for (j = 0; j < m; j++) {
s.re = s.im = 0.0;
for (k = 0; k < l; k++) {
t = mul(a[i][k], b[k][j]);
s = add(s, t);
}
c[i][j] = s;
}
}

void print_mat(complex** a,int n,int m,char *str)
{
int i, j;

printf("%s = \n", str);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
printf("%+f + %+fi ", a[i][j].re, a[i][j].im);
printf("\n");
}
}
というように変更すれば良いのでしょうか?
あと下準備を書く場所はどこでも良いのですか?
よろしくお願いします。
683669:02/08/01 19:40
>>682
>>659 と話を合わせておいた方が混乱しにくくなりますよ。

入力部分は後で実装するようにして、デバッグし、動作確認をしてみましょう。

complex a[][2] = {{{1.0, 1.0}, {2.0, 1.0}}, {{-1.0, 1.0}, {1.0, -1.0}}};



n = 2; m = 3;
a = allocate(n, m);
for (i = 0, i < n; i++) {
for (j = 0, j < m; j++) {
a[i][j].re = 1.0 * (i * n + j);
a[i][j].im = 1.0 * (i * n + j);
}
}

という感じに。b, cも同様にしてみてください。
684499:02/08/01 20:11
#include <stdio.h>

typedef struct {
double re;
double im;
} complex;

complex add(complex alpha, complex beta);
complex mul(complex alpha, complex beta);
void mat_mul(complex** a, complex** b, complex** c);
void print_mat(complex** a, char *str);

int main(void)
{
int n,m;
n = 2; m = 3;
a = allocate(n, m);
for (i = 0, i < n; i++) {
for (j = 0, j < m; j++) {
a[i][j].re = 1.0 * (i * n + j);
a[i][j].im = 1.0 * (i * n + j);
}
}

b = allocate(n, m);
for (i = 0, i < n; i++) {
for (j = 0, j < m; j++) {
b[i][j].re = 1.0 * (i * n + j);
b[i][j].im = 1.0 * (i * n + j);
}
}

complex c[2][2];

print_mat(a, "a");
print_mat(b, "b");

mat_mul(a, b, c);

print_mat(c, "a * b");
return 0;
}
685499:02/08/01 20:12
double** allocate(int n, int m)
{
 double** p;
 double* t;
 int i;

 p = (double**)malloc(sizeof(double*) * n + sizeof(double) * n * m);
 t = (double*)&p[n];
 for (i = 0; i < n; i++) {
  p[i] = &t[i * m];
 }
 return p;
}

void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l)

{
int i, j, k;
complex s, t;

for (i = 0; i < n; i++)
for (j = 0; j < m; j++) {
s.re = s.im = 0.0;
for (k = 0; k < l; k++) {
t = mul(a[i][k], b[k][j]);
s = add(s, t);
}
c[i][j] = s;
}
}

void print_mat(complex** a,int n,int m,char *str)
{
int i, j;

printf("%s = \n", str);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
printf("%+f + %+fi ", a[i][j].re, a[i][j].im);
printf("\n");
}
}
>>683
この様に変更してみました。
これ以下は以前のプログラムのままです。
686584:02/08/01 20:15
>>591
遅レスすいません。昨日はありがとうございました。申し訳ございませんが次の条件でもう一度解いてもらえませんでしょうか
getcharコマンドで、入力データの1行目を読み取り、配列aに代入(1行に38文字あるが、最後の1文字は改行文字と仮定)してカウンターの値を1に初期化する。<最初に読んだ文字(a[0]の値)が続いている間は、カウンタ
ーの値輪1ずつ増やして読んだ文字が今までと違った(文字の連続が終わっ
た)時点でカウンターの値をプリントして1の場合にはそのまま数字をプリ
ントして0の場合には、符号をマイナスにしてプリントする。カウンター
の値を1に再初期化>して<>の間を繰り返す。2行目以降を同時に処理し
てください。
条 件:・配列aを引数として、0または1の数をプリントする関数を作成してください。
687669:02/08/01 20:21
>>684
プロトタイプ宣言を修正してください。
a, b, cの変数宣言を加えてください。
l = 4を加えて b の部分を直してください。
c もallocate()を使うようにしてください。
mat_mul()などを呼び出している部分も修正してください。

そこら辺を修正したら、一度コンパイルしてみましょう。
688669:02/08/01 20:39
>>685
allocate()のところのdoubleを全てcomplexに修正してください。
>>686 二行目以降同時に…

無理。
>>686
一応やってやったがこれが最後だ。動かなくても知らん(今後も知らん)。
自分のレス番は間違えないように。非常に迷惑だ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=13&fi=no
691デフォルトの名無しさん:02/08/02 00:24
やばい、夏休みの宿題の絵日記つけるの忘れてた・・・
どなたか20日以降のお天気をおしえてください。

 厨房の夏

  2chの夏
693 :02/08/02 01:10
>>686
#include <stdio.h>
void print(int n, const int *a) {
 printf("%d", n);
}
int main() {
 int a[1], n = 0, c = 0;
 while (~(a[0] = getchar()))
  {
   if (a[0] == c)
    n++;
   else {
    if (c)
     print(n, a);
    if (a[0] == '\n') {
     putchar('\n');
     c = 0;
    } else {
     if (c)
      putchar(',');
     c = a[0];
     n = 1;
    }
   }
  }
 if (c) {
  print(n, a);
  putchar('\n');
 }
 return 0;
}
694デフォルトの名無しさん:02/08/02 01:28
>>688
21時頃に停電になってしまい、レス遅れてすいませんでした。
allocate()のところのdoubleは全てcomplexに修正しました。
695デフォルトの名無しさん:02/08/02 01:33
688>>
687>>の修正をやってみます。
696686:02/08/02 01:39
>>690
すみませんでした。できました。ありがとうございます
697デフォルトの名無しさん:02/08/02 02:49
#include <stdio.h>

typedef struct {
double re;
double im;
} complex;

complex add(complex alpha, complex beta);
complex mul(complex alpha, complex beta);
void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l);
void print_mat(complex** a,int n,int m,char *str);

int main(void)
{
int n,m,l,i,j;
n = 2; m = 3; l = 4;
double a,b,c;

a = allocate(m, l);
for (i = 0; i < m; i++) {
for (j = 0; j < l; j++) {
a[i][j].re = 1.0 * (i * n + j);  *
a[i][j].im = 1.0 * (i * n + j);  *
}
}

b = allocate(n, m);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
b[i][j].re = 1.0 * (i * n + j);  *
b[i][j].im = 1.0 * (i * n + j);  *
}
}

c = allocate(n, l);
for (i = 0; i < n; i++) {
for (j = 0; j < l; j++) {
b[i][j].re = 1.0 * (i * n + j);  *
b[i][j].im = 1.0 * (i * n + j);  *
}
}

print_mat(a, n, m, "a");      *
print_mat(b, m, l, "b");      *

mat_mul(a, b, c, n,m,l);      *

print_mat(c,n,l, "a * b");     *
return 0;
}

>>688
>>687で言われた修正をしてみましたが、*の部分でエラーが
でます。どう直せば良いかわからないので、よろしくお願いします。
698 :02/08/02 02:54
>>685
>  p = (double**)malloc(sizeof(double*) * n + sizeof(double) * n * m);
>  t = (double*)&p[n];

これ、環境によっては動かないよ。
>697
double a,b,c; -> complex **a,**b,**c;
700499:02/08/02 03:04
#include <stdio.h>

typedef struct {
double re;
double im;
} complex;

complex add(complex alpha, complex beta);
complex mul(complex alpha, complex beta);
void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l);
void print_mat(complex** a,int n,int m,char *str);

int main(void)
{
int n,m,l,i,j;
n = 2; m = 3; l = 4;
double a,b,c;

a = allocate(m, l);
for (i = 0; i < m; i++) {
for (j = 0; j < l; j++) {
a[i][j].re = 1.0 * (i * n + j);  
a[i][j].im = 1.0 * (i * n + j);  
}
}

b = allocate(n, m);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
b[i][j].re = 1.0 * (i * n + j);  
b[i][j].im = 1.0 * (i * n + j);  
}
}

c = allocate(n, l);
for (i = 0; i < n; i++) {
for (j = 0; j < l; j++) {
b[i][j].re = 1.0 * (i * n + j);  
b[i][j].im = 1.0 * (i * n + j);  
}
}

print_mat(a, n, m, "a");     
print_mat(b, m, l, "b");      *

mat_mul(a, b, c, n,m,l);      

print_mat(c,n,l, "a * b");     *
return 0;
}

>>699
あと二つ*の場所のエラーが残ります。これは、どう直せばよいので
しょうか。よろしくお願いします。
>>685
そうなんですか、動くことを信じてみます。
701デフォルトの名無しさん:02/08/02 03:09
呼び出している関数、print_matは
void print_mat(complex** a,int n,int m,char *str)
{
int i, j;

printf("%s = \n", str);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
printf("%+f + %+fi ", a[i][j].re, a[i][j].im);
printf("\n");
}
}
です。
エラーは、parse eror before string constantと出ます。
>700
double a,b,c;
が直ってない気がするが気のせいか?
文字列("b"と"a * b")の前に変な文字が混じってないか確認して
703669:02/08/02 03:20
>>700
行列a は何*何ですか?行列b は何*何ですか?
つじつまがあっていませんよ。

>>699 で言われたように直してください。
c = allocate(n, l); の後のforは要らないです。
704669:02/08/02 03:22
>>698
もしかしてアライメントの問題ですか?
705499:02/08/02 03:43
#include <stdio.h>

typedef struct {
double re;
double im;
} complex;

complex add(complex alpha, complex beta);
complex mul(complex alpha, complex beta);
void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l);
void print_mat(complex** a,int n,int m,char *str);

int main(void)
{
int n,m,l,i,j;
n = 2; m = 3; l = 4;
complex **a,**b,**c;

a = allocate(n, m);
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
a[i][j].re = 1.0 * (i * n + j);  
a[i][j].im = 1.0 * (i * n + j);  
}
}

b = allocate(m, l);
for (i = 0; i < m; i++) {
for (j = 0; j < l; j++) {
b[i][j].re = 1.0 * (i * n + j);  
b[i][j].im = 1.0 * (i * n + j);  
}
}

c = allocate(n, l);

print_mat(a, n, n, "a");     
print_mat(b, m, l, "b");      *

mat_mul(a, b, c, n,m,l);      

print_mat(c,n,l, "a * b");     *
return 0;
}

>>702-703
変更してみましたが、やはりあと二つのエラーがなくなりません。
>705
ここの部分だけでいいから(自分の手で打つんじゃなく)ファイルからそのままコピペしてくれ
print_mat(a, n, n, "a");
print_mat(b, m, l, "b");

mat_mul(a, b, c, n,m,l);

print_mat(c,n,l, "a * b");
707499:02/08/02 03:49
間違えました
print_mat(a, n, n, "a");-->print_mat(a, n, m, "a");

です。
708落ちこぼれ:02/08/02 03:49
配列に入っている整数の和を求める関数を完成せよという問題です。
提出が今日までなので必死なんです(;´Д`)
お願いします。

#include<stdio.h>

int sum(int, int, int *);


int sum(int first, int last, int *array)
{
if(first==last)
return array[first];
else
return array[first] + sum(@, A, B);
}


int main(void){
int a[]={10, 2, 1, 3, 4};

printf("%d\n", sum(0, 4, a) );
return 0;
}
>708
このコードを元にすればよいということか?
なぜに再帰?
>>708 こういう事か?
#include <stdio.h>

int sum(int, int, int *);

int sum(int first, int last, int *array)
{
if(first==last)
return array[first];
else
return array[first] + sum(first + 1, last, array);
}


int main(void){
int a[]={10, 2, 1, 3, 4};

printf("%d\n", sum(0, 4, a) );
return 0;
}
712499:02/08/02 03:55
>>705
どうもすいませんでした。,が抜けてた箇所があったみたいです。
コンパイルすることはできたのですがaとbの行列を出力したところで
core cumped してしまいました
>708
1. first+1
2. last
3. array
センセがLisperなんじゃね?
>712
とりあえずmat_mul()を↓に変えてみな

void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l) {
int i, j, k;
complex s, t;

for (i = 0; i < n; i++)
for (j = 0; j < l; j++) {
s.re = s.im = 0.0;
for (k = 0; k < m; k++) {
t = mul(a[i][k], b[k][j]);
s = add(s, t);
}
c[i][j] = s;
}
}
715デフォルトの名無しさん:02/08/02 04:33
動きましたー。どうもありがとうございます。
あとは行列を入力できるようにするだけなので、
やってみます。もしかしたら、また来ることになるかもしれませんが・・。
>>714さん>>669さん本当にありがとうございました。
716落ちこぼれ:02/08/02 11:32
>>711
>>713
ありがとうございました!
何とか単位取れそうです。
717デフォルトの名無しさん:02/08/02 20:55
配列a,bをいっしょにした、配列cを小さい順に表示したいんですが、うまくいきません。
どこを直したらいいのか、指摘して下さい。
#include <stdio.h>

void kansu( int a[5]);

int main( void ){

int a[5], b[5], c[10], i, j, k, e, f, g, min;

printf("配列 a に,5つの数を入力して下さい。\n");

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

scanf("%d",&a[i]);
}

printf("配列 b に,5つの数を入力して下さい。\n");

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

scanf("%d",&b[j]);
}

kansu( a );

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

e = i;
min=10000000;

for( j=e; j<5; j++){

if(min >= b[j]){

min = b[j];
f = j;
}
}
g = b[i];
b[i] = b[f];
b[f] = g;
}
printf("\n");
printf("配列 c の要素を順番に表示する。\n");

718デフォルトの名無しさん:02/08/02 20:57
つづきです。
i = 0;
j = 0;

for( k=0; k<10; k++){

if( a[i] <= b[j] ){
c[k] = a[i];
i++;
}
else if( a[i] > b[j] ){
c[k] = b[j];
j++;
}
else if( i==5 ){
c[k] = b[j];
j++;
}
else if( j==5 ){
c[k] = a[i];
i++;
}
}
for( k=0; k<10; k++){

printf("%d\n", c[k]);
}
}
void kansu( int a[5]){

int i, j, e, f, g, min;

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

e = i;
min=10000000;

for( j=e; j<5; j++){

if(min >= a[j]){

min = a[j];
f = j;
}
}
g = a[i];
a[i] = a[f];
a[f] = g;
}
return;
}
見づらくなってすいません。
>>717>>718
マージソートだな。
>718
とりあえず↓ここは
if( a[i] <= b[j] ){
c[k] = a[i];
i++;
}
else if( a[i] > b[j] ){
c[k] = b[j];
j++;
}
else if( i==5 ){
c[k] = b[j];
j++;
}
else if( j==5 ){
c[k] = a[i];
i++;
}

↓こうしないとダメだろ
if( i==5 ){
c[k] = b[j];
j++;
}
else if( j==5 ){
c[k] = a[i];
i++;
}
else if( a[i] <= b[j] ){
c[k] = a[i];
i++;
}
else if( a[i] > b[j] ){
c[k] = b[j];
j++;
}
>718
なんでkansu()を一回しか使ってないんだよ。
722だれかさん。:02/08/02 21:31
長いソースは >>216 が便利だよ。
なんかソート方法が変だよ。

少なくともバブルソートか交換ソートで、a[]とb[]をまず整列しる。
それからマージソートでa[]とb[]をミックスしる。
>723
a[]はkansu()でb[]はmain()内で(アフォ)選択ソートしてるよ
>>724
この選択ソートあまり見かけないやり方だね。
それに、もし入力に10000000を越える数字を入れると、動作が
おかしくなるぞ。
誰も書かないからうpしてみる。間違い訂正ヨロスク。
#include <stdio.h>

void s_sort(int a[]);
void m_sort(int a[], int b[], int c[]);

int main(void)
{
int a[5], b[5], c[10], i, j;

printf("配列 a に,5つの数を入力して下さい。\n");
for (i = 0; i < 5; i++) scanf("%d", &a[i]);

printf("配列 b に,5つの数を入力して下さい。\n");
for (j = 0; j < 5; j++) scanf("%d", &b[j]);

s_sort(a);
s_sort(b);

m_sort(a, b, c);

printf("配列 c の要素を順番に表示する。\n");

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

return 0;
}
void s_sort(int a[]) /* 単純選択ソート */
{
int i, j, t;

for (i = 0; i < 4; i++)
for (j = i + 1; j < 5; j++)
if (a[i] > a[j]) {
t = a[i]; a[i] = a[j]; a[j] = t;
}
}

void m_sort(int a[], int b[], int c[]) /* マージソート */
{
int i = 0, j = 0, k = 0;

while (i < 5 || j < 5) {
if (i == 5) c[k++] = b[j++];
else if (j == 5) c[k++] = a[i++];
else if (a[i] < b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
}
}
728デフォルトの名無しさん:02/08/02 23:29
>>720
ありがとうございます。なりました。
でも、なぜこうしたらなるんですか?
>>728
a[]とb[]をマージする時に、どちらかの添え字が境界を越えてしまわないか
どうか先にチェックする必要があるのです。
730デフォルトの名無しさん:02/08/02 23:41
あっ、なるほど。言われてみれば、当然のことですね。
自分では、気付きませんでした…。
ありがとうございます。
勉強させていただきました。
(あまりに基本的なことですみませんでした。)
テキスト内に複数回現れる最長文字列を探せ。
C言語でお願いします。出来るだけ早く動くように・・・
>731
キョーダイセイ
>>731
sageてるけど、ネタなのかな?
改行、空白文字の扱いはどーなの?
>733
デキレバ 「カイギョウ」->「クウハクモジ」 ト スル
テキスト ハ スウヒャクキロバイト ノ エイブンショウセツ
>732
やっぱ誰か見てるのね
ワードが最長?センテンスが最長?
センスが最低?
よくわからんけど、圧縮のアルゴリズムがほとんどそのまま使えるのかな。
>738
ハァ?
740 :02/08/03 01:36
>>731
文字列が重なっている場合はどうなるんだ?
テキストが abcabcabc のとき、最長文字列は
abcabc か abc かどちらだ?
741デフォルトの名無しさん:02/08/03 01:37
>>731もしくわ>>732
仕様を詳しく言え馬鹿京大生
>740
abcabc
>741
モレ ハ モウ デキテルカラ ベツニ イインダガ......

「1冊の本の中に複数回出現する最長部分文字列を探せ。本は、Project Gutenberg
(http://promo.net/pg/)から選ぶこと。」
どのようなアルゴリズムを用いても圧縮不可能な
ビット列を生成するアルゴリズムを教えてくれ。
>744
アルゴリズムがある時点で圧縮可能なんじゃ?
>>744
いろんな圧縮アルゴリズムで圧縮しまくって、縮まなくなるまで
これを繰り返す
747デフォルトの名無しさん:02/08/03 01:53
>>744
00000001
00000010
00000011
00000100
...
>>747
% ruby -e '256.times{|n| puts "%08b" % n}' > temp
% ls -l temp
-rw-r--r-- 1 hoge user 2304 8 3 01:15 temp
% gzip temp
% ls -l temp.gz
-rw-r--r-- 1 hoge user 469 8 3 01:15 temp.gz

圧縮できたYO
749733:02/08/03 02:12
>>731
結局、詳細がよくわからんのでなんとも言えんが・・・
まずは「ハッシュ法 探索 文字列」あたりで検索かけて参考にしてくれ。
詰まったらここか、>>732にでも聞けばいい。
わしゃ眠いから寝る
750デフォルトの名無しさん:02/08/03 02:20
>>748
ビット列なので、>>747のはすべて1バイト。
なのでこれ以上圧縮は無理とかいいたいんじゃないの?
751748:02/08/03 02:32
>>750
ネタだよ(w

実際にバイナリのビット列作ってみてgzipかけたら元よりデカくなったよ。
一応「おお」と驚いてみたよ。
>>744
回答するなら、こんなところでしょうね。
いずれも情報理論の基本かと思われ。

1:どんなビットパターンを生成しても、
  そのビットパターンを圧縮できるアルゴリズムは必ず存在する
2:nビット以下で表現されるビット列を、
  すべて、nビット未満に圧縮できるアルゴリズムは存在しない

2:は>>748>>750さんの示す通り。
1:は、たとえば 000 001 010 011 ... 111 のうち、
どれか一つだけを1ビットに圧縮できるが、
他はすべて4ビットに伸張してしまうようなアルゴリズムの存在を考えれば、
任意のビット列を1ビットに圧縮できるアルゴリズムが存在する、と言えるため。
>>744
シャノンの定義ではエントロピーが最大になればいいんだから
完全に偏りのない乱数のようなデータは圧縮できない

たとえばランダムに与えられる8ビットの整数 n は圧縮できない。
754752:02/08/03 02:35
番号間違えた

2:は>>747>>750
1:もすでにありますね。>>745
>753
結局その乱数もコンピュータがなんらかのアルゴリズムに基づいて生成したものだから
そのアルゴリズムに基いて圧縮可能
>>753>>755
それが「真の乱数」ならばいいのだろうけどね。
でも、「真の乱数」などこの世に存在しないという罠。
>744
ただ1ビット
 0
だ(1でも良いけどな)。これ以上圧縮しようが無い。
>>756
真の乱数ではないかもしれないが、面白い製品があるぞ。
http://www2.toshiba.co.jp/efort/market/rmaster/index_j.htm
禿しく亀レスな上に、限りなくどうでもいいのだが、
>>727
それ選択ソートじゃなくてバブルソート
>>759
禿しく亀レスで、限りなくどうでもいいのだが、>>727は選択ソートだよ。
バブルソートは次のようになる。

void b_sort(int a[]) /* バブルソート */
{
int i, j, t;

for (i = 0; i < 4; i++)
for (j = 4; j > i; j--)
if (a[i] > a[j]) {
t = a[i]; a[i] = a[j]; a[j] = t;
}
}
>>760
限りなくどうでもいいのだが、それもバブルソートじゃないよ。
>>761
限りなくどうでもいいのだが、ではバブルソートの一例を具体的に
示してくれないか。
763デフォルトの名無しさん:02/08/03 04:08
for (i = 0; i < 4; i++)
for (j = i; j < 4-1; j++)
if (a[j+1] > a[j]) {
t = a[j+1]; a[j+1] = a[j]; a[j] = t;
}
}
>>763
納得しますた。
765753:02/08/03 04:10
>>756
いかなる高性能な圧縮にも・・なら定義上は乱数列だけど、
実用上は圧縮プログラムで予測不能な数列程度で良いね。
質のいい擬似乱数ならほとんど圧縮できなくなるよ。
限りなくどうでもいいのだが、バブルソートの例。

void b_sort(int a[]) /* バブルソート */
{
int i, j, t;

for (i = 0; i < 4; i++)
for (j = 4; j > i; j--)
if (a[j-1] > a[j]) {
t = a[j-1]; a[j-1] = a[j]; a[j] = t;
}
}

>>762
限りなくどうでもいいのだが、レスが早いね。
767763:02/08/03 04:22
しまった、sage入れ忘れた。ごめん
768763:02/08/03 04:25
しかも、話題が終わってるし。鬱、逝ってきます。
連続書き込み申し訳ない。
>>761>>766-768は漏です。>>763は別の方です。

>>762を読んで>>766のレスを書いたのですが、
表示された>>763を自分のレスと勘違いして変な
連続書き込みをしてしまいました。
スレ汚しお詫びします。

今日はどうかしている。本当にもう逝く。
>>763は間違い。ソートできてない
771デフォルトの名無しさん:02/08/03 10:57
(一行に書かれた二桁までの四則演算ができるプログラム)
が、課題なんですけど、全然わからないんです、、、
どなたか教えて下さい。
>>771
それって例えば

1 + 2 * 3

と入れたら、ちゃんと 7 を返すようなもの?
>>771
既出じゃないか?
#!/usr/bin/perl
while(<>){
print eval $_
}
775デフォルトの名無しさん:02/08/03 11:21
>>773
同じ学校の人なんじゃないの?(藁
776731:02/08/03 11:23
仕様は>743位、細かいところは適当にしてください。
一様、出来たことには出来たんだけど、とても遅い
777肉と急得る:02/08/03 12:33
はじめまして、最近JAVAを勉強しだした者です。
アプレット上でCanvasクラス承継したクラスをインナークラスにしてインナークラスを
内包するクラスにインナークラスのインスタンスを生成し、内包する
クラスにrepaintメソッドを記述して、インナークラスのupdateメソッド
を呼び出しキャンバス上に描画したいのですがうまく呼び出されません。
Canvasクラスを扱うには何かコツがあるのでしょうか?

ちなみに問題の内容は

表示ボタンをクリックすると、テキストフィールドに入力された文字列が、
指定されたフォントでキャンバスに表示される。です。

ボタンなどの部品とリスナはすべて作りました、あとはキャンバスに表示
するだけなのですが、どうでしょうか?
>>777
まず、4行にも渡る1文を書く癖から改めた方がいいかなと。
>>777
まくしたてすぎ
>>777
a.innerclass(extend(canvas)) = new a.innerclass(extend(canvas))
781732:02/08/03 12:50
>>776(==731)
遅いってどれくらい?
多分suffix array構成時のソート方法に問題があるんだろうけど
782デフォルトの名無しさん:02/08/03 13:12
>>731の補題

以下の様な文字列があったとする。

abc123abcd

この文字列の中では 123 という組み合わせは
一度しか現れていない。
その為、最長一致文字列を検索する際に
123 を含む文字列( abc123a, 123ab, ... )は
検索の対象から外す事ができるので、
これらを事前に見つけておく事ができれば
検索時間を大幅に削減する事が出来る。

このような文字列のうち、(全ての組み合わせに対して
検索をするアルゴリズムと比較して)
最大限に検索対象を削減できる文字列を見つける
プログラムを作成しなさい。
>>782
要はn文字以上でである文字列が入ってないのだけを抽出すればいいんだろ?
784デフォルトの名無しさん:02/08/03 13:17
>>783
ここ嫁。

このような文字列のうち、(全ての組み合わせに対して
検索をするアルゴリズムと比較して)
最大限に検索対象を削減できる文字列を見つける
プログラムを作成しなさい。
785肉と急得る:02/08/03 13:48
>>780さん
書き込みありがとうございます。あと長文を書いてしまうのは癖でして、
見苦しい文章をカキコしてすいませんでした。

a.innerclass(extend(canvas)) = new a.innerclass(extend(canvas))

なのですが、キャンバスクラスを承継したクラスのインスタンスを
作成する時には、普通に記述した後に(extend(Canvas))と書き加える
という事でしょうか?。
自分で試してみたのですがエラーが出てコンパイル出来ませんでした。
気が向いて暇があったら教えてくださいm(__)m
今度は読みにくくないですよね?(~_~;)

786デフォルトの名無しさん:02/08/03 14:28
>>785(777) 氏へ

 >>778も言うように
 複文でだらだら書いた仕様(のようなもの)を
 単文の箇条書きに切り分けるとかして
 整理して考えてみ?
 そのうえでどの部分が問題なのかもう一回質問してみれ。
 
例)
>アプレット上でCanvasクラス承継したクラスをインナークラスにしてインナークラスを
>内包するクラスにインナークラスのインスタンスを生成し、〔以下略〕

1、 Canvasクラスを継承したクラスを作る。
2、 1、で作ったクラスは(???)クラスのインナークラスとする。
3、 1,2で定義したクラスのインスタンスを生成する。
    :
    :
787デフォルトの名無しさん:02/08/03 15:14
プログラミングを必死に勉強しているものです
ですがまだぜんぜんわかってません
ここで頼んでもしょうがないのですが、有志の方がいたらどうぞ簡単なのをひとつ依頼してもよろしいでしょうか?
ひとつの改行までの文のうしろ5バイト文字を消すプログラムを作っていただきたいのですが
作れるでしょうか?


すみませんみなさんの会話を崩してしまい・・・
ここにお詫び申し上げます
788787:02/08/03 15:15
例を挙げると
I am japanese
というのを
I am jap

と、半角5文字分消せるようにしていただきたいのです
>>787
どの言語を使っているかくらいかけよ。
Java以外だろうな。>5バイト文字を消す
791787:02/08/03 15:34
HSPです
おねがいします
氏ね
793787:02/08/03 15:52
>>791
偽者はやめてください  私を騙ったってしょうがありませんよ
>>789
別にどれでも構わないのですが。。。。
794787(793 ◆31SOL0D. :02/08/03 15:53
えっと。。。確かHSPってフリーのあのソフトだっけなぁ
私は画像を表示するだけとかの意味がないソフトくらいしかつくれないのですよ(;゚Д゚)
>>798
あほたれ。どれか構えっつの。教えた結果がまったくの無駄になるとむかつくからな。
798はあほたれが決定済み。
798795:02/08/03 15:56
>>795
おれもあほだ。>>798じゃなくて>>793だった。逝ってきます。
799795=798:02/08/03 15:57
うーん、どつぼにはまった。
ワラタ
801787(793 ◆31SOL0D. :02/08/03 16:02
作りやすいのってはどれですか??
アセンブラ何か指定しちゃったら何か迷惑だし。。。(この時点で迷惑ですけど(;´Д`)
マシン語.
804787:02/08/03 16:27
なんか厨房さんにたくさん引っかかってしまった。。。
805787(793 ◆31SOL0D. :02/08/03 16:28
>>804
そんなことして楽しいですか?
806787(793 ◇31SOL0D.:02/08/03 16:48
なんか厨房さんにたくさん引っかかってしまった。。。
↑面白い
言語がなんでもいい宿題なのか?
5バイトって日本語だったらどうするの?
809787:02/08/03 17:00
日本語なんて考えなくていいと思いますよ
たぶん
とりあえず後ろ5文字削除(≠5バイト)
public class TrimLast5String {

public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );

while ( true ) {
TrimLast5String.trim( br.readLine() );
}
} catch (Exception e) {

}
}

public static void trim( String line ) {
int length = line.length();

if ( length > 5 ) {
System.out.println( line.substring( 0, length - 5 ) );
}
}
}
>>787
C版。めんどいので、キモのところだけ。
len = strlen(str);
if(len < 5) str[0] = '\0';
else str[len-5]='\0';
char *strの後の5文字(=バイト)を消す(消したかのように見せる)
812748:02/08/03 17:32
後ろの5文字(≠5バイト)削除

puts ARGF.map{|s| s.sub(/.{5}$/, '')}
import java.io.*;
public class Trim5 {
  public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    String line;
    while ((line = in.readLine()) != null) {
      System.out.println(trimTail5(line));
    }
  }
  public static String trimTail5(String s) {
    return s.substring(0, Math.max(0, s.length() - 5));
  }
}
chop;chop;chop;chop;chop;
String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println(s.substring(0, Math.max(0, s.length() - 5)));
これだけでいいか。
816sucka:02/08/03 18:09
例えばjavascriptsで
<form action="finalForm.htm" method="post "name="frmFillin">
First Name: <input type="text" name="firstName" size="15">
</form>
こんなんあります。どうやってfinalForm.htmのほうでこの情報を表示すればいいんでしょうか?
「method="get"」にしてURLから取得する
それと、板違い→http://pc3.2ch.net/hp/
javascript"s"
javascriptsがjavascriptのtypoだったとして、
>>816がjavascriptとなんか関係あるの?
820sucka:02/08/03 18:29
ご免上の板からじゃ、書き込めん。
method="get"は分かってたんだけど、中身のほうがさ。
なにがしたいのかわからにゃー
822sucka:02/08/03 18:41
Aのファイルで名前やら住所やら書き入れます。
<form action="finalForm.htm" method="get "name="frmFillin">
First Name: <input type="text" name="firstName" size="15"></form>
そんでfinalForm.htmでどうやったら、名前やら住所を表示でするん?
>>822
板違いだから簡単に済ますけど、
formで送られた情報を得られるのはサーバ側。

だから、サーバの側でそのfinalForm.htmを加工して、
クライアントに送り返してやらないといけない。
クライアント側(ブラウザ側)だけで何とかしようと思ってもどうにもならない。
それは無理。

CGIの基本ですな。で、それは宿題なの?
>>sucka>>819
「finalForm.htm」ってことは受ける側もJavaScript使うんじゃなく?
825sucka:02/08/03 19:41
そうそう。
finalForm.htmもjavascript使うんだけど、どうやればいいか。さっぱり。
なんか、XMLとjavascriptでプロジェクトしてんだけど、昔にやったjavascriptをわすれてんのよね。
window.location
827787(793 ◆31SOL0D. :02/08/03 22:06
やった〜!!
マジでうれしいです ありがとうございました
規制前だったら2chで書き込める串さしあげてました
828デフォルトの名無しさん:02/08/03 22:24
今日からジャバをダバと呼んでください。
ジャバスクリプトはダバリプトです。よろしく。
829787(793 ◆31SOL0D. :02/08/03 22:32
HSPって皆さんの目からしてどうですか?
使いやすいですか? 私は最初はこれからやってみようかなと。。。

>>810さん
これってHSPとかでできますか??
830787:02/08/03 23:24
最初っからHSPって言ってるのにね。
831787(793 ◆31SOL0D. :02/08/03 23:47
>>830
そうですか。。。
何かエラーでたんでえっ?って感じでした すみません
832731:02/08/04 00:01
>781
ttp://sary.namazu.org/docs/suffix-array.html
suffix array は正にこんな感じ。INDEXを用意して、そいつを
使ってパケットソートにかけてます。
時間としてはうちのPENTIUM3の533で1.5万字15分くらい。
5万字とかだと、もう待ってられません。
833731:02/08/04 00:04
>832
嘘だ・・・5千字で15分くらい
834hoge ◆aLgb/tNY :02/08/04 00:06
VBなんですがお願いします。再帰関数が良く分かりません
Private Sub FindFile(ByVal ほにゃらら As String)
Dim hFind As Long
Dim FindData As WIN32_FIND_DATA
Dim bResult As Long
Dim NameOfFile As String
Const RoutePath = "るーと"
Const FILE_ATTRIBUTE_DIRECTORY = 16
flg = 0

'最初のファイル検索
hFind = FindFirstFile(RoutePath & "*.*", FindData)
'******** エラー終了 ********
If hFind = INVALID_HANDLE_VALUE Then
MsgBox "検索失敗"
Exit Sub
End If
Do
With FindData
'NULL文字を取り除く
.FileName = Left(.FileName, _
InStr(.FileName, vbNullChar) - 1)
.ShortFileName = Left(.ShortFileName, _
InStr(.ShortFileName, vbNullChar) - 1)
NameOfFile = Trim(.FileName)
If NameOfFile = "." Then
flg = 1
ElseIf NameOfFile = ".." Then
flg = 1
End If
'ディレクトリかどうか
If (.Attributes And FILE_ATTRIBUTE_DIRECTORY) <> 0 Then
Else
flg = 1
End If
End With
If Not flg = 1 Then
'【お願い】ここに呼び出したい【please】
Else
flg = 0
End If
'次を検索
bResult = FindNextFile(hFind, FindData)
Loop While bResult <> 0
'検索の終了
FindClose hFind
End Sub
835732:02/08/04 00:46
>>832(==731)
バケットソートってRadixソートだよね?
おれも最初はそれでやってたんだけど、実際に指定のところから取ってきたファイル(400KB程度)をかけたら
4時間待っても終了しないんでwこれは違うと思ってやめた
よく考えたらRadixソートがO(n)なのはデータ長が定数のときだけで、これみたいに
データ長=データ数=ファイルの大きさnのときはO(n^2)かかっちゃう。当然遅い

で違う方法に変えたら400KBを3sec弱(Crusoe600MHz)ぐらいになった。
パクられたらヤだからネタは明かすつもりないけどw
>>835
うーん、まあ明かすつもりがないのは別にいいけど、
ソートアルゴリズムは研究され尽くされてる分野だから
多分、君の考えたのも既知のアルゴリズムだと思うよ。

だからこそ、10年位前にcomb sortなんてのが考案されたときに
プログラマの間で大ニュースになったわけだし。

あ、でもcomb sortってどんなのだったか忘れちゃった。

#いや、本音は「教えてホスィ」なんだけど、それは内緒(w
>>836
comb sort遅いよ。実装してみたけど。shell sortとアルゴリズムも
似ているし、オーダーも同じくらい。
838732:02/08/04 02:37
>836
おれはソートアルゴリズム発明するよな天才じゃないYO!
要は使い方の問題。
839モヒモヒ:02/08/04 10:49
誰かつきっきりで教えてくれる人いませんか?
男か女か、それが問題だ。
いくら払うきがあるのかも問題だ。
女ならただでいいな。
ただし、未婚で彼氏なしが条件。
>>841
気弱な男の人妻とかでもいいが。
さえない旦那を優しく包み込む美人妻。
それを奪い取る快感♪

最終的には恨まれて家炎上しそうだが。
じゃあ屈強な旦那にボコられて後腐れない方がいいのか・・・・?
すみません
といれはどこですか?
846デフォルトの名無しさん:02/08/04 21:31
int i; char *d="";
main(){
i++[realloc(d,i+1)]=getc();
}

これって、未定義動作ですか?
>>846
やってはいけないことなのは確かだな。
>>847
ありがとうございます。

getc() は getch() の間違いでした。
i と i++ を使っているのですが、配列の中と外では、
評価が途中で確定するわけではないですよね?
i++[realloc(d,i+1)]

意味不明。
>>849
意味が分かるようになってからレスしれ。
>>850
つぅかint iは配列か?
ポインタですらないが。
849=851
だからぁ、a[2] を 2[a] と書いてもいいんだってばw
>>846
宿題じゃないじゃん(w
854846:02/08/04 21:55
>>853
いや、未定義動作について調べて来い、というような内容の宿題なので・・・
ちょうど某スレにこの話題が出ていて、確かめさせてもらっているのです。
>>846
何もそんな生々しい(?)例を持ってこなくても・・・
knkタンみたいに i=i++; でいいじゃないか。
>>854
非生産的な宿題ですね。
後は
j = i++ * i++;
とかね。VCとBCCで動作が異なるよ。
858846:02/08/04 22:10
みなさん、ありがとうございました。
859デフォルトの名無しさん:02/08/04 22:19
>>858
ありがとうございましたって・・・オィオィ
答えが分かったのか?(w

この問題には、いろいろな落とし穴が複合されているようだが。
860hoge ◆aLgb/tNY :02/08/05 10:16
>>835-859
 すさまじい無視っぷりをどうもありがd
 もうこねぇよヽ(`Д´)ノウァーン
861 ◆.5dNLhBI :02/08/05 19:03

200.164.56.24:80 (総合評価:<font size=+2 color=yellow>?</font><font color=lime>(A 以上 or 生 IP。)</font><font color=Cyan>[2972ミリ秒]</font><BR>
216.231.240.20:8080 (総合評価:<font size=+2 color=yellow>?</font><font color=lime>(A 以上 or 生 IP。)</font><font color=Cyan>[1532ミリ秒]</font><BR>
203.116.111.196:80 (総合評価:<font size=+2 color=yellow>?</font><font color=lime>(A 以上 or 生 IP。)</font><font color=Cyan>[3112ミリ秒]</font><BR>


これの[2972ミリ秒]、[1532ミリ秒]、[3112ミリ秒]を調べて速い順で上から並べるのって作れます?
HSPが手元であるのでそれでお願いしたいのですが、よろしいでしょうか?
>>861
構造解析くらい自分でやってくれ。
substrとindexof、もしくはそれ相当の機能がある言語なら猿でもできる。
どこが宿題だよ。
マジレスするなら、awkとsortと正規表現で2,3行でできる。
864デフォルトの名無しさん:02/08/06 16:47
86578K:02/08/07 00:06
nachos やって
866デフォルトの名無しさん:02/08/08 14:03
みなさ〜ん、宿題はこっちですよ。
867423:02/08/08 14:09
>> 866
宿題じゃないですよハゲ
868843:02/08/08 14:17
>>844
アリガトウマニアッタヨ
>>867
じゃスレ違い
870モヒモヒ:02/08/10 10:22
Borland C++で自販機作ってください。
鉄板がいっぱい要るな。
それ以前に何の自販機だろ。
エロ本でもいいのか?
873モヒモヒ:02/08/10 10:39
なんでもええ、エロ本でもエロビでも
カモーン、カモーン
自販機板に逝けよ
875デフォルトの名無しさん:02/08/10 14:18
宿題より僕のオナニーてつだってください。僕の右手じゃもう使いすぎて
ききめがあまりありません。
オトコでも顔みなければそれなりにいけるとおもうのでおねがいします。
しこしこ
> オトコでも顔みなければそれなりにいけるとおもうので

(;´Д`) ウ、ウ、ウソ-ン・・・
左手使え
板違い。オナニー板に逝け、。
879デフォルトの名無しさん:02/08/11 10:37
   _____
 /::\_____\   
 |: ̄\∩`_´) \ 
 |:   :| ̄ ̄U ̄:|
880デフォルトの名無しさん:02/08/11 11:59
C++です。直してください。
void item()
{
int item;
int howMuch[6]={100, 100, 125, 75, 75, 100};

cout << " 1 2 3" << endl;
cout << " Coke Sprite Orange Juice" << endl;
cout << "$1.00 $1.00 $1.25" << endl << endl;

cout << " 4 5 6" << endl;
cout << " Mars Oh Henry! Kit-Kat" << endl;
cout << "$0.75 $0.75 $1.00" << endl << endl;

cout << "Select the item:";
cin >> item;
clrscr();

if (item == 1)
cout << "Please deposit $1.00";
else if (item == 2)
cout << "Please deposit $1.00";
else if (item == 3)
cout << "Please deposit $1.25";
else if (item == 4)
cout << "Please deposit $0.75";
else if (item == 5)
cout << "Please deposit $0.75";
else if (item == 6)
cout << "Please deposit $1.00";

deposit();
}


void deposit()
{
int dep, change, i;

cout << endl << endl;
cout << "Enter how much you are going to deposit" << endl;
cin >> dep;

change = dep - howMuch[i - 1];
cout << "Your change is " << change << endl;

}
「直してください」とかいうと、あんたには理解不能な回答が来るぞ。
>>881
答えが得られれば、それでいいのさ。彼は。
883880:02/08/11 12:21
ごめんさい。直してくださいじゃないや。
ヒントかなんか教えてくだされば・・・
つか、howMuchの定義をdeposit()にもってけ。
商品選んでから金入れる自販機なのか。カナダの自販機ってそうなの?
まとめて金入れて複数買って最後に釣りレバーとかってできないの?
脳内自販機デス
887880:02/08/11 13:32
itemのvalue1やら3をdepositにパスしたいんですけど、その時は
deposit(int item)にすればいいんですか?
>>887
いいよ。あとプロトタイプ宣言もいりそう。
state machineで書くと何人かは喜んで「完成」させてくれそう。
パズルとしてはあっちのほうが面白い。
890デフォルトの名無しさん:02/08/12 18:10
C言語のネットワークプログラミングについての質問なんですけど、
無限ループ内でsocket関数を使ってsockfdを生成しようとすると
カウンタが1000を少しこえたところで、エラーを返します。
このエラーを回避して、永久にsockfdを生成し続けるには
どうすればいいのでしょうか?
よろしくお願いします。
>>890
socketの仕様読んでから死のうな。

後、所詮日本の通信回線ではDoSなんて不可能。
892890:02/08/12 18:24
>>891
別にDoSってわけじゃないんですけど…
単にネットワークの勉強のためにやってるだけです。
ループ1回ごとに1年sleepすれば?
>890
ループ内でちゃんとsocketをcloseしませう。
895デフォルトの名無しさん:02/08/13 20:45
system関数で実行したコマンドの実行結果を
配列に格納するにはどうすればいいですか?
>>895
>コマンドの実行結果

何を指すのかさっぱりわからない。

popen
設問に正しく答えた例:
 system内でリダイレクタつけといて、そのファイルをfopen、fgetsする

おそらく意図としてより正しいだろうと思われる例
 パイプ(_popenとか)を使え
899895:02/08/13 21:09
なるほど、popenか。
どうもです。

>>897
>何を指すのかさっぱりわからない。

system関数で実行したコマンドの実行結果。
これの何がわからんのか。あんたの方が意味不明。

>>899
実行結果って成功/失敗のフラグのこと?
それとも標準出力に吐かれた内容のこと?
>>899
ただのアホだな。
902デフォルトの名無しさん:02/08/13 21:26
>>899
>>897さんの最終行見ろや。親心に気付いてやれ。取りあえず謝っとけよ。
903895:02/08/13 22:02
いや、たぶん>>897さんは日本語が理解できなかったんだと
思うな。「さっぱりわからない」とか言ってるし。
でもなぜかpopenってことは解ってる。
不思議だね。
>>903
あんたの言動が不思議
>>897さんは>>895の理解が間違っていることを教えている。
sysytemを使った場合、>>895の言っていることは複数の回答ができてしまう。
たぶんpopenを使うのが>>895の望みんなんだろう、と>>897さんは言っている。

日本語ができないのは、>>895の方
906デフォルトの名無しさん:02/08/13 22:23
中身が入ったchar型配列を初期化(宣言時の状態に戻す)するには
どうすればいいですか?
>>906
何もしていなければ、宣言時には初期化されていない。
>>903
アホは淘汰される運命にあるのだよ。
909デフォルトの名無しさん:02/08/13 22:28
>>906
C言語ですよね。まずそれを書きましょう。
あと、「初期化」って言葉はC言語では用法を定義された言葉なので
(906さんの言うところの「宣言時」に値を設定することです。)
勝手に別の意味で使わないようにしましょう。

で、本題ですが、そんな方法はありません。
別の変数に初期化情報を保存しておいて、コピーするしかありません。
>>906
char a[10], c[10];
memcpy(c, a, 10); // 宣言時の a 値を c に保存する
a[0] = 1; a[1] = 2; ...;
...
memcpy(a, c, 10); // ここで a を戻す

ただこんなプログラム書く奴とは付き合いたくないがな
911906:02/08/13 22:35
なるほど。
では、char型配列の中身を取り除くにはどうすればいいのですか?
>>911
さっきのもそうだが、まず言葉の定義をすること。
「配列の中身」とは?「取り除く」とは?
>>911
無理。せめて'\0'で埋めるなら分かるが。
>>911
もうお前はあふぉかと。

char *a = malloc(10);
...
free(a);

こんなんどうだw
>>911

char a[256];

...
a[0]=0;

たいていはこれで事足りる。
>>908
そう、お前のようなうんこがな。
917デフォルトの名無しさん:02/08/13 22:50
>>911
煽る気も起きないくらいのアフォ...珍しいくらいのアフォ...
918デフォルトの名無しさん:02/08/13 22:57
>>911
宿題なら、問題を書け。まだその方が分かる。その上で分からない部分を示せ。
宿題じゃないなら、おまえプログラミングに向かないからやめた方がいい。
>>917
「煽る」とか、そういうおぞましい視点でこのスレを見てるお前のほうが
阿呆。それにキモイ。
>>919
> 阿呆。それにキモイ。
オマエモナー。

久しぶりに使ってみました。
911=919?
何でもいいよ. >>918が一番マトモなこと言ってると思うがどうよ.
923919:02/08/13 23:30
>>921
違う違う。
なんか煽るためだけに、こんなスレに来てる奴がキモくてね。
まあ、俺も>>918には同意だけど。
<`∀´>痔スレはお前が立てるニダ>>950
925950:02/08/14 01:30
お断りだ, ハゲ!
926花男:02/08/14 17:00
すみません。宿題でどうしても分からないのですが手伝っていただけませんでしょうか?
C言語の構造体の問題です。
「1:00から5:00まで4時間分の電車の時刻表がある。この時間帯(1:00〜4:00)
のある時刻を入力し、次の電車の到着時刻は何分後で何時何分か表示せよ

(時刻表)
1時 10分 24分 35分  40分 55分 59分
2時 13分 26分 37分  49分 
3時 7分  15分 45分
4時 30分 51分       」

ちなみに自分はプログラムではCが初めてでそれも数ヶ月はじめたばかりの厨房です。
せめてヒントを下さい。よろしくお願いいたします。

  
927花男:02/08/14 17:04
つーかこのスレもう誰もいないや・・・
新スレに改めてカキコします。
>>927
まだ次スレ立ってなかったと思ったけどおれがED?
>>928
EDなの?
930デフォルトの名無しさん:02/08/14 17:24
>>926
これ、構造体の問題なの? 単なる配列の問題じゃなくて?
分に直した時間の配列を持って、入力される時間も同様に分に直して、配列と比較すればよいんでは?
>>926
まずその時刻表をどうやって表現するか決めなくてはなるまい。
表は早い順に並べて配列に入れるとして、時刻の表現が問題だ。

1) 午前0時を基準に分で表現する
2) 構造体を使って時、分を入れる

の二通りが考えられる(これ以外にも秒であらわすとかいろいろあるけどいらんだろ)。
構造体の問題というからには2)で表現するんだろうなあ。
時間の比較、大小判定は1)の方が楽なんだけど。

そいで2)で表現するとする。まず構造体を定義する。

typedef struct {
  int h; // hour
  int m; // minute
} atime; // ださい構造体名だ

次にこの構造体を扱う関数を考える。差を分で返す関数があれば十分だろう。
大小の比較はこの関数が返してきた結果を利用すればいい。

// t - uを計算し、結果を分で返す。1時間=60分という事実を使って計算しろ。
int atimesub(atime t, atime u);

時刻表はこういうふうに初期化しとけ。
atime timetable[] = {
  {1, 10},
  {1, 24},
    :
    :
};


入力された時刻もatime型の構造体に入れて扱えばいいだろう。
以上がヒントだ。あとはこれらを使ってなんとかしてくれ。
Cを始めて数ヶ月だったらなんとかなるだろ。
932928:02/08/14 17:32
>>929
おれだけ勃てないのかな、と思って。




……逝ってきます
934花男=926:02/08/14 23:23
926さん 有難うございます。
すみません。こちらのスレッドは終わっていると思っていたものですから
丁寧にヒントを下さる方がいらっしゃるとは思いませんでした。
それで誠に申し訳無いのですが他のスレでかなり具体的な内容のプログラム
を教えて頂いてしまいました。

ただ931さんに教わったことを参考に良く考えてみます。
この電車がくるまでの時間を出す関数がどのようにしたらいいかさっぱり
分からなかったので頂いたヒントで考えて見ます

やけに丁寧なマルチだ。
936花男:02/08/14 23:37
すみません。上の書きこみ931さん、有難うございますでした。

マルチのつもりはないぽ。<935
>>936
みんな、口をそろえてこう言うんだ。

「結果的にマルチ」
938花男:02/08/14 23:52
ウワアア━━━━━(`Д´)━━━━━ ン!!!

そ・・そんなつもりじゃ・・
>>938
まぁ気にするなよ。気にしたって「結果的にマルチ」という事実に変わりないわけだし。
(`・∀・´)ハハハ
どうせ結果は同じだとか開き直ってマルチされまくったらなんかやだな
942デフォルトの名無しさん:02/08/15 23:00
次スレどこー?
>>942
>>925
仕方ないから>>949が立てて.
944949(予定):02/08/15 23:09
断る カチャ
  ;y=ー( ゚д゚)・∵. ターン
  \/| y |)
そして誰も立てなかった…と.
予定って
死んだら949取れないがな
947デフォルトの名無しさん:02/08/15 23:29
やだよ
じわじわとけん制?
949949:02/08/15 23:31
やはり断る カチャ
  ;y=ー( ゚д゚)・∵. ターン
  \/| y |)
        はぁ〜
    ∧_∧            ((
   ( ´Д`)            ) )
  /    \          ノ
  | |     | \        ((  ((
  | | /⌒|⌒|ヽ二二つ    )    ) 丿パチパチ
  ヽ二二Ο./      \ (( (   ノノ
  (_| |_| |_       \ ∴λ∵ ←>>943
    .(__)__)       //》||ヾミ\
新スレたってる。誰か知らないがお疲れ様です
かえんほおーしゃだ でんげきだー
ちょーのーりょくをー つかうときー
ばびるーにせいの ひとみはもえーえるー
A
955デフォルトの名無しさん:02/10/10 09:15
10進BASICを使ったプログラムで、こういうのの作り方を教えてください。
連立1次方程式を解く。
初期値(x=0)を与えて、蜘蛛の巣のようにして連立一次方程式を解いてみる。

1)y=2x+4 y=4x
2)y=x-1 y=-2x+2
3)y=5x+4 y=-3x+1
4)y=-x-2 y=1/2x+3

掃き出し法 で検索すれ
957nanashi:02/10/10 14:15
 99999以下とは限らない正の整数を次々と読み、データの個数と最小値、
2番めに小さい値および3番目に小さい値を印字するプログラムを作れ。ただし、
データがつきたことをあらわすために、0または負の数を入力することにする。

このアルゴリズムのを書いてください。流れ図でも箇条書きでもよいです。書き
方がさっぱりです。
958デフォルトの名無しさん:02/10/10 14:21
>>957
> 99999以下とは限らない

これの意味わからないな。
とんでもないでかい数字が入ってくるってこと?
959デフォルトの名無しさん:02/10/10 14:26
ボクの小学校の夏休みの宿題で
夏休みの思い出っていう題名で作文書いてきてっていわれました。
夏休み終わったのにまだ、できてないからてずだってください。
つーか旧スレageんなぼけ
http://pc3.2ch.net/test/read.cgi/tech/1029422194/
961nanashi:02/10/10 14:31
>>958
よくわからないけど99999より大きい数をよみこむとエラーがでるのかな?
962デフォルトの名無しさん:02/11/14 04:55
#include <stdio.h>
#define swap(a,b) {int temp=a;a=b;b=temp;}
int num[3];
int main(void){
int count=0, n;
for(;;){
scanf( "%d", &n );
if( n <= 0 ) break;
count ++;
if( num[ 0 ] == 0 ) num[ 0 ] = n;
else if( num[ 1 ] == 0 ) num[ 1 ] = n;
else if( num[ 2 ] == 0 ) num[ 2 ] = n;
else {
if( num[ 1 ] < num[ 0 ] && num[ 2 ] < num[ 0 ] ) num[ 0 ] = n;
else if( num[ 0 ] < num[ 1 ] && num[ 2 ] < num[ 1 ] ) num[ 1 ] = n;
else if( num[ 0 ] < num[ 2 ] && num[ 1 ] < num[ 2 ] ) num[ 2 ] = n;
}
}
if( count < 3 ) printf( "(゚д゚)\n" );
else {
printf( "データの個数:%d\n", count );
if( num[ 1 ] < num[ 0 ] && num[ 1 ] < num[ 2 ] ) swap( num[ 0 ], num[ 1 ] );
else if( num[ 2 ] < num[ 0 ] && num[ 2 ] < num[ 1 ] ) swap( num[ 0 ], num[ 2 ] );
if( num[ 2 ] < num[ 1 ] ) swap( num[ 1 ], num[ 2 ] );
printf( "最小値:%d\n", num[ 0 ] );
printf( "2番め:%d\n", num[ 1 ] );
printf( "3番目:%d\n", num[ 2 ] );
}
return 0;
}
これでいいのか?
リア厨でもできたぜ?(ワラ
>>957
ひょっとして続きものの問題じゃない
それの一つ前に99999以下に限った問題があったとか

scanfを使うことが期待されているような問題だとすれば
文字列として読み込んで数値に変換するのが問題の肝じゃないかな
964デフォルトの名無しさん:02/11/14 05:37
>>963
釣れた(ワラワラ
965デフォルトの名無しさん:02/11/14 13:41
だれか助けて。。。
このcleanStringのメソッドをどう作ればいいのかがまったくわかりません。
http://www.cs.okstate.edu/cs1113/programs/pgm04.html
↑ここに宿題があります。。。
電卓で計算させるとこがうまくいかない・・・
気が向いたら誰か助けてください。
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Dentaku extends Applet{
TextField display=new TextField("");
Panel keyPanel=new Panel();
String buttonString="789/456*123-0.=+";

public void init(){
setSize(200, 250);
setFont(new Font("Monospaced", Font.BOLD, 14));
setLayout(new BorderLayout());
add(display, "North");
keyPanel.setLayout(new GridLayout(4, 4));
for(int i=0; i<buttonString.length(); i++){
if(i==14 || i%4==3){
keyPanel.add(new OperatorButton(buttonString.substring(i,i+1)));
}else{
keyPanel.add(new NumberButton(buttonString.substring(i,i+1)));
}
}
add(keyPanel, "Center");
add(new ClearButton(),"South");
}
public void actionPerformed(ActionEvent e){
String number=getLabel();
display.setText(display.getText()+number);
}
}

次の計算させるとこがよくわかりません。
968966 967 988:02/12/06 23:29
public class OperatorButton extends Button
implements ActionListener{
public OperatorButton(String s){
super(s);
addActionListener(this);
}
public void actionPerformed(ActionEvent e){
String operator=getLabel();
double number=(Double.valueOf(display.getText())).doubleValue();
double result=(Double.valueOf(display.getText())).doubleValue();
if(operator.equals("/")){
}else if(operator.equals("*")){
}else if(operator.equals("*")){
}else if(operator.equals("-")){
}else if(operator.equals("+")){
}else if(operator.equals("=")){
number=result;
display.setText(String.valueOf(result));
}
}
}
}
969966 967 988:02/12/06 23:32
すみません、抜けてました
public class ClearButton extends Button
implements ActionListener{
public ClearButton(){
super("C");
addActionListener(this);
}
public void actionPerformed(ActionEvent e){
display.setEditable(false);
display.setText("");
}
}

訂正967
public class NumberButton extends Button
implements ActionListener{
public NumberButton(String s){
addActionListener(this);
}
public void actionPerformed(ActionEvent e){
String number=getLabel();
display.setText(display.getText()+number);
}
}
970デフォルトの名無しさん:02/12/14 12:19
すいません教えてください。お願いします。
3つの配列のうち最小のやつを選びたいのですが、

minimum( Gx[i][j-1] , Gx[i-1][j] , Gx[i-1][j-1] );
としてminimumに渡したいのですが、

minimum' : 1 番目の引数を 'unsigned char' から
'int [][512]' に変換できません。

とエラーが出て上手く渡せません。どうしたらよいでしょうか。

ちなみに

#define X_SIZE 512
unsigned char Gx[X_SIZE][X_SIZE];

unsigned char minimum(unsigned char Gx1[X_SIZE][X_SIZE],
  unsigned char Gx2[X_SIZE][X_SIZE],
unsigned char Gx3[X_SIZE][X_SIZE]){
}

と、しているのですが・・・。
>>970
マルチ氏ね
マルチポストじゃなきゃ答えがもらえたかもしれないのにね。
973デフォルトの名無しさん:02/12/14 12:38
>>970
呼び出し元から呼び出し先へ何を渡したいの?
974970:02/12/14 12:53
>973

Gx[i][j-1] , Gx[i-1][j] , Gx[i-1][j-1] です。

for (i=0; i<biWidth; i++){
for (j=0; j<biWidth; j++){
Gx[i][j] = gx[i][j] + minimum( Gx[i][j-1] , Gx[i-1][j] , Gx[i-1][j-1] );
}
}

って感じでminimumに Gx[i][j-1] , Gx[i-1][j] , Gx[i-1][j-1] を
渡したいのですが・・・。
975bloom:02/12/14 12:53
976デフォルトの名無しさん:02/12/14 13:04
>>970
とりあえず関数の引数については置いといて・・・

唐突だけど、関数内でGx[i][j-1]を他の変数に
代入するのってどうやる?
977970:02/12/14 13:29
>>976
A[i][j]にGx[i][j-1]を代入するとして
どちらの配列もグローバルで定義してから、

for (i=0; i<biWidth; i++){
for (j=0; j<biWidth; j++){

A[i][j] = Gx[i][j-1]

}
}


として代入しています。
但しこの場合 , (i==0 || j == 0)のときは
Gx[i][j]は0としているのですが。

初心者なのでよくわからないのですが。
わかりやすくお教えください。

978デフォルトの名無しさん:02/12/14 14:14
http://japan.pinkserver.com/under/index.html
勝手に他人のサイトを直リンク!!
「法的根拠はない!!」
「だから直リンしてます」
ハァ?
ネチケットも守れない痛い厨のサイト晒し
pinkserverってアダルトサイトじゃなかったっけ? 宣伝か?
>>979
いや、行ってみたが、なんかマジでイタい厨だったよ。
たぶん、ヲチ祭りだろう。。どこでやってんのか知らんが。
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。