584 :
デフォルトの名無しさん :
2005/06/20(月) 13:10:51 誰か助けてください。C言語で鶴亀算(?)ってできるのでしょうか?一応linuxです…
機械的な手順に落とせるのならできる
>>584 #include <stdio.h>
#define MAX( a, b ) ( a < b ? b : a)
#define MIN( a, b ) ( a > b ? b : a)
/* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/
int get_head1(int feet1, int feet2, int all_head, int all_feet)
{
if(feet1 < 1 || feet2 < 1) return -1;
if( MIN(feet1, feet2) * all_head > all_feet ) return -1;
if( MAX(feet1, feet2) * all_head < all_feet ) return -1;
return ( all_feet - all_head * MIN(feet1, feet2) ) / MAX(feet1, feet2);
}
/* 脚の多い方の動物の頭数を返す (-1 == ERROR )*/
int get_head2(int feet1, int feet2, int all_head, int all_feet)
{
int ans = get_head1(feet1, feet2, all_head, all_feet);
if( ans != -1 ) ans = all_head - ans;
return ans;
}
int main()
{
int kame_feet = 4;
int turu_feet = 2;
int all_head = 10;
int all_feet = 30;
printf("turu = %d\n", get_head1(kame_feet, turu_feet, all_head, all_feet));
printf("kame = %d\n", get_head2(kame_feet, turu_feet, all_head, all_feet));
return 0;
}
char str1[20] = "aaaaa\n"; char str2[20] = "bbbbbb\n"; char str3[20] = "ccc\n"; char tmp[20] = ""; 上記のような変数を用意し、tmpにそれぞれをコピーしようとしています。 正確にはファイルから1行読み取り、改行手前までのデータをコピーするのですが。 このとき、strncpy(tmp,str1,strlen(str1)-1); と strncpy(tmp,str2,strlen(str2)-1); までは 正常に動作するのですが、 strncpy(tmp,str3,strlen(str3)-1); を実行するとうまくできません。 strncpy(tmp,str1,strlen(str1)-1); → tmp : aaaaa strncpy(tmp,str2,strlen(str2)-1); → tmp : bbbbbb strncpy(tmp,str3,strlen(str3)-1); → tmp : cccbbb str3をコピーして、tmpにcccだけを格納したいのですが、 どのようにすればいいのでしょうか。 環境はWindows2000で、コンパイラはbccです。
588 :
584 :2005/06/20(月) 14:23:20
間違えた。 get_head1 が脚の多い方。 get_head2 が脚の少ない方。 です。
スマン番号ミス。 >588 は、 584 ではなく、>586の訂正。
すいません、自己解決しました・・・orz
591 :
586 :2005/06/20(月) 14:29:56
げ、計算あってない。スマン。
592 :
582 :2005/06/20(月) 14:44:15
>>592 検索も出来ない人にageられても困ります。
594 :
582 :2005/06/20(月) 14:56:09
>>583 だったらURL張ってみてください。
最後まで検索かけましたが何か?
595 :
586 :2005/06/20(月) 14:58:51
できた。以下の関数を訂正。 /* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/ int get_head1(int feet1, int feet2, int all_head, int all_feet) { int tmp; if(feet1 < 1 || feet2 < 1) return -1; if( MIN(feet1, feet2) * all_head > all_feet ) return -1; if( MAX(feet1, feet2) * all_head < all_feet ) return -1; tmp = all_head * MAX(feet1, feet2) - all_feet; if( tmp % MIN(feet1, feet2) != 0 ) return -1; return tmp / MIN(feet1, feet2); } なお、get_head1 が脚の少ないほう、get_head2 が多いほうです。 すれ汚しスマソ。
596 :
582 :2005/06/20(月) 16:08:19
>>583 結局みつからないのならはじめから煽らないでください。
>>582 いいから消えろ
.NETが見つからん言うてVCスレとか探してみたんかてめぇは
____________
|| ||
|| バカは放置! ||
|| 。 ΛΛ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄
ハーイ! || \. (゚Д゚,,) <
>>597 さん、いいですね!
||________⊂ ∪ \_______
∧ ∧ ∧ ∧ ∧ ∧ | |
( ∧ ∧ ( ∧ ∧ ( ∧ ∧ UU~
〜(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ハーイ!
〜(_( ∧ ∧_( ∧ ∧_ ( ∧ ∧
〜(_( ,,)〜(_( ,,)〜(_( ,,)
〜(___ノ 〜(___ノ 〜(___ノ
599 :
デフォルトの名無しさん :2005/06/20(月) 17:15:29
char *a = mallocで作られたポインタ; free(a); としたら、*aを使うのは危険になりますが、aは大丈夫なのでしょうか? つまりこのまま a = 別のmallocで作られたポインタ; 等とするのは大丈夫なのでしょうか?
600 :
582 :2005/06/20(月) 17:15:45
>>597 だったらはなから.netスレ池とかかくなヴォケ
うまく誘導できないくらいならするなと言いたいだけだ。
まぁこんな糞なことしか議論できない低脳に聞いた俺が馬鹿だったって話なんだがな。
freeの後で*aを使うのはもちろんだめだが aを再利用するのは問題ない
>>599 OK。キミはちゃんと変数を理解している。
希に、delete a; すると、
「aが使えない」「aにNULLが入る」等と勘違いする人がいる。
>>599 aはただの入れ物であり、free(a)で解放されるのはaに入れていたアドレスの先にある領域
aにはなんら影響を及ぼさない
余談だが、free(a)したら直後にa=NULLにしておくことをオススメする
ただ、変数の意味が変わるような使い方は好ましくないとされてるみたい。
608 :
584 :2005/06/20(月) 18:20:23
>>586 ありがとうございます
ですが…
C言語で連立方程式を解くに
はそんなにかかるんですか…
もっと勉強しなきゃ…or-z
実は授業で出た課題なんですが
scanf関数とかしかやってない
のにこれはちょっと無茶では
いや、これは連立方程式ではなく鶴亀算。 連立王定式なら、もっと煩雑になるだろうな。
一次連立方程式なら、行列を使った解法がいくらでもあるんじゃない?
611 :
◆CDoPhxVDCI :2005/06/20(月) 18:36:08 BE:76068926-#
printf("\x1b[2J") ができません。画面が消えません。 device=%SystemRoot%\system32\ANSI.SYS を追加したんですができませんでした。 OSはXPでコンパイラはフリーのBCCを使っています。
XPではだめなんじゃ? command.comならいける
そういうことではなく、32ビットコンソールアプリとNT系コンソールの組み合わせがNG. XPのcommand.comから32ビットコンソールアプリを起動してもミリ。
cygwin でもミリ?
XPにcommand.comってあったっけ? cmd.exeならあるんだが。 で、エスケープシーケンスで色つけたいなら端末エミュレータを使えばいい。
c:\windows\system32 のディレクトリ 2001/08/28 12:00 64,814 command.com
>>608 連立一次方程式。整数解のみ版
#include <stdio.h>
int main()
{
int a, b, c, d, e, f;
int x, y;
int v1, v2;
printf(">> ax + by = c\n");
printf(">> dx + ey = f\n");
printf("input [ a b c ] > ");
scanf("%d %d %d", &a, &b, &c);
printf("input [ d e f ] > ");
scanf("%d %d %d", &d, &e, &f);
v1 = e * c - b * f;
v2 = e * a - b * d;
if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
x = v1 / v2;
v1 = c - a * x;
v2 = b;
if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
y = v1 / v2;
printf("%dx + %dy = %d\n", a, b, d);
printf("%dx + %dy = %d\n", d, e, f);
printf("( x, y ) = ( %d, %d )\n", x, y);
return 0;
}
鶴亀計算するなら。
input [ a, b c ] = [ 1, 1, 頭の合計]
input [ d e f ] = [ 2, 4, 脚の合計] で
( x, y ) = ( 鶴の数, 亀の数 ) と出ます。
619 :
618 :2005/06/20(月) 19:06:45
バグ訂正 下から5行目 誤> printf("%dx + %dy = %d\n", a, b, d); 正> printf("%dx + %dy = %d\n", a, b, c);