【初心者歓迎】C/C++室 vol.18

このエントリーをはてなブックマークに追加
584デフォルトの名無しさん
誰か助けてください。C言語で鶴亀算(?)ってできるのでしょうか?一応linuxです…
585デフォルトの名無しさん:2005/06/20(月) 13:22:00
機械的な手順に落とせるのならできる
586デフォルトの名無しさん:2005/06/20(月) 14:18:54
>>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;
}
587デフォルトの名無しさん:2005/06/20(月) 14:22:50
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です。
588584:2005/06/20(月) 14:23:20
間違えた。

get_head1 が脚の多い方。
get_head2 が脚の少ない方。

です。
589デフォルトの名無しさん:2005/06/20(月) 14:24:47
スマン番号ミス。

>588 は、 584 ではなく、>586の訂正。
590デフォルトの名無しさん:2005/06/20(月) 14:27:10
すいません、自己解決しました・・・orz
591586:2005/06/20(月) 14:29:56
げ、計算あってない。スマン。
592582:2005/06/20(月) 14:44:15
>>583
無いスレに誘導されても困ります。
593デフォルトの名無しさん:2005/06/20(月) 14:53:40
>>592
検索も出来ない人にageられても困ります。
594582:2005/06/20(月) 14:56:09
>>583
だったらURL張ってみてください。
最後まで検索かけましたが何か?
595586: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 が多いほうです。
すれ汚しスマソ。
596582:2005/06/20(月) 16:08:19
>>583
結局みつからないのならはじめから煽らないでください。
597デフォルトの名無しさん:2005/06/20(月) 16:24:09
>>582
いいから消えろ
.NETが見つからん言うてVCスレとか探してみたんかてめぇは
598デフォルトの名無しさん:2005/06/20(月) 16:41:55
           ____________
          ||                ||
          ||    バカは放置!    ||
          ||          。  ΛΛ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ハーイ!     ||          \. (゚Д゚,,) <  >>597さん、いいですね!
          ||________⊂ ∪  \_______
  ∧ ∧    ∧ ∧    ∧ ∧      |  |
  (  ∧ ∧ (   ∧ ∧ (  ∧ ∧   UU~
〜(_(  ∧ ∧ __(  ∧ ∧__(    ∧ ∧    ハーイ!
  〜(_(  ∧ ∧_(  ∧ ∧_ (  ∧ ∧
    〜(_(   ,,)〜(_(   ,,)〜(_(   ,,)
      〜(___ノ  〜(___ノ   〜(___ノ
599デフォルトの名無しさん:2005/06/20(月) 17:15:29
char *a = mallocで作られたポインタ;
free(a);
としたら、*aを使うのは危険になりますが、aは大丈夫なのでしょうか?
つまりこのまま
a = 別のmallocで作られたポインタ;
等とするのは大丈夫なのでしょうか?
600582:2005/06/20(月) 17:15:45
>>597
だったらはなから.netスレ池とかかくなヴォケ
うまく誘導できないくらいならするなと言いたいだけだ。

まぁこんな糞なことしか議論できない低脳に聞いた俺が馬鹿だったって話なんだがな。
601デフォルトの名無しさん:2005/06/20(月) 17:17:43
freeの後で*aを使うのはもちろんだめだが
aを再利用するのは問題ない
602デフォルトの名無しさん:2005/06/20(月) 17:21:04
>>600
自分で馬鹿言ってりゃ世話無いぜw
603デフォルトの名無しさん:2005/06/20(月) 17:21:42
>>598
ジサクジエンカコワルイ
604デフォルトの名無しさん:2005/06/20(月) 17:23:50
>>599
OK。キミはちゃんと変数を理解している。
希に、delete a; すると、
「aが使えない」「aにNULLが入る」等と勘違いする人がいる。
605デフォルトの名無しさん:2005/06/20(月) 17:27:03
>>600
誘導して欲しいなら、まずはこっちに行け。

【 質問誘導スレ 】
http://pc8.2ch.net/test/read.cgi/tech/1066747198/l50
606デフォルトの名無しさん:2005/06/20(月) 17:29:23
>>599
aはただの入れ物であり、free(a)で解放されるのはaに入れていたアドレスの先にある領域
aにはなんら影響を及ぼさない

余談だが、free(a)したら直後にa=NULLにしておくことをオススメする
607デフォルトの名無しさん:2005/06/20(月) 17:56:38
ただ、変数の意味が変わるような使い方は好ましくないとされてるみたい。
608584:2005/06/20(月) 18:20:23
>>586ありがとうございます
ですが…
C言語で連立方程式を解くに
はそんなにかかるんですか…
もっと勉強しなきゃ…or-z
実は授業で出た課題なんですが
scanf関数とかしかやってない
のにこれはちょっと無茶では
609デフォルトの名無しさん:2005/06/20(月) 18:28:59
いや、これは連立方程式ではなく鶴亀算。
連立王定式なら、もっと煩雑になるだろうな。
610デフォルトの名無しさん:2005/06/20(月) 18:29:58
一次連立方程式なら、行列を使った解法がいくらでもあるんじゃない?
611 ◆CDoPhxVDCI :2005/06/20(月) 18:36:08 BE:76068926-#
printf("\x1b[2J") ができません。画面が消えません。
device=%SystemRoot%\system32\ANSI.SYS
を追加したんですができませんでした。
OSはXPでコンパイラはフリーのBCCを使っています。
612デフォルトの名無しさん:2005/06/20(月) 18:45:57
XPではだめなんじゃ?
command.comならいける
613デフォルトの名無しさん:2005/06/20(月) 18:51:28
そういうことではなく、32ビットコンソールアプリとNT系コンソールの組み合わせがNG.
XPのcommand.comから32ビットコンソールアプリを起動してもミリ。
614デフォルトの名無しさん:2005/06/20(月) 18:56:36
cygwin でもミリ?
615デフォルトの名無しさん:2005/06/20(月) 18:57:08
XPにcommand.comってあったっけ?
cmd.exeならあるんだが。

で、エスケープシーケンスで色つけたいなら端末エミュレータを使えばいい。
616デフォルトの名無しさん:2005/06/20(月) 18:59:39
617デフォルトの名無しさん:2005/06/20(月) 19:02:26
c:\windows\system32 のディレクトリ
2001/08/28 12:00 64,814 command.com
618デフォルトの名無しさん:2005/06/20(月) 19:03:25
>>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 ) = ( 鶴の数, 亀の数 ) と出ます。
619618:2005/06/20(月) 19:06:45
バグ訂正
下から5行目
誤> printf("%dx + %dy = %d\n", a, b, d);
正> printf("%dx + %dy = %d\n", a, b, c);