C/C++の宿題をやらせて。おながい。13代目

このエントリーをはてなブックマークに追加
今まで4年間、ほとんど毎日休まず一生懸命C/C++を勉強してきた。
わからない宿題があったら私にやらせてくださいm(_ _)m
宿題が中心ですが、その他の問題なんかもOK。

【注意点】
・問題はしっかり分かりやすく書きましょう。
 全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
 解いてもらっている方に失礼になってしまいます。

【歴代スレ】
前スレ: http://pc2.2ch.net/test/read.cgi/tech/1060706382/
11代目: http://pc2.2ch.net/test/read.cgi/tech/1058283913/
10代目: http://pc2.2ch.net/tech/kako/1057/10570/1057070174.html
9代目: http://pc2.2ch.net/tech/kako/1055/10559/1055944101.html
8代目: http://pc2.2ch.net/tech/kako/1055/10550/1055056940.html
7代目: http://pc2.2ch.net/tech/kako/1053/10539/1053963794.html
6代目: http://pc2.2ch.net/tech/kako/1053/10530/1053045530.html
5代目: http://pc2.2ch.net/tech/kako/1051/10515/1051594046.html
4代目: http://pc2.2ch.net/tech/kako/1045/10450/1045074808.html
3代目: http://pc2.2ch.net/tech/kako/1041/10419/1041992392.html
2代目: http://pc3.2ch.net/tech/kako/1039/10397/1039772622.html
宿題手伝いますYO!!: http://pc3.2ch.net/tech/kako/1038/10380/1038024989.html

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html


続きは>>2に書いてあります。
【関連スレ】
C言語なら私に聞け! Part 65
http://pc2.2ch.net/test/read.cgi/tech/1064234533/l50

C++相談室 part23
http://pc2.2ch.net/test/read.cgi/tech/1062690663/l50

★初心者にVisual C++を教えるスレ★ Part8
http://pc2.2ch.net/test/read.cgi/tech/1063029371/l50

C++Builder相談室 Part7
http://pc2.2ch.net/test/read.cgi/tech/1061594556/l50

GCCについて part2
http://pc2.2ch.net/test/read.cgi/tech/1046179115/l50

Turbo C++ 5.0 プログラミング
http://pc2.2ch.net/test/read.cgi/tech/1030878794/l50

【初心者歓迎】C/C++室【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1059041347/l50
3デフォルトの名無しさん:03/09/26 11:04
>>1
タイトルがつまらない。死ね。
4沢村おっかけ隊:03/09/26 11:41
>>3
おヌヒ、ひどい奴よの。
5デフォルトの名無しさん:03/09/26 13:11
>>1
>>3
おまえもな♥
♥Д♥
8デフォルトの名無しさん:03/09/26 19:25
C++でプリンタポートをいじってます。
ポートからの出力を100msくらいのパルスにしたいんですが
Hiを出力後、100ms待ってLoを出力するまでの時間つぶしをする関数とか
ありませんか?
よろしくお願いします。
>>1
どんどん腰が低くなっていくのは何か意図でもあるのか
>>8
ハードウェアもOSも分からなければ答えようがない。
WindowsならtimeGetTime()でも使え。
118:03/09/26 20:23
>>10
あ、すいません。windowsです。
timeGetTime()ですね。キーワードさえわかればなんとかなりそうです。
ありがとうございました。
Windowsなら
Sleep(100);
でええやん。
それ宿題なのか?
14デフォルトの名無しさん:03/09/27 21:12
とりあえずハゲ
15デフォルトの名無しさん:03/09/27 21:37
>>1はコンピュータ言語勉強する前に
日本語を勉強しなおせ。
小学生以下の失態を犯して恥ずかしくないのか?
はーぁ?
17 ◆KDTN0ONHdw :03/09/27 22:55
算数オリンピックからの問題です。
A君、B君、C君、D君が○×式のテストを受けました。
全10問の4人の解答とA君、B君、C君の点数は下の表のようになりました。
    第1問 第2問 第3問 第4問 第5問 第6問 第7問 第8問 第9問 第10問  点数
A君   ○   ×   ○   ×   ○    ○   ×   ×   ×    ○    70点
B君   ○   ○   ×   ×   ×    ○   ○   ○   ×    ×    70点
C君   ×   ×   ×   ○   ○    ×   ○   ×   ○    ×    60点
D君   ○   ○   ×   ×   ○    ×   ○   ×   ×    ×     ?

このテストは1問10点で100点満点です。
さて、D君は何点でしょう。
この問題プログラム化して解くのに何分かかる。
ちなみに俺の場合普通に解いた方が速かった。5分くらい。
プログラム化の時間は恥ずかしくて言えない。
>>15
失態って何?
>>17
6分弱もかかってしまった。

#include <stdio.h>
int z,t;Q(char*p){for(z=0;*p;p++)z=z*2+*p-'0';return z;}R(int x){for(z=0;x;x/=2
)z+=x&1;return z;}main(){int a=Q("1010110001"),b=Q("1100011100"),c=Q("1101010")
,d=Q("1100101000");for(;t<1024;t++)R(a^t)-3||R(b^t)-3||R(c^t)-4||printf("%d0\n"
,10-R(d^t));}
漏れも手動かすより普通に解いたほうが速かった。
21デフォルトの名無しさん:03/09/28 00:24
「お長居します」ってこと?
>>17
>このテストは1問10点で100点満点です。

では、A君とB君は50点で、C君とD君は40点です。
採点ミスがあったようですね。
30秒で解けました。
>>22
あんたが大将!!
お前の話はつまらん
ネタはマ板で
26 ◆KDTN0ONHdw :03/09/28 00:58
では、私の場合の解答。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=3
注意:<pre>タグいらんかった。
27デフォルトの名無しさん:03/09/28 11:01
お願いします。お助けください。

No.(学籍番号・4桁の数字)
Name(名字・20文字以内のアルファベット)
English(英語テスト・100点満点の点数)
Math(数学テスト・100点満点の点数)

上記の項目を入力し、合計点の高い順にソートして結果を
画面に表示させるプログラムを作成しなさい。。

結果表示はNo. Name 合計点 English Mathの順になるように
すること。細かな表示方法は各自の工夫に任せるものとする。
例としては、以下のような形式が考えられる。

1021 YAMADA 162 92 70
1005 NAKAYAMA 149 83 66

なお、50人分までのデータセット入力にたえられるように設計
すること。
28ヤマダ:03/09/28 11:08
俺は数学で70点なんか取りません
英語で92点も取れません
29デフォルトの名無しさん:03/09/28 14:11
static const int min = 10;
static const int max = 20;

void ReviseValue(int& v)
{
 if (v > max)
 {
  v = max;
 }
 else if(v < min)
 {
  v = min;
 }
}

値がはみでてるかどうかをチェックして修正したいんだけど、
かっこよくやる方法教えて
>>29
表記的にかっこいいのは思いつくがパフォーマンスも考えればそれでいいんじゃない?
そんな短くてしかも改変の可能性もほとんど無いif分に行数を割くのは見にくくなるだけかとは思う。
31デフォルトの名無しさん:03/09/28 14:35
switch文で文字列比較したいと思いませんか?

switch ( str ) {
 case "hoge":
  shori( a );
  break;
 case "piyo":
  shuri( a,b,c );
  break;
}

こんな感じの処理を簡潔に記述するにはどうしたらいいですかね
ぐるぐるまわって関数ジャンプも考えたけど引数が統一されてないと・・
>>29
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
v = max(min(v,20),10);

windows.hがインクルードしてあれば最初の2行はいらない。

>>32
max(++a,b) とかやるとき困っちゃうから
わざわざ関数定義してるのではないでしょうか
template<typename T> T max(T a, T b)
{
 return a > b ? a : b
}

template<typename T> T min(T a, T b)
{
 return a < b ? a : b
}

v = max(min(v, 20), 10);
35デフォルトの名無しさん:03/09/28 15:57
>>31

static const char* vars[3] = { "hoge", "piyo", "fuga" };
switch ( std::find(vars, vars+3, str) ) {
 case &vars[0]:
  shori( a );
  break;
 case &vars[1]:
  shuri( a,b,c );
  break;
 case &vars[2]:
  nanika(a,b,c,d,e,f,g);
 default:
  std::cerr << "ヽ( ・∀・)ノ ウンコー" << std::endl;
}
&vars[2]はbreakし忘れ。
つーかよく考えたら&は(゚听)イラネ
>>35
vars[0]とか明らかに定数式じゃないし…
3929:03/09/28 16:02
みなさまありがとうございます。

>>30
無駄が多かったif文は{ v = max;} みたいな感じで短くしました。

>>32
>>34
ぃゃ〜かっこいいですね〜。
勉強になります。

>>33
前置インクリメントなどはやらないつもりです。
static const char* vars[3] = { "hoge", "piyo", "fuga" };
int i;
for(i=0; i<3; i++) { if(!strcmp(vars[i], str) break; }

switch ( i )
{
 case 0:
  shori( a );
  break;
 case 1:
  shuri( a,b,c );
  break;
 case 2:
  nanika(a,b,c,d,e,f,g);
 default:
  throw("ヽ( ・∀・)ノ ウンコー");
}
41デフォルトの名無しさん:03/09/28 16:22
問題3行3列の行列を入力し、逆行列を求めなさい。
  ただし要素の入力、行列式の計算、要素の計算、要素の表示は関数を用いて行う。
  ヒントは二次元配列、ポインタ、関数、exit()です。
  ちなみにC言語です。
 よろしくお願いします。
ケーリー・ハミルトン
>>34
C++使うならわざわざ自分で書かなくても<algorithm>にある。
v=v<min ? min : v>max ? max : v;
45デフォルトの名無しさん:03/09/28 18:03
>>39
前置インクリメントというか、マクロの場合副作用が2回おきるのが問題。
インクリメントならわかりやすいけど、
max( f1(a), f2(b) );
とかだと非常に分かりにくいバグの元。
46デフォルトの名無しさん:03/09/28 18:49
>>17
これってABCの回答が別のものになってもDの点数は解るのでしょうか?
一応書いてみたけど、使いまわしきかないなぁ。
#include <stdio.h>
#include <string.h>
int atob(char* p)
{
int result=0,len=strlen(p);
for(int i=0;i<len;i++){result += *(p+i)=='0' ? 0 : 1<<i;}
return result;
}
int main(void)
{
int A=atob("1010110001"),B=atob("1100011100")
,C=atob("0001101010"),D=atob("1100101000");
int result=0,w;
w=D^((C^((A^B)^-1))|(C&(A^B)))^-1;
for(int i=0;i<10;i++){result+=w&(1<<i)?10:0;}
printf("%d\n",result);
return 0;
}
>>46
無理でしょ。
論理的にありえない点数だったり、ABCが三人とも同じ答えなら正解を導くことは不可能になるし。
>>46
ですよね。良かったぁ。
>>46
ABCそれぞれの点数が以下の場合でもDの点数が求まる。
A:100 B:40 C:30
A:70 B:70 C:60
A:40 B:100 C:30
A:30 B:30 C:100
A:30 B:30 C:40
結論。どんな点数でも求まる(矛盾してなければ)
>>41
3×3行列の逆行列は簡単に求める方法があったよね?
知ってるんでしょ?
>>40
ヽ( ・∀・)ノ ウンコー

かっこいいな。
53デフォルトの名無しさん:03/09/29 09:25
奇数魔方陣を二次元配列でやれという宿題がでました。上手く出来ないので
お願いいたします。
>>53
いきなりその宿題を「やれ」ってことはないでしょう。
その前に習った事の応用を利かせて解けばいいんじゃない。
>>53
国選エスパーを雇ってから来てください。
もし誘導されてきたんならその旨も書いてね。
57デフォルトの名無しさん:03/10/01 12:46
for文などを使わずに、四則演算だけで小数点以下を四捨五入させるプログラムの組み方がわかりません。
おながいします。
58デフォルトの名無しさん:03/10/01 12:47

+0.5して少数点以下を切り捨て
>>53
#include <stdio.h>
#define SIZE 5

int main(void)
{
  int y,x,i;
  int num[SIZE][SIZE]={0};

  for(y=0,x=SIZE/2,i=1;i<=SIZE*SIZE;i++)
  {
    num[y][x]=i;

    y--;x++;
    if(y<=-1) y+=SIZE;
    if(x>=SIZE) x-=SIZE;

    if(num[y][x])
    {
      y+=2;x--;
      if(y>=SIZE) y-=SIZE;
      if(x<=-1) x+=SIZE;
    }
  }

  for(y=0;y<SIZE;y++,puts("\n"))
    for(x=0;x<SIZE;x++)
      printf("%4d",num[y][x]);

  return 0;
}
6157:03/10/01 14:21
#include<stdio.h>
main(){
int num_1, num_2, div, mod, roundoff;

printf("割られる数を入力して下さい>");
scanf("%d",&num_1);
printf("割る数を入力して下さい>");
scanf("%d",&num_2);

div = num_1 / num_2;
mod = num_1 % num_2;

roundoff = ほにゃほにゃ
printf("四捨五入された商 = %d",roundoff);
exit(0);
}
今のところ、こんなかんじです。・・・重要なところができておりません。

>>59
「小数点以下を切り捨て」はどうやるのですか??
(int)(hoge + 0.5)じゃないの?
63デフォルトの名無しさん:03/10/01 15:14
>>40
enum vars { hoge, piyo, fuga, not_vars };
enum vars str2vars( char *str ){
struct {
char*str;
enum vars var;
} str_var[] = { { "hoge", hoge }, { "piyo", piyo }, { "fuga". fuga }, { "", not_vars } };
int i;
enum vars var;
for ( i=0, var=not_vars; str_var[i].str; i++ ) if ( !strcmp( str_var[i].str, str ) ) break;
return var;
}
.
.
.
switch ( str2vars( str ) ){
 case hoge: shori( a );break;
 case piyo: shuri( a,b,c );break;
 case fuga: nanika( a,b,c,d,e,f,g );break;
 case not_vars: err( str, "不正な文字列です" );break;
}
>>61
(num_1 * 10 / num_2 + 5) / 10
一応参考までに
double x = -1.5;
int i = (int)x;
で i が -1 か -2 かは実装依存な
6657:03/10/01 16:55
>>62
(int)というものをまだ学んでいないので、調べてみます。

>>64
むむむ・・・すごいです。ありがとうございました。
6764:03/10/01 17:02
>>61
試してないけど。
roundoff = div + (num_2 / mod <= 2)? 1 : 0;
6864:03/10/01 17:05
考えながら書いているうちに返事が…
>>67 だと四則演算のみにならないのか。
6957:03/10/01 17:22
>>67-68
>>64>>67は同じことを別の組み方で書いているのでしょうか?
それとも、ただ結果が同じなだけで厳密には違うのでしょうか?
初心者ですので、>>67の書き方がさぱーりわかりません・・・。
特にこの辺→「<=2)? 1:0」
もっと勉強して、わかるように努力します。
7064:03/10/01 17:38
>>69
結果は同じになると思います(試してないんで)
mod / num_2 >= 0.5 の逆数を使ったやり方で、考え方が違います。

三項演算子 ? : をif文に置き換えるこんな感じ
if (num_2 / mod <= 2) roundoff = div + 1;
else roundoff = div + 0;
7157:03/10/01 19:08
>>70
おぉ、勉強になります。ありがとうございますた。
72お助けを 1:03/10/01 20:55
学校の課題でつ。このままだと提出日に間に合わないので、1問よろしく手伝って下さい。おながいしまつ。m(__)mm(__)m

1.ベクトルクラス
以下のような2次元ベクトル(Vector)のクラスを作成せよ。
コピーコンストラクタと代入オペレータも練習のため作成せよ。

class Vector {
public:
// (0,0) ベクトルの生成
Vector();
// (x,y) ベクトルの生成
Vector(double x, double y);
// コピーコンストラクタ
Vector(const Vector& vector);
// 代入オペレータ
Vector& operator=(const Vector& vector);

// (x,y) を返す
double x() const;
double y() const;
73お助けを 2:03/10/01 20:56
// 長さを返す
double length() const;

// ベクトルとのなす角度を返す
double angle(const Vector& vector) const;

// 符号反転したベクトルを返す
Vector operator-() const;

// ベクトルの加減算
friend Vector operator+(const Vector& left, const Vector& right);
friend Vector operator-(const Vector& left, const Vector& right);
Vector& operator+=(const Vector& vector);
Vector& operator-=(const Vector& vector);

// ベクトルの伸縮
friend Vector operator*(double n, const Vector& vector);
friend Vector operator*(const Vector& vector, double n);
friend Vector operator/(double n, const Vector& vector);
friend Vector operator*(const Vector& vector, double n);
Vector& operator*=(double n);
Vector& operator/=(double n);
2分とかからず作れそうだが
>>72
privateとかprotectedに変数置いちゃ逝けないの?
protected:
double x_, y_;
Vector() : x_(0), y_(0) {}
Vector(double x, double y) : x_(x), y_(y) {}
Vector(const Vector& vector)
{
 x_ = vector.x();
 y_ = vector.y();
}
Vector& operator=(const Vector& vector)
{
 x_ = vector.x();
 y_ = vector.y();
 return *this; 
}
double x() const
{
 return x_;
}
double y() const
{
 return y_;
}
改行減らして圧縮してくれよ(;´Д`)
double length() const
{
 return sqrt(x_ * x_ + y_ * y_);
}
Vector operator-() const
{
 Vector ret(-_x, -_y);
 return ret;
}
friend Vector operator+(const Vector& left, const Vector& right)
{
 Vector ret(left);
 ret += right;
 return ret;
}

friend Vector operator-(const Vector& left, const Vector& right)
{
 Vector ret(left);
 ret -= right;
 return ret;
}
Vector& operator+=(const Vector& vector)
{
 x_ += vector.x();
 y_ += vector.y();
 return *this;
}

Vector& operator-=(const Vector& vector)
{
 x_ -= vector.x();
 y_ -= vector.y();
 return *this;
}
86お助けを 3:03/10/01 21:24
// 始点を中心として angle 度回転させたベクトルを返す
Vector rotate(double angle) const;

// 比較
friend int operator==(const Vector& left, const Vector& right);
friend int operator!=(const Vector& left, const Vector& right);

private:
double my_x;
double my_y;
};


すみません。3つ目を書き込もうとしたら、20分経たなきゃダメとはじかれました。
これで全部でやす。
> 75
あまりプロっぽくするとバレバレなので、できればあまり高度なワザは出さないほうが懸命かと思われまつ。
みなさま、どうかよろしくおねがいしまつm(__)m
friend Vector operator*(double n, const Vector& vector)
{
 Vector ret(vector);
 ret *= n;
 return ret;
}

friend Vector operator*(const Vector& vector, double n);
{
 Vector ret(vector);
 ret *= n;
 return ret;
}
friend Vector operator/(double n, const Vector& vector)
{
 Vector ret(vector);
 ret /= n;
 return ret; 
}

//つーかここは問題が間違ってるだろ
friend Vector operator/(const Vector& vector, double n)
{
 Vector ret(vector);
 ret /= n;
 return ret;
}
回答レスのangleがすっぽかされてるのがワラタ

double angle(const Vector& vector) const
{
 return std::atan2( y-vector.y, x-vector.x );
}

↑関数・引数の名前が不適当
どっちからどっちに向けての角度かわからない。
Vector& operator*=(double n)
{
 x_ *= n;
 y_ *= n;
 return *this;
}

Vector& operator/=(double n)
{
 x_ /= n;
 y_ /= n;
 return *this;
}
friend int operator==(const Vector& left, const Vector& right)
{
 return left.x() == right.x() && left.y() == right.y();
}
friend int operator!=(const Vector& left, const Vector& right)
{
 return !operator==(left, right);
}
レスリング部に所属している集団が部活帰りに
「ボクシングってダセェよな、シッシッ言っちゃってよ。」などと
言っているのが聞こえたので走って近づき、リーダー格の奴に、
右ボディを食らわせて前屈みにし、ワンツー連打から左フックでKOした。
オレはその場を立ち去る時に残りの高校生たちを指差し、
「お前らも灰になれるものを見つけろよ」と言った。
離れていく時に後ろから、「ボクシングっていいよな。」と声が聞こえた。
誰か作ってください。

C言語で
構造体の中の変数a[]を使って、
void s()という関数を作って
その変数a[]をその関数で
a[0]=1;
a[1]=2;
a[2]=3;




a[15]ぐらいまでして最後にメイン関数でそのa[0]からa[15]までの数字を
表示するプログラムを誰か作ってください。
94デフォルトの名無しさん:03/10/02 12:14
C言語の課題なのですが、
標準入力からテキストファイルを読み込み、
行を辞書順に並べ直して標準出力に出力しなさい。
という課題で今頭を悩ませています。
並べ直しはqsort()をつかうのかなあ、などと試しているのですが、
正直ちょっと手詰まりになってしまいました。
どうか手助けお願い致します。
>94
何か条件は無いの。
>94
各行をバッファに入れてソートしたら良いだけ
>>94
分からんかったら、これ出せば良い。

#include <stdlib.h>
main(){system("sort");return 0;}
98デフォルトの名無しさん:03/10/02 13:04
>>94

/* 128行までで、1行あたり1023文字まで */

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

static char *chomp(char *s)
{
size_t len=strlen(s);
if(len&&s[len-1]=='\n')
s[len-1]='\0';
return s;
}

static int scmp(const void *a,const void *b)
{
return strcmp(*(char **)a,*(char **)b);
}
99つづき:03/10/02 13:05

int main()
{
char a[128][1024];
char *pa[129];
int i;

for(i=0;fgets(a[i],sizeof a[0],stdin)&&i<128;i++)
pa[i]=chomp(a[i]);
pa[i]=NULL;
qsort(pa,i,sizeof(char *),scmp);
for(i=0;pa[i];i++)
puts(pa[i]);

return 0;
}
>>94
君は向上心がありそうだから、C++の場合を教えてやろう。
君のmissionはこれをCに直すだけだ。
健闘を祈る。

#include <string>
#include <list>
#include <iostream>

main()
{
 using namespace std;
 string s;
 list<string> lst;
 while(getline(cin, s))
  lst.push_back(s);
 lst.sort();
 copy(lst.begin(), lst.end(), ostream_iterator<string>(cout));
}
>>100
すでにC++の場合の答えは出てるんですけど。set<string>と。
>98のプログラムで実行したらいきなり1024(byte)*128のメモリ占有されてしまうのもなんだかな〜
ああと計算間違いしてた。
C言語とC++言語の違いを述べよ
また、C++言語の仕様を体系化せよ

の課題はどうすればいいでつか?
「あぁん?お前そんなことも知らないのか?それなら
ISO仕様書でも購入して勝手に読めやゴルァ!!!!!!」とでも言ったら
>>102
あちこち無様だが,多少動的に確保したモノ。
一筆書きだからミス修正ヨロ。

enum { PAGESIZE=4096 };
char *buf=NULL;char *tmpbuf;int bufsize=0;
char **list; char **tmplist;int listsize=0;
{size_t num_read;
do {
bufsize+=PAGESIZE; buf=realloc(buf,bufsize);
tmpbuf=buf+bufsize-PAGESIZE;
num_read=fraed(tmpbuf,PAGESIZE,1,stdin);
tmpbuf+=num_read;
}while( num_read == PAGESIZE );
*tmpbuf='\0'; ++tmpbuf; bufsize=tmpbuf-buf}
for(listsize=1;tmpbuf>buf;--tmpbuf) if(*tmpbuf=='\n') ++listsize;
list=malloc(listsize*sizeof(*list));
tmplist=list;
for(tmpbuf=buf+size-1;tmpbuf>buf;--tmpbuf) if(*tmpbuf=='\n'){ *tmpbuf='\0';*tmplist=tmpbuf+1;++tmplist }
*tmplist=tmpbuf;
qsort(list,listsize,sizeof(*list),strcmp);
for(tmplist=list;tmplist<list+listsize;++tmplist) printf("%s\n",*tmplist);
10793:03/10/02 17:46
忘れないでね。
>>107
まず日本語をきっちり書け
109デフォルトの名無しさん:03/10/02 18:11
>>93
#include <stdio.h>

struct
{
int a[15];
}A;

void s()
{
int i;

for(i = 0; i < 15; i++)
A.a[i] = i + 1;
}

int main(void)
{
int i;

s();

for(i = 0; i < 15; i++)
printf("%d\n", A.a[i]);

return(0);
}
11093:03/10/02 18:23
>>108
う〜ん例えが難しいんだよな。
簡単に言えば
#include<stdio.h>

void s()

struct A{
int a[];
};

int main(){

struct A A;

s(構造体);
A.a[0〜15]まで表示する。

}

void s(構造体){
a[0]=1; //構造体A.a[]
a[1]=2;
a[2]=3;



}

こんな感じw
すいません初心者なのでこんなんで勘弁してください。
11193:03/10/02 18:26
>>109
ありがとうございます。

答えてくれたので
110のことはなかったことにしてください。
11272:03/10/02 20:47
72です。ありがとうございまつ。自分的にお見事としかいいようがありません。
自分もすらすら早く書けるようになりたいです。
ひとつ質問なのですが、
friend Vector operator-(const Vector& left, const Vector& right);
Vector& operator+=(const Vector& vector);

この2つは、main() 関数でどう書いて呼んだらいいのでしょうか。
いろいろやってるんですが、「未解決ですエラー」とか出ます。捕捉おねがいできますでしょうか。


> 88
> //つーかここは問題が間違ってるだろ
> friend Vector operator/(const Vector& vector, double n);

> 89 :デフォルトの名無しさん :03/10/01 21:29
> 回答レスのangleがすっぽかされてるのがワラタ
> double angle(const Vector& vector) const
> 関数・引数の名前が不適当
> どっちからどっちに向けての角度かわからない。

自分のタイプミスではないようなので、出題がまちがっている可能性はなきいしもあらずです。
この辺は笑顔でかわします。
無きにしも非ず、だろ。何だよ、「なきいしもあらず」ってのは。

>>112
Vector left, right;
left-right;
left+=right;

double angle(const Vector& v) const{
return acos((x*v.x + y*v.y)/(length()*v.length()));
}
116>>64:03/10/02 21:44
(2*num_1 + num_2) / 2*num_2
>>115
double angle(const Vector& v) const{
return atan2(x * v.y - y * v.x, x * v.x + y * v.y);
}
11864:03/10/02 22:35
>>116
そうだ * 2 でもよかったんだ…
とか感心してたら、ミスに気づいた。
a[51]という変数があってその配列の数字は
a[0]=1、a[1]=2、a[2]=3、・・・a[51]=52です。

つまりa[]={1,2,3,4,5,6,7,8,9,・・・50,51,52}
ですがそれを
a[]={3,16,42,35,8,17,・・・}
ランダムにするプログラムを作りたいのですが
そのようなプログラムを誰か作ってくれませんか?
#include <algorithm>

main()
{
 a[]={1,2,3,4,5,6,7,8,9,・・・50,51,52}
 std::random_shuffle(a, a+51);

 //一応出力
 std::copy(a, a+51, std::ostream_iterator(std::cout));

}
#include <iostream>するの忘れた
>>230
これって
std::copy(a, a+51, std::ostream_iterator(std::cout));

std::copy(a, a+51, std::ostream_iterator<int>(std::cout, ","));
にしないとうまく動かないんじゃない?
>>119
#include <stdlib.h>
#include <time.h>

int main()
{
int a[]={1,2,3,4,5,6,7,8,9,・・・50,51,52};
int i=1000000,j,k,l;

srand(time(NULL));
while(i--){
j=rand(); k=rand();
l=a[j]; a[j]=a[k]; a[k]=l;
}
for(i=0;i<52;i++)
printf("%d ",a[i]);

return 0;
}
124123:03/10/02 23:24
アウチ!

j=rand(); k=rand();
ではなく
j=rand()%52; k=rand()%52;
125119:03/10/02 23:42
>>124
答えてくれてありがとうございました。
すごい初歩的なんですが、

#include<stdio.h>

int main(){

char a[2][10]={"S5","D13"};


printf("%s\n",a[0]);

//ここでS5からS3に

printf("%s\n",a[0]);



}

このS5という文字をS3に変えるにはどうすればいいでしょうか?
すいません初歩的な質問で。
>>126
a[0][1] = '3';
12872:03/10/03 21:08
72 です。まことにありがとうございました。ご回答いただけたので十分です。助かりました。m(__)m
129デフォルトの名無しさん:03/10/03 21:47
cppllにバカが1人現れた!

[cppll:9552] ファイル入出力ストリームとNEW演算子.

すいません少し聞かせてください.
下記の処理で,少し理解できない部分があります.
処理の流れは,テキストファイルからint型の数を読み込み,
その数分,動的に二次元配列をNEWでとるという流れになります.

int** cost_matrix;
int assign_num;

ifstream fin( "test_1.txt",ios::out);
if(!fin.is_open()) exit(1); // エラーチェック
fin >> assign_num;
*cost_matrix = new int[assign_num];
for(int i = 0 ; i < assign_num ; i++ )
cost_matrix[i] = new int[assign_num];

この流れではプログラムがうまく動かないのですが
130デフォルトの名無しさん:03/10/03 21:48


int assign_num;
ifstream fin( "test_1.txt",ios::out);
if(!fin.is_open()) exit(1); // エラーチェック
fin >> assign_num;
int** cost_matrix; ←ここ
*cost_matrix = new int[assign_num];
for(int i = 0 ; i < assign_num ; i++ )
cost_matrix[i] = new int[assign_num];

このようにすればうまくいきます.
なぜでしょうか??
初歩的な質問でしょうがよろしくお願いします.
偶然うまく動いたように見えてるだけ
>>129-130はこんな所でしか馬鹿と言えない意気地なし
133デフォルトの名無しさん:03/10/03 22:00
放置の方向。
うみゅ。放置だね。
135デフォルトの名無しさん:03/10/03 22:06
徹底的に放置しましょう
136デフォルトの名無しさん:03/10/03 22:20
お願いします。m(__)m
↓のプログラムを改良して作って下さいです。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=148
マウスの左ボタン入がクリックされた場所の数字をプラス1したものに変えて描画します。
配列データを参照して、1をクリックしたら2、2をクリックしたら3、、、5をクリックしたら1を描画するようにします。
また繰り返しクリックすると数字がさらに変化するように作成してください。
*描画開始点は10,10


実行結果イメージ

「1」「1」「1」「1」「1」
「1」「2」「5」「3」「1」
「1」「4」「2」「4」「1」
「1」「3」「5」「2」「1」
「1」「1」「1」「1」「1」

「 」一つ一つがアイコン
で「1」のアイコンを左クリックすると「2」のアイコンになりさらにクリックすれば「3」のアイコンになる
137デフォルトの名無しさん:03/10/03 22:33
負けるな。放置
138デフォルトの名無しさん:03/10/03 22:37
> 129
 誰か相手にしてくれるよ。大丈夫。
139136:03/10/03 22:38
え?俺、放置っすか?何故
140デフォルトの名無しさん:03/10/03 22:40
136
君じゃないってさ。
>>140
誰も136の相手をしていないという意味だろ。
142141:03/10/03 22:41
ああ、137のことか。
>>136
とりあえずWM_LBUTTONUPに反応しなされ。
渡されたパラメータからマウスの座標を見つけて更新。
InvalidateRectあたりでウィンドウを更新。

しかしこういうスレでWinアプリに手を貸そうと思うやつはまれじゃなかろうか。
144デフォルトの名無しさん:03/10/03 22:46
>> 136
心配するな。
145デフォルトの名無しさん:03/10/03 22:56
1 が答える
146デフォルトの名無しさん:03/10/03 22:59
age
ここに書き込もうとしたら、「あなた騙されてますよ」っていうのが出たんですけど。
148デフォルトの名無しさん:03/10/03 23:14
>>1
回答はsiro 
>>147
あなた騙されてますよ
150デフォルトの名無しさん:03/10/03 23:21
面白いからあげ
151デフォルトの名無しさん:03/10/03 23:27
か・な・ら・ず・こ・た・え・ろ
152デフォルトの名無しさん:03/10/03 23:35
153デフォルトの名無しさん:03/10/03 23:49
#include<stdio.h>
int main()
{
 "Hello world.\n";
 return 0;
}
155デフォルトの名無しさん:03/10/05 20:24
助かってますので、消えないでほしいでつ
なんか宿題出してくれないと消えちゃいます
ならちょっくらOS作ってくれんか?
宿題じゃないものは駄目です
じゃあコンパイラの作成を
明日までの宿題なので、お願いします。

問題
1〜10の和を求めた後、Hello Worldと表示しなさい。
main()
{
 int printf();
 int i = 55;
 return printf("Hello World");
}
>>160
program p
var i : integer;
begin
 i := 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
 writeln("Hello World");
end.
>>162
スレのタイトルが読めないようですね
日本語から勉強してください
>>161
プログラムの戻り値が異常終了時の戻り値になりますよ
>>160

#include <iostream>
#include <numeric>
#include <algorithm>

struct Gen { inline int operator()() { static int n = 1; return n++; } };
main()
{
 using namespace std;
 int onetoten[10];
 generate_n(onetoten, 10, Gen());
 accumulate(onetoten, onetoten + sizeof( onetoten)/sizeof(int), 0);
 cout << "Hello World" << endl;
}
166デフォルトの名無しさん:03/10/05 22:17
sin Xをテイラー展開して近似するという問題で
プログラム自体はできましたが
どうしてもXの値を大きくすると
誤差が大きくなってしまいます。
何か誤差を小さくする方法は無いものでしょうか?
long doubleを使う
168166:03/10/05 22:18
プログラムを附記しときます

#include<stdio.h>
#include<math.h>
#define NMAX 100
void main(void)
{
float eps,x,t,s;
int n;
printf("Taylor series\n");
scanf("&g",%eps);
printf("eps=%g\n",eps);
for(;scanf("%g",&x)!=EOF;){
printf("\nx=%g\n n\tt\t\ts\n",x);
t=x;s=x;
for(n=1;n<NMAX;n++){
t*=-1*x*x/(2*n*(2*n+1));s+=t;
printf("%2d %15.6e %15.6e\n",n,t,s);
if(fabs(t)<eps)break;
}
if(n>=NMAX)
printf("---not converged---\n");
printf("exp(%g)=%g\tn=%d\n",x,s,n);
}
exit(0);
}。
floatなんか使うなよ。せめてdouble。なるべくなら自分で高精度浮動小数点クラスを作る。
>>166
先に正規化しろよ
マクローリン展開は 0 から離れるほど収束が遅くなる
もはやこれは常識!
172136:03/10/06 01:02
一度クリックしたら変わるのは出来るんだけどもう一度クリックしたら重なって表示でもいいからでる
方法が分からないんだが、それだけ教えてくれんかの?
>>172
アイコンをボタンに張って、ボタンを同じ場所に5つ配置し、
それをひとつずつShowWindow()すると言う手はどうだ?
174デフォルトの名無しさん:03/10/06 04:23
--------------------------------------
サーバ用プログラムの一部
--------------------------------------
int rec;
char buff[1024];
char fbuf[1024];
int fbyte;
FILE *fp;

//クライアントからのデータ受付
rec = read(connfd,buff,1024);

//ファイルオープン
fp = fopen("info.txt","r")
while(fgets(fbuf,1024,fp) != NULL){
fbyte = strlen(fbuf);
write(connfd,fbuf,fbyte);
}
175デフォルトの名無しさん:03/10/06 04:24
--------------------------------------
クライアント用プログラムの一部
--------------------------------------
char buf[1024];
int ret;

//サーバへのデータの出力とサーバからのデータの入力
while (fget(buf,1024,stdin)){
write(sockfd,buf,1024);
ret = read(sockfd,buf,1024);
buf[ret] = '\0';
print("%s",buf);
}

以上のプログラムをサーバー側ののプログラムだけを改造して
クライアントから入力した文字をそのまま返す(エコーバック)こと
を実現したいのですが。Cの玄人様よろしくおながいします。
簡単な解説(どうやって実現させているのか)等もできればおながいします。
read()の戻り値って読み込んだサイズだったよね?
それならこれだけ。

//クライアントからのデータ受付
rec = read(connfd,buff,1024);

write(connfd,buff,rec);

説明のしようもないや。
filedes 取得絡みの解答が全くないな…
178デフォルトの名無しさん:03/10/06 12:06
(゚Д゚)ハァ?
filedes ってなんだよ、おい。
ファイルデスクリプタ?
typedef char* pchar , moji って
二つ目はmojiはcharってことで正解ですか?

基礎ですみませんが教えてください。
181デフォルトの名無しさん:03/10/06 13:28
平均と分散を引数にとって、正規分布を作って、
グラフを出力する関数を作ってください。
言語はCです。
>>180
正解
>>172
2次配列flg[5][5]にアイコンのフラグ(1〜5)を格納
WM_PAINTでflg[5][5]をswitchして描画
WM_LBUTTONDOWNでflgをインクリメント、InvalidateDataでいいんでない?
>>178
sock, bind, connect, listen, accept あたりの話がごっそり抜けてるな
と思って
184172:03/10/06 19:29
>>143,173,182
デキタ━━━━━━(゚∀゚)━━━━━━ !!!!!!
大感謝!出来たよ!やったよ!ありがとよ!!!
ヤッホーーイ!!ヽ(´Д`)ノInvalidateRect関数なんて知らなかったぜヤッホーーイ!!


また詰まったらヒント頼む・・・
俺もこんなに感動した日があったな〜・・・ハァ〜・・・
>>183
その辺のコードはすでに存在しているということが読み取れないか?
「?の一部」が >>183の言語野じゃtruncateされてるらすぃ。
行列Aのi行をk倍した行列Bを出力
行列Aのi行とj列を交換した行列Cを出力
お願いシマス
>>188
行列Aのi行とj列を交換っていうのは特定の1行と1列のみ?それとも丸ごと全部?
stdlib.hを使わずにatoi関数を自作せよという宿題がでました
atoi("100")=100,atoi("-200"),atoi("134a")=134,
atoi("12uy6")=12,atoi("a975")=0,atoi("134.23")=134
atoi("2/3")=2
というように、整数ならそのまま整数を出力して、
整数-英文字,記号...なら初めの整数だけ出力して、
それ以外は0を出力する関数を作りたいです。
どうやったら作れますか?
>stdlib.hを使わずに
プロトタイプ宣言するだけだろ。
>>191
さすがだな
>>190
int value = 0; を宣言。
先頭から読んでいって数字なら value = value * 10 + その数字;
文字列の終わりか、数字じゃなくなるまで続ける。
>>193
ヌル文字も数字じゃないから「文字列の終わりか」は余計。

>>190
まず、1.先頭のwhile(空白||タブ文字)を飛ばし。
次に、2. if('+')が付いてるかelse if('-')が付いてるかしたら、それぞれ処理。
そして、3. >193の話。
>>190
#include <stdio.h>
int atoi(const char *string)
{
 int n;
 return sscanf(string, "%d", &n) == 1 ? n : 0;
}
>>195
エレガントすぎてわけわかりません。
>>195
   n                n
 (ヨ )              ( E)
 / |    _、_     _、_    | ヽ
 \ \/( ,_ノ` )/( <_,` )ヽ/ / グッジョブ!!
   \(uu     /     uu)/
    |      ∧     /
>>193, 194
プログラムで示してやれよ。
199デフォルトの名無しさん:03/10/07 22:22
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=149
オセロゲームなんですが、
あとは右クリ(黒を置く)と左クリ(白を置く)を交代交代出来るようにして、
反転条件を縦、横、斜めそれぞれ作れば完成だと思うんですけど。
その交代交代で置けるようにする方法と反転条件縦、横、斜めそれぞれを考えてください。。。
>>199
> あとは右クリ(黒を置く)と左クリ(白を置く)を交代交代出来るようにして、
これってあまり意味ないんじゃ…
>>200
俺もそう思う・・・
けれど、それが仕様なんだから良いんじゃない?
202199:03/10/07 23:26
右クリと左クリで交互に置けるようにしないと黒2回おいたりしちゃうし・・・

と、言いますか、仕様なので…
>>202
> 右クリと左クリで交互に置けるようにしないと黒2回おいたりしちゃうし・・・
(゚Д゚)ハァ?
>>202
脳みそ腐ってますか?
>>200
同意。マウスとキーボードとかなら分かるけど。
でも1本のマウスで恋人同士で勝負するとかはやるかも。

>あとは右クリ(黒を置く)と左クリ(白を置く)を交代交代出来るようにして
static teban=1;みたいなのをあらかじめ用意しておいて
黒の時は、case WM_LBUTTONDOWNの後にif(teban==1)を付け加え、
偽だったら全処理を行なわない、又は手番が違うと表示するとか。
白の時はその逆。最後、breakで抜ける前にteban=3-tebanみたいにして反転させる。

>反転条件を縦、横、斜め
指した位置から8方向を調べる。上ならy--、右下ならy++,x++みたいにして、
相手の駒でなくなるまで調べる。その時その駒が自分の駒だったらひっくり返す。
206199:03/10/07 23:39
むむ・・・変な事言っちゃったか?
上のプログラムだと、左クリックを2回したら2個白が置けちゃいますよね・・・
でもオセロなんだから、白の次は必ず黒を置かなければならないですよね・・・
だから、白を置いた後にまた白を置こうとしても無理にしないと・・・・
ってことをいいたかったんだけど・・・

てかまた変なこと言っちまった?
いいじゃね〜かよ。本人がそれが仕様だって言っているんだから。

・・・でも、ちょっと変だね。
208205:03/10/07 23:48
>>205に付けたし
盤を参照する時>>205の方法だと配列をはみ出してしまって危険だから、
配列のサイズを2ずつ大きくしておいて、端は駒を置く位置としては
使わないようにする方が良い。

後、8方向を調べる時、左上から右回りに調べるとして、調べる位置を動かす時、
ptnY[]={-1,-1,-1,0,1,1,1,0}、ptnX[]={-1,0,1,1,1,0,-1,-1}
みたいな配列を作っておいて、
for(i=0;i<8;i++)
{
y+=ptnY[i];x+=ptnX[i];
if(osero[y][x]!=3-teban)break;
}
みたいに調べるとすっきりかけると思う。
>>199
ちょっとwebで検索して、オンラインのオセロがどういう使い勝手になっているか見てこい。
一例でも右クリックと左クリックを使い分けているものがあったら教えてくれ。
teban = 3 - teban; って激しく気持ち悪いな。
enum 使うのがいやでも普通は
teban = 1 - teban; ってやると思っていたのだが。
人の仕様をボロクソに言うスレか、ここは・・・
teban, teban ってターバンって読んでた。
手番かよ。なんだよ。
enum位使えよ

namespace color
{
 enum { WHITE, BLACK };
}


using namespace color;
teban = teban == WHITE ? BLACK : WHITE;
bool teban;


teban ^= true;
>>208
配列のサイズが 8x8 の場合は危険で、10x10 なら安全だという
理屈がわからん。
>>213
その無駄なnamespaceの意味は?
enum{WHITE, BLACK}
teban++;
teban &= BLACK;
>>216
グローバル名前空間にenum置くような馬鹿は絶滅したと思ったが。
>>214
普通は teban = !teban。
>>218
usingしたら意味がないだろ。
>>219
tebanがlhsにもrhsにも出てきちゃう所がイマイチ。
>>220
usingする場所によるだろ。
>>215
所謂センティネルでしょ。
8x8フィールドの外側に堀を用意するか、自分で壁を判断するかの違いだよね。
>>220
これじゃ意味無いけど、
using namespace color;
ChangeTurn()
{
 teban = teban == WHITE ? BLACK : WHITE;
}


これなら意味あるでしょ
ChangeTurn()
{
 using namespace color;
 teban = teban == WHITE ? BLACK : WHITE;
}
>>194
ほらよ。
int atoi(const char*nptr){
int sign=1; int result=0;
while (*nptr == ' ' || *nptr == '\t') ++nptr;
if (*nptr == '-') { sign=-1;++nptr; } else if (*nptr == '+') ++nptr;
while (*nptr >= '0' && *nptr <= '9') result=10*result+(*(nptr++)-'0');
return result*sign;
}
isspace(), isdigit() を知らんのか・・・。
>>226
じゃあ、それらを使用してコードを晒してくれ。
>>221
たしかにそうだが、boolに対してbitwise exclusive orするよりはマシ。
229226:03/10/08 00:41
>>227
isspace(), isdigit() に該当する処理を置き換えたら良いだけだろ。
一々ムキになるなよ・・・。
>>227
ほらよ。
int atoi(const char *string) {
 const char *nptr = string;
 int sign = 1, result = 0;
 for (; isspace(*nptr & 0xff); ++nptr);
 if (*nptr == '-') sign = -1, ++nptr;
 else if (*nptr == '+') ++nptr;
 for (; isdigit(*nptr & 0xff); result = 10 * result + *nptr++ - '0');
 return sscanf(string, "%d", &result) == 1 ? result : 0;
}
>>229
isspaceってよりはisblankだけどな
( ´Д`)/先生!isblankなんてANSI Cにないです
>>230
結局それか!
int atoi(const char*s){
int sign=1; int result=0;
while ( isblank(*s) ) ++s;
if (*s == '-') { sign=-1; ++s; } else if (*s == '+') ++s;
while ( isdigit(*s) ) result=10*result+(*(s++)-'0');
return result*sign;
}
>>232
C99
>>234
だからisblankはあんたのコンパイラにしか入ってませんよ
( ´,_ゝ`)
int atoi(const char*s) throw(boost::bad_lexical_cast)
{
 return boost::lexical_cast<int>(s);
}
>>223
センティネルなら両端2ずつ延ばして12x12のフィールドで
延ばした部分に白と黒を置いた方がいい
240239:03/10/08 00:56
>>223
すまん
両端1ずつ延ばした10x10のフィールドで
延ばした部分に0(何もない状態)を置いた方がいいな
わざわざ大きめの配列作らなくても配列カプセル化するクラス作ってgetterとsetterにチェックさせるのが一番いい。
>>238
Cとは言ってないからな
でもboost使いましたってことをレポートに示すより
atoiくらい自力で書いた方が速くない?

それを考えると>>191>>195の方がエレガントだな
>>241
(゚Д゚)ハァ?
なんだこの厨房スレは
245225:03/10/08 01:07
>>226
そんなテーブルルックアップ関数は(゚听)イラネ
>>238
仕様を満たしていないので0点。
車輪の(ry
>>247
車輪の設計図盗んで来ただけですが何か?
'-')
250がおー:03/10/08 01:26
℃〜
どれを選ぼうと、>>190は人に助けてもらったのがバレバレで教官にどやされるのだな。
252int:03/10/08 11:48
数列を逆に変換するプログラムなのですが
VC++6.0でコンパイルした物を実行すると
思い通りに数列が逆に表示されないです
エラーは0でしたが、何か問題点が有りましたらよろしくお願いします
あぷろだの関係で拡張子が.cですが、.cppです・・・
http://sorimati.s3.x-beat.com/upload/source/up0360.c
>>252
よく分からんけど最後の部分が
moji[i] = '\0'; じゃなくて
gyaku[i] = '\0'; じゃないの? 
単純なミスだと思われ
254int:03/10/08 12:32
>>253
ありがとうございます、感謝
255:03/10/08 12:47
すいませんが、立てている文字列どうやって、横並びにしますか。
a
i
u
e
o

aiueo
にする。
もう出来てるじゃないか
257:03/10/08 12:54
ごめんなさい、説明不足なんで、
立てている文字列のファイルを読み込んで、横並びにして、別のファイルに書き込みます。
番号(int no)、名前(char name[20])をメンバとする構造体を作成し、データ入力及び表示を行うプログラムを作成してください。
最大5件分の入力か、「input data?(y/n)」の問いかけに対して'n'が入力された場合に、入力処理を終了してデータを表示してください。
なお、番号は1〜9999の範囲で一意なものとし、範囲外番号や登録済みの番号が入力された場合は再入力させてください。
名前についても20文字以上入力された場合は、エラーメッセージを表示して再入力させてください。
1件分の入力処理はinput_data()で、表示はdisplay_data()と処理を関数に分けて行ってください。

って問題なんですけど、番号入力の部分がわからないんです。
誰かおねがいします。
while( c = getchar(), ( c != '\n' ? putchar(c) : 1 ) != EOF );
260258:03/10/08 13:10
ちなみにC言語で、構造体のところまでしか習ってません。
scanf() とか fgets() + atoi() or sscanf() とか
262デフォルトの名無しさん:03/10/08 15:34
教えてください。
行列の和と積を求めるプログラムを作成せよという課題が出たのですが、宣言した型の行列しか
計算できません。どんな型の行列にも対応したプログラムにしたいのですが・・・。
ちなみにコンパイラはgccです。



もへじは黙ってろよ
>>262
C++ならtemplateを使え。
Cならマクロを使って似た様なことができるが、面倒くさいので、
「計算する時、全部doubleにキャストする」って方法でごまかすのが吉。
265264:03/10/08 16:37
キャストじゃうまくいかねーか。
例えばThis@is@meなら
This
is
me
記号を使って文字列を分割して改行する関数divide(char *a,char c)
を作って欲しいです。
使うヘッダはstdio.hだけです
>>266
つまりstrtokを使うなってことか…
>>266
divide(char *a, char c)
{

while (*a) {
if (*a == c) *a = '\n';
a++;
}

}
char *aを分割したい文字列
char cを区切り文字
記号を使って文字列を分割して改行し標準出力に表示すると仮定
void divide(char *a,char c){
  for(;*a!='\0';*a++){
        if(*a!=c)putchar(*a);
        else putchar('\n');
  }
}
>>266
void divide(char *a, char c)
{
while(*a != '\0')
{
*a == c ? putchar('\n') : putchar(*a);
a++;
}
}
>>270
putchar(*a == c ? '\n' : *a);
>>270はアフォ
>>272は(ry
マインスイーパーのプログラムをC++でお願いします。
#include <iostream>
main()
{
 using namespace std;
 cout << "マインスイーパーのプログラム" << endl;
}
276デフォルトの名無しさん:03/10/08 20:35
バイナリファイルに2バイトのデータが3つずつかなり多く入ってるんだけど、それをそれぞれ3つの変数(配列)にfread関数を使って格納する方法が分からない。
ゼミの提出明日までなんだ。誰か教えてー。


unsigned short date[3];
fread(data, 2, 3, file);
278266:03/10/08 20:58
>>269の関数を使ってcompile&実行したら結果はでるんですけど、エラーも出ます
divide(char *a,char c)が間違ってました
*をつけた*divide(char *a,char c)なら内容はどう変わるんですか?
>>278
???? *divide(char *a, char c)
???? を答えよ
280デフォルトの名無しさん:03/10/08 21:11
<<277
違う違う。
a[],b[],c[]の3つに格納するんだよ。
>>280 == >>276
アホのオーラが出てる
>>280
アフォか
3回繰り返せよ
>>280
こんなアフォのいるゼミって…
284266:03/10/08 21:16
>>279
????=charです
285268:03/10/08 21:19
>>284
char *divide(char *a, char c)
{
char *tmp = a;

while (*a) {
if (*a == c) *a = '\n';
a++;
}

return tmp;
}

a が const char * じゃなくて char * だからそんなとこだろうと思ったよ
286266:03/10/08 21:52
>>285
コンパイルしてe@rと入力して実行したら
e
r

e
r

...
と無限に出てきます
>>286
入力部分のソースと出力部分のソースを出せ
>>288
無限に出力されるはずがない。
よって、お前の書いたコードのミス。
>>286
おまいのバグだ
291266:03/10/08 22:16
#include <stdio.h>
char *divide(char *a,char c);
int main(void){
char n[256],*p1,*p2;
printf(">");
fgets(n,256,stdin);
p1=n;
do{
p2=divide(p1,'@');
printf("%s\n",p1);
p1=p2;
}while(p2!=NULL);
}
後は>>285
>>291
全く素晴らしい。文句なしだなこりゃ。
>>291
言 っ て た こ と と 違 い ま せ ん か ?
だめだこりゃ
#include <stdio.h>
char *divide(char *a,char c);
int main(void){
char n[256];
printf(">");
fgets(n,256,stdin);
divide(n,'@');
printf("%s\n",n);
}
>>291 は、strtok() のように扱いたかったんだろうか・・・。
297266:03/10/08 22:40
>>295ならできました。いらない文がだいぶあったみたいです。
でも>>291を変えずにそのままにすると、>>285はどうなってたんでしょうか
298デフォルトの名無しさん:03/10/09 17:48
おながいします、C++でマインスイパー作って;;
#include <iostream>
main()
{
 using namespace std;
 cout << "マインスイパー" << endl;
}
300デフォルトの名無しさん :03/10/09 18:24
誰か助けて。21:00までにうpきぼん。おながい。。
問題
C言語には平方根を求めるsqrt関数が用意されている。このsqrt関数を使わずに、
入力された自然数Nの平方根Rを、小数点以下4桁まで求めるプログラムを作成
せよ。
301デフォルトの名無しさん:03/10/09 18:38
ヒント:平方根Rの整数部分をまず決定すれば良い。そのためには自然
数を小さい方から順番に2乗して、入力された自然数Nを超えない最大
の整数を求める。同じ原理を適用してRの小数部を決定する。

だって。だれかおながい。21:00以降でもいいから。
302デフォルトの名無しさん:03/10/09 18:46
double x = 0;
double d;
for (d = 1.0; d <= 0.0001; d /= 10) {
for (; x * x < n; x += d) ;
x -= d;
}
303デフォルトの名無しさん :03/10/09 18:52
302って300の問題の答え?
自然数Nの入力とかなくない?
もうちょっと補足してくれ。おながいします。
304bing:03/10/09 18:54
文字列:"abcMdefgMMef"のとき、Mが一つの場合、"MMMM"を出力して、
二つの場合"MMMMM"を出力する。
ちなみに "abcMMMMdefgMMMMMef"のように出力したいです。
お願いします。
>>303
そこまで面倒みない。自分でやれ。

>>304
while ((c = getchar()) != EOF) {
if (c == 'M') {
c = getchar();
printf("MMMM");
}
putchar(c);
}
s = 1;
if (n > 1)
 s = n;
do {
 r = s;
 s = (n / s + s) / 2.0;
} while(s < r);
で求まるらしいがヒントとは関係ないからおそらくバレるな。
307bing:03/10/09 19:07
元の文字列にMの数が違うによって、出力するMの数も違いますから、
305の回答はまだ不完全じゃないですか。
3つの場合は"MMMMMM"か?
309bing:03/10/09 19:11
M二つの場合"MMMM"、四つのM
M三つの場合"MMMMM"、五つのMです
問題を正確に写してくれ。
311bing:03/10/09 19:17
文字列:"abcMdefgMMef"のとき、
Mが一つの場合、"MMMM"を出力して、
 Mが二つの場合"MMMMM"を出力する。
ちなみに "abcMMMMdefgMMMMMef"のように出力する。
3つの場合は"MMMMMM"として
while ((c = getchar()) != EOF) {
if (c == 'M') {
printf("MMMM");
while ((c = getchar()) != EOF && c == 'M') putchar(c);
if (c != EOF) putchar(c);
} else {
putchar(c);
}
}
>>300
#include <stdio.h>
#include <math.h>

int main() {
double n;
printf("数値入れろモルァ: ");
fflush(stdout);
if (scanf("%lf", &n) == 1)
printf("平方根は%.4fでつ\n", pow(n, 0.5));
return 0;
}
>>314
これを丸写しして研究課題として提出だいえいオアがGはッウェアフィjsじゃl;
ってことになったらなんかやだな
fatal プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
>>316
#include "stdafx.h"
>>306
ニュートン法はあまりに有名だから流石にバレないだろ

>>313
やるな
319デフォルトの名無しさん:03/10/10 00:12
再帰関数(Recursive)にしないといけないんですが、どう直したらいいのでしょうか?

void List::retrieve(int inde, ListItemType& dataItem, bool& success) const
{
success = bool ((inde>=1)&&(index<=size));
if (success)
dataItem=items[translate(index)];
}
320デフォルトの名無しさん :03/10/10 00:29
正の整数を5つ入力として受け付けて、それらを配列に格納し、
それを以下に示すように棒グラフとして出力せよ。

・例、入力が6,5,1,10,9のとき
******
*****
*
**********
*********

321デフォルトの名無しさん:03/10/10 00:36
#include<stdio.h>
int main(void){
int i,j,hairetu[5];
puts("正の整数を5つ入力だゴルァ")
scanf("%d",&hairetu[i]);
for(i=1;i<=5;i++){
for(j=1;j<=hairetu[i];j++){
printf("*");
}
printf("\n");
}
return(0);
}

どこが間違っていますか?
322デフォルトの名無しさん:03/10/10 00:37
>>320-321
で実行すると
どんな数字を入力しても
*
*
*
*
*
となってしまいます
scanf("%d",&hairetu[i]);
この時点でiの値が不定です
324デフォルトの名無しさん:03/10/10 01:00
puts("正の整数を5つ入力だゴルァ")
for(i=1;i<=5;i++){
printf("%d",i);
 scanf("%d",&hairetu[i]);
}
これを追加すればいいんですか?
>>324
配列がいくつから始まるか習わなかったか?
>>319
void List::retrieve(int index, ListItemType& dataItem, bool& success) const
{
 if (index >= 0)
  retrieve(-index, dataItem, success);
 else {
  success = index <= -1 && index >= -size;
  if (success)
   dataItem = items[translate(-index)];
 }
 success = !success;
}
327デフォルトの名無しさん:03/10/10 01:20
>>325
0ですか?
>>327
それを知ってるのに、なぜ0からアクセスしない?
329デフォルトの名無しさん:03/10/10 01:24
ってことはこうですか?
puts("正の整数を5つ入力だゴルァ")
for(i=0;i<5;i++){
printf("%d",i);
 scanf("%d",&hairetu[i]);
}
入力が一回しか行なわれていないことには気づけないもんだろうか。
printf("%d",i);
これにはなんの意味が?
もうわかりません
#include<stdio.h>
int main(void){
int i,j,hairetu[5];
puts("正の整数を5つ入力だゴルァ");
for(i=0;i<5;i++){
scanf("%d",&hairetu[i]);
}
for(i=0;i<5;i++){
for(j=0;j<hairetu[i];j++){
printf("*");
}
printf("\n");
}
return(0);
}
333デフォルトの名無しさん:03/10/10 01:51
四角形の面積を求めるプログラム誰か書いてみて
334デフォルトの名無しさん:03/10/10 02:14
結局、解答はどんな感じなんでしょうか?
335デフォルトの名無しさん:03/10/10 02:16
>>333
#include <stdio.h>
int main()
{
int teihen,takasa;
printf("底辺の長さは? :");
scanf("%d",&teihen);
printf("高さは? :");
scanf("%d",&takasa);
printf("面積は%dじゃネーノ?\n",teihen*takasa);
return 0;
}
336デフォルトの名無しさん:03/10/10 02:23
>>320はどうでしょうか?
337デフォルトの名無しさん:03/10/10 02:50
>>320

#include <stdio.h>
int main()
{
int a[5],i,j;
printf("> ");
scanf("%d,%d,%d,%d,%d",a+0,a+1,a+2,a+3,a+4);
for(i=0;i<5;i++){
for(j=0;j<a[i];j++)
putchar('*');
putchar('\n');
}
return 0;
}
>>320
#include<stdio.h>
int main(void) {
int i, j, hairetu[5];
puts("正の整数を5つ入力だゴルァ");
for(i=0; i<5; i++) scanf("%d",&hairetu[i]);
for(i=0; i<5; i++) {
for(j=0; j<hairetu[i]; j++) putchar('*');
putchar('\n');
}
return(0);
}

>>337とおおむね同じ。ポインタ習ってないと思うので、自然な形に変えただけ。
>>333
#define chouhoukei(teihen, takasa) ((teihen)*(takasa))
#define daikei(joutei, katei, takasa) (((joutei)+(katei))*(takasa)/2)
バッファオーバーラン対策きぼんぬ
341デフォルトの名無しさん:03/10/10 04:02
>>339
×2
○2.0
>>339
以下の4点から構成される4角形の場合、
そのマクロをどう使うんでつか?

(3,2)(1,24)(12,15)(26,26)
>>337-338
サンクス!!!
>>342
三角形2つに分割してヘロンの公式で求めるべし
ただし凹四角形も考慮すること
頂点が4つ決まると、
四角形は一意に決まるのですか?
>>335は勉強しなおせ
>>345
凹四角形を考慮しちゃうと定まらない希ガスる
やっぱ定まる
俺は定まらない
>>346
はぁ?
>>348-349
バタフライ形を「四角形」と呼ぶかどうかの問題?
>>351
△←こんな形の三角形の、各頂点を上から右回りにA,B,Cとする。
これの重心よりすこし下の位置をkとする。
すると、四角形 ABCk と ABkC では面積が異なる。

353314:03/10/10 18:56
致命的なバグが・・・
でもどうでもいいよね?
354デフォルトの名無しさん:03/10/10 18:56
>>335-352
結局藻前ら、4角形の面積も満足にもとめられないのか(w
>>346
>>335のどこが悪いの?
356デフォルトの名無しさん:03/10/10 19:08
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1027870433_150/so-su.lzh
適当に作った、テストの平均点を出すプログラムですが
アルゴリズムはどうでも良いのですがソースの書き方やファイル名の付け方、
宣言の仕方、インクルードの仕方、があってるか教えていただけますでしょうか。
いちおう動くことは動きます。
圧縮してあるので読む気が起きません
358356:03/10/10 19:53
>>357
帰って読みにくかったようですいません。
本文カキコしておきました。お願いいたします。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=151
ソースの書き方つーとヘッダでusingすんなとか非インラインのメンバ関数の実装を
ヘッダに書くなとか、ヘッダにはインクルードガードをつけろとかそういうのか?

意味もなくグローバル変数使ってる時点で真面目に読む気がせんのだが。
>>355
>>335か?もうアホかと
361:03/10/10 20:25
file1の中身:This is test program
file2の中身:
1 program
2 b
3 ab
4 This
5 i
6 is
7 test
...
file1とfile2を比較して、file2にfile1と同じ単語があったら、
ファイル2からその単語と単語前の数字を出力する。
このプログラムを教えてください。
362335:03/10/10 20:29
>>360
355は違うが、何が悪いのかさっぱりわからん。
平行四辺形に限定しているってことを言いたいのか?

それなら339もそれと台形に限定しているだろ。
363デフォルトの名無しさん:03/10/10 20:35
>>361
> 単語前の数字

???
四角形の面積は凹四角形を考えるのがポイントだろ
たぶん君には言ってもわからないと思うが
365363:03/10/10 20:36
ああ、Thisなら4ってことか。スマソ
366デフォルトの名無しさん:03/10/10 20:38
>>333
何を元に四角形を求めるんだ?
それを書かないと答えようがない。
367デフォルトの名無しさん:03/10/10 20:38
・・・と最初から素直に指摘しておくべきだったか。
368366:03/10/10 20:40
s/四角形/四角形の面積/
>>358
>>359以外に、

グローバル関数・変数はなるべくnamespaceで包む
(そもそも今回の場合グローバル変数は使うべきでない)
extern ban;
extern sum;
これはひどすぎる

<<, >>, !=等の前後にスペース入れるべき

コンストラクタはできるだけ初期化子を使って初期化する
Test::Test() : a(0), name("名無し")
{
}

x = x / ban;

x /= banにすべき
>>369
> <<, >>, !=等の前後にスペース入れるべき

それは趣味の問題
371356:03/10/10 20:47
>>359
すいません、まだ良く分かってないもので。
どこかにファイル分割したときの書き方などが書いてあるサイトがありますでしょうか?
あるいは今のレベルじゃ同じファイルに全部ソースを書いて置いたほうが良いんでしょうか?
外部参照宣言って普通ヘッダーファイルに書くんじゃ(定義はソースファイルに)・・・・
373356:03/10/10 20:50
>>369-370
謝ってるばかりですが、申し訳ありません。
まだ始めて2週間ぐらいなもので、ちゃんとした書き方知りませんでした。
374372:03/10/10 20:51
あれ、ヘッダーファイルなのか(T_T)
何行もある関数をクラスの中に直接・・・
375372:03/10/10 20:52
あーまたちゃんとみていないし・・・
やっぱりクラスの外か。それはいいんだけど、ヘッダーファイルの中に書いちゃいけないよ。
376372:03/10/10 20:57
test_c.hの「Test::Test() //コンストラクタ」より下を先頭に#include "test_c.h"を付加して別ファイルに。
extern ban;extern sum;は削除
377356:03/10/10 21:00
>>374-376
検索してみてもファイル分割の方法やヘッダーやらの詳しい解説サイトがあまり見当たらないのです。
別ファイルにするというのは後ほどやってみます。
つーか今の状態でextern消したらコンパイル通らないだろ
>>373
プログラミング初めて2週間なら上出来なほうだと思う。
がんがれ。
380372:03/10/10 21:07
>>378
test_c.hにextern int sum;が必要だな。

banだけ書いてなぜsumを書かないんだろう・・・
381356:03/10/10 21:11
>>376>>378>>380
すいません、それについては良く分かりませんでした。

>>379
ありがとうございます、がんばります。
382:03/10/10 21:13
file1の中身:This is test program
file2の中身:
1 program
2 b
3 ab
4 This
5 i
6 is
7 test
...
file1とfile2を比較して、file2にfile1と同じ単語があったら、
ファイル2からその単語と単語前の数字を出力する。
このプログラムを教えてください。

うるさいかもしれないが、助けてくださいよ。
>>382
考え中
>>382
#include <iostream>
#include <fstream>
#include <map>
#include <string>
main()
{
 using namespace std;
 
 map<string, int> strmap;
 
 ifstream file2("file2");
 while(file2)
 {
  int i;
  string s;
  file2 >> i;
  file2 >> s;
  strmap[s] = i;
 }
 ifstream file1("file1");
 string s;
 while(file1 >> s)
 {
  map<string, int>::iterator it = strmap.find(s);
  if(it != strmap.end())
  {
   cout << (*it).first << " " << (*it).second << endl;
  }
  
 }
}
>>384
(*it).firstはit->firstじゃだめなの?
>>385
本来そうあるべきだが、
C++準拠度がかなり高いコンパイラじゃないと、
it->firstは通らない。
>>386
なるほど。
388:03/10/10 21:31
できれば、Cで書いてほしいですけど、
マンドクセ
思った通りのレスだ。
Cスレにマルチしていたからそう来ると思った。
で、>>354はウダウダいってるだけでなんも書いて無いの?
>>391
それは言うな。
>>333
#include <stdio.h>
#include <math.h>

int main() {
 struct {int x, y;} p[4];
 int i, s = 0;
 for (i = 0; i < 8; i++) {
  printf("%d点目の%c座標入れろモルァ: ", i / 2 + 1, 'X' + (i & 1));
  fflush(stdout);
  if (scanf("%d", &p->x + i) != 1)
   return 1;
 }
 for (i = 0; i < 4; i++)
  s += (p[(i + 3) & 3].x - p[(i + 1) & 3].x) * p[i].y;
 printf("面積は%f\n", fabs(s / 2.0));
 return 0;
}
>>388
file2読み取りのコードだけでこんなになっちまったぜ。

struct node { int id; char *word; };
struct storage { int num_node; struct node *first_node; };
struct storage node_storage = { 0, NULL };
FILE file1, file2;
int file2_size; char *file2_data;
file2 = fopen("file2","r");fseek(file2, 0, SEEK_END);
file2_size = ftell(file2); fseek(file2, 0, SEEK_SET);
file2_data = malloc(file2_size);
fread(file2_data, file2_size, 1, file2);
{ char *tmp, *last; char *next_line;
last = file2_data+file2_size;
for(next_line = tmp = file2_data; tmp < last; ++tmp){
if(*tmp == '\n'){
int id; char *word; char *line;
*tmp='\0'; line = next_line; next_line = tmp +1;
tmp=line; while( isdigit(*tmp) ) ++tmp; if( ! isblank(*tmp) ) continue; *tmp='\0'; id=atoi(*line);++tmp;
while( isblank(*tmp) ) ++tmp; if( *tmp == '\0' ) continue; word = tmp;
{
struct node cur_node;
node_storage.num_node++;
node_storage.first_node = realloc(node_storage.first_node, sizeof(struct node)*node_storage.num_node);
cur_node = node_storage.first_node + node_storage.num_node - 1;
cur_node->id = id; cur_node->word = word;
}
}
}
Cは駄目だな
>>393
× 'X' + (i & 1)
○ (i&1)?'Y':'X'
>>396
どこが間違ってるか分からないんだけど。
'X'に1足したものが'Y'になるという保証はない。
例えばASCII限定ならOKだが。
>>398
そんな環境は他の文字も化けるので、はなから相手にしていませんが。
>>398
EBCDICでもXの次はY
誰もEBCDICの話なんかしていないと思うが・・・
>>401
EBCDIC以外でASCIIをサブセットとしていない文字コードを挙げてくれ
398じゃないが、
どのコード体系が云々とかいう問題じゃないだろう。
ある文字にある整数を加算した結果が特定の文字になることを期待してはいけない、ってことだろ。
言語としてそれが規定されているわけではないから。
というか三項演算子使った方が分かりやすくなると思うんだが。
というか剰余算使った方が分かりやすくなると思うんだが。
406デフォルトの名無しさん:03/10/11 03:30
も前ら三項演算子とか可読性とか Lisper や Java 厨に影響されすぎ。
C なんだから男らしく "XY"[i&1] と書くべき。
(i&1)["XY"]
>>403
つまりC++では1+1=2とは限らないという事ですか。
>>408
漏れには 403 は (例えば) 'X' + 1 == 'Y' とは限らないって書いてあるようによめる。
同じものが君には「1+1=2とは限らない」と読めるのか。。。
410403:03/10/11 15:53
>>409
フォローサンクス。
言いたいことはおっしゃるとおり。

>>408
推測するに、

「文字」ってのはつまるところ「int(C++ではchar)型の整数」なんだから
すなわち>>403
「ある整数にある整数を加算した結果が特定の整数になることを期待してはならない」
と読み替えることができる。

と言いたいわけだな。
違ったらスマン。

俺にはこれ以上うまい説明を考えるのがめんどくさい。
C FAQかC++ FAQあたりにこれに関する議論が確かあったと思うので
それを読んでくれ。以上。
わざわざ説明しなくても勘違いしたのはおそらく408だけ。
>>408
その通りです。
+演算子をオーバーロードすれば
1+1が3にでも11にでもなります。
>>412
演算子をオーバーロードできるのは少なくともひとつの
ユーザー定義型をオペランドに持つときだけなんだなこれが。
>>412
恥ずかしい奴
415デフォルトの名無しさん:03/10/11 19:36
リアル宿題です。休明けまでにまだいくつもしなくてはいけません。手伝っていただけますでしょうか。
よろしく御願いします。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=152&fi=no
ヘッダーファイ参上
>>425
そこから何をすればいいのかよく分からない。
Rectangleのメソッドを実装すればいいの?Pointの方は実装しなくて良いの?
本当に何をすればいいのかわからんな。
419415:03/10/11 21:45
ヘッダーファイ「ル」が抜けてましたね。失礼しました。
Point, Rectangle 両方実装します。
出題の文章がこれしかないので、推測できる範囲で結構です。
よろしければ、ご回答を元に、C講師の添削した結果を後日書きます。

420名無し@沢村:03/10/11 22:51
おまいらよ、TSXBINって知ってるか?
これは土屋秀雄というガキがつくったバイナリエディタだが、ただのバイナリエディタではなく、いろいろなファイルをそのファイルのフォーマット解説つきでバイナリ表示&編集できるというなかなかのすぐれものバイナリエディタよ。
で、ファイルを開いたときに、フォーマット解説を表示するためには、そのフォーマットを記述したマクロファイルを定義しなければならないわけだが、最初からおまけでついているものは、BMP、GIF、JPG、ICO、LZHなどだよ。
つまり実際はBMP、GIF、JPG、ICO、LZHファイルに限ってフォーマット解説が見れるわけだな。
おまいらよ、おれはこのTSXBIN用のマクロとして、MIDとMLD用のやつをつくったからちょっと見てみろ?
つまりこのマクロがあると、パソコン用のMIDIファイルと携帯DoCoMo用のMfiファイルがフォーマット解説つきでバイナリ表示できるぞ。
ここ↓からダウンロードしてみろ?
http://hp.vector.co.jp/authors/VA015412/
おまいらよ、これはMIDIシーケンサーを学ぶおまいらにとてもためになるものだから、ちょっと見てみろ!?
421415:03/10/11 22:51
あの・・・誰かやってくれませんか?
>>421
とりあえず少しだけ
Rectangleも同じような事の繰り返しだから
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=153
423415:03/10/11 23:03
> よろしければ、ご回答を元に、C講師の添削した結果を後日書きます。

捕捉です。
見たい、という方にはです。
うちの講師も授業中にふらふら他所のクラスに出かけるいいかげんな人なので、
イマイチ信用できません。
424415:03/10/11 23:04
421 は私ではありませんので・・・
いま書き込んで気が付きました。 め!
425教師:03/10/11 23:06
座標の入力と出力だけじゃ0点
>>415
#include <iostream>
using namespace std;
#include "rectangle.h"
Point::Point(double x, double y) : mp_x(x), mp_y(y) {}
Point::Point(const Point& p) : mp_x(p.mp_x), mp_y(p.mp_y) {}
Point::~Point() {}
Point& Point::operator=(const Point& p)
  { mp_x = p.mp_x; mp_y = p.mp_y; return *this; }
ostream& operator<<(ostream& out, const Point& p)
  { return out << "(" << p.mp_x << ", " << p.mp_y << ")"; }
istream& operator>>(istream& in, Point& p)
  { return in >> p.mp_x >> p.mp_y; }

Rectangle::Rectangle(const Point& p1, const Point& p2, const Point& p3, const Point& p4)
  : mp_p1(p1), mp_p2(p2), mp_p3(p3), mp_p4(p4) {}
Rectangle::Rectangle(const Rectangle& rect)
  : mp_p1(rect.mp_p1), mp_p2(rect.mp_p2), mp_p3(rect.mp_p3), mp_p4(rect.mp_p4) {}
Rectangle::~Rectangle() {}
Rectangle& Rectangle::operator=(const Rectangle& rect)
  { mp_p1 = rect.mp_p1; mp_p2 = rect.mp_p2; mp_p3 = rect.mp_p3; mp_p4 = rect.mp_p4; return *this; }
ostream& operator<<(ostream& out, const Rectangle& rect)
  { return out << "[" << rect.mp_p1 << ", " << rect.mp_p2 << ", " << rect.mp_p3 << ", " << rect.mp_p4 << "]"; }
istream& operator>>(istream& in, Rectangle& rect)
  { return in >> rect.mp_p1 >> rect.mp_p2 >> rect.mp_p3 >> rect.mp_p4; }
427デフォルトの名無しさん:03/10/12 13:39
アプリケーションのADTの壁を破壊してはいけない主な理由は?
A. プログラムがRunしない。
B. ADTのインフォメーションはPrivate であるべき。
C. ADTの変更は、アプリケーションプログラムの変更が必要。
D. ADTの変更は、アプリケーションプログラムのリコンパイルが必要。
よろしくお願いします。
428デフォルトの名無しさん:03/10/12 14:17
.cppでキーボードからEnterとかスペースが押されたのは
どうやって判別するんですか?

実行例

スペースボタンを押してください
(スペースを押すと)
スペースを押したね?

みたいな・・・
>>427
> アプリケーションのADTの壁を破壊してはいけない主な理由は?
> A. プログラムがRunしない。
×。これが正しいならADTの壁は破壊できないことになる。破壊できる
から、してはいけない理由を問うている。

> B. ADTのインフォメーションはPrivate であるべき。
×。理由になってない。

> C. ADTの変更は、アプリケーションプログラムの変更が必要。
○。アプリケーションがADTの壁を破壊し、ADTの内部構造に依存して
いればそうなる可能性がある。

> D. ADTの変更は、アプリケーションプログラムのリコンパイルが必要。
×。ADTはインタプリタ言語にも存在する。
ADTって何の略?
いろいろありすぎて検索してもわからんかった。
>>430 まったく同じ・・・(w 
検索しても???だった
>>430-431
そんなレベルの人には聞いていません。と言われるのがおち。
>>430-431
Abstract Data Type
private/変更/内部構造 あたりの単語から Abstract Data Type の略と想像。
壁の破壊ってのが良くわからんな・・・
ICollection i;
Array a = (Array)i;
みたいな事だろうか?
Application Development Tool でも通じるんだよなぁ・・・壁は相変わらず意味不明だけど。
ひとつ言えることはC/C++の宿題ではないということだな。
437415:03/10/12 21:29
どうもありがとうございます。
とりあえずそのまま貼ってコンパイルすると、エラーがいくつかでてきますが、
自分で直せそうなところは直してみます。
もしわかんなかったら、またお聞きします。
>>437
ちなみに>>415でリンクしているヘッダーファイルの

>    ~Rectangel();

はスペルミスだと思う。コンパイルエラーはこのせいではない?
>>436
ということは、誰よりも>>427自身がADTって何のことだかわかってないってことですか?
>>439
いや、スレタイはああなっているものの、実際はC/C++に限らず宿題ならやってくれると思ったんだろ。
441デフォルトの名無しさん:03/10/12 22:14
C言語で宜しくお願いします。m(__)m

数値を入力し、その数値が素数ならYes、素数でないならNoと表示するプログラム
を作成せよ。
442デフォルトの名無しさん:03/10/12 22:19
>>441
#include <stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
for(i=2;i<n;i++)
if(!(n%i))
return printf("No\n");
return printf("Yes\n");
}
443441:03/10/12 22:29
>442
ありがとうございますm(__)m
>>441
指数関数のオーダーでよいですか?
>>441
#include <stdio.h>
#include <math.h>

int isPrime(int n)
{
int i, m;
if ( n < 2 ) return 0;
if ( n == 2 ) return 1;
if ( n % 2 == 0 ) return 0;
m = sqrt(n);
for ( i = 3; i <= m; i += 2 ) {
if ( n % i == 0 ) return 0;
}
return 1;
}

int main(void)
{
int n = 0;
scanf("%d",&n);
if ( isPrime(n) ) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
#include <stdio.h>
int main()
{
 int num;
 char ans;
 printf("数字を入力してください\n");
 scanf("%d", &num);
 printf("%dは素数ですか?(y/n)\n", num);
 scanf(" %c", &ans);
 if (ans == 'y')
  printf("%dは素数です\n");
 else
  printf("%dは素数ではありません\n");
 return 0;
}
447415:03/10/13 01:22
> 438
そのとおりです。スペルミスでした。
でも、そこを直しても、エラーが14個でてくるので・・・
でもでも回答いただけてありがたかったです。
ここまで書くのは、たぶん、1、2日はかかるので。
何気に名スレの評判は確かですね。

「標準化を行うプログラムを作成せよ」

↓のやり方でやろうと思いましたがうまくいきません、C言語でお頼みします
http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/statans/stat4/stat4.html
実数型のfloatとdoubleの変数を宣言して0で初期化しなさい。
それぞれに0.01を1万回加えて、その結果を確かめなさい。

こんな問題です。
一応馬鹿なりに考えて見た結果。

#include<stdio.h>
main()
{
int i;
float f;
double d;
f=0;
d=0;
for(i=1; i<=10000; ++i){
f=f+0.01;
d=d+0.01;
}
printf("floatは%dです。\n",f);
printf("doubleは%dです。\n",d);
}

こういうことになったんですけど、間違っているのは目に見えているので教えてください。
>>449
"%d"→"%f"。もしかして釣り?
451449:03/10/13 02:40
多分自己解決しました。
変換指定子が間違っていたんですね。。多分
>>447
> でも、そこを直しても、エラーが14個でてくるので・・・

ひょっとしてレイアウトのための全角スペースを消してないとか。
インデントされてみえるところは全部全角スペースだから、そのままでは通らない。
453441:03/10/13 09:13
遅くなってすみません。
レスして下さった皆様、有難うございました。m(__)m
454デフォルトの名無しさん:03/10/13 09:40
二つのテキストファイルのそれぞれの先頭からスペースまでの数値同士を演算して
結果を別のファイルに出力し、またスペース以降の数値同士を演算して。。。
といった処理を繰り返すプログラムを作っているのですが、どうにもうまくいきません。
どのようにすればより簡単にできますでしょうか?
#include <iostream>
#include <fstream>

main()
{
 using namespace std;
 ifstream ifsa("a.txt");
 ifstream ifsb("b.txt");
 ofstream ofs("result.txt");
 double a, b, out;
 while(ifsa && ifsb)
 {
  ifsa >> a;
  ifsb >> b;
  out = a * b;
  ofs << out << " ";    
 }
 ofs << endl;
}
456デフォルトの名無しさん:03/10/13 10:26
構造体
struct verbform{
char present[10];
char past[10];
};
でデータがstruct verbformverblist[]={{"have","had"}....}
と与えられていてこれを番人付き線形探索をするのだ。
すれば?
458454:03/10/13 12:20
fstreamでこんなに簡単に使ってできるんですね・・・
まだまだ初心者なもので、知りませんでした。

ところでですね。
【using namespace std;】
と定義していますが、ここの意味がいまいち分かりません( ;^^)
これを記述することで、どのような事があるのでしょうか?
アドバイス、よろしくお願いします。。
std::ifstreamとかstd::endlとかのstd::を省略できる。
>>458
C++の入門書ぐらい買って読めよ。さもなくば、プログラミングやめろ。
461454:03/10/13 15:30
そういうことだったんですか。。
早速、取り掛かってみたいと思います。
レスしていただいたみなさん(460除外)ありがとうございました!
m(__)m
462デフォルトの名無しさん:03/10/13 15:43
C言語で電卓を作りたいのですが、
●数字キーは0〜9
●小数点、符号反転、OFFキー(.,+/-,OFF)
●演算キー(+,-,*,/,=,AC,CE)
●表示部(Display)
このような電卓の作るプログラムを教えて下さい。
反転符号は、数の入力時にどこで押してもok。一回押されるごとに
符号が反転します。
計算は簡単な電卓に見られるように左優先で計算し、
乗除算が加減算を優先することはありません。
とりあえず
数値にしろ反転にしろ、
キーが押されたら反応するってのは
標準Cだけでは無理
>>463
getchar();
>464
できるならやってみな
一番ためになる助言をしてくれた460を除外した454の先も見えたな
>>466==460
getchar()
fflush(stdin)
setvbuf(stdin, NULL, _IONBF, 0);
getchar();
470デフォルトの名無しさん:03/10/13 16:10
>>463
ボタンは作らなくてもいいんです。
電卓のレイアウトは一切気にしないで、
scanf文で読み込むだけでいいんです。
数の入力もコマンド上でやります。
>>468-469
で、試してみたかい?
>>467
俺も>>466の通りだと思うんだけど、このレスもジエン扱いかな?
>>472
>>460のどこがためになると?
>470
int main()
{
 int number;
 while (1) {
  char s[];
  int n;
  数字かコマンドを入力(s);
  switch (s[0]) {
   case '+':
   数字を入力();
   number += n;
   break;
   case '-':
   数字を入力();
   number -= n;
   break;
   case '*':
   ...;
   case '反転':
   number = -number;
   break;
   default:
   number = atoi(s);
  }
  numberを表示();
  if (終了)
   break;
 }
 return 0;
}
>>473
入門書買えという助言がためにならないと感じるなら末期症状だ
わからないことが出るたびに2chで聞くような対処療法には限界があるぞ
>>475
言いたい事が分かった。俺が間違ってたよ。
>>475
×対処療法
○対症療法
10個の整数を格納出来る配列を宣言し其の各要素をキーボードから入力せよ。
そして其の配列中の要素で5以上の物の個数を求めて出力せよ。

C言語で宜しくおながいします・・・。
int data[10];
int i;
int count = 0;
for (i = 0; i < 10; ++i) {
 scanf("%d", i個目のデータのアドレス);
}
for (i = 0; i < 10; ++i) {
 if (data[i]が5以上?) {
  count++;
 }
}
printf("%d\n", count);
480デフォルトの名無しさん:03/10/13 19:24
添削お願い致しますします。

「標準入力から読み込んだ2つの整数の除算を行い、
その解を小数点以下20桁まで表示するプログラムを作成せよ。
プログラムにおいては、ループをまわして各桁をその都度計算し表示すること。
ただし、計算途中で割りきれた場合は、それ以後の少数値は求めない。
また、割る数に0が入力された場合は計算を行わない。」

っていう問題です。

出来たのは出来たんですが、無駄があるかも知れません。

ちなみに僕はC言語2週間目です。
481デフォルトの名無しさん:03/10/13 19:27
#include <stdio.h>

main()
{
int i, s, x, y;

printf("x: ");
scanf("%d", &x);

printf("y: ");
scanf("%d", &y);

if (y != 0)
printf("x / y = %d", x / y);

482デフォルトの名無しさん:03/10/13 19:27
for (i = 1; i <= 20; i++) {
if (y == 0){
printf("割れません");
break;
}

s = (x - (x / y) * y) * 10;

if (s == 0)
continue;

if (i == 1)
printf(".");

printf("%d", s / y);
x = s;
}
printf("\n");
}
>>480
仕様を満たしていないので 20/100 点

どちらかの数字が負の場合正しく表示されない。
例:-5/2

yが大きいとき正しく表示されない。
例:1/2000000000 (ただしsizeof(int)==4)
添削と採点の違いってわかるかな?
添削:答案を ただ点数をつけるだけでなく、誤りの点を指摘したり 講評を添えたり して返すこと。
Shin Meikai Kokugo Dictionary, 5th edition (C) Sanseido Co., Ltd. 1972,1974,1981,1989,1997

というわけで俺は問題を指摘してやったわけだが。
あっそ
487480:03/10/13 20:09
>>483
ありがとうございます。

>yが大きいとき正しく表示されない。
>例:1/2000000000 (ただしsizeof(int)==4)

の部分はまだ習っていないので分かりませんが、
負の場合にちゃんと出るようにやってみたいと思います。

もしさっきのソースコードで正解だった場合、
無駄、もしくは簡単にできる部分はありますか?
488478:03/10/13 20:41
>>479
マジで有難う御座いました。
>>487
continueはbreakの方がいいな。
490デフォルトの名無しさん:03/10/13 21:11
>>480
問題の題意をちゃんと把握しているか?
これは要するに、

"藻前らが今まで学校でやって来た「筆算」をエミュレートしてみれ"

と言っているのだと思うぞ。
Cを習い始めて2週間目の課題としては
ちと厳しいかも・・・
491デフォルトの名無しさん:03/10/13 21:50
1.1から20までの整数のうち、偶数の和を求める
 プログラムをfor文を用いて作りなさい。
2.キーボードから整数を入力させ、1から入力した整数の
 うち、3の倍数のみを表示するプログラムを作成しなさい。

全然思いつきません(泣)お願いします
492デフォルトの名無しさん:03/10/13 21:57
1000分の1の確率で1(当たり)を返して、
1000分の999の確率で0(はずれ)を返す関数を作ってください。
rand()を使うんだと思うんですが、よくわかりません。
int kansuu(void){ return rand()%1000==0; }
>>492
return ! ( rand() % 1000 );

ただし rand() が線形合同法ならお勧めできない
495デフォルトの名無しさん:03/10/13 22:01
>>491
1.
int i, sum=0;
for(i=2; i<=20; i=2) sum+=i;
printf("%d\n",sum);

2.
int i,max;
scanf("%d",&max);
for(i=1;i<=max;i++) if(i%3==0) printf("%d\n",i);

確かめてないからバグあるかも。
とりあえずメインにぶちこんでコンパイルしてみ。
>>491
#include <iostream>
int Sum(int last,int rate)
{
  int ret=0;
  for(int i=1; i<=last; ++i){
    if(!(i%rate)) ret += i;
  }
  return ret;
}

int main()
{
  using namespace std;
  cout<<Sum(20,2)<<endl;
  int num;
  cout<<"last number :";cin>>val;
  cout<<Sum(num,3)<<endl;
  return 0;
}
497デフォルトの名無しさん:03/10/14 00:16
字句解析クラスを書いているんですが
よくあるPushBack()のようなメソッド(javaのStreamTokenizerにもありますね)
どんな実装になっているのでしょう?
バックトラックしながらtokenの区切りまで戻しているのでしょうか。
それだとラインコメントなどがあった場合すごく面倒臭いと思いますが・・・。
今はNextToken()の呼び出し毎にトークン位置をスタックに積んでおき、
PushBack()の呼び出し時にpopして読み出し位置を設定してますが、
もっといい実装方法があるんじゃないかと悩んでます。
どんな実装が最適でしょうか?
498デフォルトの名無しさん:03/10/14 00:21
この問題がわかりません

#include <stdio.h>
int main(){
char* a, *b;
char c[] = "123";
a = c;
*(c+1) = *a++;
b = a++;
printf("*a=%c \t *b=%c\n",*a,*b);
return 0;
}
>>497
PushBack()は、ただフラグを立てるだけ。
NextToken()が呼ばれたときにフラグが立っていれば、
フラグを落として、前回返した値をそのまま返す。
>>498
どういう問題なのかがわかりません。
501497:03/10/14 00:38
>>499
PushBack();PushBack();
とやっても2個前には戻らないんですね・・・。
じゃ、構文解析器で2個前のtokenを取得したいってな場合は、
どこかにtokenを退避させとくしかないのかな。
2個前のtokenが必要になる事事態が解析方法ミスってますか?(藁
>>501
たいていの言語の文法は、トークンをひとつ先読みできれば
解析できるようにできている(もちろん例外はある)。
497が解析しようとしている文法がLALR(1)やLL(1)に属して
いるのであれば、トークンひとつの先読みで解析できるはずだ。
503497:03/10/14 01:25
>>502
だからPushBack()は2個前に戻れるような仕様でなくてもいい訳ですか。
脳みその肥やしになりました。ありがと。
>>498はなぜそんな無意味なポインタの使い方をするんだ?
ポインタの危険性が分かってないのか。

*(c+1)と書くことにメリットはあるか?c[1]と書けばいいだろうが。
それから*a++;なんてのは煩雑になるからやめろ。
*(c+1) = *a++; は
a++; c[1] = *a;
と書け。
どうしても1行にしたけりゃ c[1]=*(a++);にしろ。
505デフォルトの名無しさん:03/10/14 04:06
Winプログラムで、CreatFont()を使って文字を大きく違うフォントにしたいのですがどうやってやればいいのでしょうか?
文字はMS Pゴシックで論理値を「30」 論値平均幅を「20」であとは全ていじくらない状態で文字を描画します。
あと作成したフォントを元のフォントに戻す方法もお願いします。
>>504
わかってないのはお前じゃねーの?
*(c+1) = *a++; と
a++; c[1] = *a; は
動作が異なるぞ
>>505
状況説明能力をもう少しつけたほうがいいと思う。

> 文字を大きく違うフォント
何と違うのか不明。

> であとは全ていじくらない状態で
俺には一行目と矛盾しているように読める。
大きく違うのにファミリーとサイズ以外はいじらないのか?
いじらないとは何と比べていじらないのか?

> 作成したフォントを元のフォントに戻す
作成したフォントを元に戻すとは削除するということか?日本語がおかしい。
>>505
スレ違い。

Win32API質問箱 Build14
http://pc2.2ch.net/test/read.cgi/tech/1065328397/l50

まずこっちへ来い。話はそれからだ。
509デフォルトの名無しさん:03/10/14 05:11
再帰関数を使い配列の中の最小値を求める。
void recursiveMinimum (int x[], int size)を関数の宣言にどうぞ。

それでどうやって結果を返すんだよ
>>505
CreateFont(...)でHFONTを作成してからSelectObject(...)でHDCにHFONTをセット。
TextOut(...)か何かで文字を描画すれば作成したフォントで文字を描画できる。
元に戻したい場合はSelectObject(...)の戻り値に以前にHDCに割り当てられていたHFONTが帰ってくるから
それをHDCに対してSelectObject(...)。
ヘルプ嫁。酔ってるので間違ってたらWin32API質問箱の優しいおにーちゃんに聞け。
と言うか検索くらし汁。
>>510
グローバル変数に決まってんだろ。
>>510
探索結果を利用できないので最適化の結果こうなりますた。
void recursiveMinimum (int x[], int size){}
学校の授業でWin32のプログラミングなんてやるのか?
そんな学校やめちまえ。
計算機を作ってください
>>515
数学モデルでよいですか?
>>516
お願いします。
>>517
M = (Q, Σ, Γ, δ, q_0, B, F)
Q : 状態の有限集合
Γ : テープ記号の有限集合
Σ ⊆ Γ : 入力記号
q_0 ∈ Q : 初期状態
B ∈ Γ - Σ : 空白記号
F ⊆ Q : 受理状態の有限集合
δ : 動作関数
δ : Q × Γ → Q × Γ × {Left, Stop, Right}
519518:03/10/14 20:34
テープは両方向無限
読み書き可
チューリングもびっくり
521デフォルトの名無しさん:03/10/15 03:22
#include <stdio.h>
int keisan(int*,int*,int*,int);
void main(void)
{int suu1;int suu2;int kotae;int enzan;
printf("四則演算を行います\n");
printf("どの演算子を利用しますか?(+→1:−→2:*→3:÷→4)==>");
rewind(stdin);
scanf("%d",&enzan);
printf("演算する数を入力してください(1つ目)");
rewind(stdin);
scanf("%d",&suu1);
printf("演算する数を入力してください(2つ目)");
rewind(stdin);
scanf("%d",&suu2);
keisan(&suu1,&suu2,&kotae,enzan);
printf("答えは『%d』です。",kotae);
}
int keisan(int* a,int* b,int* c,int d)
{
if(d==1)c=a+b;
if(d==2)c=a-b;
if(d==3)c=a*b;
if(d==4)c=a/b;
return c;
}
エラーがでてしまいます。メイン関数は一切いじらず、自作関数の部分を自分で作れ
って問題なんですが分かりません。&suu1,&suu2を使ってるからポインタだと思うんですが
訂正お願いします
エラーメッセージを張れ
523デフォルトの名無しさん:03/10/15 03:31
error C2110: ポインタにポインタを加えようとしました。
error C2440: '=' : 'int' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照)
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
error C2296: '*' : 不正な左オペランドです。
error C2297: '*' : 不正な右オペランドです。
error C2296: '/' : 不正な左オペランドです。
error C2297: '/' : 不正な右オペランドです。
error C2440: 'return' : 'int *' から 'int' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
cl.exe の実行エラー - エラー 7、警告 0
ポインタのさす先の値を使用したり代入したりするときは頭に*をつけれ。
c=a+b;

*c = *a + *b;

他も同じ。
525デフォルトの名無しさん:03/10/15 03:57
さんくす
> rewind(stdin);

(^o^;)
>>521
rewind(stdin);
は要らん
シークになんの意味が・・・・
つーかstdinならシークできないことが多いんじゃ・・
rewindはひょっとして出力をフラッシュしようとしてるとか?

まぁscanf呼び出した時にフラッシュされるから、どっちにしろいらんけど
入力がパイプだったりすると seek できたりするから、
間違った rewind は入れないほうがいいと思う。
>>521
rewind(stdin)とかfflush(stdin)はANSI-Cでは動作未定義です。
532しつもん:03/10/15 17:10
ここでは、PICプログラムでもOKですか?

PICはMICROCHIP社製で16LF628 SOICタイプで
開発環境はマイクロチップ社製の
MPLAB ICE Universal Emulator v2.60

でライターはPICSTART Plusを使っています。
>>532
だから?
534デフォルトの名無しさん:03/10/15 17:16
どなたかこの二問やってみてくれませんか(^o^;)
分からないです。

*成績処理プログラムの作成*
番号、名前、得点からなる一クラスの成績データを以下のように処理するプログラムを作成しなさい。
なお、データは各自が作成すること。(10名分以上)
(処理)
各生徒の得点を
100〜80点・・・・A
79〜70点・・・・B
69〜60点・・・・C
59〜0点・・・・D
のようなランク付けし、1行に1名分のデータを番号、名前、得点、ランクの順にそろえて表示する。

*問題2[成績処理プログラムの作成]*
更に、平均点(少数2桁まで)、最高点最低点を最後に表示するプログラムを作成せよ
535デフォルトの名無しさん:03/10/15 17:50
配列に入れてループで表示や平均点を求める。
失礼いたします。
以下の条件を満たすプログラムを作りたいのですが
いろいろぐぐってもよくわからないのです。
・0以上の整数「x」と「y」を入力
・関数「plus(x,y)」を使用しxとyの和を求める
・再帰呼び出しの形で書く
・ただし+と-は使えない
よろしく、お願いいたします。。。
>>536

unsigned plus( unsigned x, unsigned y ){ return y==0 ? x: plus( x^y, (x&y)<<1 ); }
>>537
この面白そうな解は何?
これ何の問題なん?
539536:03/10/15 20:23
しまった・・・ plus(x,y)はint型でなければならないんだった _l ̄l○
>>537サン ゴメンナサイ... クビツッテキマス
>>537
すまん
これの理屈を教えてくれ
加算と桁上げをbit単位でしてるだけ
>>540
(1) まず、ビット単位で桁上がりがない足し算を考える。
 0 + 0 = 0
 1 + 0 = 1
 0 + 1 = 1
 1 + 1 = 0
つまり x ^ y。

(2) 次に、ビット単位で足し算したとき、どのケースで桁上がりおこるかを考える。
 0 + 0 = 0
 1 + 0 = 0
 0 + 1 = 0
 1 + 1 = 1
つまり、x & y。

(3) 桁上がりがなくなるまで、(1)を x、(2)を1ビット左にずらしたものを y として、
  (1)から繰り返す。
どーでもいいがC++だと標準ライブラリにplusってのあるから、設問自体ダメダメだな。
>>537
うーん、素晴らしい!
>>543
何のためのstd名前空間だよ
546デフォルトの名無しさん:03/10/15 21:46
>>534
誰か教えて。

>>535さん:もう少し詳しく教えてくれませんか?


国崎を最高にするプログラムを作って頂きたい
>>546
#include <stdlib.h>
#define N 10
int main(void) {
struct {int num; char name[10]; int score;} r[N] = {{1, ">>534", 0}};
int i, sum, min, max;
for (i = 1; i < N; i++) {
r[i].num = i + 1;
sprintf(r[i].name, ">>%d", i + 1);
r[i].score = rand() % 101;
}
/* 問題1 */
for (i = 0; i < N; i++)
printf("%3d %-10s %3d %c\n", r[i].num, r[i].name, r[i].score,
"DDDDDDCBAA"[r[i].score / 10]);
/* 問題2 */
sum = min = max = r[0].score;
for (i = 1; i < N; i++) {
sum += r[i].score;
if (r[i].score < min) min = r[i].score;
if (r[i].score > max) max = r[i].score;
}
printf("平均 %.2f 最高 %d 最低 %d\n", (double)sum / N, max, min);
return 0;
}
>>548
#include <stdio.h> が抜けた。
>>547
#include <iostream>

main()
{
 for(;;std::cout << "クニサキサイコー" << endl;);
}
551デフォルトの名無しさん:03/10/16 02:11
考えても分からないのでどなたか助けてください。

問題:連結リストとして扱われているString文字列で下記の
オペレーションを含んだClass Newstringを作る。(String1とString2はNewstringのタイプ)

string1.concatenate(string2) String1の最後にString2を結合。
string1.concatenate(ch) String1の最後に一文字のchを結合。
string1.display()スタンダードアウトプットでString1を表示。
string1.length() String1の長さをReturnする。
string1.substring(string2) String2がString1のサブストリングならReturn1、
違えばReturn2

サブストリングの意味が良く分からないのですが、よろしくお願いします。

>>551
サブストリングの意味、部分文字列。
"abcde" のサブストリングというと、 "bcd" とか "de" とか。

サブストリングという言葉が分からないお前も、
部分文字列とか、String2 が String1 に含まれるなら
とか書かないその問題作った奴も両方 DQN。
>>551
string2がstring1の部分文字列かどうか。つまりstring2がstring1に含まれているかどうか。

なお、c/c++は大文字小文字を区別するんだから意味無くキャピタライズするな。
その他の文字列処理関数
char *strncpy(char *s1, const char *s2, size_t n);
char *strncat(char *s1, const char *s2, size_t n);
int strncmp(const char *s1, const char *s2, size_t n);
char *strchr(const char *s1, char c);
char strrchr(const char *s1, char c);
size_t strspn(const char *s1, const char *s2);
size_t strcspn(const char *s1, const char *s2);
char *strpbrk(const char *s1, const char *s2);
char *strstr(const char *s1, const char *s2);
char *strerror(size_t n);
char strtok(char *s1, const char *s2);
練習問題
2つの文字列を入力として受け付けて、それらが等しけ
ればyesを、等しくなければnoを出力せよ。ただし、文
字列ライブラリを使ってはならない。
文字列を入力として受け付けて、その文字列中にabcと
いう文字列が含まれていればyesを含まれていなければ
noを出力せよ。ただし、文字列ライブラリを使っては
ならない。

n ugabcftという文字列が入力された場合→ yes
n abcという文字列が入力された場合→ yes
n iunhabという文字列が入力された場合→ no

お願いします。
>>554訂正

問題

文字列を入力として受け付けて、その文字列中にabcと
いう文字列が含まれていればyesを含まれていなければ
noを出力せよ。ただし、文字列ライブラリを使っては
ならない。


n ugabcftという文字列が入力された場合→ yes
n abcという文字列が入力された場合→ yes
n iunhabという文字列が入力された場合→ no

お願いします。
556デフォルトの名無しさん:03/10/16 04:35
ありがとうございます。

このClass Newstringも作成お願いしたいのですが、
できる方どうぞ。自分でがんばってみたのですが、
出来ません。
557デフォルトの名無しさん:03/10/16 06:59
>>557
strstrにstrcmp使うのは美しくないなぁ。

>>555
int check_getchar(){
    const char *target="abc";
    const char *tmp, *last;
    int input;
    tmp=target;
    last=target+strlen(target);
    while( EOF != (input=getchar()) ) {
        if( *tmp == input ) {
         if( ++tmp == last ) return 1;
        }else{
         tmp=target;
        }
    }
    return 0;
}

int main(){
    printf("%s\n",check_getchar()?"yes":"no");
    return 0;
}
>>558
入力が aabc のときは?
560デフォルトの名無しさん:03/10/16 08:32
ん? 「strcmp使わない」!=「>558のコード」
>558は、検索対象"abc"とストリーム入力に合わせて単純化してある。

strcmp使うと、初期パターンとの照合はさむ余地が無いでしょ。
>>558
aabcで失敗するわ、決まり(strlen ただし、文字列ライブラリを使ってはならない)は守らないわで問題外だな。

>>558>>560
strcmpじゃなくてstrncmpなんだが。
C++でマインスイーパーは無理なでしょうか?
もしくは、スレ主の4年間の勉強ではまだ実力不足ということですか?
起動は
x名前 &
でも、ディスプレイ上にそれと思わしき単語がでてくるでも可能ですよ。
>561
"aabc"ならint32_tでの比較が速くて良いな。
>>562
xならGPLのマインスイーパがあるのでそれ使ったらどうですか?
[煽ったらやってくれるかなあ・・・]
>>562
>>314が既にやってくれている。
試しに動かしてみたけど、それなり動いるようだった。
ただし…
>>563
なんたそのANSI非準拠型の汚い型は?
> なんた
( ´,_ゝ`)
>>554
#include <algorithm>
#include <iostream>
using namespace std;

main()
{
 char *str;
 static const char* abc = "abc";
 cin.seekg(0, ios_base::end);
 size_t size = cin.tellg();
 cin.seekg(0, ios_base::beg);
 str = new char[size];
 cin.get(str, size);
 size_t end = str+size;
 cout << search(str, end , abc, abc+3) != end ? "yes" : "no" << endl;
 delete[] str;
}
5701?:03/10/16 12:30
>>562
このスレは自分だったかな?C宿スレの1000まで行ったのを見つけて、
まだ立てられていなかった時、立てた事もあったが。
ただ、本当に1がやるのではない。1代目スレの時は1が中心に解いていた
のかも知れないけど。主旨が多少ずれても、名前を受け継いでいくのは、
2chの名残。
×size_t end = str+size
○char* end = str+size;
>>569
確かにこれなら文字列ライブラリは使われてないな。
>>569
( ´,_ゝ`)プッ
cin.seekg(0, ios_base::end);



cin.get(str, size);
>>569,572
藻前裸アフォだろ。どう見ても動かないだろそれ。
つーかこれで十分だべ。string.hもstringも使ってないし。

#include <algorithm>
#include <iostream>
namespace
{
 const char* abc = "abc";
 const size_t maxSize = 16384;
 const char* result[] = { "yes", "no" };
}
main()
{
 using namespace std;
 char str[maxSize + 1];
 cin.getline(str, maxSize);
 char* end = str+strlen(str);
 cout << result[search(str, end , abc, abc+3) != end ? 0 : 1] << endl;
}
>>575
詰めが甘いな

× char* end = str+strlen(str);
○ char* end = find(str, str+maxSize, '\0');


577デフォルトの名無しさん:03/10/16 12:59
>>575
そのstrlenは一体何!?
たったこれだけの事に22レスもかかってやっと完成かよ。このスレレベル低いな。
579↑ 文盲:03/10/16 13:08
>>567
ISO/IEC 9899:1999ですがなにか?
>>580
そんな物に対応してるコンパイラはまだ少ないだろ
>>581
現時点では対応していないコンパイラの方が少ない。
>>581
で,どうしろと?
>>583
むしろそれは>>563に言うべき
誰もaabcを探すなんて言っていないのに
何だか知らんが563に腹を立てて延々粘着してる、と
要するにC99が嫌いなんだろ
587584:03/10/16 13:51
言っておくが、567でも582でもないぞ。
588584:03/10/16 13:54
582じゃなくて581ね・・・
589562:03/10/16 17:15
314様すいませんんでした。
大きさは相手側の入力で決まり、
本当のゲームのようにしないとならないのです。。。
説明不足でごめんなさい。
来週の月曜日までにやらない今年も専門の留年が決定しそうです。
590562:03/10/16 17:26
あとmineの位置はランダムで、できれば、0:0座標からではなく
1:1でお願いします。
人の留年がかかってるとなると怖くて答えられないぜ
>本当のゲームのようにしないとならないのです。。。

どういう意味?
593デフォルトの名無しさん:03/10/16 18:34
ノートパソコンとPIC間においてのIR通信に関してわからないことがあるんですが、
Cプログラム上でkbhit関数を使い、ノートパソコンのハイパーターミナル
上からPICにキーボード操作での命令を実行し通信しようとしてるのですが、
どうもうまくいきません。何かよい方法ありませんか。
>>593
とりあえず
- ハイパーターミナルの切断状態になっていないことを確認する
- ハイパーターミナルの通信設定が正しいかを確認する
- PIC以外のIR通信のできるものを用意し、通信できるか確認してみる
- 自作ではないIR通信のプログラムをPIC上で動かし、通信できるか確認する
- PICのピンをオシロか何かであたってみて、通信しているか確認する

PIC上で動くプログラムの話をしたいなら制御系スレとかに
いった方がいいぞ。オレもよう知らんし。
595たすけて:03/10/16 20:27
わかりました。ありがとうございます
>>589
マウス対応とか、カーソル移動が出来るということ?
それなら、環境を書かないと分からないよ。
597555:03/10/16 22:25
あの・・・
そんな難しくしないで
ifやforなどで作って欲しかったのですが・・
598デフォルトの名無しさん:03/10/16 22:42
キーボードから入力した文字列を、逆転させて画面に出力しなさい。

#include <stdio.h>
void main (void){
char str[256];
char *p1 = str;
char *p2 = str;
printf ("文字列の入力:");
scanf ("%s", str);
printf ("逆から表示する:");
while (*p2)



puts ("です。");
}

◆の部分は、
;
if( )
while( )
putchar( );
を順に使って記述。

初心者な質問ですみません。どうしても条件を使わなくてはならないらしいのでわからずにいます。
++p2;
if(p1!=p2)
while(p1!=p2)
putchar(*--p2);
600デフォルトの名無しさん:03/10/16 22:57
>599さん
即答ありがとうございました。非常に助かりました。
>>597
MineSweeperくらいWebを探せばソースが転がってるだろ?

で、MineSweeperも作れないなら留年するよりやめたほうがいいぞ。
602597:03/10/17 01:13
>>601さん
別にMineSweeperは作れてなくても構わないのですが・・・
>>597
ごめん、>592だった。
604デフォルトの名無しさん:03/10/17 01:24
const int arraysize = 10;
int array[arraysize] = {11,0,1,12,-1,4,7,6,9,2};
この配列の最小値を再帰関数で求めるには?
>>604

inline int main(int a, int b){return a < b ? a : b;}

int min(int* xint length)
{
if(length == 1)
return x[0];
if(length == 2)
return min(x[0], x[1]);

int tmp = min(xlength - 1]);
return min(tmp, xlength - 1]);
}
>>604
#include <iostream>
#include <algorithm>
int min(const int *array, int arraysize) {
 return (arraysize == 1
     ? *array : std::min(min(array, arraysize / 2),
               min(array + arraysize / 2,
                 arraysize - arraysize / 2)));
}
int main() {
 const int arraysize = 10;
 int array[arraysize] = {11,0,1,12,-1,4,7,6,9,2};
 std::cout << min(array, arraysize) << std::endl;
 return 0;
}
>>604
#include <iostream>
using namespace std;
const int arraysize = 10;
int array[arraysize] = {11,0,1,12,-1,4,7,6,9,2};

int min_element(int i) {
  if(i == arraysize-1) {
    return array[i];
  } else {
    int v = min_element(i + 1);
    return v > array[i]? array[i] : v;
  }
}

int main(int argc, char **argv) {

  cout << min_element(0) << endl;
  return 0;
}
C++のコードをJavaに書き直すことはできますか?
10個の整数を配列に格納し(初期化)、これらの順序を入れ替えて、
入れ替え前と、入れ替え後の全配列要素の値を出力するプログラム
を作りなさい


という問題なんですが何方かよろしくお願いします。
順序を入れ替えるってどういう基準でだ。
基準というのが何を指すのかよく分からないです・・
d[0]とd[9]を入れ替えるヒントくらいしか書いてありません・・
分かりづらくて申し訳ないです
>>611
それだけなら、単純に
int temp;
temp = d[0];
d[0] = d[9];
d[9] = temp;
で入れ替え完了。
考えられるのは、小さい順だよね。
10個の整数は何でもよくて(例 1,2,3,4,5,6,7,8,9,10)
for文を使うと聞きました

上の例の数を使うと出力結果が
1,2,3,4,5,6,7,8,9,10
10,9,8,7,6,5,4,3,2,1

となるプログラムなんです
ややこしてく申し訳ないです
それじゃ、降順にするのかひっくり返すのか判らん。
お前プログラミング以前に算数と国語の勉強しろ。
>>614
なら前後逆順にするとか書けよ。
その問題出したやつDQNか?

inline void Swap(int& a, int & b){int tmp = a; a = b; b=tmp;}

void Reverse(int array, int len)
{
for(int i=0; i<len/2; ++i) Swap(array[i], array[len-1-i]);
}

>>614
これでええんやない?

#include<iostream>
using namespace std;

void main()
{
int kazu[10];
for(int i=0; i<10; i++)
kazu[i]=i+1;
for(int i=9; i>=0; i--)
cout<<kazu[i]<<" ";
}
618617:03/10/17 16:57
間違えた

#include<iostream>
using namespace std;

void main()
{
int kazu[10];
for(int i=0; i<10; i++)
kazu[i]=i+1;
for(int i=0; i<10; i++)
cout<<(i+1)<<" ";
cout<<"\n";
for(int i=9; i>=0; i--)
cout<<kazu[i]<<" ";
}
619初心者X:03/10/17 19:29
以下の2次元配列の合計と平均を計算して表示する
プログラムってなんですか?(C言語)

int a[3][5] =
{
{7,2,3,8,8},
{1,9,4,5,3},
{4,3,8,3,6},
};
初心者スレにあったのでコピペしてきた。

以下の配列をバブルソートでソートするプログラムをかきなさい。
#include <stdio.h>

void main (void)
{
int a[10] = {4,6,3,8,3,4,5,7,9,8};

注意:バブルソートです。他の方法のソートで行わないで下さい。

bubble_sort(a, 10);
>>619
まず日本語を勉強しろ。

#include <stdio.h>
int main () {
 int a[3][5] = {{7,2,3,8,8}, {1,9,4,5,3}, {4,3,8,3,6}};
 int i, sum;
 for (i = sizeof a / sizeof **a, sum = 0; i; sum += a[0][--i])
  ;
 printf("合計: %d 平均: %f\n",
     sum, (double)sum / (sizeof a / sizeof **a));
}
623デフォルトの名無しさん:03/10/17 21:52
mallocを使用した動的割り当てができないのでどなたか知恵を貸していただけないでしょうか?
UNIXでC言語を使用しておりまして、
文字列のバッファサイズをコマンドラインの引数で指定するのですが、
文字列はmain関数だけでなく、同じプログラム上の別関数にも使用されるため、
グローバル宣言しています。
この際、どのようにすれば引数で文字列のサイズを変更できるのでしょうか?

どなたかよろしくお願いします。
624デフォルトの名無しさん:03/10/17 21:53
>>623
そういう質問はhttp://pc2.2ch.net/test/read.cgi/tech/1064234533/で

main関数の第二引数(普通はargvと名付ける)から得て、それを数値に変換する。
>624
argvから読み込む場合、
グローバル宣言のときにはバッファサイズを変数で定義してしまうから
そこでコンパイルエラーが出てしまうのです(涙

レス違い申し訳ありませんでした。移動して聞いてみます。
>>625
これの意味分かる方解説してもらえませんか?
>>626
さっぱり分からんが、こんな風にしてはまっているのでは。

ローカル
int main(int argc, char **argv) {
  long size = strtol(argv[1]);
  char buffer[size];

グローバル
long size;
char buffer[size];

int main(int argc, char **argv) {
  size = strtol(argv[1]);
int c;
while((c=getchar())!=EOF){
if(isprint(c)){
printf("0x%x\n",c);
}else if(c!='\n'){
printf("0x%x not ASCII\n",c);
}
}

enterキーのみの入力は出力したいんですが…
もう何時間も悩んでます。
>>627
#include <stdlib.h>していれば最後の行だけでもエラーだな。
>>628
else
>>628
× c!='\n'
○ c=='\n'
>>627

その通りです。
それではだめなのですが、
>>624さんのリンク先で教えていただけたので、
それでやってみます。
どうもありがとうございました。
20個の整数を入力として受付配列に格納し、その配列中に3と8が両方含まれていれば1を出力し、
どっちか一方が含まれてれば2を出力し、どっちも含まれていない時には3を出力せよ。

C++でおながいします。
634628:03/10/17 23:11
>>631さん
そうするとaを入力してenter押した時enterまで出力されてしまうんです。
>>628
int main(int argc, char **argv)
{
  int c;
  while((c = getchar()) != EOF) {
    if(c == '\n') {
      printf("0x%x not ASCII\n",c);
    } else {
      do {
        if(isprint(c)) printf("0x%x\n",c); else printf("0x%x not ASCII\n",c);
        c = getchar();
      } while(c != EOF && c != '\n');
    }
  }
  return 0;
}
636628:03/10/17 23:27
>>635
ホントにありがとうございます
#include <stdio.h>
void main(void)
{
int shiharai ;
char waribiki ;

printf("支払金額を入力してください:");
scanf("%d",&shiharai);
printf("割引券はありますか (Y/N):");
scanf("%c",&waribiki);
if(waribiki == 'Y')
printf("支払金額は%d円です\n",shiharai -100);
else
printf("支払金額は%d円です\n",shiharai);
}
2個目のscanfが実行してくれないんですが何が悪いですか?
最初のprintfに\nがついてないから
実行中に入力待ちじゃないと勘違いしてるんじゃねーの?
639637:03/10/18 00:07
\nつけてやってみてもダメでした
>>633
#include <vector>
#include <iostream>
#include <algorithm>
main()
{
 using namespace std;
 for(int i=0; i<20; i++)
 {
  int value;
  cin >> value;
  vec.push_back(value);
 }
 int count = 0;
 find(vec.begin(), vec.end(), 3) != vec.end() && ++count;
 find(vec.begin(), vec.end(), 8) != vec.end() && ++count;
 cout << 3 - count << endl;
}
>>637
だからscanf()は使うなとあれほど……
>>637
fflush(stdin);
>>638
自分がわかってないなら書くなよ。
>>642
お前もだ。
printf("支払金額を入力してください:");
scanf("%d",&shiharai);

fflush(stdin);

printf("割引券はありますか (Y/N):");
scanf("%c",&waribiki);
>>640
Perlerキタ━━━━━(゚∀゚)━━━━━!!
>>640
using namespace std;
の次の行に
vector<int> vec;
追加しといて
まあfflush(stdin)はウンコでこっちが正しいのはFAQだな

printf("支払金額を入力してください:");
scanf("%d",&shiharai);





getchar();





printf("割引券はありますか (Y/N):");
scanf("%c",&waribiki);
649637:03/10/18 00:27
>>642 >>645 >>648
できました、ありがとうございます。
ごみ処理も考えると
while( '\n' != getchar() );
の方が適切だろ。
あ〜情けなや…
>>640
if文でやった方が簡単じゃない?
>>637
printf("支払金額を入力してください:");
scanf("%d",&shiharai);
printf("割引券はありますか (Y/N):");
scanf(" %c",&waribiki);
654デフォルトの名無しさん:03/10/18 03:27
前に質問した問題ですがまた教えてください。

問題:連結リストとして扱われているstring文字列で下記の
オペレーションを含んだClass Newstringを作る。
(string1とstring2はNewstringのタイプ)

string1.concatenate(string2) string1の最後にstring2を結合。
string1.concatenate(ch) string1の最後に一文字のchを結合。
string1.display()スタンダードアウトプットでstring1を表示。
string1.length() string1の長さをReturnする。
string1.substring(string2) string2がstring1のサブストリングならReturn 1、
違えばReturn 2

先生に質問したところ、「string2のコピーをnode-by-nodeで取り
(copy constructorと似た方法)string1のtailをコピーしたリストの
先頭にNextポインターでポイントする。」のがお勧めの方法らしいです。
>>654
#include <iostream>

class Newstring {
public:
 Newstring() : head_(0) {}
 Newstring(const Newstring &src) : head_(copy(src.head_)) {}
 ~Newstring() {destroy(head_);}
 Newstring &operator =(const Newstring &src)
  { if (&src != this) {node *p = copy(src.head_); destroy(head_); head_ = p;}
   return *this;}
 void concatenate(const Newstring &string2) {(head_ ? tail(head_)->next : head_) = copy(string2.head_);}
 void concatenate(char ch) {(head_ ? tail(head_)->next : head_) = new node(ch);}
 void display() const {for (const node *p = head_; p; p = p->next) std::cout << p->ch;}
 size_t length() const {size_t n = 0; for (const node *p = head_; p; p = p->next, n++); return n;}
 bool substring(const Newstring &string2) const
  { for (const node *p = head_;; p = p->next)
   { const node *r = string2.head_;
    for (const node *q = p; r; q = q->next, r = r->next)
     { if (!q) return false; if (r->ch != q->ch) break;}
    if (!r) return true;}}
private:
 struct node { node *next; char ch; node(char c) : ch(c), next(0) {}};
 static void destroy(node *p) {for (node *q; p; q = p->next, delete p, p = q);}
 static node *tail(node *p) {if (p) for (; p->next; p = p->next); return p;}
 static node *copy(const node *p)
  { if (!p) return 0;
   Newstring temp; node *q; temp.head_ = q = new node(p->ch);
   for (; p = p->next; q->next = new node(p->ch), q = q->next);
   q = temp.head_; temp.head_ = 0; return q;}
 node *head_;};
>>654
先生のオススメより賢い方法「参照カウンタ」
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=157

代入や連結でコピーが必要ない。その分、速くてメモリの消費も少ない。
657デフォルトの名無しさん:03/10/18 12:31

上2つの方々ありがとうございます。
みなさん賢いですね。
658デフォルトの名無しさん:03/10/18 14:29
prog.txtというファイルがあります。

様々な文字列の中に
$hoge{'abc'}
$hoge{'dfawe'}
などの文字列が埋もれています。

この{' '}で囲まれた中身を抽出するプログラムを書きなさい。
659kintyou:03/10/18 14:56
ほかのところでも質問したのですが、ここでも質問させていただきます。
cでデフォルトゲートウェイをaaa.aaa.aaa.aaaから
bbb.bbb.bbb.bbbに変更するプログラムを書きたいのですが、
まったくわかりません。
systemからrouteを呼び出せばよいと、アドバイスされたのですが
よくわかりませんでした。
詳しくご存知の方よろしくお願いします。
>>659
routeコマンドを直接使ったら変更することができるのですか?
>>658
#include <stdio.h>
#include <string.h>
int main()
{
 char t[9][256] = {0};
 int c, s = 0;
 FILE *fp;
 memset(&t[7], 7, sizeof *t * 2);
 t[7]['\''] = t[8]['\''] = 8;
 t[8]['}'] = 0;
 for (c = 0; c < 7; c++)
  t[c]["$hoge{'"[c]] = c + 1;
 fp = fopen("prog.txt", "r");
 if (!fp)
  return 1;
 while ((c = getc(fp)) != EOF) {
  int s2 = t[s][c];
  if (s == 8)
   putchar(s2 ? '\'' : '\n');
  if (s >= 7 && s2 && s2 != 8)
   putchar(c);
  s = s2;
 }
 fclose(fp);
 return 0;
}
662デフォルトの名無しさん:03/10/18 22:18
「自然数Nを素因数分解するプログラムを作成せよ。Nの与え方は自由。
与え方が分からない人はN=85800でやってみよ。結果の表示方法も自由」
↑一応両方お願いします。
663デフォルトの名無しさん:03/10/18 22:29
for (x = 2; x * x <= N; x++) {
for (y = 0; N % x == 0; n /= x, y++) ;
if (y > 1) printf("%d^%d * ", x, y);
if (y == 1) printf("%d * ", x);
}
printf("%d\n", N);
boost::lexical_castって強烈に重くないですか?
ループの内側では使いたくない重さだ…
>>664
stringstreamいちいち構築したりしてるから
そりゃatoiとかに比べると圧倒的に重いだろうねぇ

666デフォルトの名無しさん:03/10/19 00:48
『2つの最大40桁の自然数を入力して、その和・差・積を求めるプログラム(ポインタは使わない)』
という課題なんですが、さっぱり分かりません。
配列を用いて計算するということは分かるんですが…。

C言語です。よろしくお願いします。
なんで配列がいるの?
>>666
筆算をエミュレートすればいい
669デフォルトの名無しさん:03/10/19 01:10
>>667
たばいちょー
doubleでも15桁程度が限界
intたくさん使って固定小数点クラス作れば簡単。
自然数同士の和・差・積に小数は要らないナリ
>>671
>>666へのレスだとしたら、なんで小数点が必要なんだよ。
商なら必要になるかもしれないけどな。見事に含まれていないな。
>>674
商の多倍長計算は面倒だからな
>>666
足し算

#include <stdio.h>
#define MAXDIGS 40
int adc(int x, int y, int *c) {
 int v = x - '0' + y - '0' + *c;
 *c = v >= 10 ? (v -= 10, 1) : 0;
 return v + '0';
}
void add(const char *x, const char *y) {
 char r[MAXDIGS + 2];
 int xl = strlen (x), yl = strlen (y), rl = (xl > yl ? xl : yl) + 1, c = 0;
 r[rl] = 0;
 while (xl > 0 && yl > 0) r[--rl] = adc (x[--xl], y[--yl], &c);
 while (xl > 0) r[--rl] = adc (x[--xl], '0', &c);
 while (yl > 0) r[--rl] = adc ('0', y[--yl], &c);
 if (c) r[--rl] = '1';
 printf ("%s\n", &r[rl]);
}
int main(void) {
 char x[MAXDIGS + 1], y[MAXDIGS + 1];
 printf ("x? ");
 fgets (x, sizeof x, stdin);
 if (*x) x[strlen (x) - 1] = 0;
 printf ("y? ");
 fgets (y, sizeof y, stdin);
 if (*y) y[strlen (y) - 1] = 0;
 add (x, y);
 return 0;
}
677666:03/10/19 12:54
>>676
足し算、引き算は簡単なわけよ!
掛け算と割り算を教えてよ
>>677
偽物は良いから…
>>677
本物は割り算を求めてはいないわけだが
680デフォルトの名無しさん:03/10/19 14:51
Cで3次元配列のメモリを確保するにはどうしたらいいですか?
int test[10][10][10];
ポインタのポインタのポインタか
一次元配列で確保して関数とかでインデックスと返すようにする。
683680:03/10/19 14:55
malloc使ってfor文で回してやろうと思うのですが、
具体的にどう書いていいかわかりません_| ̄|○
>>666
気がついたら,mainだけポインタだらけに(w
まぁ,許せ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=158
すいません、96の64乗を計算するのに
一番シンプルな手法って
どういうのがあるのでしょうか??
powだと溢れちゃいますた。
速さにこだわりはありません。
lisp
687686:03/10/19 18:09
96^64=7334304125596190624668832643061791071911921761558623296040973972480495126634460976537700765146565217101386328744001668808441856
>>685
main() {
int i;
double a = 96.0;
for (i = 0; i < 6; i++)
a *= a;
printf("96^64=96^2^6=%g\n", a);
}
>>685
多倍長整数演算クラス作る課題の延長じゃないのか?
先の課題で作ったクラスの名前を MultiByteInteger とでもしとくと、

MultiByteInteger a = 96;
a = a * a;
a = a * a;
a = a * a * a;
cout << a << endl;

MultiByteInteger に operator* と operator<< を定義しとくこと。
教授キタ━━━━━(゚∀゚)━━━━━!!
>>685
まさかとは思うがその後で mod を取ったりしないよな?
>>686
C/C++スレでlispとか答える奴はカス
それならJavaのBigInteger使えと
lispなら1行だけどJavaだとコンパイルも必要だしシンプルじゃないだろ。
>>685 >>689
ぱっと見て,10進で133桁以下115桁以上が確実なわけで666とは関係がなさそう。
近頃の大学ではコレが流行ってるのか?
>>693
LispとJavaの普及率を考えると
最悪Lispは処理系選びからやらねばならん
unixならgclかemacs入ってるでしょ。
>>694
あら、666 と 689 は別件だったのか。
なら、元から多倍長演算に対応してる言語使って計算する方が手っ取り早いよなぁ。

まあ、手ごろな課題でいいんじゃないかな<多倍長の加減乗算。
プログラミングの出来る奴向けに追加課題で
FFT 使った高速畳み込みしろとか、除算まで実装しろとか出せるし。
+,-,*,/,=,C(クリア)を使って電卓を作ってください。

但し、入力は1文字ずつする。
例:1[Enter] 2[Enter] 3[Enter]と入力したら表示は123となる。
つい最近も電卓って課題見た気がする
自然数Xを入力として受け付けて、以下に示すような連続する2自然数の積の和を求める。
ただし X >1を仮定して良い。

1*2 + 2*3 + 3*4 + .....+ (X-1)*X

よろしくお願いします。
配列を使わずポインタを使用して
5変数を降順に出力するプログラムを作りたいのですが。入力はscanfで。
配列を使うならば出来るのですが…。

よろしくお願いいたします。
>>701
配列を使うほうを書いて見れ
703666:03/10/20 00:57
皆さんどうもありがとうございました。
おかげで何とかなりそうです。
自然数を入力として受付け、以下に示す様な連続する 2 自然数の積の和を求めよ。
ただし、x>1と仮定して良い。

1*2+2*3+3*4+ …… +(x-1)*x


#include <stdio.h>
int main(void) {

「ここの部分をおながいします。」

 return(0);
}
705685:03/10/20 01:21
遅レスすいません、>685です
みなさんありがとうございます。

>686
検算に使わせていただきます(^^;

>688
カウンタが回ってるのにfor文中でiが使われてないのが
不思議です(^^;
試しに実行してから考えてみます

>689
多倍長整数演算クラス作る課題の人とは別なんですけど、
やっぱり多倍長演算出来ないと厳しいみたいですね(^^;

>691
ずばり、そのあとでmod取りたいです・・・

>694
流行ってるとは言い切れないですけど、
直前でも似た(?)質問してる方いますね(^^;

>697
商と余りまで出すのが最終目的です

週末で多倍長演算と言うをする必要があると思ったので
また明日調べてがんばってみます。
みなさんありがとうございます。
またヒントがあればよろしくお願いします。
706685:03/10/20 01:53
自レスです。

>カウンタが回ってるのにfor文中でiが使われてないのが
>不思議です(^^;

とんでもないこと言ってますね、私。。。
平方乗法
>>704
#include <stdio.h>
int main()
{
  unsigned long int n;
  puts("xは何?");
  scanf("%lu",&n);
  printf("1*2+2*3+3*4+・・・・+(x-1)*x=%lu\n",((n-1)*n*(n+1))/3);
  return 0;
}
>>705
> ずばり、そのあとでmod取りたいです・・・
えーと, mod N が目的なら,計算途中では N^2 未満にしかならないのだが…
710709:03/10/20 09:57
x * y mod N = ( x mod N ) * ( y mod N ) mod N
を使うべし
mod 取りたいんなら最初からそう書けって。
難易度が全然違うんだから。

709 の内容はプログラムで書くと、

for(int i=0; i<NUM; ++i) x = (x * x ) % N;



for(int i=0; i<NUM; ++i) x = (x * x );
x %= N;

が(x の精度を無視して考えるなら)一緒ってことね。
>> 704
c言語あんまり知らないので、こんなもので勘弁・・・

#include <stdio.h>
int main(void)
{
int n, flag = 0;
while(1)
{
printf("整数を入力してください (n > 1) : ");
if (fscanf(stdin, "%d", &n))
{
if (n > 1)
{
if (flag == 1)
puts("ほんまかいな、まあ一応やってみますけど");
printf("%d\n", n * (n - 1) * (n - 2) / 3);
return 0;
}
puts("真面目にやってください");
flag = 1;
continue;
}
fprintf(stderr, "実家に帰らせてもらいます\n");
break;
}
return 0;
}
>>710
すみません、それは何と言う定理でしょうか?
>>713
X = A + BN, Y = C + DN とおけば、
X * Y = A * C + (BC + AD)*N + BD * N^2 てなわけで自明だと思うが。
一般に、まずは算数してからプログラム書いたほうが効率いいぞ!
文字列を入力として受付け、その文字列中に abc という文字列が含まれていればyesを、
含まれて居なければ no を出力せよ。ただし、文字列ライブラリを使ってはならない。
abcは連続のもののみ。
>>715
>>555
>>575-576
ガイシュツ。
つーか同じ授業で何人も同じ事聞く香具師がいるなんて相当頭悪い学校なんだろうな。
>>716
まぁそう言ってやるな。頭悪い事は本人が一番分かってるだろうし。
>>716
多分、課題出した人的には標準ライブラリ自体使わずやって欲しい気がする。
まあ、確かに search なら配列に対する操作だから
「文字列ライブラリを・・・」ってのにひっかからないけど。

こういう言葉足らずな課題って多いよなぁ。

>>715
というわけで、search も使うの気が引けるなら、
“Knuth-Morris-Pratt” とか “Boyer-Moore” のアルゴリズムでぐぐれ。
>>718
> “Knuth-Morris-Pratt” とか “Boyer-Moore” のアルゴリズムでぐぐれ。
文字列が長くないとコスト高杉
720701:03/10/20 21:50
見難い、かつ醜くてお恥ずかしいのですが…

#include <stdio.h>
#include <string.h>

int main(void)
{
int item[100];
int a, b, t;
char x;

for(a=0; a<5; a++) scanf("%d", &item[a]);

for(a=1; a<5; ++a)
for(b=4; b>=a; --b){
if(item[b-1] < item[b]){
t = item[b-1];
item[b-1] = item[b];
item[b] = t;
}
}

for(t=0; t<5; t++) printf("%d ", item[t]);

return 0;
}

これを配列を使わず、ポインタで…。
ここはこうした方がいいとか全面的にこうした方がいいとか。
入力も繰り返したいんで作り直した方がいいのかもしれないんですが。
配列を使わず、ポインタで?イミワカンネェよ
>>720

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
 int *item, *pitem, *pitem2;
 int a, b, t;
 char x;

 item = (int*)malloc(sizeof(int)*100);
 
 for(a=0, pitem = item; a<5; a++) scanf("%d", pitem++);

 for(a=1; a<5; ++a)
  for(b=4, pitem=item+4,pitem2=pitem-1; b>=a; --b, pitem--, pitem2 = pitem-1){
   if(*pitem2 < *pitem){
    t = *pitem2;
    *pitem2 = *pitem;
    *pitem = t;
   }
  }
 pitem = item;
 for(t=0; t<5; t++) printf("%d ", *pitem++);
 free(item);

 return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <functional>
int main(void)
{
 int *item, *pitem, *pitem2;
 int i;
 char x;

 item = (int*)malloc(sizeof(int)*100);
 for(i=0, pitem = item; i<5; ++i)
  scanf("%d", pitem++);

 std::sort(item, item+5, std::greater<int>());

 for(i=0, pitem = item; i<5; ++i)
  printf("%d ", *pitem++);
 free(item);
 return 0;
}
724デフォルトの名無しさん:03/10/21 01:16
C言語で電卓を作りたいのですが、
入力 5+
出力 Display:5 Op:+
入力 4-
出力 Display:9 Op:-
入力 2=
出力 Display:7 Op:=
と表示されるような電卓を作りたいのですが、
どのようなプログラムを作ればいいか教えて下さい。
使うキーは数字記号の1〜9と、演算記号の+,-,*,/,=,AC,CE、
それに小数点とOFFキーと符号反転(+/-)キーです。
計算は左優先で乗除が優先されることはありません。
教えて下さい。
725デフォルトの名無しさん:03/10/21 01:50
上の続きですが、
入力は全てキーボードでコマンドプロンプト上でやります。
少数はマンドイので整数のみ。「AC とか CE は一文字の何か」ね。少数対応にするときのポイントは、
・位取りようの変数を使う ('.' が入力されたら d=0.1、あとは数字キーで acc = acc + (c - '0')*d; d = d/10.0 とかする)
・不動小数点数を使うと誤差の扱いが面倒なので、適当に BCD ライブラリ等を使う
#include <stdio.h>
int main(int argc, char* argv[])
{
 int op = '+', acc = 0, operand = 0, c;
 while ((c = getchar()) != EOF) {
  switch(c) {
  case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
   operand = operand * 10 + (c - '0'); break;
  case '+/-': operand = -operand; break;
  case 'CE': operand = 0; break;
  case 'AC': operand = acc = 0; operation = e_add; break;
  case '+': case '-': case '*': case '/': case '=':
   switch (cp) {
   case '+': acc = acc + operand; break;
   case '-': acc = acc - operand; break;
   case '*': acc = acc * operand; break;
   case '/': acc = acc / (operand ? operand : 1); break;
   }
   operand = 0; op = c;
   printf("Display:%d Op:%c", acc, op);
   break;
  }
 }
 return 0;
}
727デフォルトの名無しさん:03/10/21 02:47
写真測量で空間後方交会という空中写真から撮影時のカメラの3次元座標と
傾きを求める方法があって、このプログラムをc言語で作らなくては
いけなくなったんですが、どなたか分かる方いませんか?
↓まずは画像データの解析から
729デフォルトの名無しさん:03/10/21 07:48
漸化式
Yn+1 = a * (1-yn) * yn

これをCで表現するとどのようになるのでしょうか?
書き方説明の仕方が下手ですいません
730デフォルトの名無しさん:03/10/21 07:55
いくらC/C++の文法やライブラリに精通していても
空間後方交会や漸化式の事が解らないとどうにもならない。
>>729
n=0or1の定義がないと書きようが無い
732729:03/10/21 08:20
漸化式というのは差分方程式のことでした
>>729
static int y0=???;
static int a=???;

int y(n){ // n:0->n
enum { ERROR = ???? };
int i,y;
if(n<0) return ERROR;
for(i=0,y=y0;i<n;++i) y=a*(1-y)*y;
return y;
}
問1
文字列を入力として受け付けて、その文字列を逆順にしたものを出力せよ。
問2
言葉当てゲームを作る。入力として文字列を受け付けて、あらかじめ定めておいた文字列と等しければBingoと出力して終わる。
異なっていてかつ文字の長さが等しければsame length、
入力された文字列の方が長ければlonger、
入力された文字列の方が短ければshorterと出力する。
Bingo以外の場合は繰り返し入力を受け付ける。
問3
文字列を入力として受け付けて、その文字列の中に含まれる数字の合計を出力せよ。

分かる人いますか?


います
教えて下さい!
>>736
問3
#include<stdio.h>
main()
{
int x,i;
char c[10];
i=0;x=0;
scanf("%s",c);
while(c[i]!='\0'){
if(c[i]>='0' && c[i]<='9')
x++;
i++;
}
printf("%d個\n",x);
}

こんなんでいい?
>>737
isdigitを使えよ。

>>736
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
  string s;
  //// (1)
  getline(cin,s);
  copy(s.rbegin(),s.rend(),ostreambuf_iterator<char>(cout));cout<<endl;
  //// (2)
  string check("string");
  while(1){
    cout<<"input・・・・・";
    getline(cin,s);
    if(!check.compare(s)){ cout<<"Bingo"<<endl; break; }
    else if(check.size() == s.size()) cout<<"Some Length"<<endl;
    else if(check.size() < s.size()) cout<<"Longer"<<endl;
    else if(check.size() > s.size()) cout<<"Shorter"<<endl;
  }

  //// (3)
  getline(cin,s);
  string::iterator first = s.begin();
  int n=0;
  for(; first != s.end(); ++first ){
  if(isdigit(*first))n += (*first - '0');
  }
  cout<<n<<endl;
  return 0;
}
数字の合計って数字の個数の合計じゃないの?
>>734
問1
> 文字列を逆順にしたものを出力せよ。
ということは実際に逆にしなければならないのか。

#include <stdio.h>
#include <string.h>
void reverse(char *);
int main()
{
char s[4096];
fgets(s,sizeof s,stdin);
reverse(s);
puts(s);
return 0;
}
void reverse(char *s)
{
int i=0,j=strlen(s)-1;
char c;
if(s[j]=='\n') j--;
for(;i<j;i++,j--)
c=s[i],s[i]=s[j],s[j]=c;
}
問3は
std::cout << std::count_if(s.begin(), s.end(), isdigit) << std::endl;
で一発。
>>734
問2

#include <stdio.h>
#include <string.h>
#define s2 "string"
void chomp(char *);
int main()
{
char s1[4096];
size_t s1len,s2len=sizeof s2-1;
while(1){
fgets(s1,sizeof s1,stdin);
chomp(s1);
s1len=strlen(s1);
if(!strcmp(s1,s2)){ printf("Bingo\n"); break;}
else if(s1len==s2len) printf("same length\n");
else if(s1len>s2len) printf("longer\n");
else printf("shorter\n");
}
return 0;
}

void chomp(char *s)
{
if(!*s) return;
s+=strlen(s)-1;
if(*s=='\n') *s='\0';
}
>>734
問3

#include <stdio.h>
#include <ctype.h>
unsigned int count(char *);
int main()
{
char s[4096];
fgets(s,sizeof s,stdin);
printf("%u\n",count(s));
return 0;
}
unsigned int count(char *s)
{
unsigned int n=0U;
for(;*s;s++)
if(isdigit(*s))
n++;
return n;
}
>>746
>unsigned int n=0U;
かっこいいーーー!!
748デフォルトの名無しさん:03/10/21 18:24
1、配列10個を整数で宣言する。
2、その10個の配列に1から20までの数値を適当にランダムに代入して初期化しておく。
3、配列を小さい順に並べ替える。
4、5番目の数値(中央値)を表示する。

以上を、1つ1つ作ってください。
よろしくお願いします。
>>748
日本語が変だけど、
1. 要素数10の int 型の配列を宣言する。
2. その配列の各要素を1から20までの一様乱数で初期化する。
ってこと?

あと、配列の要素数が10(偶数)だから、
厳密には5番目の値は中央値にならないよね。

#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;

inline int random(int min, int max){return (double)rand() / (RND_MAX + 1) * (MAX - MIN + 1) + MIN;}

int main(){
const int N = 10;
const int MIN = 1;
const int MAX = 20;
int array[N]; // 1.
for(int i=0; i<N; ++i) array[i] = random(MIN, MAX); // 2.
sort(array, array + N); // 3.
cout << array[N/2] << endl; // 4.
return 0;
}
組合せ数nCmを求めるプログラムを作成しなさい、組合せ数は以下の3通りの方法で計算できる
それぞれに対応した方法で組合せを計算する3つの関数を用いて計算するようにしなさい
TnCm={n(n-1)(n-2)・・・(n-m+1)}/(1*2*3*・・・*m)
UnCm=nCm-1 * (n-m+1)/m
VnCm={1 m=0,m 
  {n-1Cm-1 + n-1Cm 1<=m<=n-1

Tだけはできました。UとVをお願いします、TもおかしいのならTも編集お願いします
#include<stdio.h>
int Combination(int n,int r);
int main(void)
{
int x,y;
scanf("%d %d",&x,&y);
printf("%d %d 組み合わせ %d \n",x,y,Combination(x,y));
}
int Combination(int n,int r)
{
int x,y;
if(n-r<r){
r=n-r;}
for(x=1,y=1;r>0;){
x*=n--;
y*=r--;
}
return (x/y);
if(n==r)
return 1;
}
751750:03/10/21 19:31
Vの条件式が分かりにくいんで
VnCm={1               m=0,m 
     {n-1Cm-1 + n-1Cm    1<=m<=n-1
752デフォルトの名無しさん:03/10/21 19:33
>>749
>日本語が変だけど、
>1. 要素数10の int 型の配列を宣言する。
>2. その配列の各要素を1から20までの一様乱数で初期化する。
>ってこと?
ありがとうございます。上の通りでお願いします。
753デフォルトの名無しさん:03/10/21 19:49
文字列を入力として受け付けて、その文字列中に含まれる数字の合 値を求めよ。
例: a1b23g4 と入力された場合、1+2+3+4 で10 を出力する。
>>753
マルチ氏ね!!!
ヒントください

10進数で入力された値を16進数に変換し
上位2バイトと下位2バイトを入れ替えたものを10進数で出力するプログラム

例:
1234567と入力→16進数では、0012D687→これを D6870012とする→3599171602と出力
>>570
I もそれはあんまりお勧めしない。
↓こういう風に、逐次除算してった方がオーバーフローしにくくなる。

int Combination1(int n, int m)
{
int x = 1;
for(int i=1, j=n; i<=m; ++i, --j)
{
x *= j;
x /= i;
}
return x;
}
で、II と III。

int Combination2(int n, int m)
{
if(m <= 0) return 1;
return Combination2(n, m-1) * (n - m + 1) / m;
}

int Combination3(int n, int m)
{
if(m <= 0 || m >= n) return 1;
return Combination3(n-1, m-1) + Combination3(n-1, m);
}
>>755
ヒント:こんな感じにするとうまくいくかも。

void f( char *t )
{
union { unsigned short s[ 2 ]; unsigned int i; } a;
unsigned short s;

sscanf( t, "%d", &a.i );
s = a.s[ 0 ], a.s[ 0 ] = a.s[ 1 ], a.s[ 1 ] = s;
printf( "%u", a.i );
}
文字列を入力として受け付けて、その文字列中に含まれる数字の合 値を求めよ。
例: a1b23g4 と入力された場合、1+2+3+4 で10 を出力する。
初心者スレの。
わっかりません
わっかりません
761デフォルトの名無しさん:03/10/21 21:22
>759
>わっかりません
その投げやりな態度、気にいった!
とりあえず今ぱっと思いついたコードをうpしてやる。
それが理解できるかどうかは藻前しだいだがな。

int f( char *s )
{
int n[ UCHAR_MAX + 1 ], c, i;

memset( n, 0, sizeof( n ) );
while( ( c = *s ++ ) != '\0' )
n[ c ] ++;
c = 0;
for( i = 0 ; i < 10 ; i ++ )
c += i * n[ "0123456789"[ i ] ];
return c;
}
>>755

上位2バイト、下位2バイトを別の4バイトx2領域にコピーして
右シフト&左シフトして必要ビット分をマスクしてORすればどう?

763デフォルトの名無しさん:03/10/21 22:10
>>724
>>726
書き込みありがとうございます。
コンパイルしたのですが、
13:operation が未定義
13:e_add が未定義
15:cp が未定義
15:switch 文の条件が評価できない
とエラーが出てしまいます。
前で定義されてると思うのですが、
どうすればよいのか教えて下さい。
764726:03/10/21 22:16
cp は op、e_add は '+' の間違いね。
あとは自分で直して。
765デフォルトの名無しさん:03/10/21 22:32
>>764
char* argv[]はどういう処理に使ってるんですか?

766726:03/10/21 22:44
使ってません。
767デフォルトの名無しさん:03/10/21 22:51
例えば"A"という条件があり、それを繰り返し文の中で2回判定させたいです。
判定結果がfalseであれば、繰り返し構文からbreakさせたいです。
if文を使わないでfor文かwhile文のみで、このようなことは可能なのでしょうか?
可能でしたら、方法を伝授してくださいませ。

例> num_aが真ならば{}内を繰り返す。
#include<stdio.h>
main(){
int num_a, num_1, num_2;

num_a = 100;
//繰り返したい
{
printf("num_aを減らす数を入力せよ@");
scanf("%d", &num_1);
num_a -= num_1;
<!-ここで1回目の判定-->
printf("num_aを減らす数を入力せよA");
scanf("%d", &num_2);
num_a -= num_2;
<!-ここで2回目の判定-->
}
exit(0);
}

あくまで例ですので、「何に使うんだ?」と思われてしまいそうなプログラムですが・・・お願いします。
入れ子構造をとってみたりしたのですが、当然ながら中の繰り返し文を繰り返すだけになってしまいました。
768デフォルトの名無しさん:03/10/21 22:53
>>767
なんでifを使いたくないの?
769767:03/10/21 22:56
>>768
"ifは使わないで作れ"と先生が言っているのです。
>>765
int main(void) または int main (int, char**) は仕様です
>>769
do while も使ってはダメなのか?
772名無しさん@そうだドライブへ行こう:03/10/21 23:05
ifが嫌なら、switch文でやれ。
if (condition) {
a;
} else {
b;
}
は、
switch (condition) {
default:
a;
break;
case 0:
b;
break;
}
に置き換え可能。
#但し、break;でどこまでbreakするかはお察しください
774768:03/10/21 23:19
>>769
インラインアセンブラでやれ
#include<stdio.h>
main(){
int num_a, num_1, num_2;

num_a = 100;
for(;;)
{
printf("num_aを減らす数を入力せよ@");
scanf("%d", &num_1);
num_a -= num_1;
num_a < 0 && break;
printf("num_aを減らす数を入力せよA");
scanf("%d", &num_2);
num_a -= num_2;
num_a < 0 && break;
}
exit(0);
}
>>775
で、それはコンパイルできるのか?
done = 0
while(!done){

printf();
scanf();
done=(判定1の式) ? 0:1;

以下似たようなノリ
:
:

}
>>777
それじゃ二カ所でbreakできませんよ

done = 0;
done2 = 0;
while(!done){

printf();
scanf();
done=(判定1の式) ? 0:1;

while(!done && !done2)
以下似たようなノリ
:
:
}
}
最初のループもこれだといいな
while(!done && !done2)

判定部分の値を ! (not) してそのまま変数に入れてもいいかも

#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
int flag = 0;
jmp_buf jumper;
int jmp()
{
flag = 1;
longjmp(jumper, 1);
return 0;
}
main(){
int num_a, num_1, num_2, value;
num_a = 100;
setjmp(jumper);
for(;!flag;)
{
printf("num_aを減らす数を入力せよ@");
scanf("%d", &num_1);
num_a -= num_1;
num_a < 0 && jmp();
printf("num_aを減らす数を入力せよA");
scanf("%d", &num_2);
num_a -= num_2;
num_a < 0 && jmp();
}
exit(0);
}
で、またループに入るのか…
>>783
flagが変わってるから入らない
おお、ループには入らないなぁ。
かなりイカレたプログラミングですな
漏れはこうかな。

while(printf() && scanf()==1 && 判定1 && printf() && scanf()==1 && 判定2)
;
>>787
>>782とは対照的だな
int flag;

volatile int flag;
にしないとヤバイのですよ。
こうすればvolatileにしなくてよし
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
jmp_buf jumper;
int jmp()
{
longjmp(jumper, 1);
return 0;
}
main(){
int num_a, num_1, num_2, flag;
num_a = 100;
flag = setjmp(jumper);
for(;!flag;)
{
printf("num_aを減らす数を入力せよ@");
scanf("%d", &num_1);
num_a -= num_1;
num_a < 0 && jmp();
printf("num_aを減らす数を入力せよA");
scanf("%d", &num_2);
num_a -= num_2;
num_a < 0 && jmp();
}
exit(0);
}
791767:03/10/22 00:50
ふぇぇ、皆様、レスありがとうございます・・・。
ですが、学び始めて間もない漏れにとっては、まだまだ皆様の組んだプログラムが理解できない状態であります・・・情け無いです。
皆様のレスは、テキストで保存しておきます。後に見たときに理解してみせます。

今回は、if文を使ったものを提出することにします。
駄目と言われたとはいえ、提出しないよりはマシだと思いますので。

ありがとうございました。
課題云々を考えなければ、ifを使うのが一番読みやすいのならそれが正解。
このプログラムを関数を用いて実行したいです

#include<stdio.h>
int main(void)
{
int term=10,i,total2=50000;
double rate=0.5,total=50000;
for(i=1;i<=term;i++){
total=total*(1+rate/100);
total2=total2*(1+rate/100);
printf("double型 %2d年目 %f\n",i,total);
printf("int型 %2d年目 %d\n",i,total2);
printf("差額 %2d年目 %f\n",i,total-total2);
}
}

>>793
すでに main 関数を用いてるじゃん。
795793:03/10/22 03:53
main関数とは別に関数定義して
計算できるように書き換えろということです
#include<stdio.h>
void DQN(void)
{
int term=10,i,total2=50000;
double rate=0.5,total=50000;
for(i=1;i<=term;i++){
total=total*(1+rate/100);
total2=total2*(1+rate/100);
printf("double型 %2d年目 %f\n",i,total);
printf("int型 %2d年目 %d\n",i,total2);
printf("差額 %2d年目 %f\n",i,total-total2);
}
}
int main(void)
{
DQN();
}
797すいません:03/10/22 15:42
データ表の右側に各人の合計点、平均点を記入した
ファイルをDataB.datという名前で作るプログラムを
作れ。という課題なんですが・・・わかりません。
おしえて下さい
確かにわからんな
実際のデータ表とやらが全く想像できん
800シュウ:03/10/22 20:12
〆切がせまってます助けてください。よろしくお願いします。


正の整数 n を読み込み,その平方根の整数部分を求めるプログラムを書け.

ヒント)

女の子(めのこ)平方という方法を用いる.
正の整数 a から,1, 3, 5 と順 に奇数だけを引けるだけ引いたとき,
引くことができた奇数の個数が a の平方根の整数部分になる.
>>800
>女の子平方
へぇ〜へぇ〜へぇ〜
>>800
ヒントはヒント、それを使えって条件つけられたわけじゃないんだから無視。
ニュートン法で池。
>>800
int sqrt_int(int n)
{
  int i=1,cnt=0;
  while((n -= i)>=0){
    i += 2;
    ++cnt;
  }
  return cnt;
}
>>800
#include <math.h>
#include <iostream>

main()
{
 using namespace std;
 int n;
 cin >> n;
 cout << floor(sqrt(n)) << endl;
}
1 = 1
4 = 1+3
9 = 1+3+5
16 = 1+3+5+7
25 = 1+3+5+7+9
 :

こういうことか?
>>800
#include <stdio.h>

int square_root(int n, int r)
{
  n = n - (2 * r + 1);
  if(n < 0) return r; else return square_root(n, r + 1);
}

int main(int argc, char **argv)
{
  int n;
  scanf("%d", &n);
  printf("%d^(1/2) = %d\n", n, square_root(n, 0));
  return 0;
}
807シュウ:03/10/22 21:18
=800
みなさんありがとうございます。

で、なぜかコンパイルできません。

???
808デフォルトの名無しさん:03/10/22 21:25
入力された数字を二進数にして表示させるプログラムが分かりません。
よろしくお願いします。
>>808
2で割ってきゃいいんじゃねーの?
>>808
各bitが立った値を配列でもなんでも用意して
ANDとって真だったら0x31を出力すれば?

811809:03/10/22 22:25
>>808
あんまない知恵を絞ってたらできたぞ
逆からなのはご愛嬌

#include<iostream>
using namespace std;

void main()
{
int x;
cout<<"xは?";
cin>>x;
cout<<x<<"を二進数で逆からあらわすと\n";
while(x!=0)
{
if((x % 2)==0)
{
x = x / 2;
cout<<0;
}
else
{
x = (x - 1)/2;
cout<<1;
}
}

}
>>807
> で、なぜかコンパイルできません。

全角スペースでインデントされているので、半角スペースに置き換える必要がある。
813すいません:03/10/22 22:29
>799 データ表

学籍番号 英語 数学 国語 理科 社会
   1  87 78 89 79 95
2 59 68 70 60 56
:  : : : : :
: : : : : :
100 55 20 86 64 37

こんな感じです。
>>808
#include <iostream>
#include <list>
using namespace std;
int main(int argc, char **argv)
{
  int n;
  list<int> l;

  cin >> n;
  do { l.push_front(n % 2); n /= 2; } while(n > 0);
  for(list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it; }
  return 0;
}
>>800
(int)sqrt(n)
>>797
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char **argv) {
  int gakuseki, eigo, suugaku, kokugo, rika, syakai, sum;
  ifstream ifs("DataA.dat"); // 入力データファイルはDataA.dat
  ofstream ofs("DataB.dat");
  string buffer;

  getline(ifs, buffer); ofs << buffer << endl; // タイトル行の処理
  while(!ifs.eof()) {
    ifs >> gakuseki >> eigo >> suugaku >> kokugo >> rika >> syakai;
    if(ifs.fail()) break;
    sum = eigo + suugaku + kokugo + rika + syakai;
    ofs << gakuseki << " " << eigo << " " << suugaku << " " << kokugo << " "
      << rika << " " << syakai << " " << sum << " " << (sum / 5.0) << endl;
  }
  return 0;
}
817デフォルトの名無しさん:03/10/22 23:32
二進数ありがとうございました!
遅くなりましたが
>>722、723様有難うございました
ある数列を順に印字していくプログラムなのですが、
その第N項が40桁とか50桁(10進数)になるまで印字し続けるという条件がついています。

そのかなり多い桁数はどうやって扱ったらいいかヒントだけでもよいのでお願いします。
C++なら多倍長整数のライブラリを漁って使う
やっぱり最近多倍長ネタ流行ってる?

>>819
それ、精度については指定されてるん?
精度がどうでもいいなら、普通に double 使えばいいわけで。
822デフォルトの名無しさん:03/10/23 08:12
>>790
> for(;!flag;)

whileって知っていますか?
>822
まともな奴ならそんな所に while を使用していようが for を使用していようが
拘らないものだ。
なぜならば、それは構文規則に則っているし、コンパイル結果・実行結果も同じに
なることが容易に想像がつくから。

こんなところに拘る奴ってのは大概・・・

>>790が何をやっているのか理解していますか?(w
>>823
しているよ。
num_a < 0 && (longjmp(jumper,1),0);ではなくnum_a < 0 && jmp();としている理由はわからないけど。
#include <stdio.h>
#include <stdlib.h>
int main(int c,char*p[]){while(*(++p)){int n=atoi(*p),r=0;while((n-=(r*2+1))>=0)++r;printf("%d ",r);}printf("\n");return 0;}
#include <bitset>
#include <iostream>
int main(){unsigned long n;std::cin>>n;std::cout<<std::bitset<32>(n)<<'\n';return 0;}
#include <stdio.h>
#include <netdb.h>
int main(int argc,char *argv){
struct hostent *host;
struct in_addr addr;
char host_name[255];
printf("Host > ");
fgets(host_name,sizeof(host_name),stdin);
host=gethostbyname(host_name);
if(host=NULL){
printf("%s is none\n",hostname);
return -1;
}
printf("IP=%s\n",inet_ntoa(addr));
return 0;
}
ホストからIPアドレスを表示しようとしたんだけど、コンパイルがmainで躓くのはなんで?
828デフォルトの名無しさん:03/10/23 13:08
>>827
エラーの原因じゃないと思うが、argvの型はchar **
エラーメッセージを書かない奴は逝ってよし。しかもここは質問スレじゃないし。
>>824
>>782 != >>790 で、
>>790がforを使ったのは>>782が使っていたからだと
思ったけど。

>>789
ヤバイんだっけ?
問題なさそうに思うけど。
831デフォルトの名無しさん:03/10/23 14:12
>>782
> for(;!flag;)

whileって知っていますか?
832830:03/10/23 14:17
>>831
>>782がforを使ったのは、>>775がforを使っていたからだと
思ったけど。
>>775がwhile(1)を使っていたら、>>782もwhileを使ったと思うよ。
775はmainでexitを使うのか。しかもstdlib.hをインクルードしないで。
>>830
volatileは必要ないね。
835827:03/10/23 17:57
mainの問題はコマンドを変えればクリアできたけど、
結果のIPアドレスが0.0.0.4しかでない
>>835
コンパイルで躓くんじゃなかったのか? 実行できるということはコンパイルできているんじゃねーか。
837デフォルトの名無しさん:03/10/23 22:44
問:2から10000までの整数の中の素数を全て表示するプログラムを書きなさい。
という問題で

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

int main()
{
int a, b;

for(a = 2; a <= 10000; a++){
for(b = 2; b < a; b++){
if(a % b == 0)break;
else{
printf("%d \n", a);
}
}
}
return 0;
}
↑のようにかいたのですが、素数が数が増えるにしたがって、多く出てきてしまいます。
恐らくelseのとこが間違ってると思うんですがどうすればきれいに一つずつ順に素数が表示されるでしょうか?
お願いします。
else取っ払ってループの外に出して、外で
if (a == b) printf("%d \n", a);
しといたら
839デフォルトの名無しさん:03/10/23 23:07
はい、次!
840デフォルトの名無しさん:03/10/23 23:18
>>838
あの〜コンパイルは通るんですが、表示がならないんですけど・・・


841デフォルトの名無しさん:03/10/23 23:24
外ループの外に移したら何もでないだろうなぁ
ループの外ってのは、内側のループの外ってことだぞ
843デフォルトの名無しさん:03/10/23 23:33
>>841-842
無知な私に救いの手を・・・
結局何行目にif (a == b) printf("%d \n", a);
を入れればいいんでしょうか・・・?
>>827
addrに何も代入していないように見えるのだが、コンパイラは何も警告しなかったのかな?
>>843
内側のループより下で外側のループの下限より上。
846デフォルトの名無しさん:03/10/23 23:50
>>845
ダメだった・・・_| ̄|○
ホントに悪いんですがそこの部分書き直してもらえませんか・・・
847inaian:03/10/23 23:54
自然数 n,m を入力して、n に一番近い m の倍数を求める関数 nb(n,m)

お願い教えて
848デフォルトの名無しさん:03/10/24 00:03
>>724
>>726
726のプログラムなんですが、
小数入力と、AC、CE、の処理がうまくいきません。
具体的にどうすれば良いのでしょうか?
教えて下さい。
ちなみにACは全てを初期化、CEは現在の入力をキャンセルして
入力が始まる前の状態に戻ることです。
>>847

return (n/m)*m;
>>847
http://pc2.2ch.net/test/read.cgi/tech/1058630709/

の141で答えてもらってるぞ。
>>847

return n-(n/m)*m<(n/m)*(m+1)-n?n-(n/m)*m:(n/m)*(m+1)-n;
852837:03/10/24 00:23
誰か>>837-838をふまえてプログラム書いておくれ・・・
宿題は自分でも理解しようね
#include <stdio.h>
#include <stdlib.h>

int main()
{
int a, b;

for(a = 2; a <= 10000; a++){
for(b = 2; b < a; b++){
if(a % 0 == b)break;
}
if (a == b) printf("%d \n", a);
}
return 0;
}
854デフォルトの名無しさん:03/10/24 00:29
for(b = 2; b <= a; b++){
if(a % b == 0)break;
if (a == b) printf("%d \n", a);
}
855837:03/10/24 00:30
>>853
あ〜なるほど!!
ホントありがとうございました。
856デフォルトの名無しさん:03/10/24 00:31
for(b = 2; b <= a; b++){
if (a == b) printf("%d \n", a);
if(a % b == 0)break;
}
>>855
お土産つきだからね。きをつけて。
858837:03/10/24 00:35
>>854,856さんもありがとうございます。
>>857
危うく引っかかるところですたw
859デフォルトの名無しさん:03/10/24 05:07
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
のcap26.cppのプログラム実行結果をテキストに保存するプログラムをください。
どこに実行結果の数値をテキストに書き込む処理を入れれば、
いいのでしょうか?
>>859
while(1)のループのあたりじゃない?
cap26.exe > cat26.log
862861:03/10/24 07:46
もしくはmainのはじめにfreopen("cap26.log","w",stdout);
863デフォルトの名無しさん:03/10/24 08:20
>>860 861
返答ありがとうございます。
freopen("cap26.log","w",stdout);とすると
↓のような結果は、logとして出ますが、nだけをテキストにするには、どうしたらよいのでしょうか?
また、テキストファイルに自由に名前をつけて保存し、複数のファイルを作るとしたらどのようにしたらよいのでしょうか?
お願いいたします。
amt.lSampleSize = 1036800
BitmapInfo.bmiHeader.biBitCount = 24
キャプチャを開始します、どれかキーを押して下さい
グラブ hr = 80040227, n = 0.000000
グラブ hr = 0, n = 58.767339
グラブ hr = 0, n = 4.656205
グラブ hr = 0, n = 4.146371
グラブ hr = 0, n = 3.421728
グラブ hr = 0, n = 3.625358
グラブ hr = 0, n = 4.840005
グラブ hr = 0, n = 3.523250
>>859
マルチ死ね
865デフォルトの名無しさん:03/10/24 12:48
文字列を入力として受け付けて、その文字列の中に含まれる数字の合計値を出力せよ
>>865
お前、面白い奴だな・・・(w >>761
>>761
int n[ UCHAR_MAX + 1 ]={0}とやるだけで0フィルされますね。
>>863
イラン行はstrerrに吐いとけ。
geゲゲ。typo。
strerr -> stderr な。
>>761って合ってるのか??
871デフォルトの名無しさん:03/10/24 22:18
次の関数getnumを利用して、3つの実数(double型とする)を読み込み、
それらの実数のうち最大値を表示するプログラムを作成せよ。

void getnum(char *msg,double *num){
printf(msg);
scanf("%lf",num);
}

実行例
1番目は?:12.34
2番目は?:56.7
3番目は?:890.5
最大値は890.5です

よろしくお願いします。
872デフォルトの名無しさん:03/10/24 22:52
2つの整数値をそれぞれキーボードから整数型と実数型の
2通りで読み込みそれぞれに対して四則演算の結果(それぞれ
4通りずつ)を示せ。

お願いします。
ああ、漏れはあふぉなんだろうか。
入力がいくつ入ってくるかわからんし、どっちの言語を使っていいのかもわからん。
874872:03/10/25 00:16
説明不足だったかもしれません・・・
キーボードから2つの数字を入力して
その2数の四則演算を、整数型と実数型の2通り
で表せということです。つまり、4*2で8通りの
答えがでてくるということです。
ちなみに言語はCです。
改めてよろしくお願いします。
>>871
getnumの1行目はprintf("%s", msg);にした方がいい。
msg内に%が含まれているといけないからね。

int main(void)
{
    const int times = 3;
    double max_value = DBL_MIN;
    int i;

    for (i = 0; i < times; ++i) {
        double num;
        char msg[256];
        sprintf(msg, "%d> ", i + 1);
        getnum(msg, &num);
        if (max_value < num)
            max_value = num;
    }
    printf("%f\n", max_value);

    return 0;

}
876デフォルトの名無しさん:03/10/25 05:59
問題:2つの数字を入力してもらい、その和を計算して出力するプログラムを書け。

struct number{
int digit;
struct number *next;
};

digitは桁の値で、nextが次の桁の構造体を指すポインタ。

struct number *input(char *p){



}
void add(struct number *a, struct nunmber *b){

aにbの値を加える。

}
void output(struct number *a){

出力する。

}

この辺の関数を使いながら問題を解いてみて下さい。
お願いします。
>>875
いやするべき。鉄則。
>>554
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
 char ans;
 srand(time(0));
 getchar();
 printf("%s\n正しいですか?(y/n)", rand()&1?"yes":"no");
 fflush(stdin);
 scanf("%c", &ans);
 if (ans == 'n') {
  printf("プログラムにバグはつき物です、あきらめましょう\n");
 }
}
879デフォルトの名無しさん:03/10/25 07:56
>>878
fflushは出力ストリームに使うもの。
scanfが始めにでてくるCの教本みて思うんだが
scanfは初心者には難しくない?規格書をよく
読まないと細かい動きがつかめない、入力エラーの
対処がかなり難しい。
たまたまBASICのINPUT文の機能を似せることが
できるだけで初級で教えるには相応しくないと思うのだが…。
>>880
だからscanf()は使うなとあれほど……
最初に出てくるのはputsかprintfだろ。
はじめ 【初め/始め】
(1)はじめること。
⇔終わり
「仕事―」
(2)はじめたばかりの段階・時。副詞的にも用いる。
「―にお断り申し上げます」「―気がつかなかった」

さいしょ 【最初】
いちばんはじめ。
884デフォルトの名無しさん:03/10/25 12:36
putsはでてこねーよ
885871:03/10/25 13:12
>>875
どうもありがとうございました
886デフォルトの名無しさん:03/10/25 13:38
おれは初心者諸君に言う事に決めた。
最初に習う言語はCからはじめる方が多いようだがこんなのを勉強したって
糞のコーディングしか身につかずやくに立たない。
そこで時間を無駄にする事のないようにおすすめの言語はjavaかC#がええと思う。
C++から始めてもいいけどくれぐれもCの関数ライブラリを使うやり方を覚えないように。
つーか宿題スレだし
>>886
最初に習う言語はLispに決まってるだろ。バ〜カ。
そして、次はアセンブラだ。
>>880
そんな本は 捨 て ろ!!!
そんな事言ったら最初に習うのならHTMLできまり。
891デフォルトの名無しさん:03/10/25 15:02
VC++の6で、10〜20の乱数が出せないんですが…
言語はCです。

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

int main(void){
int dis;

srand((unsigned)time(NULL));
dis=((rand()/(double)RAND_MAX)*10);
return(0);
}

こう書いて、gccでは出来たのですが、VC6++だと警告されます。
他に乱数を出す方法を教えてください。
>>891
 何の警告が出るのか書けよ。
893デフォルトの名無しさん:03/10/25 15:11
>>892
warning C4244: '=' : 'double ' から 'int ' に変換しました。データが失われているかもしれません。
です。申し訳ないです
>>893
 まんまじゃないか。int型にキャストしてないだけ・・・。
 
 dis=(int)((rand()/(double)RAND_MAX)*10);

gccは#include<stdio.h>書かなくてもprintfがちゃんと判断できるくらい
 デフォルトだとぬるい文法のコンパイラだから。
>>894
Cってそういうものじゃないのか?
>>894
おぉ、できた。ありがとうございます!
897894:03/10/25 15:27
>>895
まあ他のコンパイラ言語よりは文法にぬるいけどGCCはさらにぬるい。
>>891
>dis=((rand()/(double)RAND_MAX)*10);

漏れは無駄に括弧が多いのが気になるぞ。
演算子の優先順位くらい理解しとけ!

dis = rand() * 10 / RAND_MAX;
これで良いんでないの? キャストも要らんし。
>>894
単にint型を返す関数と見なしているだけ。
もともとCにはプロトタイプ宣言なんてものはなかったから、今でも宣言せずとも呼ぶことはできる。
900898:03/10/25 15:39
dis = rand() * 10 / RAND_MAX + 10;

鬱だ。
>>890
いや、ヒンディー語と中国語を習うのが吉。
902894:03/10/25 15:45
>>899
 それは単にC言語の仕様。
 単純に呼ぶんじゃなくてある程度のstdio,stdlibの関数の引数情報はコンパイラ内でもっている。

gccでも -Wall 付けると小姑みたいにうるさくなるぞ。
警告はどう出そうがコンパイラの自由
>>902
>ある程度のstdio,stdlibの関数の引数情報はコンパイラ内でもっている。

ファイナルアンサー?
907デフォルトの名無しさん:03/10/25 16:06
誰か>>876をおながいします
>>907
なかなかいい問題だな。こんど出題してみよう
ポインタの一番奥が一番最初の桁でいい?
>>876
#include <stdio.h>
#include <malloc.h>
struct number{ int digit; struct number *next; };
struct number *input2(char *p, struct number *a){
  struct number *np;
  if(*p == '\0') return a;
  np = malloc(sizeof(struct number));
  np->digit = *p - '0'; np->next = a? a : NULL;
  return input2(p + 1, np);
}
struct number *input(char *p) { return input2(p, NULL); }
void output(struct number *a) {
  if(!a) return;
  output(a->next); printf("%d", a->digit);
}
int to_int(struct number *a) { if(!a) return 0; else return a->digit + to_int(a->next) * 10; }
void add(struct number *a, struct number *b) {
  struct number *a_before;
  int rv = to_int(a) + to_int(b);
  for(a_before = a; rv > 0; rv /= 10, a_before = a, a = a->next) {
    if(!a) { a = calloc(1, sizeof(struct number)); a_before->next = a; }
    a->digit = rv % 10;
  }
}
int main(int argc, char **argv) {
  struct number *a;
  printf("%s + %s = ", argv[1], argv[2]);
  a = input(argv[1]); add(a, input(argv[2])); output(a);
  return 0;
}
911910:03/10/25 17:43
見にくくてごめん。
>>902 はDQN。
プロトタイプがなけりゃ、どんな引数でも通るわい。

int main(){
fopen(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1);
return 0;
}

これが通らないコンパイラは標準Cに準拠"していない"。
さらに大概の処理系だと、上のコードはリンカも無事に通る。
(シンボル名に引数情報が含まれていないため)

まかり間違っても、#include <stdio.h> をつけ足すなよ??
>>912
(スコア:1, 参考になる)
#define REPLACEMENT '.'
#define CONNECTOR '_'
#define LEFT_PAREN '('
#define RIGHT_PAREN ')'

int is_stopper(int c)
{
return (isspace(c) || (c == ')') || (c == '('));
}

int read_item(FILE *fp, char *str)
{
int letter;
/* first read in any blankspace and check for EOF */
while(isspace(letter = getc(fp)));
if (letter == EOF) return EOF;

/* check if parenthesis */
if (letter == '(') return LEFT_PAREN;
if (letter == ')') return RIGHT_PAREN;

ungetc((char) letter, fp);
while(!is_stopper(*str++ = getc(fp))) /* read word in */
if (*(str-1) == CONNECTOR) *(str-1) = REPLACEMENT; /* change '_'to'.'*/
ungetc(*--str, fp); /* went one too far */
*str = '\0'; /* end it nicely */
return OK;
}

上の関数の挙動がまるでワカラソ。どなたかご教授おながいします。
たとえば
( abc_def_g
)
こんな入力から
abc.def.g
を取り出す関数か?

コメントどおりとしかいえないと思うが。
916876:03/10/25 21:50
>>910さん
ありがとうございます
助かりました!!
917876:03/10/25 22:01
コンパイルできません…
どうすればいいんでしょうか。
>>914
とりあえず、スペースも( )もない
1Gバイトくらいのファイルを食わせてみると
何かがわかる。
919910:03/10/25 22:23
>>917
全角スペースでレイアウトしてるから。分からなければ以下を。
#include <stdio.h>
#include <malloc.h>
struct number{ int digit; struct number *next; };
struct number *input2(char *p, struct number *a){
struct number *np;
if(*p == '\0') return a;
np = malloc(sizeof(struct number));
np->digit = *p - '0'; np->next = a? a : NULL;
return input2(p + 1, np);
}
struct number *input(char *p) { return input2(p, NULL); }
void output(struct number *a) {
if(!a) return;
output(a->next); printf("%d", a->digit);
}
int to_int(struct number *a) { if(!a) return 0; else return a->digit + to_int(a->next) * 10; }
void add(struct number *a, struct number *b) {
struct number *a_before;
int rv = to_int(a) + to_int(b);
for(a_before = a; rv > 0; rv /= 10, a_before = a, a = a->next) {
if(!a) { a = calloc(1, sizeof(struct number)); a_before->next = a; }
a->digit = rv % 10;
}
}
int main(int argc, char **argv) {
struct number *a;
printf("%s + %s = ", argv[1], argv[2]);
a = input(argv[1]); add(a, input(argv[2])); output(a);
return 0;
}
920876:03/10/25 22:44
>>919
/usr/lib/libcygwin.a(libcmain.o)(.text+0x81): undefined reference to `WinMain@16
'
collect2: ld returned 1 exit status

こんなエラーがでるんですけど、分からない…
初心者でごめん。
921876:03/10/25 22:47
今もっかいやったらコンパイルできました。
たびたびすいません。
ただsegmentation faultになってしまいます。
-mwindows オプション外せ
923914:03/10/25 23:04
>>915,918さん
つまりこの関数はファイルから読み込んで
EOFもしくは「(」もしくは「)」が来たらそれを返し、
それ以外の単語だったら(空白が来るまで)引数のstrに代入するということ
でしょうか?つーかコメントに書いてあった。鬱・・・
ただ入力ファイルに「_」がひとつも見当たらないのが気
になります。
とある数の階乗を計算して出力するプログラム誰か作って下さいな。
925910:03/10/25 23:07
>>921
実行例

$ ./a.exe 123 45
123 + 45 = 168

まったくエラーチェックしてないので、引数を間違えるとすぐcore dumpする。
>>924
こんなんでええのかね?

#include<iostream>
using namespace std;

int main()
{
int a, x=1;
cin>>a;
for(int i=1; i<=a; i++)
x = x * i;
cout<<x;
}
>>923(914)
その入力ファイルは宿題と一緒に渡された物?

 _ が含まれていた場合の挙動に気づくかどうかという
別な課題を課しているか、単に出題者のミスと思われ。
928910:03/10/25 23:28
宿題でなく、オープンソースなコードを勉強のために読んでるんじゃない?
929924:03/10/25 23:42
>>926
ありがとん
>>924
#include <stdio.h>

void main()
{
  printf("%ld", f(10));
}

long f(int n)
{
  if (n == 0 || n == 1)
    return (1L);
  else
    return (n * f(n -1));
}
>>910
int to_int(struct number *a) { if(!a) return 0; else return a->digit + to_int(a->next) * 10; }
ってオーバーフローしない?
とか input2 の np->next = a? a : NULL; って np->next = a; でいいんじゃないの?
とかあるけど,再帰を使えばこんなに綺麗にかけるんやね
感動した
>>924
n! ってかなり小さい n でオーバーフローしない?
933914:03/10/26 01:07
>>927,928さん
卒論のためのプログラムを書いていて、その足しになるかと思って
とあるオープンソースプログラムを外国から拾って読んでました。
上の関数の問題は解決しました。協力していただいた皆さん、ありがとうございました。
階乗は結構発散するからせめて100桁ほどの数字が扱えると好ましい
>>931
スタック代わりに再帰を使っている例だな。
感動するのは良いが,こういう本質をちゃんと見抜けよ?
>>935

void add(struct number *a, struct number *b) {
while (b || (a && a->digit >= 10)) {
a->digit += b->digit;
if (a->digit >= 10) {
a->digit -= 10;
if (!a->next) a->next = (struct number *)calloc(1, sizeof(struct number));
(a->next->digit)++;
}
if (!a->next && b->next) a->next = (struct number *)calloc(1, sizeof(struct number));
a = a->next;
b = b->next;
}
}

consっぽいことやってるし,関数プログラマなんかね?
計算アルゴリズムに再帰関数が綺麗だと言っているようじゃ終わりやな。
>>937
>>937 の開発言語は再帰をサポートしていない
>>937は再帰が苦手
941910:03/10/26 13:30
なんだかよく分からない展開に…。

>>931さん
ご指摘ありがとうございます。
addについては>>936さんのようにやるべきですね。
input2については…なに考えてたんだろう。

なお再帰構造の最適化については、>>910さんへの宿題ということで…。
>>937 は再起不能
アルゴリズムというか、式を表現するのに再起を使うのは自然
スタック等に展開するのはその先の段階で、
きれいとか言う問題ではなく一番シンプルな基本形って言いたいんじゃないの?
>>941
宿題にするまでもねぇ。
void add(struct number *a, struct number *b){
int result;
int carry;
result = a->digit;
if(b) result += b->digit;
carry = result / 10;
a->digit = result % 10;
if( ( b && b=b->next ) || (carry) ) {
if(!a->next) a->next = calloc(1, sizeof(struct number));
a = a->next;
a->digit += carry;
add2(a,b);
}
return;
}

>>910のaddの方がややこしいと思うのは気のせいか?
>>936さんへ。
int i;
for(i=1<<22; i; --i) add(n1,n2);

というコードで何回も足し算させると、すぐに落ちてしまいます。
a,bを読み込んで直行行列を掛けていき
R(k)=(<y^4>-5)^2+(<z^4>-5)^2という式のR(k)が最大値を取るときのkを代入した値y,zを出力したいのですが
途中まで書いてみましたがうまくいきませんです、、どなたかご教授願います
<>は平均を表します。0<k<90の範囲

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int i,k;
#define n 100
#define pai 3.1415926
int main(void){

double c,c2,c3;
double d,d2,d3;
double e,f,a[n],b[n],y[n],z[n];
FILE *fp;

if(NULL==(fp=fopen("ab.txt","r"))){
printf("\n can not be opened\n");
exit(1);
}
i=0;
while(fscanf(fp,"%lf,%lf",&a[i],&b[i])!=EOF){
i++;
}
fclose(fp);
if(NULL==(fp=fopen("kai.txt","w"))){
printf("\n can not be opened\n");
exit(1);
}

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

for(i=0;i<n;i++){
y[i] =cos(pai*k/180)*a[i]+sin(pai*k/180)*b[i];
z[i] =-sin(pai*k/180)*a[i]+cos(pai*k/180)*b[i];
}
c=y[i];
d=z[i];

c2 += pow(c,4);
d2 += pow(d,4);

c3=c2/n;
d3=d2/n;
e=(c3-5)*(c3-5);
f=(d3-5)*(d3-5);
fprintf(fp,"k=%d%lf\n",k,e+f);
fclose(fp);
}
return 0;
}
948910:03/10/26 17:36
>>946
プログラムを見るとなんとなくやりたいことは分かるが、
kとy,zの関係式、平均の定義式をきちんとかけ。

> #define n 100
このパラメータも問題に定義されてないし。
949946:03/10/26 17:56
すいません、説明不足でした・・
nは読み込むデータの総数で
平均<>は読み込んだデータを全て足しあわせて総数nで割ります
kとy,zとの関係は最大となるkを求めた後
y(k)=cos(pai*k/180)*a[i]+sin(pai*k/180)*b[i]
z(k)=-sin(pai*k/180)*a[i]+cos(pai*k/180)*b[i]
という式に当てはめて0-100まで順に出力したいのですが

トランプゲームのブラックジャックのプログラムを作ってください。
よろしくお願いします。
>>944
add2はtypoだろうが…
何でループに展開された末尾再帰を末尾再帰に改悪するの?
>>951
数学的観点から見たら展開した方が汚いよ。
>>949
>>947のメインループを以下のようにしては?
for(k=0; k<90; k++){
for(i=0;i<n;i++){
y[i] =cos(pai*k/180)*a[i]+sin(pai*k/180)*b[i];
z[i] =-sin(pai*k/180)*a[i]+cos(pai*k/180)*b[i];
}
r = R(y, z, n);
if(r > r_max) { r_max = r; k_max = k; }
}
fprintf(fp,"k_max=%d R(k_max)=%lf\n",k_max,r_max);
for(i=0;i<n;i++){
y[i] =cos(pai*k_max/180)*a[i]+sin(pai*k_max/180)*b[i];
z[i] =-sin(pai*k_max/180)*a[i]+cos(pai*k_max/180)*b[i];
fprintf(fp,"y[%d]=%lf z[%d]=%lf",y[i] ,z[i]);
}
ちなみに前もって以下を定義しておく。
double r_max = 0, r;
int k_max;
double avg_pow4(double arr[], int N) {
int i; double result = 0;
for(i = 0; i < N; i++) result += pow(arr[i], 4);
return result / N;
}
double R(double y[], double z[], int N) {
return pow(avg_pow4(y, N) - 5, 2) + pow(avg_pow4(z, N) - 5, 2);
}
954946:03/10/26 19:49
>>953
どうも有り難うございましたm(__)m
感謝します!
955デフォルトの名無しさん:03/10/26 19:53
------------------------------------------------------------
テキストファイルの内容をバッファ読み込む関数
int file_load(const char *fname,char *buf)

バッファの内容をテキストファイルに読み込む関数
int file_save(const char *fname,char *buf)

ファイルオープン・クローズ、および必要なエラー処理は関数無いで行い
戻り値はエラー終了の場合-1、正常終了の場合0とする
------------------------------------------------------------
の作り方がどうしてもわかりません。。。
よろしければご教授おねがいします。

>>955
普通にfopenしてbufにメモリ割り当ててstrcpyすればいいのでわ?
957955:03/10/26 20:15
レスありがとうございます。
C言語まだ初めて数ヶ月の初心者でどこをどういじって
いいのやらみたいな感じで。。。
厨房同然で申し訳ありませんがが簡単な説明交えてサンプルソースなんか
作って頂けると有り難いです。。。
958944:03/10/26 20:36
>>951
それなりのコンパイラなら,最適化かけりゃどっちも同じマシンコードになるはず。
再帰で書いて欲しそうだったから,再帰にしてあげた。
>>956
その引数じゃ何をしたいのかわけワカメ。
, char **pbuf)
でバッファを動的に確保するとか,
, char *buf, size_t buf_size)
で確保済みバッファを渡すとか,
もう少し,意図を明確に。

バッファオーバーフロー上等ってのは勘弁してくれ。
960955:03/10/26 21:10
>>959
レスどうもです。
バッファオバーフローとかはまだ習っていない状態です。。
引数はconst char *fname,char *bufしか与えてはいけ
ないらしいです。。
>>960
> 引数はconst char *fname,char *bufしか与えてはいけ

このスレッド最大の難問だな。
962955:03/10/26 22:33
>>961 >>959
あ、もうしわけありません。
重要なことがぬけてたっぽいです。。。
「バッファのメモリ確保は関数外で行うものとする」
だそうです。。
>>955
インデントが崩れたら適当に調節してね。
で、main()も要る?

int file_load(const char* fname, char* buf)
{
FILE*fp = fopen(fname, "rt");
intch;

if(fp == NULL) return -1;
while( (ch = fgetc(fp)) != EOF ) {
*buf++ = ch;
};
fclose(fp);
*buf = '\0';

return0;
}

int file_save(const char* fname, char* buf)
{
FILE*fp = fopen(fname, "wt");
if(fp == NULL) return -1;
fwrite(buf, 1, strlen(buf), fp);
fclose(fp);

return0;
}
965910:03/10/26 23:16
>>962
#include <stdio.h>
size_t FileSize;
int file_size(const char *fname) {
FILE *fp;
if((fp = fopen(fname, "r")) == NULL) return -1;
fseek(fp, 0L, SEEK_END);
if((FileSize = ftell(fp)) == 0) return -1;
fclose(fp); return 0;
}
int file_load(const char *fname, char *buf) {
FILE *fp;
if((fp = fopen(fname, "r")) == NULL) return -1;
if(fread(buf, 1, FileSize, fp) != FileSize) return -1;
fclose(fp); return 0;
}
int file_save(const char *fname, char *buf) {
FILE *fp;
if((fp = fopen(fname, "w")) == NULL) return -1;
if(fwrite(buf, 1, FileSize, fp) != FileSize) return -1;
fclose(fp); return 0;
}
int main(int argc, char **argv) {
char *buf;
if(argc != 3) return -1;
if(file_size(argv[1]) != 0) return -1;
if(FileSize <= 0) return -1;
buf = (char *)malloc(FileSize);
if(file_load(argv[1], buf) != 0) return -1;
if(file_save(argv[2], buf) != 0) return -1;
return 0;
}
すまん。さっきから名前欄の数字を消し忘れてばかり…。
967955:03/10/26 23:25
>>964
ありがとうございます。感謝感激です。
main関数は次の授業でなにか作るらしいので結構です。
これからC言語の勉強がんばります。
ほんとにありがとうございました〜
授業でVC++使ってるんですが、「Tree作ってこい」とのことです。
( ゚Д゚).。oO(Treeって何?) っていう状態で困ってます(検索しても死ぬほどでてくる)。
>>968
普通ツリーっていったら木構造で、たぶん課題なら二分木だと思われ。
「アルゴリズム 二分気」とかって検索しる!
実はクリスマスツリーを作ってくる宿題に300モナー
っていうかさ、本当に教官が「Tree 作ってこい」と言っただけなんだったら
クリスマスツリーの AA 作って提出すりゃいいと思う。
それで単位落とされたら教務課にクレーム出してもいいくらい。

↑もちろん、その教官が授業中木構造について全く説明してないってのならの話ね。
ツリーツっていうのを食えってことだよ
聞き間違いだよ

埋めるためにほんわかさせてみた
>>968
フラクタル図形で木でも描いたら良いんだろ?
974968:03/10/27 00:57
友達に質問メール出してたらさっき返信が帰ってきますた。
”treeコマンドを作れ”とのことらしいです。
一応treeコマンドがどんなものか検索したら分かりましたので、
これからがんばってみることにします。
(今日は寝れるかな・・・)
友達居んなら来んなよ゚д゚) 、ペッ
WinAPIでそんなんがあったやうな
977デフォルトの名無しさん:03/10/27 13:30
関数テンプレートなのですが
これだと
エラー E2147 untitled.cpp 6: 引数宣言は 'type' で始められない
エラー E2303 untitled.cpp 6: 型名が必要
というエラーが出ますどこが間違っているのでしょうか?

#include<iostream>
using namespace std;

template <typename type> type f(type a, type b);

f(type a, tyep b)
{
return (a + b) * 4;
}
void main()
{
int a=9, b=3;
double c=3.8, d=5.8;
cout<<f(a, b);
cout<<f(b, c);
cout<<f(c, d);
cout<<f(d, a);
}

template <typename type> type f(type a, type b) /*;

f(type a, tyep b) */
>>978
そこがいらなかったのですか・・・プロトタイプ宣言とごっちゃになってました
ありがとうございました
エラー見たら推測できないなー
まーちゃんと返事も書いて礼儀正しいから良しとしますか
981sage:03/10/27 15:24
任意のウインドウに文字列を送信するって
どうやって実現しているのですか?

例えば、顔文字入力支援といったものがありますよね。

クリップボードを経由するやり方があるのでしょうか?
単にクリップボードにコピーするのであれば
・OpenClipboard()
・EmptyClipboard
・SetClipboardData
・CloseClipboard
という手順でやったことはあるのですが。

それとも、クリップボードなど経由でず、直接ウインドウの
例えばエディットコントロール等に文字列を送っているのでしょうか?

ご存知の方、いらっしゃいましたら教えて下さいませ。
宿題かよ
あれ?
>>981
クリップボードでしょう
>>984

レスありがとうございます。

推測ですが・・・
クリップボードへコピーした後に、CTRL+V 相当の
指示を対象ウインドウに送るのでしょうか?

だとしたら、それってどうやるんでしょう?
FindWindow() でウインドウハンドル取得して、
メッセージを投げるのでしょうか?

それとも、クリップボードからペーストする別の
機構が用意されているのでしょうか?
>>985
別のスレに行ったほうがいいよ。
スレ違いだし、ここはもう埋め立てるだけだから。
>955 KAIT(´ι_`)
Page 2B-3
>>985
ありがと。
そうします。
989代理人:03/10/28 11:16
昔、教えていただいたClass Newstringについて質問

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=157

これにmainを加えて、ちゃんと機能するか確かめてから宿題再提出になりました。
string1.concatenate(ch)の部分で上手くstring1の後ろにch(一文字)付け加え
出来ません。あと、string1.substring(string2)もディスプレーできません。
分かる人教えてください。
読みずれー!
まっとうなインデントしろよ。
つーか、
string1.concatenate(ch)なんてどこに書いてあるんだよ。
string1.substring(string2)なんてどこに書いてあるんだよ。
お前はどんなmainを書いたんだ?
そのmainがどう動作すること期待してて、
実際にはそのmainはどう動いたんだ?
それを書け。
>>990
(っていうか「質問」とか「教えて」とかいう状況じゃあなさそうだから、課題の文章を
 そのままコピペしてもらったほうがいいんじゃないかな。。。)
>>990
読みづれー!
まっとうな日本語使えよ。
993990:03/10/28 13:10
>>992
すまんこってす
delete [] 配列名;
で、なんかエラーが出るので、
配列名 = NULL;
こうしてみたのですが、
このやりかたで、メモリ解放できているのでしょうか?
配列?
とりあえず開放はされない。
ちゅーか、ソース抜き出して貼れよ。
996デフォルトの名無しさん:03/10/28 16:09
記念カキコ v(^-^=)
997994:03/10/28 16:10
error
終幕
1000デフォルトの名無しさん:03/10/28 16:14
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。