にげっとかな?
1です. 前スレ常駐してたわけではないので, 常連さんで気がついたリンクあったら書き足しておいてください.
>>4 前スレの内積、
if (n == 0) {
return 0.0;
}
↑これいらなくない?
6 :
Rina ◆tI333vNE :02/07/27 16:53
7 :
Rina ◆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
印刷というか多分それを書き出すプログラム?なのかなあ。 自分でもよくわかりません。はあーー。
(・∀・)
>>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をメインで使っている人物が、今は出払っている罠
24 :
Rina ◆tI333vNE :02/07/27 19:17
いや、テケトーに作ったのがあるんだけど書き込めない…(汗 いっそ改行とっぱらって書き込もうか…。
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; }
// 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) + "月"); } } } }
けっこう長くなるんだね。
もっと短く, かつ効率的にできるけどやってない.
コメントの分もあると思われ.
必要なら
>>9 がやるでしょう.
てか、配列使う必要性あんの?
31 :
おねがいします! :02/07/27 19:44
ありがとうございます!! かなり助かりました。ちょっと感動。。。
使わない方法教えて, 気になる. 使った方がコードの見通しがいいと思ったんだけど.
>>33 売上の最大の月が複数あったらどうすんだ ? 結局配列が必要だよ。
35 :
Rina ◆tI333vNE :02/07/27 20:11
36 :
デフォルトの名無しさん :02/07/27 20:13
マジですか(汗 当方、ぶちゃいくなので止めといたほうがいいと思われ.
ガクガクブルブルΣ((((゜Д゜)))ガクガクブルブル
>配列 Collections Framework を使えということではないか?
…納得.
実は私が厨だというワナ
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 それだけ分かってれば書けるだろ?
何が分からないんだ?
閏年の時はどうすればいいかわからなかった(泣)
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){ // うるう年 }
何故Winを起動しえいたらJavaが書けないのだ?
>>50 Windows版のSDKが入ってなかったり、デュアルブートだから
再起動が面倒だったり、Meadowの使い心地がイマイチだったり。
>>51 この程度のコードにコンパイル確認なんかいらんだろ。
メモ帳で打つのも嫌。 ごめんなさい、emacsマンセーなんです。
xyzzyを薦めてみる・・・
>>53 俺なんかココでお試しコード書くときは、このテキストエリアに
直書きするぞ(藁
56 :
デフォルトの名無しさん :02/07/28 00:45
>>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 どういう授業の課題かにもよるんじゃない?
Athron1G,メモリ256での結果。 Java>gcc>.NET 71回 Java=gcc>.Net 6回 gcc>Java>.Net 23回 とりあえず100回やってみました。 じゃークライアントから電話掛かってきたのでお仕事いってきます。 …行きたくない。
誤爆しました、逝ってきます。
>>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ずつ減らしていけば いいんじゃない...?
すいません、、、なんとか書いていただけないでしょうか。 ずうずうしいこと言って本当にすいません。
数式書いてよ。 そしたら、実装するよ。
#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; }
あ、だめっぽいすまん
いや、あっているとおもう
>>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; }
いまさらながら、さっきの直した。 #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重ループ。 ここに直で書いてたら、もう出てたという罠。
if ( x < 0 ) ans = 0; else これいらないやゴメン
>他の回答者さんたち テストがてら、各xに対する組み合わせ数でもはりませんか?
あってるかな? x = 10 => 4 x = 50 => 37 x = 100 => 159 x = 150 => 451 x = 500 => 19162
x=10 => 4 x=50 => 37 x=100 => 159 x=150 => 451 x=500 => 19162
をを!いいかんじ。
ただ、
>>73 はどこにいったのか?
しかしなんというか…、つっこみたくなる > 7 - d
(;´∀`)=3 よかった。ってSchemeで書いてあった見本をCに翻訳しただけなんだけど x = 1000 => 248908 5000とか入れると止まっちゃうねえ。もっと速いアルゴリズムないのかな
いや…、よく気づくね
再帰と7-dによる
>>79 と、6重ループの
>>82 では、
どっちが評価高いんでしょ。
cの宿題的には、
>>79 もありかもネ。
いやいや
>>82 は一番遅い。
82を5重ループにすれば、
オーダーで言えば再帰にしろループにしろ
全てカウントするタイプだからどれも同じ程度
他人の宿題ながら、なんだか楽しかった。
すいません73です。徹夜でこの問題考えていたもんでいつの間にか机につっぷしてました。
みなさんこんな時間に本当にありがとう!!! しかも私意識飛んじゃってて本当にすいませんでした。
|| ∧||∧ ( ⌒ ヽ ∪ ノ 計ってみたらダントツで遅かった.......鬱氏 ∪∪
二日酔いで昼過ぎに起きたら、 今日締め切りのレポートが完成して机の上に置いてあった。 という心境だな。
わしも徹夜でしたので体力使い果たしました。 寝ます
うっ、、、返す言葉もございません。
速さ云々はたいした問題じゃないな 解析的に求まるし おやすみ
本当にありがとうです。
>>73 どうでもいいけど徹夜で考える前に google で調べてみたの?
"小銭の払い方 C"
で検索してみ。
質問です。下のプログラムと同じ結果を表示するように、 グローバル変数を用いて書くのってどうやりますか? #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); }
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);
}
>>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 になっているのに気が付いていたか?
>>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のプログラムに入れ込んでもらえませんか?あほですんまそん。
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); を置けば。
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;} } だな。
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
これでいいんでしょう?
関数の置き方がわからないのか? 使う前に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 インデント付けろとはいわんが空行くらい入れてください・・・。
>>130 そうです!でも0はいりません。すみません、説明不足でした。
>>133 うーん、この宿題は0が入力されたらどうするの?(0も有効なの?)
0を無視していいなら表示するときに飛ばせばいいと思うけど。
そうでなかったら、配列の長さを変数で保持して、shiftで減らすとか・・・。
>>132 上の修正ができたら、空行いれるよ。
つーか、文句は124に言ってくれ。
>>134 入力された0は有効です。
例 1、3、5、0、7、5
↓
7、5、3、1、0
できたよ。テストしてね。 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"); }
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; }
137のshiftだと12345678 で全部入力されてると 動かないよなあ。でも直せん。
140 :
デフォルトの名無しさん :02/07/28 14:32
C言語で任意の整数を定義するにはどうしたらいいのでしょうか?
これでお茶をにごしとこう。 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 とりあえずは文字列として表現するのが手っ取り早い。
char *add(char *a1, char *a2);
main(){add("123", "456");}
みたいな(中身を書くのは面倒臭いから勘弁。
また関数が返す値は関数内部で新規にメモリを
確保したとこに書く(形に実装したほうが手離れが良い?)から、
使用後は free するのをお忘れなく)。
それが嫌(速度・メモリ etc. の為)なら
その部分だけアセンブラで書くのが吉。
>>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を表示するだけちゃうの?
#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; }
あ、あとscanfの%d→%fかな
で、
>>149 はbを使ってることになるのかな?
あと、△形かどうかの判定は無くて良し?
次の宿題カモーン
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
>>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;
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; }
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; }
1125899906842624じゃない?
間違えた。 下ので 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 は下の方が一致してるよね。上位桁の扱いに問題がありそう。
うわ、書いてる間にちゃんと訂正されてた。鬱。
次はまだか?
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
うっ!問題の意味がわからない。
みなさまありがとうございます。
>>160 doubleでできるんですね。。。
>>163 いまいち理解できてませんが、ありがとうございます。
これからじっくり読みます。
(2) チェスのナイトは、将棋の桂馬と同じ動きをするが、前だけでなく左右や後ろにも桂馬飛びができる。 そこで、3×3の配列bとcを宣言して、それぞれに現在位置(i,j)から移動できるマスの番号を2桁の整数で入力する。 移動できるマスが(3,1)ならば31と入力する。(この問題では移動できるマスは常に2つなので配列bとcを使います。) ここの意味が分からん。
とりあえずナイトを真中に置いたら手詰まりだってことはわかった。
>>176 よし、助け船を出そう。
こう回答しとけ。
「設計自体が悪いので却下します」
それが角が立つので嫌だというならこういうのもあるぞ。
「一体貴方はプログラマを育成したいのですか?
それともキーパンチャーを育成したいのですか?」
どうでもいいけど、コード貼り付ける時 全角スペースで字下げしてくれないかなぁ… 読み辛いです ダメならいいけどさ
>>149 3個目の点の値を入力して実行すると値が変わるんですけどどうすればいいですか?
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を作って!
191 :
デフォルトの名無しさん :02/07/28 22:38
194 :
デフォルトの名無しさん :02/07/28 22:56
>>193 あれ? ナップザック問題って「線形計画法」で解くんだっけ?
動的
かぶった しかも、レス付け間違えた
>>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言語によるはじめてのアルゴリズム入門(河西朝雄 著,技術評論社)
#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
>>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・・)となるんですが・・・
204 :
デフォルトの名無しさん :02/07/28 23:41
θ=30なら、(5,6)→(7.696857, 1.326041)になるけど?
sin30=0.5 cos30=0.86・・・
>>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; }
(0.5・・,0.86・・)→(1.000,0.000)でいいんじゃない?
211 :
デフォルトの名無しさん :02/07/29 00:03
>>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に
データを代入する関数を使うにはどうすればいいんですか?
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点
217 :
デフォルトの名無しさん :02/07/29 00:40
198さんのとおりにやったんだけど、うまくいきませんでした。 んで自分でちょっといじくったらセグメンテーション違反って結果が。。。 初心者で申し訳ないのですが、一体どうすればいいのでしょうか?
>>218 別に[3][2]でもいいけど
行列を考えたときそのほうがわかりやすかったからでふ。
なんかおかしぃ
>>214 関数の入れ方がわからないんですけど・・・。すみません。
[3][2]のほうがわかりやすいね。
#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; } これであってるかな?
C使いはじめてから十数年、全部構造体の配列でやってるなぁ。 だから、多次元配列なんて一度も使ったこと無いんだ。 だいたい、ミスってても分かりづらいからバグの温床になるんだよな。 経験上、他人のソースをレビューしてて真っ先に注目するのってソレ。 一番ありがちなのは次元を間違えて別領域書き潰し。 スタックぶっ潰してるから、関数から戻ったときに訳のわからんアクセス 違反でアボート。 Cではヤメにしない?多次元配列。 移植性損なわずに、ベクトル演算できるわけでもなし。 少なくとも宿題レベルで必要無いと言い切りたい。
例えば
>>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 見たら配列使うような指示が・・・
2次元くらいなら問題ないと思うけどね。図にもできるし。 3次元以上は使わないけど。 まあ、実際のメモリを考えると2次元もおかしいんだけど。
200ですがどなたかおねがいします・・・
231 :
デフォルトの名無しさん :02/07/29 02:18
>>226 俺がその問題解いてたときは
#define SIZE 2
typedef float point[SIZE];
typedef float matrix[SIZE][SIZE];
ってして、point関係の関数作ってあまり考えなくても
いいようにしてたよ。
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 ;
}
}
>200 じゃあ、Ruby while line = gets i = 1 puts line.split(',').map{|n| i *= -1; (i == 1 ? '1' : '0') * n.to_i}.join end
やっとできた。ループがカッコ悪いのでだれか直して。 #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 ;
}
しまった配列を使えというのか
>>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"); } }
つか、もう全然違うものになってしまったな(w しかもバグ取りに使ったprintf残ってるし(恥
夜中に目が覚めてチラっと見にきたらレスの数がが増えまくってる…。 おそるべし2ch…。
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");
}
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; }
間違えた。
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 でどうぞ。
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 : : : : と表示したいのです。どうぞお願いします。
>>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();
}
}
みたいに書けってこと。
う。名前が残ってた。
>>237 >>238 >>241 遅レスすみません。きちんと解いてくれた方ありがとうございました。
微妙に嫌がらせしてくれた方、微妙におもしろかったです!
>>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]); } できればコメントつけていただくとうれしいのですが…
>>253 とりあえずRubyで。
while line = gets
puts line.scan(/1+|0+/).map{|s| s.length}.join(',')
end
次Cいくから待ってろ(w
>>253 えーと、問題を見ると、配列aは
char a[38];
と定義するように見えるんだけど違うのかな。
Cのコードは問題に含まれてる? それとも君が書いた?
>>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
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でも動かして 自分でデバグしろよ。
266>> ほんと素人ですいません… コンパイルはgcc -o test test.cとやって別にエラーも出てきません。 で、実行結果は 品 目 重量 価格 d 1 110 c 2 225 セグメンテーション違反です と表示されるんです。
>>268 こっちでも試してみたけど、違反は起きないなあ。
270 :
デフォルトの名無しさん :02/07/29 17:48
MDIのアプリケーションなんかで(ワードとか)、 複数枚のウィンドウを表示してる状態でそのウィンドウを閉じると その前にアクティブだったウィンドウにフォーカスが映りますよね。 あのように、その前にアクティブだったウィンドウのハンドル って、どうやってとれば良いんでしょうか? よろしくお願いします。<(__)>
269さんありがとうございます。 でもやっぱり動かないんですよねぇ。 いったい何がいけないんだろう? もう少しいろいろがんばってみます!
272 :
デフォルトの名無しさん :02/07/29 17:54
全角スペースは半角に変えた? #define LIMIT 8 #define NUMBER 5 #define MIN_SIZE 1 で gcc -Wall -o test test.c やってみて。
272さん それでコンパイルしてみたら test.c:In function 'main': test.c:warning:control reaches end of non-void function と出ます。
>>273 それはmainの最後にreturn 0; をいれればいいだけ。
return0;もつけて、実行するとやはりセグメンテーション違反って出ます(鬱) こういう場合って書いてるプログラムのどこかがみなさんとちがう箇所とかがあるってことなんでしょうか? スペースの空け方に問題があるとか…?
gcc -ggdb -g3 -o test test.c でコンパイル、 gdb test でデバッガから runしてみ。 SEGVで止まったら p s p item
全角スペースとったののせとくよ。 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]); }
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行目ってことですね?
item[s] が範囲外を指してるのかなあ。 がんばれ。
その printf の直前で念のため s と item[s] の値も 表示してみるといいかもしんない。
>>278 見やすい方が良いかと、全角でインデント付けてみたけど、
かえって悪かったみたい。スマソ
>>279 漏れはVCだから、助けられないけどガンガレ
>>279 > 原因は41行目ってことですね?
そう。そこでp sとp itemしてみ。
プログラムよく読んでないから分からんけど、item[]を初期化してないなんてこたぁないよな?
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
ところでこの問題って同じ荷物を二回選んでいいの? そういう風に解いてるように見えるけど。
キタ━━━━━━(゚∀゚)━━━━━━!! なったぁ〜〜〜〜〜〜〜〜〜〜〜〜〜 ありがとうございます! for(s = 0;s <= LIMIT;s++) { item[s] = 0; value[s]=0; } って書いたけどいいでしょうか? 問題ないならこれでオッケーなんですけど。 とにかくうれしいです! いろいろ協力してくださったみなさんありがとうございます! 今心の底から本当に感謝しています。ちょと涙。 プログラムの勉強をはじめて間もない素人相手にこれだけの助言をいただけてうれしいです。 これからもっと自分でできるようにがんばります!
荷物| 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さんの指摘する部分はこういうことなんでしょうか?
>>289 はい。誠に悲しいことですが、アルゴリズムを根本から直さないと、
その現象は直りません。
ガーン そうなんですか… その修正は難しいのでしょうか? どのあたりを書き換えたらいいでしょうか? よろしければ教えてください…
正直、どの辺を直せばいいってレベルじゃない気はする。
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 になってたけど・・・
もう全部書き換えるしかないってことですか… 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); }
上の参考のやつをみたのですが、かなり僕には厳しいです… すべての組み合わせを試す方法でいきたのですが、どういうプログラムを書いていいのか方向性が見えません・・・ 組み合わせってどうやって求めるのでしょうか? またその重複を省く方法というのはどうすればいいのでしょうか?
>>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); }
ぶひょ。 すでにつくってあげてた人がいた。スマソ 逝って来る
ゲッ、Choceの綴り間違えた(w あ、total weighも表示したかったら自分で改良してね ってその前にこれで合ってるのか知らんけど
301,303>> ありがとうございます! これを参考にもっとがんばってみます!
>>297 これって実質上、全検に毛の生えたようなもの
(ちょこっと枝狩りが付いている?)と解釈していいのか?
枝狩りが結構ヒューリスティックな方法(だと思う・・・)なので
まだ良く理解できん。
アルゴリズムの説明キボンヌ(特に eval の所)
長いソースは
>>216 のソース置き場をご利用いただけます。
309 :
デフォルトの名無しさん :02/07/29 21:00
俺のコードは2重ループ。 一回目のループで最大値を求め、 二回目で最大値な組み合わせを求めたつもり。
二重じゃなくて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 作って。
Cの易しい問題カモーン
宿題というか、ム板プログラムコンテストでもする? 実行時間競うとか。
うーん、 ●実行時間を競うもの ●なんかのゲームを対戦させるもの どっちがいいかな?
>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が書いたプログラムなのだが、これでは組み合わせが表示されないうえに組み合わせたものの数だけ答えが表示されてしまう。 これを改善してみよう。
>>324 つまり、クイックソートよりバカソートが好きと。
>>324 俺もだ。
>>328 クイックソートって再帰で書かれてるのがちょっとね。再帰で書かない方法
もあるけど、本見て再帰で書かれていて嫌になった事がアルヨ。
>328 たかが十数個の要素をソーティングするのにqsort()つかったり、 ましてやクイックソート関数を自作するようなヤシは即頃すけど
>>330 え、そう? 要素数10数個程度にこそqsortを使うけど。
要素数が数万とかそれくらいになってくるとさすがに自前でソートすることを考える。
確実に動くものを作っておいて性能に問題が出たときに改めて
そういうところを見直すもんだと思ってた。
せっかく便利な関数があるんだから使わないと損だよ(w
いや、無論ソート前にquick sortの苦手な配列になっていることが確実なら、
最初から自前のソートを実装するかもしらんが。
4321→1234みたいなソートね。
で、確かqsortってquick sortで実装することは求められてなかったんじゃなかったっけ。
331>> 327は夏厨なんだからもっとわかりやすく教えてやれよ。
>332 数10と十数は大違いだから覚えとくように 要素数が20以下ならqsortより自前のbubble sortのほうが速い
>>334 >>330 も
>>332 もどっちも10数(十数)だけど?
要素数20以下つったら、バブルソートの方が速いつったって、
そんな少ない要素数ならどっちも誤差じゃないのかな。
ループのなかで何度も何度もソートするというなら、
そりゃ自前でソートするしアルゴリズムも検討するよ。
そうでなければ誤差だと思うけど考え方間違ってる?
>335
>
>>330 も
>>332 もどっちも10数(十数)だけど?
すまん。アホった
当然俺の言ってるのは
>ループのなかで何度も何度もソートするというなら
これだが?
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; } } } }
はやっっっっ!!!! ありがとうございました!!
#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; }
もう一つお願いしてもよろしいでしょうか 「適当な実数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; }
ううっ、、、あんなに悩んでた問題が一瞬で、、、、、 ありがとうございました。
早すぎ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)); }
実は同じ学校だったとかだったらおもしろいかも
Rina.mottou == 汎用 一番のりじゃなかったのが実は悔しいw
>>351 まあ、依頼レスを見た時刻にもよるけどねぇ。
それにしても345とかは速い。
にしても, 大の大人がこんな時間に何やってんだか…w …とかいいつつ, 次の宿題に秘かに期待している自分がここに(苦笑
>>348 sin のままのとこあるよ。
あと (*func)(a) は func(a) でもいいね。
うわー、しまったw > sin(tmp) 一度π用に書いて, その後書き直したんで見落としちゃったか. 仕事中にやったら殺されるなw ガタガタブルブル(((゜Д゜)))ガタガタブルブル 関数ポインタって(*func)()じゃなくてfunc()でコールできるの? それは初耳.
あ、func()でもコールできるんだねぇ…一つ賢くなりますた.
調子に乗ってもう一問だけお願いいたします。 言語は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の前の*の意味がわからん
そもそも何がしたいのか分からん<マテ
gcdって暗号だっけ…とりあえず数学のお勉強から始めますかw
>>351 に期待age
*は掛けるのつもりで書きました。 わたしもmod,gcdの意味さえ分からないです。 何とか調べますんでちょっと待ってください。
Rinaたんは今回は捨ての方向で(ぉい).
modはモジュロ、gcdは最大公約数だっけか? ヒントの意味がまるでわからん。
うん, 確かそう. modとgcdは作ったけど, 捨ての方向でw いまノートで作業してる間横で, さっきまで使ってたマシンが 逝かれました…. 買い替えるかぁ….
二つ目のヒントでしょうか kの2進数展開とは、 aのk乗=(i=0からの)Πaの(ki*2のi乗)乗 k=(i=0からの)Σ(ki*2のi乗) 三つ目のヒントはaが大きな数の場合にすぐ破綻してしまうため とあります。 ものすごくわかりにくい書き方しかできずすいません。 だれか〜本当にお願いします〜!!!
>仕事中にやったら殺されるなw ガタガタブルブル(((゜Д゜)))ガタガタブルブル > >関数ポインタって(*func)()じゃなくてfunc()でコールできるの? >それは初耳. おめ−、学生さんだろ。学生さんが悪いとはいわんが なんで「仕事中」なんて書くんだ?
学生?私が? …あの〜、いちおう社会人なんですけど(ヘタレですが).
みんな〜捨てないで、、、 捨てないでくだせ〜〜〜〜〜
>>368 >*は掛けるのつもりで書きました
って、mod m はかけるものじゃないでしょ?
ううううぁぁぁぁぁぁぁ!!!!! そっっっそうか!!(mod m)のまえの*いらないですね 全く分かってないまま質問してすいません。。。。
>>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のことほとんどしらん。
>>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;
}
つまり, 今まで通り (*func)() 書いた方がいいってことですな.
>>374 気持ち悪いにしても、意図は明確なんだしfunc();って書きましょうよ(w
>>375 あ, 可読性を重視してfunc()って書けってレスだったのね.
てっきり互換性を重視して(*func)()って書けって文章かと
早合点しちゃったよw
内容もスレ違いだし, 逝ってきます.
>>358 int f( int a ) // (aのψ(n)乗)*(modm)を計算する関数
{ return 1; }
詳しくは「オイラーの定理」を検索しれ。
380 :
◆aCDPDEl2 :02/07/30 07:12
オイラーの定理 自然数nに対して、1,2,3,…,nの中でnと互いに素な数の個数をφ(n) とすれば、(a,n)=1なる整数aに対して a^φ(n)≡1(mod n) となる。 また、この時のφをオイラー関数と言う。
だめなやつ
こうしろってこと? 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); }
>>384 こんな感じの巨大な地形にも対応させてと言って見ます、
32
10
0000000000100000100000000000000G
00000000000000001111111111001100
11011111111100001000000001110100
00000000000100001000000001000100
00000000000100000000000000000100
11111111011111111000000001000100
00000000000000001000000001000000
00000000000000001000000001000100
00000000000000001000000000000100
S0000000000000001000000000000000
>>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
391>> ビットシフト演算子もわからないのですが、全体的にどういう流れでどういうことをしているのかを知りたいのです。 ここはこういう計算をしてるみたいな…
>>262 すみません。昨日といてもらった問題がちゃんと実行されないのですが
>>366 > すみません。昨日といてもらった問題がちゃんと実行されないのですが
エラー:「ちゃんと」という言葉が曖昧です。
エラー1、警告0、要求は受理されませませんでした。
>397
>>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 コンパイルはできるんですが思う通り出力されないんですが
#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; }
>>403 もちっと詳しく書いてもらえないとこっちとしても対処のしようがないよ。
・なにをして
・どうなった
・どうなってほしい
くらいは書いておくれ。
仕事が立て込んでるのでレスポンス悪いよ、すまんな。
406 :
デフォルトの名無しさん :02/07/30 18:04
直接宿題とは関係ないんですが、プログラミングを勉強すると 将来どのようなことに役立つのでしょうか?今大学で教わって いるのですが、学習意義がまだよくわかりません。 大雑把な質問ですみませんがどなたか教えてください。 僕は理工学部の二年生です。
>>406 プログラムできない奴よりはできる奴のほうが職業選択の
幅は広い
俺さ。
厨房の時に「なんで三角関数なんて勉強するんだ?」って思ったんだよ。
工房の時に「なんで微分積分なんて勉強するんだ?」って思ったんだよ。
ところがさ。PGになって「なんで色々勉強しなかったんだ?」って思ったんだよ。
要するにさ。やりたいことが決まってるなら、それを勉強すれば良いと思うよ。
やりたいことが決まってないなら、なんでも勉強すると良いよ。
ということを若いころに言われた気がするけど、俺は理解していなかったからさ。
多分
>>406 も理解できないんじゃないかな。
>>406 理工学部であれば、将来何らかの技術職に就くつもりかな。
であれば、道具として計算機を使うだろう。
そのためにプログラミングを学ぶのは決して無駄じゃないと思うよ。
ちょっと条件を変えて同じような計算を何度もやったりとかなんて結構あるんじゃなかな。
電卓でいちいちその計算をなぞるよりも、ちょっとプログラム組んで自動化させたら楽だしね。
多分、技術職になれば嫌でもプログラミングを覚えないと仕事にならんと思う。
研究職ならなおさらだ。基礎体力だと思っておいたほうがいい。
それ以前にプログラミングは楽しいものだが、それは人によるか(w
大雑把な質問なんで大雑把な答を返してみた。
>>407 、409、410
ありごとうございました。とても参考になりました。
>>406 漏れも似たような境遇なんだけどさ、
正直なんでそう思えるのかがわからんよ。
将来ってか今必要じゃない?研究とかでさ。
漏れは逆になんでこんな基本的なことしか教えてくれないんだろう、と思ってるよ。
授業で習ったことだけじゃ研究に使うプログラムも満足に書けないからね。
理工系だろ?プログラム書けないっつーことは、英文科行ってて英語喋れない奴と同類だぜ?
>>406 おまえ自身が将来何の役にもたたなくて
存在意義がないと思う。
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, : : と出力したいです
したいんですかそうですか
したいんですかたいへんですね
>>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; }
>>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です。 対話的に入力しますので、その入力誤りに対しては、再度入力するように表示して再入力させます。 』
なにが分からないのか明記せよ
プログラムを作れません…。作成してください。お願いします!
いやだから、プログラムのどの部分がわからんのよ? まさか、課題が出るような場所にいるのにコンパイルの仕方すらワカランとは言わないよな?
コンパイルの仕方は、わかるんですが、コンパイルするまでのプログラムが、どう作ったらいいのかわからなくって…。
#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)ですかね…
間違えた 4) char* roma[4][10] = { {略}, {略}, {略}, {"I", "II", "III", "IV", 略}}; という配列と3)の結果を使ってローマ数字を表示する。
>>432 2)4000以上もしくは1000未満の数字が入力されたら
再度入力するように表示して1)へいく
一応、問題に「4桁の数字」ってあるんで。
更に間違えてた 4) char* roma[4][9] = { {略}, {略}, {略}, {"I", "II", "III", "IV", 略}}; という配列と3)の結果を使ってローマ数字を表示する。
なんとなくそれっぽいものができたんですが、 ここでいきなり貼ったら教育的効果ゼロですかね。
お願いします。
442 :
manko_chinko ◆c2rpKRNM :02/07/30 21:01
貼ってもらえませんか?自分には、解けそうにないんです。
教育効果ゼロはいやなので、422 = 430 には少し課題を出したい気分。 まず、整数の入力を受け取り、 1000 未満でも 4000 以上でもないことを確認し そのまま(ローマ数字に変換せず)画面に表示するコードくらい書いてみろ。 それがイヤならやっぱりエロ画像だな。
>>445 わからないなりに何かやってみた?
もし何かやってみたのなら、そのコードを貼ってみれ。
422 は学校の課題だとして、何かテキストがあったんだろう。 どんなテキストで、いままで何を習ってきたのか、 そのくらいは説明できないか?
教えてください。
>>444 さて、何カ所間違いがあるでしょう?
void main(void)
{
int n;
scanf("%d", n);
if(1000 <= n < 4000) printf("%d\n", n);
}
答えを聞いてるのに問題だされても・・・
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
宿題丸投げの場合はさ、学校・学部・学科・科目・先生の名前を書いてもらえると楽しいと思わない?
460 :
デフォルトの名無しさん :02/07/30 21:55
>>430 すみません。読解力無いので、手伝えません。
そんなわけで、この宿題は終了〜。
>456 複素数値の入出力に関しては指定はないの? 「3.0 + 4.0 i」とか、「(3.0,4.0)」とか、これだけでも面倒。 それから、456 は(プログラムとは関係なしに) 行列の積の求め方とか、複素数についての知識とかはあるの?
>>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
470 :
デフォルトの名無しさん :02/07/30 22:08
466 ほとんど初めて見るのばっかです。
471 :
デフォルトの名無しさん :02/07/30 22:09
トリップってなんでしょう?
実はともっちです。
473 :
デフォルトの名無しさん :02/07/30 22:09
知るかいな!
474 :
デフォルトの名無しさん :02/07/30 22:11
>>418 コンパイルはできるんですが入力(00000011111100000のような)できません
(特に解答者は)sage進行でいった方がいいと思うのは漏れだけ? >422 432 のアイディアはぜんぜん参考にならない? 461 にも書いたけど、問題そのものがわからないのか、 それをプログラムにする段階でわからないのか、 そのくらいはハッキリしてくれないとどうにもならないし、 いくらなんでも18歳にもなればそのくらい答えられて当然でしょう。
>>468 3999かな?4000ですよね。ボケてました。
478 :
デフォルトの名無しさん :02/07/30 22:28
>>478 なぜ、プログラムが分からないのに、プログラムの宿題があるの?
理解できない...。
>>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とかで分けるより、テーブルから取り出したほうがよかったな)。
書いてはみたものの、わかりづらいなあ。日本語は難しいよ・・・
>>464 コンパイルもしないで質問するけど、これって
4 を IV にしてくれないんじゃないですか?
>>479 出てない講義のレポートなんじゃねーの。
483 :
デフォルトの名無しさん :02/07/30 22:31
英語でお願いします。
>478 で、その、「プログラムがわからない」とは、 もっと具体的に説明できないの?
>>482 納得。それじゃどうしようもないね。終了?
>>477 いや、それもそうなんだけど、
たとえば、1004はMIVと表示しなければならないのに、
464のプログラムだとMIIIIになってしまう。
>481 あひゃ!とうとう俺もボケ始めたらしい。さらば。
一人脱落。。。ラベル低いよ
>>418 ありがとうござうました。コンパイルはできました。しかしうまくいきません
0000000000000000111100000000000000000
0000000000011111111111111000000000000
11,14,12
と実行されます。1行がでません。
490 :
デフォルトの名無しさん :02/07/30 22:38
>>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));
}
}
}
}
これで駄目なら… #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++;}
長すぎるってさ。 #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; (次へ続く)
寝た方が良さそう。
(前からの続き) 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のような形です。
複素数の積と和のプログラムはできたのですが
それを行列と組み合わせるのがわからないです。
よろしくお願いします。
>>499 491が行列の積を求める部分だよ。積と和のプログラム
が出来たのなら関数名の部分を変えて、mainルーチンを
ちょちょっと書いてコンパイルすればいいのでは?
>>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); を作って行列の計算するんじゃないの?
>502 そのコードで 3444 を与えると結果はどうなる?
505 :
デフォルトの名無しさん :02/07/30 23:39
MMMCCCCXXXXIVだが MMMCDXLIVにするのか?
>>495 数字の入力を受け付けてくれません。
ずっと入力待ちなんですが・・・。
>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; }
ナルホド。やっぱり再入力の時は「再入力しろやゴルァ」と表示すべきですかね。 その場合は if (1000 > *i || *i > 0xf9f) { fputs("再入力しろや(゚Д゚)ゴルァ\n", stdout); goto input_loop; } と書き直せばいいはずです。
やはり仕様はきちんと読まないと駄目ということで。
しかし完璧とはいえない。
あと
>>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 を提出するのか?
>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の補数をプリントする部分を関数に すること。 友達に聞いても誰もわかりませんでした。どうかこの問題を解いてください。お願いします。
デジャブ?
>514 もちろん七行スレ出身、七行スレ育ちでチャキチャキの酔っ払いです(w どうも夜になると頭が回らなくなるね。
>>514 440さんおつかれでした。
なんか私がコードを書き始める前に、
>>440 の書き込みがあったので、
完全におまかせモードに入っていました。
519 :
デフォルトの名無しさん :02/07/31 01:15
問題を教えてもらおうとして、 問題を書いたのですが、改行が多すぎますといわれて 載せれません。どうしたらいいでしょうか?
>>515 例えば 345 と入力されたらどう表示されるの?
あと言語は?
問題は下のプログラムをすべての解を表示するようにする事です。 ただし、点対称・線対称の解は排除します。 では、よろしくお願いします。 #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);}
8女王問題! 昔 MSX-FAN で高速なアルゴリズムを募集してたなー。 Z80 程度のおもちゃ(今では)であっさり答えが出てきたのには感動した。
527 :
デフォルトの名無しさん :02/07/31 01:44
N王妃問題なら、 「C言語による最新アルゴリズム辞典」 に載ってるのでそれ参照。
8クイーンのソースなんてさまざまな言語であちこちに落ちてるだろ・・・
>>521 c言語です。すみませんが自分もあまり問題が理解できていません。
>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; }
>>528 それはそうなんですが、理解できないうえに
与えたものを改良しろという問題なので・・・
すいません。
>>529 その辺わかっていないと嘘教えられると困るよ。
問題文もまぎらわしいけど。
んじゃ、345 が入力されたら、
011001111000 3余り符号
100110000111 3余り符号の補数
と表示されるって解釈で話を進めるよ。
っていっても
>>530 と似たようなプログラムになるはずなので、
まずこれを読んだ上での感想やわからない点などを
いってくれ。
>>521 530のプログラムを見ましたが理解できませんでした。そちらの解釈通りで結構なので プログラムを進めて下さい。お願いします。
>>522 と全く同じ課題、ソースを持っている。
こんなとこで訊いてんじゃねえボケ。検索すればすぐ見つかるだろうが。
>>534 そういうときは黙って見守って、あとでコソーリ教官に報告しておくものだよ。
どうせこのスレは丸投げ厨にはまともな答えを返さないから。
>>533 マルチしてんじゃん。せっかく対応してるのに…
なんかやる気失せた。
途中だけど、貼り付けてあげるからあとやれ。
#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; } ~
なんだかんだ言って, 今までやった分を張り付けてあげるところが 優しいねw
>>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が正しくないとか
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
ねらいがはずれた模様。
>>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 そりゃ数字の文字列を整数にする処理だ。
終わった後が","かどうかとかやればできるんじゃないの?
一文字ずつ読み込んでるんじゃない? 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 会社の研修用の宿題なんです(涙) できなくて、ほんと泣いてます・・・。
>>558-561 どうもありがとうございます!理解できました。
あとは自分でがんばってみます。
でも課題があと2つあるので、行き詰まったらまたお願いします。
皆さん、ありがとうございます!宿題できました! #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 たぶん、ウィンドウプロシージャみたいなのがあるでないの? イベント割り込みみたいなー
>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
ねぇねぇ〜、ヒストグラムってなにさ? 詳しく教えてくれ。
>573
それって、変数定義してだけだろ????
いや、オラクルやったことないから分からんけど、
>画面を移動する際、変数を渡したいのですが、どのように渡したらよいのか
>わかりません。
画面を移動したり、キャレットがテキストボックスに表示されたりすると、
イベントが発生して、それをうけとるんじゃないの?
ORACLEのHPから、ドキュメントが見れるから、それ見れば?
ttp://otn.oracle.co.jp/document/products/forms/ これぐらい、自分で探せると思われ。
すいません、さっそく。
>>557 で書いた関数(command())の戻り値が*aなんですけど、この後この関数の戻り値で
行指定があったかどうかを判別してます。
cp = command(&a_no)
if (a_no > 0)
cpはswitch()に渡してます。(コマンド判別)
戻り値を引数にしてる???
ちなみに「3d」のような行指定は標準装備です。
わけわからんくなってきた・・・
>576 もちろん、リファレンスは見てるのですが、 その解釈もできなくて・・・(涙) イベントはcall_formで発生はさせています。 変数(とは違うと思うけど、この場合パラメータ)は宣言してるだけ っていうのはわかってるんですが、 それをどう使っていいのかがわからないのです。
>>577 こっちも全然わからないんだが…
関数commandの定義はどうなってる?
char* command(int* a) てな感じ?
「3d」と入力された場合と、「3,10d」と入力された場合とで、
cp と a_no の内容はどうなる?
>>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 っていうのがどういうものかは
わかってる?
>>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のアドレス(位置)を渡している。
そこにある箱の中に行指定を入れといてくれやという感じ。
これでもわからなかったいってくれ。
>>585 ズバリです!これだけの情報でそこまでわかるんですか!?
嗚呼、なんてアホな俺。課題の提出は明日。ハァ・・・
急にヤル気がなく(以下略
うちではこれで動いたよ。 #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; }
>>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++;}
>>587 アドレスを確保しとくから処理が終わったらここに(&a_no)にいれてくれ
ってことですか?
うぅ、一回寝ようかな?頭回らなくなってきたし、座りっぱなでケツが痛ひ
>>592 処理が終わったらでなく、入れるタイミングはcommand()の方におまかせ。
今回の場合、command()の *a = -1; や *a = n; で a_no に -1 や nの値が入る。
>>592 なるほど、わかったようなわからんような・・・うーむ
>>585 そこっ!そこさえわかれば。
どこでわかるんですか?
>>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は行を詰めるから、この二つは別もの。
>>595 うおぉぉぉ!できたっ!!
ありがとうございます!
では、また次の課題でくるかもしれません。と言うかくるでしょうw
バイトいってきます。 イツネヨウカナァ
>>597 この慌てぶりだと、今度は"3d"が機能しなくなってたりして…
>>599 bccです。
>>600 じゃあ、
if (a[0] != '0') printf("0,");
のところ消しといて。
>>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関数をどのように書けばいいのか
わかりません。よろしくお願いします。
>>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;
}
>>610 それよりは
struct complex {
double re;
double im;
};
を
typedef struct {
double re;
double im;
} complex;
にすべきであろう。
612 :
sucka :02/08/01 07:26
javacsripts, xml, xsl, htmlなどを使ったプログラム ってどういうのがやりやすいでしょうか? 上の物を使って自由にプログラムしろって言われても・・・・なんですよ。 よきアドバイスもとむ。
613 :
デフォルトの名無しさん :02/08/01 07:38
>>612 どれくらいの難易度のものを作ればいいのかよく分からんが、
html+javascriptでグラフィカルな電卓というのはどうだ。
614 :
sucka :02/08/01 08:00
難易度は易しめ。xml、xslとか習って2ヶ月程度。 グラフィカルな電卓って言うと? ってかどっかにXMLとJavascriptsのプログラミング のexampleみたいなのないのかな。参考にしてー
>>598 はい、"3d"なくなってました。なんか手のひらで弄ばれてる感じだw
一応それもクリアしました。
次は行指定じゃなく /単語/で検索後に処理ができるようにします。
/abc/p
で"abc"を含む行を表示。"d"についても同じです。
とりあえず、今からやってみますけどなんかヒントがあったらお願いします。
提出まであと7時間・・・
>>602 ちょっと3行でテストしてみてくれないか?
たぶん最後の1行鹿結果がでてこないと思うぞ。
もしそうならmainのなかをもう一度確認してごらん。
>>602 というか環境は何よ?
Cmachineなら今すぐやめな。
>>615 の/文字列/で文字列の取り出し方がよくわかりません。
どなたか教えてください。よろしくお願いします。
>>618 まぁ手抜きなんだけど。
if (strstr(行, 文字列) == NULL) {
/* 見つからなかった */
} else {
/* 見つかった */
}
>>618 あれ、解釈みすったかな?
> /文字列/で文字列の取り出し方
i = 0;
while ("/文字列/"[i + 1] != '\0') {
if ("/文字列/"[i + 1] == '/') break;
buffer[i] = "/文字列/"[i + 1];
i++;
}
buffer[i] = '\0';
>>619 その前の処理がわからないんです。
コマンドラインかで
/任意の文字列/p
と入力したとき、コマンドから文字列を取り出してその後
>>619 の処理ですよね?
command()は
>>557 です。ここのcbufなりpから文字列だけを取り出したいのです。
>>621 なんか下手に改造するよりも、edのソースを(以下略)
いちおう if (*p == '/'){ ++p; while (*p != '/') *str++ = *p++; *str = '\0'; } でやってみたんですができません。あと /文字列 のように、/でくくるのを忘れた時の処理にも迷ってます。
処理としては間違ってないような if (*p == '/'){ ++p; while (*p != '/' && *p != '\n' && *p != '\0') *str++ = *p++; *str = '\0'; } とでもすれば間違って読みすぎることは無いかな。 あとstrの中はどうなってる?printしてみれ
>>624 何も入ってないです。しかも普通の動作もおかしくなりました。
うぅっ、あと4時間・・・
strはどう確保してる?
/abcd/を入力 p=abcd/ ,str=a" p=bcd/ , str=" p=cd/, str=" p=d/, str=d" どういうことでしょう?
まさかstr++していって、最初のポインタを保存してないってことはないよな。
>>626 確保と言いますと?char *strですか?
>>627 そこはまだ考えてないので後で考えます。
とりあえずstrの挙動がわからないです。
if (*p == '/'){ char *a = str; ++p; while (*p != '/' && *p != '\n' && *p != '\0') *a++ = *p++; *a = '\0'; } どうだ?
どこか根本的に間違ってる気がしてきた
>>631 できました!ありがとうございます。
>char *a = str;
これが確保ということですか?
strを char *str = malloc(256); などと確保しておいて その下に char *a = str; とすればaをいくらいじってもstrは変わらん。 strを書き換えると後で使うときになってそんな風になって非常に困る。
あ、確保ってのは str[256]とかstr = malloc(256)とかね。 char *a = strってのは確保ではないな。
>>606-611 stroage size of "a" isint known
っていうエラーがでるんですが、これはどういう意味なんでしょうか?
>>499 a[][2]では配列のサイズが確定できないということ。
配列の要素数を省略できるのは一番最後だけのはずなので、きちんと要素数を宣言すればいいよ。
桶?
>>637 すいません、要素数の宣言とはa[][2]を例えばa[2][2]とかにすれば
いいということですか?
ごめん、嘘だ。 正しくは最初だけが省略できる。 逝ってくる。
>>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]
>>643 言われたとおりやってみたらコンパイルはできました。
実行してみたら行列aと行列bの値はでるのですが、
aとbの積がでませんでした。
646 :
デフォルトの名無しさん :02/08/01 15:15
1.オブジェクト指向型ソフトウェア開発のメリットとデメリットについて 2.Java言語の現状と今後の動向について という課題に現在取り組んでます。 でもあまりわからないので、どういったことをかけばよいのか、 そして他の人の意見もほしくて投稿してます。 なにかないでしょうか?
mainでmat_mul(a,b,c)が呼び出せてないみたいなんですが、 どうしたらいいのでしょうか
648 :
デフォルトの名無しさん :02/08/01 15:19
======2==C==H====================================================== 2ちゃんねるのお勧めな話題と ネットでの面白い出来事を配送したいと思ってます。。。 ===============================読者数:120141人 発行日:2002/07/25 どもどもー、ロスタイムに身悶える、とっても苦しいひろゆきですー。。。 昨年5月、珍走団に「文句があったらいつでも来い!バーカ!バーカ!」といいつつ、本当に来られたら、土下座をしてしまったおいらですが、実は他にもあるですよー。恥ずかしい話は、、、うぅうぅ 昨年6月のことですが、おいらに批判的なチョンに「ボコる」「焼き入れる」「殺す」と慣れないセリフを使って一生懸命脅してみたですけど、チョンってば全然ビビッってくれないで「相手になってやる!」なんて言うですよー、、、うぅうぅ おいらってば焦って必死に逃げ回って激ヤセしちゃったですよー、、、うぅうぅ “歴史は繰り返す”といいますが“おいらの歴史”も繰り返しまくりですよー、、、うぅうぅ 皆さんご存知のとおり、おいらってばネットや電話では結構勇敢なんですが、どうも面と向かってしまうとすっかりドテチンになっちゃうみたいなんですよー、、、うぅうぅ でも今はなんとか気を取り直してチョンに反撃をはじめたですよー、、、えっへん イタズラ電話やウィルス爆弾とか家族への嫌がらせとか色々やってますですー。。。 ところで、おいらの病的な臆病さの原因は「腕力に自信がないから」だけではないんですー、、、 それはそれは、、本当に、、本当に、、根深い問題があるんですよー、、、うぅうぅうぅ 臆病さだけではありません。決断力のなさも笑われ始めてます、、、うぅうぅ 元削除人の皆さん!あんまりおいらの秘密言いふらすのやめてよー、、、うぅうぅ んじゃ!
>>648 意味不明。先生に問題の意味を確認してこい。
#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; }
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; }
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呼び出す所でとまってしまいます。
結局、時間が無いので未完成のまま提出してきます。 助言してくださった方々、どうもありがとうございました。
みんなが
>>557 ぐらいの気概があればこっちも楽だ。
>>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
と出たところで止まってしまいます。
>>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 =の結果まで出たぞ
>>659 遅かったか。660 は忘れてくれ。
どう直したら動くようになったの?
本当にちょっとしたミスでmat_mul関数内でiの所にjを書いてしまって いました。本当にすいませんでした。
664 :
デフォルトの名無しさん :02/08/01 17:01
>>661 > Win+Cygwin
CygwinってWindows以外で使えるのか?
>>663 >>653 にそういうところはなさそうだけど、
どうなってるの?
>>659 n, m, l はどういう扱いにするの?
固定にするの?それとも、入力するようにするの?
>>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;
}
>>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;
}
とりあえずこれが下準備部分となります。
>>676 間違えました。
doubleを全てcomplexに修正してください。
void mat_mul(complex** a, complex** b, complex** c, int n, int m, int l) というように変更し、2をnなりmなりlに置き換えてください。 print_mat()に関しても同様に修正してください。
>>675 こちらでもコンパイルすることができました。
なんとか動くように頑張りたいと思います。
本当にありがとうございました。
>>678 どうもありがとうございます。
さっそく試してみます。
waveファイルの結合のアルゴリズムと手法を教えてください。 かなり、ネットで探したんですが、見つかりません。
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"); } } というように変更すれば良いのでしょうか? あと下準備を書く場所はどこでも良いのですか? よろしくお願いします。
>>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も同様にしてみてください。
#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; }
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 この様に変更してみました。
これ以下は以前のプログラムのままです。
>>591 遅レスすいません。昨日はありがとうございました。申し訳ございませんが次の条件でもう一度解いてもらえませんでしょうか
getcharコマンドで、入力データの1行目を読み取り、配列aに代入(1行に38文字あるが、最後の1文字は改行文字と仮定)してカウンターの値を1に初期化する。<最初に読んだ文字(a[0]の値)が続いている間は、カウンタ
ーの値輪1ずつ増やして読んだ文字が今までと違った(文字の連続が終わっ
た)時点でカウンターの値をプリントして1の場合にはそのまま数字をプリ
ントして0の場合には、符号をマイナスにしてプリントする。カウンター
の値を1に再初期化>して<>の間を繰り返す。2行目以降を同時に処理し
てください。
条 件:・配列aを引数として、0または1の数をプリントする関数を作成してください。
>>684 プロトタイプ宣言を修正してください。
a, b, cの変数宣言を加えてください。
l = 4を加えて b の部分を直してください。
c もallocate()を使うようにしてください。
mat_mul()などを呼び出している部分も修正してください。
そこら辺を修正したら、一度コンパイルしてみましょう。
>>685 allocate()のところのdoubleを全てcomplexに修正してください。
691 :
デフォルトの名無しさん :02/08/02 00:24
やばい、夏休みの宿題の絵日記つけるの忘れてた・・・ どなたか20日以降のお天気をおしえてください。
厨房の夏 2chの夏
>>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>>の修正をやってみます。
>>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 で言われた修正をしてみましたが、*の部分でエラーが
でます。どう直せば良いかわからないので、よろしくお願いします。
>>685 > p = (double**)malloc(sizeof(double*) * n + sizeof(double) * n * m);
> t = (double*)&p[n];
これ、環境によっては動かないよ。
>697 double a,b,c; -> complex **a,**b,**c;
#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")の前に変な文字が混じってないか確認して
>>700 行列a は何*何ですか?行列b は何*何ですか?
つじつまがあっていませんよ。
>>699 で言われたように直してください。
c = allocate(n, l); の後のforは要らないです。
#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");
間違えました print_mat(a, n, n, "a");-->print_mat(a, n, m, "a"); です。
配列に入っている整数の和を求める関数を完成せよという問題です。 提出が今日までなので必死なんです(;´Д`) お願いします。 #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;
}
>>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 さん本当にありがとうございました。
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; } 見づらくなってすいません。
>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()を一回しか使ってないんだよ。
なんかソート方法が変だよ。 少なくともバブルソートか交換ソートで、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 ハァ?
>>731 文字列が重なっている場合はどうなるんだ?
テキストが abcabcabc のとき、最長文字列は
abcabc か abc かどちらだ?
741 :
デフォルトの名無しさん :02/08/03 01:37
>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
>>731 結局、詳細がよくわからんのでなんとも言えんが・・・
まずは「ハッシュ法 探索 文字列」あたりで検索かけて参考にしてくれ。
詰まったらここか、
>>732 にでも聞けばいい。
わしゃ眠いから寝る
750 :
デフォルトの名無しさん :02/08/03 02:20
>>748 ビット列なので、
>>747 のはすべて1バイト。
なのでこれ以上圧縮は無理とかいいたいんじゃないの?
>>750 ネタだよ(w
実際にバイナリのビット列作ってみてgzipかけたら元よりデカくなったよ。
一応「おお」と驚いてみたよ。
>>744 回答するなら、こんなところでしょうね。
いずれも情報理論の基本かと思われ。
1:どんなビットパターンを生成しても、
そのビットパターンを圧縮できるアルゴリズムは必ず存在する
2:nビット以下で表現されるビット列を、
すべて、nビット未満に圧縮できるアルゴリズムは存在しない
2:は
>>748 >>750 さんの示す通り。
1:は、たとえば 000 001 010 011 ... 111 のうち、
どれか一つだけを1ビットに圧縮できるが、
他はすべて4ビットに伸張してしまうようなアルゴリズムの存在を考えれば、
任意のビット列を1ビットに圧縮できるアルゴリズムが存在する、と言えるため。
>>744 シャノンの定義ではエントロピーが最大になればいいんだから
完全に偏りのない乱数のようなデータは圧縮できない
たとえばランダムに与えられる8ビットの整数 n は圧縮できない。
>753 結局その乱数もコンピュータがなんらかのアルゴリズムに基づいて生成したものだから そのアルゴリズムに基いて圧縮可能
>>753 >>755 それが「真の乱数」ならばいいのだろうけどね。
でも、「真の乱数」などこの世に存在しないという罠。
>744 ただ1ビット 0 だ(1でも良いけどな)。これ以上圧縮しようが無い。
禿しく亀レスな上に、限りなくどうでもいいのだが、
>>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; } }
>>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 限りなくどうでもいいのだが、レスが早いね。
しまった、sage入れ忘れた。ごめん
しかも、話題が終わってるし。鬱、逝ってきます。
771 :
デフォルトの名無しさん :02/08/03 10:57
(一行に書かれた二桁までの四則演算ができるプログラム) が、課題なんですけど、全然わからないんです、、、 どなたか教えて下さい。
>>771 それって例えば
1 + 2 * 3
と入れたら、ちゃんと 7 を返すようなもの?
#!/usr/bin/perl while(<>){ print eval $_ }
775 :
デフォルトの名無しさん :02/08/03 11:21
仕様は>743位、細かいところは適当にしてください。 一様、出来たことには出来たんだけど、とても遅い
777 :
肉と急得る :02/08/03 12:33
はじめまして、最近JAVAを勉強しだした者です。 アプレット上でCanvasクラス承継したクラスをインナークラスにしてインナークラスを 内包するクラスにインナークラスのインスタンスを生成し、内包する クラスにrepaintメソッドを記述して、インナークラスのupdateメソッド を呼び出しキャンバス上に描画したいのですがうまく呼び出されません。 Canvasクラスを扱うには何かコツがあるのでしょうか? ちなみに問題の内容は 表示ボタンをクリックすると、テキストフィールドに入力された文字列が、 指定されたフォントでキャンバスに表示される。です。 ボタンなどの部品とリスナはすべて作りました、あとはキャンバスに表示 するだけなのですが、どうでしょうか?
>>777 まず、4行にも渡る1文を書く癖から改めた方がいいかなと。
>>777 a.innerclass(extend(canvas)) = new a.innerclass(extend(canvas))
>>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バイト文字を消すプログラムを作っていただきたいのですが 作れるでしょうか? すみませんみなさんの会話を崩してしまい・・・ ここにお詫び申し上げます
例を挙げると I am japanese というのを I am jap と、半角5文字分消せるようにしていただきたいのです
Java以外だろうな。>5バイト文字を消す
HSPです おねがいします
氏ね
>>791 偽者はやめてください 私を騙ったってしょうがありませんよ
>>789 別にどれでも構わないのですが。。。。
794 :
787(793 ◆31SOL0D. :02/08/03 15:53
えっと。。。確かHSPってフリーのあのソフトだっけなぁ 私は画像を表示するだけとかの意味がないソフトくらいしかつくれないのですよ(;゚Д゚)
>>798 あほたれ。どれか構えっつの。教えた結果がまったくの無駄になるとむかつくからな。
798はあほたれが決定済み。
↓
うーん、どつぼにはまった。
ワラタ
作りやすいのってはどれですか?? アセンブラ何か指定しちゃったら何か迷惑だし。。。(この時点で迷惑ですけど(;´Д`)
マシン語.
なんか厨房さんにたくさん引っかかってしまった。。。
なんか厨房さんにたくさん引っかかってしまった。。。
↑面白い
言語がなんでもいい宿題なのか? 5バイトって日本語だったらどうするの?
日本語なんて考えなくていいと思いますよ たぶん
とりあえず後ろ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文字(=バイト)を消す(消したかのように見せる)
後ろの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))); これだけでいいか。
816 :
sucka :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のほうでこの情報を表示すればいいんでしょうか?
javascript"s"
javascriptsがjavascriptのtypoだったとして、
>>816 がjavascriptとなんか関係あるの?
820 :
sucka :02/08/03 18:29
ご免上の板からじゃ、書き込めん。 method="get"は分かってたんだけど、中身のほうがさ。
なにがしたいのかわからにゃー
822 :
sucka :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使うんじゃなく?
825 :
sucka :02/08/03 19:41
そうそう。 finalForm.htmもjavascript使うんだけど、どうやればいいか。さっぱり。 なんか、XMLとjavascriptでプロジェクトしてんだけど、昔にやったjavascriptをわすれてんのよね。
window.location
やった〜!! マジでうれしいです ありがとうございました 規制前だったら2chで書き込める串さしあげてました
828 :
デフォルトの名無しさん :02/08/03 22:24
今日からジャバをダバと呼んでください。 ジャバスクリプトはダバリプトです。よろしく。
HSPって皆さんの目からしてどうですか?
使いやすいですか? 私は最初はこれからやってみようかなと。。。
>>810 さん
これってHSPとかでできますか??
最初っからHSPって言ってるのにね。
>>830 そうですか。。。
何かエラーでたんでえっ?って感じでした すみません
>832 嘘だ・・・5千字で15分くらい
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
>>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とアルゴリズムも
似ているし、オーダーも同じくらい。
>836 おれはソートアルゴリズム発明するよな天才じゃないYO! 要は使い方の問題。
誰かつきっきりで教えてくれる人いませんか?
男か女か、それが問題だ。 いくら払うきがあるのかも問題だ。
女ならただでいいな。 ただし、未婚で彼氏なしが条件。
>>841 気弱な男の人妻とかでもいいが。
さえない旦那を優しく包み込む美人妻。
それを奪い取る快感♪
最終的には恨まれて家炎上しそうだが。
じゃあ屈強な旦那にボコられて後腐れない方がいいのか・・・・?
すみません といれはどこですか?
846 :
デフォルトの名無しさん :02/08/04 21:31
int i; char *d=""; main(){ i++[realloc(d,i+1)]=getc(); } これって、未定義動作ですか?
>>847 ありがとうございます。
getc() は getch() の間違いでした。
i と i++ を使っているのですが、配列の中と外では、
評価が途中で確定するわけではないですよね?
i++[realloc(d,i+1)] 意味不明。
>>849 意味が分かるようになってからレスしれ。
>>850 つぅかint iは配列か?
ポインタですらないが。
849=851 だからぁ、a[2] を 2[a] と書いてもいいんだってばw
>>853 いや、未定義動作について調べて来い、というような内容の宿題なので・・・
ちょうど某スレにこの話題が出ていて、確かめさせてもらっているのです。
>>846 何もそんな生々しい(?)例を持ってこなくても・・・
knkタンみたいに i=i++; でいいじゃないか。
後は j = i++ * i++; とかね。VCとBCCで動作が異なるよ。
みなさん、ありがとうございました。
859 :
デフォルトの名無しさん :02/08/04 22:19
>>858 ありがとうございましたって・・・オィオィ
答えが分かったのか?(w
この問題には、いろいろな落とし穴が複合されているようだが。
>>835-859 すさまじい無視っぷりをどうもありがd
もうこねぇよヽ(`Д´)ノウァーン
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
nachos やって
866 :
デフォルトの名無しさん :02/08/08 14:03
みなさ〜ん、宿題はこっちですよ。
>> 866 宿題じゃないですよハゲ
Borland C++で自販機作ってください。
鉄板がいっぱい要るな。
それ以前に何の自販機だろ。 エロ本でもいいのか?
なんでもええ、エロ本でもエロビでも カモーン、カモーン
自販機板に逝けよ
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 答えが得られれば、それでいいのさ。彼は。
ごめんさい。直してくださいじゃないや。 ヒントかなんか教えてくだされば・・・
つか、howMuchの定義をdeposit()にもってけ。
商品選んでから金入れる自販機なのか。カナダの自販機ってそうなの? まとめて金入れて複数買って最後に釣りレバーとかってできないの?
脳内自販機デス
itemのvalue1やら3をdepositにパスしたいんですけど、その時は deposit(int item)にすればいいんですか?
>>887 いいよ。あとプロトタイプ宣言もいりそう。
state machineで書くと何人かは喜んで「完成」させてくれそう。 パズルとしてはあっちのほうが面白い。
890 :
デフォルトの名無しさん :02/08/12 18:10
C言語のネットワークプログラミングについての質問なんですけど、 無限ループ内でsocket関数を使ってsockfdを生成しようとすると カウンタが1000を少しこえたところで、エラーを返します。 このエラーを回避して、永久にsockfdを生成し続けるには どうすればいいのでしょうか? よろしくお願いします。
>>890 socketの仕様読んでから死のうな。
後、所詮日本の通信回線ではDoSなんて不可能。
>>891 別にDoSってわけじゃないんですけど…
単にネットワークの勉強のためにやってるだけです。
ループ1回ごとに1年sleepすれば?
>890 ループ内でちゃんとsocketをcloseしませう。
895 :
デフォルトの名無しさん :02/08/13 20:45
system関数で実行したコマンドの実行結果を 配列に格納するにはどうすればいいですか?
>>895 >コマンドの実行結果
何を指すのかさっぱりわからない。
popen
設問に正しく答えた例: system内でリダイレクタつけといて、そのファイルをfopen、fgetsする おそらく意図としてより正しいだろうと思われる例 パイプ(_popenとか)を使え
なるほど、popenか。
どうもです。
>>897 >何を指すのかさっぱりわからない。
system関数で実行したコマンドの実行結果。
これの何がわからんのか。あんたの方が意味不明。
>>899 実行結果って成功/失敗のフラグのこと?
それとも標準出力に吐かれた内容のこと?
902 :
デフォルトの名無しさん :02/08/13 21:26
いや、たぶん
>>897 さんは日本語が理解できなかったんだと
思うな。「さっぱりわからない」とか言ってるし。
でもなぜかpopenってことは解ってる。
不思議だね。
906 :
デフォルトの名無しさん :02/08/13 22:23
中身が入ったchar型配列を初期化(宣言時の状態に戻す)するには どうすればいいですか?
>>906 何もしていなければ、宣言時には初期化されていない。
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 を戻す
ただこんなプログラム書く奴とは付き合いたくないがな
なるほど。 では、char型配列の中身を取り除くにはどうすればいいのですか?
>>911 さっきのもそうだが、まず言葉の定義をすること。
「配列の中身」とは?「取り除く」とは?
>>911 無理。せめて'\0'で埋めるなら分かるが。
>>911 もうお前はあふぉかと。
char *a = malloc(10);
...
free(a);
こんなんどうだw
>>911 char a[256];
...
a[0]=0;
たいていはこれで事足りる。
917 :
デフォルトの名無しさん :02/08/13 22:50
>>911 煽る気も起きないくらいのアフォ...珍しいくらいのアフォ...
918 :
デフォルトの名無しさん :02/08/13 22:57
>>911 宿題なら、問題を書け。まだその方が分かる。その上で分からない部分を示せ。
宿題じゃないなら、おまえプログラミングに向かないからやめた方がいい。
>>917 「煽る」とか、そういうおぞましい視点でこのスレを見てるお前のほうが
阿呆。それにキモイ。
>>919 > 阿呆。それにキモイ。
オマエモナー。
久しぶりに使ってみました。
911=919?
何でもいいよ.
>>918 が一番マトモなこと言ってると思うがどうよ.
>>921 違う違う。
なんか煽るためだけに、こんなスレに来てる奴がキモくてね。
まあ、俺も
>>918 には同意だけど。
お断りだ, ハゲ!
すみません。宿題でどうしても分からないのですが手伝っていただけませんでしょうか? 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 まだ次スレ立ってなかったと思ったけどおれが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を始めて数ヶ月だったらなんとかなるだろ。
>>929 おれだけ勃てないのかな、と思って。
……逝ってきます
926さん 有難うございます。 すみません。こちらのスレッドは終わっていると思っていたものですから 丁寧にヒントを下さる方がいらっしゃるとは思いませんでした。 それで誠に申し訳無いのですが他のスレでかなり具体的な内容のプログラム を教えて頂いてしまいました。 ただ931さんに教わったことを参考に良く考えてみます。 この電車がくるまでの時間を出す関数がどのようにしたらいいかさっぱり 分からなかったので頂いたヒントで考えて見ます
やけに丁寧なマルチだ。
すみません。上の書きこみ931さん、有難うございますでした。 マルチのつもりはないぽ。<935
>>936 みんな、口をそろえてこう言うんだ。
「結果的にマルチ」
ウワアア━━━━━(`Д´)━━━━━ ン!!! そ・・そんなつもりじゃ・・
>>938 まぁ気にするなよ。気にしたって「結果的にマルチ」という事実に変わりないわけだし。
(`・∀・´)ハハハ
どうせ結果は同じだとか開き直ってマルチされまくったらなんかやだな
942 :
デフォルトの名無しさん :02/08/15 23:00
次スレどこー?
断る カチャ ;y=ー( ゚д゚)・∵. ターン \/| y |)
そして誰も立てなかった…と.
予定って 死んだら949取れないがな
947 :
デフォルトの名無しさん :02/08/15 23:29
やだよ
じわじわとけん制?
やはり断る カチャ ;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
掃き出し法 で検索すれ
957 :
nanashi :02/10/10 14:15
99999以下とは限らない正の整数を次々と読み、データの個数と最小値、 2番めに小さい値および3番目に小さい値を印字するプログラムを作れ。ただし、 データがつきたことをあらわすために、0または負の数を入力することにする。 このアルゴリズムのを書いてください。流れ図でも箇条書きでもよいです。書き 方がさっぱりです。
958 :
デフォルトの名無しさん :02/10/10 14:21
>>957 > 99999以下とは限らない
これの意味わからないな。
とんでもないでかい数字が入ってくるってこと?
959 :
デフォルトの名無しさん :02/10/10 14:26
ボクの小学校の夏休みの宿題で 夏休みの思い出っていう題名で作文書いてきてっていわれました。 夏休み終わったのにまだ、できてないからてずだってください。
961 :
nanashi :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
965 :
デフォルトの名無しさん :02/11/14 13:41
電卓で計算させるとこがうまくいかない・・・ 気が向いたら誰か助けてください。 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); } } 次の計算させるとこがよくわかりません。
968 :
966 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)); } } } }
969 :
966 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]){ } と、しているのですが・・・。
マルチポストじゃなきゃ答えがもらえたかもしれないのにね。
973 :
デフォルトの名無しさん :02/12/14 12:38
>>970 呼び出し元から呼び出し先へ何を渡したいの?
>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] を 渡したいのですが・・・。
975 :
bloom :02/12/14 12:53
976 :
デフォルトの名無しさん :02/12/14 13:04
>>970 とりあえず関数の引数については置いといて・・・
唐突だけど、関数内でGx[i][j-1]を他の変数に
代入するのってどうやる?
>>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
pinkserverってアダルトサイトじゃなかったっけ? 宣伝か?
>>979 いや、行ってみたが、なんかマジでイタい厨だったよ。
たぶん、ヲチ祭りだろう。。どこでやってんのか知らんが。
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。