トップページ⇒tech
1001コメント437KB

C/C++の宿題を片付けます 59代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/01/27(金) 09:08:40
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
 投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html

【前スレ】
C/C++の宿題を片付けます 58代目
http://pc8.2ch.net/test/read.cgi/tech/1137522945/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0232デフォルトの名無しさん2006/01/28(土) 23:30:10
>>211
EOFって何ですか?
0233デフォルトの名無しさん2006/01/28(土) 23:31:55
>>232
End Of File
0234デフォルトの名無しさん2006/01/28(土) 23:32:04
>>232
ファイルの終端。コンソールから入力するときは CTRL+Z や CTRL+D など。つーかググれ。
0235デフォルトの名無しさん2006/01/28(土) 23:32:06
>>232
あなたはまずgoogleの使い方を知るべきです。
0236デフォルトの名無しさん2006/01/28(土) 23:34:37
>>226
読もうと努力したけど、アルゴリズムのところ、値を負にしてマークしたりしてて、理解が追いつかなかった。
0237デフォルトの名無しさん2006/01/28(土) 23:36:02
>>233-235
すみません。ありがとうございます!
後>>210をコンパイルしてもエラーが出るんですがどうしてでしょうか?
0238デフォルトの名無しさん2006/01/28(土) 23:38:03
>>237 エラーメッセージは?
0239デフォルトの名無しさん2006/01/28(土) 23:40:45
cl /GX だっけ。
0240デフォルトの名無しさん2006/01/28(土) 23:45:36
#include<iostream>
#include<assert.h> // assert を使うためのヘッダ

class stack
{
private:
static const int max = 100; int data[max]; int sp;
public:
void push(int); void pop(); bool empty() const;
int top() const; int size() const;
friend bool equal(const stack&,const stack&);
stack(); ~stack();
};
void stack::push(int d){ assert(sp<max); data[sp++] = d; }
void stack::pop(){ assert(0<sp); --sp; }
bool stack::empty() const{ return sp==0; }
int stack::top() const{return data[sp-1]; }
int stack::size() const{ return sp; }
bool equal(const stack& s1,const stack& s2){
bool eq = true;
if(s1.sp!=s2.sp) eq = false;
else{
for(int j=0; j<s1.sp && eq; j++)if(s1.data[j]!=s2.data[j]) eq = false;
return eq;
}
}
stack::stack(){sp = 0;}
stack::~stack(){}
このクラスを実行すると、スタックが同じ場合には1,スタックが異なる場合には56と表示されました。これで合っているのでしょうか?
0241デフォルトの名無しさん2006/01/28(土) 23:46:11
>>238
エラーメッセージが長くて貼れませんでした。なので一応途中まで。
C:\MyC>gcc x.cpp -o x
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text+0x62):x.cpp: undefined reference
to `cin'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text+0x14f):x.cpp: undefined referenc
e to `cout'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text+0x1f0):x.cpp: undefined referenc
e to `cout'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$_S_oom_malloc__t23__malloc_alloc
_template1i0Ui+0x1a):x.cpp: undefined reference to `endl(ostream &)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$_S_oom_malloc__t23__malloc_alloc
_template1i0Ui+0x27):x.cpp: undefined reference to `cerr'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$_S_oom_malloc__t23__malloc_alloc
_template1i0Ui+0x2c):x.cpp: undefined reference to `ostream::operator<<(char con
st *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$replace__t12basic_string3ZcZt18s
tring_char_traits1ZcZt24__default_alloc_template2b0i0UiUiUic+0x34):x.cpp: undefi
ned reference to `__out_of_range(char const *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$replace__t12basic_string3ZcZt18s
tring_char_traits1ZcZt24__default_alloc_template2b0i0UiUiUic+0x8e):x.cpp: undefi
ned reference to `__length_error(char const *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$resize__t12basic_string3ZcZt18st
ring_char_traits1ZcZt24__default_alloc_template2b0i0Uic+0x2c):x.cpp: undefined r
eference to `__length_error(char const *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$__rs__H3ZcZt18string_char_traits
1ZcZt24__default_alloc_template2b0i0_R7istreamRt12basic_string3ZX01ZX11ZX21_R7is
tream+0xad):x.cpp: undefined reference to `streambuf::sungetc(void)'
0242240 ◆OtZ3csKgUQ 2006/01/28(土) 23:46:17
>>240
[1] 授業単元:C++によるプログラミング
[2] 問題文(含コード&リンク):
stackにequal(const&,const&)(下のプログラム参照)を追加したプログラムを実行し、スタックを比較した結果を確認せよ。
[3] 環境
 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc 2.90 [3.3] 言語:C++
[4] 期限:1月29日12:00 [5] その他の制限:特にありません
#include<iostream>
#include<assert.h> // assert を使うためのヘッダ
0243デフォルトの名無しさん2006/01/28(土) 23:48:14
>>241
gcc は C のコンパイラ。 C++ をコンパイルするときは g++ を使う。
0244デフォルトの名無しさん2006/01/28(土) 23:48:46
>>226
自分で実装したけど、コードの穴埋めをする気にはなれない。
たぶん途中の値を負にしたりするのは、そのノードが確定かどうかの
フラグに使っていると思うんだが、読むのはストレスが溜まる。
穴埋め以外不許可なら、変数表つけるとか出題者はもっと考えるべきだな。
0245240 ◆OtZ3csKgUQ 2006/01/28(土) 23:50:10
>>242のテンプレは>>240のプログラムについてです。
0246デフォルトの名無しさん2006/01/28(土) 23:52:21
>>243
わかりました。やってみます。
0247デフォルトの名無しさん2006/01/28(土) 23:53:01
>>240
どうを実行して56を表示させたんだ?↓のテストは 1 0 ときちんと表示されるが?

int main() {
stack s1, s2, s3;
s1.push(10); s2.push(10); s3.push(11);
std::cout << (equal(s1,s2)) << std::endl << (equal(s1,s3)) << std::endl;
}
0248デフォルトの名無しさん2006/01/29(日) 00:05:09
>>194
遅レスだけど。内容はヒントの2番目の通り。ソースが汚いのは行数規制のせいなので許して。
#include <stdio.h>
void swap(int *x, int *y) {int temp = *x; *x = *y; *y = temp;}
void reverse(int *first, int *last) {for(; ; ) if (first == last || first == --last) return; else swap(first++, last);}
int next_permutation(int *first, int *last) {
    int *i = last - 1, *j, *k;
    if (first == last || first + 1 == last) return 0;
    for(; ; ) {
        j = i--;
        if (*i < *j) {k = last; while (!(*i < *--k)){} swap(i, k); reverse(j, last); return 1;}
        if (i == first) {reverse(first, last); return 0;}
    }
}
int is_derangement(int *a, int *p, unsigned int n) {
    while (n--) if (a[n] == p[n]) return 0;
    return 1;
}
int main() {
    int i, a[] = {0, 1, 2, 3, 4}, p[sizeof(a) / sizeof(a[0])], count = 0;
    for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) p[i] = a[i];
    do {
        if (is_derangement(a, p, sizeof(a) / sizeof(a[0]))) {
            printf("(");
            for (i = 0; i < sizeof(a) / sizeof(a[0]) - 1; i++) printf("%d,", a[i]);
            printf("%d)\n", a[i]);
            count++;
        }
    } while (next_permutation(a, a + sizeof(a) / sizeof(a[0])));
    printf("number of derangement for %d = %d\n", sizeof(a) / sizeof(a[0]), count);
    return 0;
}
0249240 ◆OtZ3csKgUQ 2006/01/29(日) 00:09:06
>>247さん。ありがとうございます。
すみません。main()を書き忘れておりました。
int main()
{
stack s1,s2;
s1.push(5);s1.push(8);s1.push(9);
s2.push(5);s2.push(8);s2.push(9);s2.push(10);
std::cout << equal(s1,s2) << std::endl;
s2.pop();
std::cout << equal(s1,s2) << std::endl;
return 0;
}
>>247さんが書かれたmain()では確かに 1 0 と表示されました。
0250デフォルトの名無しさん2006/01/29(日) 00:13:14
>>243
できました!ありがとうございます!
>>210の方もありがとうございました!
0251デフォルトの名無しさん2006/01/29(日) 00:14:14
前スレの767ですがスルーされてるのでよろしくお願いします。

[1] 授業単元: プログラミング基礎演習
[2] 問題文(含コード&リンク):
1.整数 P, X (1 < X < P で, P, X は互いに素) を与えて, X × Y を P で割った余りが 1 になるもっとも小さな正整数 Y を求めるプログラムを書いてください。
2.ユークリッドの互除法(正整数 X, Y (X > Y) の最大公約数は X を Y で割った余りと Y の最大公約数に等しい)の手順を使って最大公約数を見つけるプログラムを作れ
3.2を利用して1のプログラムを作り直せ。(P と X は「互いに素」なので,両者の最大公約数は必ず 1 というのを使う)
[3] 環境
 [3.1] unix
 [3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
 [3.3] C
[4] 期限:2006年1月末
0252デフォルトの名無しさん2006/01/29(日) 00:14:16
>>249
equal関数でs1.sp!=s2.spの時に関数の最後でreturnしていないから。
0253デフォルトの名無しさん2006/01/29(日) 00:14:37
[1] 授業単元: 二次元配列
[2] 問題文(含コード&リンク):
ライツアウト(ttp://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%84%E3%82%A2%E3%82%A6%E3%83%88)を作成せよ。
どの場所のライトを点灯/消灯させるかをキー入力させて盤面を更新し、終了条件(すべて消灯)を満たすまでループするようにする。最初にどこが点灯しているかという「問題」は各自で適当に作成してよい。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 1月30日まで
[5] その他の制限:
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1564.txt
↑のように表示させる部分まではできたのですが点灯/消灯がどうしてもできません。
0254デフォルトの名無しさん2006/01/29(日) 00:15:16
[1] 授業単元: プログラミング基礎演習
[2] 問題文(含コード&リンク):
1.getchar, putchar を用いて標準入力(stdin) からテキストデータを読み込みそのまま 標準出力(stdout) に書くプログラムを作成せよ。
ファイル末尾に達すると getchar の値が EOF になるのを利用するとよいだろう。
2.1のプログラムを改良して,アルファベット文字に関して大文字は小文字に変換,小文字は大文字に変換して表示するプログラムを作成しなさい。
3.1のプログラムを改良してそのままじゃなくて「行番号」を付けて表示させよ。
4.英文テキストファイルを読込んで,文字数,単語数,行数をカウントして表示するプログラム mywc を作成しなさい。
[3] 環境
 [3.1] unix
 [3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
 [3.3] C
[4] 期限:2006年1月末
0255デフォルトの名無しさん2006/01/29(日) 00:15:47
[1] 授業単元: プログラミング基礎演習
[2] 問題文(含コード&リンク):
1.2つの分数(fraction)を入力し,その四則演算(+,-,*,/)を計算するプログラムを作成してください.
ただし,次の構造体を利用すること.ここでは,四則演算を関数化しないこと.また,既約分数にしなくとも良いです.
/*fraction_t型の定義*/
typedef struct {
int numerator; /*分子*/
int denominator; /*分母*/
} fraction_t;

/*fraction_t型の変数の宣言*/
fraction_t frt;

2.和(add),差(subtract),積(multi),商(quotient)を計算する4つの関数を作成せよ.
その関数を利用し,1のプログラムと同じ構造体を利用し,同じ動作をするプログラムを作成せよ.
3.2のプログラムで,計算が正しく行われない場合を列挙して,その対応策を考えよ.
(例 1/-2 のような計算結果は,美しい表示方法とはいえません)
4.3で列挙した対応策を,2で作成したプログラム上で実現せよ.
[3] 環境
 [3.1] unix
 [3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
 [3.3] C
[4] 期限:2006年1月末
0256240 ◆OtZ3csKgUQ 2006/01/29(日) 00:21:57
>>252さん、ありがとうございました!解決しました。
0257デフォルトの名無しさん2006/01/29(日) 00:25:44
>>255
2.の時点では適切に表示されないようにせよということかな?
そういう美しくない問題はいただけないなぁ。
0258デフォルトの名無しさん2006/01/29(日) 00:27:04
>>254
「単語」の定義は?「空白」で囲まれたもの?だとしたら「空白」の定義は?
isspace()が真を返すものでいいの?
0259デフォルトの名無しさん2006/01/29(日) 00:27:51
>>254
1,2,3のみ
行数制限のために改行をけしているから適当に改行するように
(1)
#include<stdio.h>
int main(void){int ch;while((ch=getchar())!=EOF)putchar(ch);return 0;}
(2)
#include<stdio.h>
#include<ctype.h>
int main(void){int ch;while((ch=getchar())!=EOF)putchar(islower(ch)?toupper(ch):tolower(ch));return 0;}
(3)
#include<stdio.h>
int main(void){int ch,l=1,w=0;for(;(ch=getchar())!=EOF;l+=(w=ch=='\n'?0:w+1)==0)w||printf("%3d: ",l),putchar(ch);return 0;}
0260デフォルトの名無しさん2006/01/29(日) 00:33:46
>>251
3 に 2をどう使ったらいいかわからんかったので,拡張GCDを新たに書いて使った.
わざわざプログラム三つ書くの面倒だったから適当に直してください.

void f(int P, int X) { /* 問1 */
  int Y;
  for (Y = 1; (X * Y) % P != 1; ++Y);
  printf("Y = %d\n", Y);
}
int gcd(int X, int Y) { /* 問2 */
  return Y > 0 ? gcd(Y, X % Y) : X;
}
/* 問3 で使う拡張GCD:
 * aX + bY = gcd(X,Y) なる gcd(X,Y), a, b を求める */
int extgcd(int X, int Y, int *a, int *b) {
  int g = X; *a = 1, *b = 0;
  if (Y > 0) g = extgcd(Y, X % Y, b, a), *b -= (X / Y) * (*a);
  return g;
}
void g(int P, int X) { /* 問3 */
  int Y, dummy;
  extgcd(X, P, &Y, &dummy);
  while (Y < 0) Y += P;
  printf("Y = %d\n", Y % P);
}
0261デフォルトの名無しさん2006/01/29(日) 00:41:42
>>231のプログラムをgccでコンパイルしたんですけど、
>>222にあるような実行例の場合、式を正しく読み込めず
value = 0となってしまいます。

原因分かる方いらっしゃいますか?
0262デフォルトの名無しさん2006/01/29(日) 00:47:05
>>257
そうみたいですね。2では動作すればいいだけで4で改良。

>>258
たぶんisspaceというのは聞いたことないです。

>>259
ありがとうございます。でもよく分かりません。

>>260
ありがとうございます。
02632312006/01/29(日) 00:47:07
>>261
こちらではきちんと value = 114 が表示されました.
・割り算でゼロになってないか
・不正な入力をしなかったか(入力にスペースが含まれてはいけない)
などを確認してみてください.
02642312006/01/29(日) 00:49:09
>>263 割り算なんか実装してないよね orz なんかボケてきたので後誰か頼
0265デフォルトの名無しさん2006/01/29(日) 00:56:38
[1] 授業単元:C++によるプログラミング
[2] 問題文(含コード&リンク):長いので後で書きます。
[3] 環境
 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc 2.90 [3.3] 言語:C++
[4] 期限:1月29日12:00 [5] その他の制限:特にありません

main()で上手くいくようにComplexのデータを<<を用いて出力できるような関数
std::ostream& operator<<(std::ostream& os,Complex& c){
c.print(os);
return os;
} を以下のプログラムに追加・必要であれば修正するようなのですが、どうすればよいのか分かりません。
#include<iostream>

class Complex
{
private: double real; double imag;
public:Complex(){ real = 0.0; imag = 0.0; }Complex(double r,double i){ real = r; imag = i; } ~Complex() {};
double re() const {return real;} double im() const {return imag;}
void set_re(double r){ real = r; } void set_im(double i){ imag = i; }
void print(std::ostream& os) const{
os << real << "+" << imag << "i";
}
};
int main(){
Complex a[3];
a[0] = Complex(1.00,2.00); a[1] = a[0] + Complex(0.00,1.00);
Complex *c = &(a[2]); *c = a[0];
for(int i=0; i<3; i++) std::cout << a[i] << std::endl;
Complex *b = new Complex[3]; for(int i=0; i<3; i++)b[i]=a[i]+Complex(1.00,1.00);
for(int i=0; i<3; i++)std::cout<<b[i]<<std::endl; delete [] b; return 0;
}
02662592006/01/29(日) 01:00:11
>>262
具体的にソースのどの部分が分からないのか該当箇所を列挙してくれ。
それによって書き換える場所と書き方を変えないといけないから。
まぁ多分(3)は全書き直ししないといけないだろうなぁとは推測してるけどw
0267デフォルトの名無しさん2006/01/29(日) 01:06:24
>>231のソースを拝借中

9*9*9
value = 729 (これは正しい)

(2*3)+5
value = 0

3*(2+2)
value = 1

3+2
value = 5 (これも正しい)


おかしいのはfactorなのかな…
ちょっと弄ってみるか
0268デフォルトの名無しさん2006/01/29(日) 01:18:02
>>261
「入力される式の中の数が1桁の正整数」という与えられた前提では、
これでうまく計算されるはず。
int factor(char **p) {
    int x;
    if (**p == '(') ++(*p), x = expression(p), ++(*p);
    else x = **p - '0', ++(*p);
    return x;
}
02692312006/01/29(日) 01:19:53
>>267
うーん,手元では,真ん中の二つも正しい結果が出てるんですけどねえ…….むーう.
とりあえずソース全文置いときますね http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1565.c
0270デフォルトの名無しさん2006/01/29(日) 02:10:14
>>164にずいぶん似ているけど、本人?>>265
0271デフォルトの名無しさん2006/01/29(日) 02:19:35
日曜の昼が締め切りってどーよ?
0272デフォルトの名無しさん2006/01/29(日) 02:28:48
C++の使用コンパイラのこと教えてくれてありがとです。
・・・VC++が予想以上に多かったかなぁ・・・漏れも導入を検討します。
使おうかと思ってたのがg++(gcc 3.3.2)だったんで、ちと調べてみます。
0273デフォルトの名無しさん2006/01/29(日) 02:52:07
>>266
islower(ch)?toupper(ch):tolower(ch)
と
(3)は全然分からないorz
0274デフォルトの名無しさん2006/01/29(日) 03:04:36
>>273
OKOK。
三項演算子が分からんのかな? もしかするとislower()とかの関数の方かも知れんけど、
まーとりあえず三項演算子を排除して書く。
(3)は20秒位で書いたカオスなソースなんで全部書き直しっと。

//(2)
#include<stdio.h>
#include<ctype.h>
int main(void){
    int ch;
    while((ch=getchar())!=EOF){
        if(islower(ch))
            ch = toupper(ch);
        else
            ch = tolower(ch);
        putchar(ch);
    }
    return 0;
}
//(3)
#include<stdio.h>
int main(void){
    int ch,old='\n',line=0;
    while((ch=getchar())!=EOF){
        if(old == '\n')printf("%3d: ",++line);
        old = ch;
        putchar(ch);
    }
    return 0;
}
0275デフォルトの名無しさん2006/01/29(日) 03:35:03
>>274
すみません。islower、toupper、tolowerも分からないですorz
たぶん'a'=97,'A'=65を利用するのかと思います。
0276デフォルトの名無しさん2006/01/29(日) 03:40:38
>>275
ってことはASCIIコード前提でOKなんだね
(2)
#include<stdio.h> 
#include<ctype.h> 
int main(void){ 
    int ch;
    while((ch=getchar())!=EOF){
        if('a' <= ch && ch <='z')
            ch = ch + 'A' -'a';
        else if('A' <=ch && ch <='Z')
            ch = ch + 'a' -'A'; 
        putchar(ch); 
    } 
    return 0; 
}
02772762006/01/29(日) 03:42:52
あ、#include<ctype.h>は要らんから消しといて
0278デフォルトの名無しさん2006/01/29(日) 03:52:15
>>276
神様ありがとうございます。
こうやって見ると自分でもできそうなのに全然できないorz感謝です。
もし暇があれば明日でもいいので>>254の4も教えていただけると最高です。
0279焼豚2006/01/29(日) 03:55:42
[1] 授業単元: プログラム演習
[2] 問題文(含コード&リンク):「グラフ作成プログラム」
               プログラムを実行したら、まずグラフ名と数値の入力を求められ、 
               数値データを入力したら、自動でXwindow上に二次元座標でグラフをプロットするプログラム。数値に対して座標軸などがオートで決定される。
[3] 環境
  OS:TurboLinux
  言語:C++
[4] 期限: 2/1
  どうかお願いします
0280デフォルトの名無しさん2006/01/29(日) 04:00:27
>>279
どこまで使っていいの?gnuplotとか、pgplotとか使っていいの?
0281デフォルトの名無しさん2006/01/29(日) 04:23:14
>279
なんだか出題内容をきちんと理解していないような気がするな。
こういうことか?

1.起動したら標準入力から二次元座標の列を手作業で入力する。
2.入力が終了したらEOFでも入れる。
3.x軸とy軸の最大値最小値を元に描画範囲を決定する。
4.gnuplotにデータを渡す。
0282デフォルトの名無しさん2006/01/29(日) 04:25:46
>>278
isspaceは確か授業で習ってないと言ってた気がするので(真面目に読んでないんで自信なし)
適当に空白は指定しておいた。

#include<stdio.h> 
int main(void){ 
    int ch;
    int in_word = 0;
    int line = 0,word = 0,bytes= 0;
    while((ch=getchar())!=EOF){
        ++bytes;
        if(ch=='\n' || ch==' ' || ch=='\t'){
            if(ch=='\n')++line;
            in_word=0;
        }else{
            if(in_word == 0){
                ++word;
                in_word = 1;
            }
        }
    }
    printf(" %d  %d %d",line,word,bytes);
    return 0; 
}
0283デフォルトの名無しさん2006/01/29(日) 04:31:05
>279
あと、オレの知り合いの大学の先生でここチェックしている人がいるから気をつけろよ
0284デフォルトの名無しさん2006/01/29(日) 08:43:34
isspaceとかtoupperとかググれば先頭に出てくるんだがなぁ
丸投げするような奴はその程度のことすらしないのかと改めて悲しくなった
0285焼豚2006/01/29(日) 10:54:52
>281
遅れて申し訳ありません。そんな感じです。おねがいします
0286デフォルトの名無しさん2006/01/29(日) 11:14:23
データを配列に記憶するのと構造体に記憶することの長所と短所を教えてください。
前スレでも聞いたのですがよくわかりませんでした。
プログラミングが全然わかってないので少しやさしめに答えてもらえるとうれしいです。
0287デフォルトの名無しさん2006/01/29(日) 11:24:46
よくわからんが配列は単純に連続した数字等を入れるときはいいんでない
数列とか
構造体はたくさんのパターンが同じ物入れたいときとか
100人分の身長体重視力・・・とか
参照する時もname.weightとかで出せて便利でしょて思う
0288デフォルトの名無しさん2006/01/29(日) 11:32:27
>>286
構造体というか線形リスト(連結リスト)のことだな。
287に付け加えると配列は必要な分だけあらかじめ領域を確保するから
格納するデータ数が決まって(又は予想出来る)いる場合じゃないと駄目(後から配列を大きくする事は出来ない)だけど
線形リストはデータ数が決まってなくても使える。
追加はノードを新しく作成してポインタでつなげればいいし、削除もポインタを繋ぎかえてノードを解放すればいい。
ソートなんかもポインタのつなぎかえだけでOK。
ただしプログラムが面倒になる。
0289デフォルトの名無しさん2006/01/29(日) 11:42:30
[1] 授業単元: プログラム基礎演習
[2] 問題文(含コード&リンク):
以下のプロトタイプ宣言で示すインターフェイスを持つ関数を、各問の指示に従って作りなさい。
ただし与えられたデータ構造、インターフェイスを変更しないこと。

(問)
配列内のデータを昇順に並び替える関数、及び降順に並び替える関数をそれぞれ作成せよ。
void sort(int[], int n);
/* d[] : データが格納されている関数, n : 配列内のデータの個数 */

  OS:vineLinux
  言語:C
 コンパイラ : gcc
[4] 期限: 06/1/31まで
[5]
・#include<stdio.h>のみでお願いします。
・アルゴリズム (探索、整列)に絡む範囲は未習です。


神様お助けください。
0290デフォルトの名無しさん2006/01/29(日) 11:43:52
俺も構造体の役割がよくわからんかった。
STUDENT:氏名、学生番号、性別・・・
とかやらずにそれぞれのグローバル配列持っておいて、
IDで管理すればいいじゃないか、と思ってた。

それでもできる、それがCクォリティ。
>>288のような連結リストのとき以外で使う意味がたいしてない。

と思っていたのはオブジェクト指向を勉強する前までだな。
0291デフォルトの名無しさん2006/01/29(日) 11:44:45
神じゃないから助けない><
0292デフォルトの名無しさん2006/01/29(日) 11:46:08
>>290
いやそうでもなくても構造体使うと
例えば多数の座標を持ちたい時とか
プログラム組む時にわかりやすいんだよ
0293デフォルトの名無しさん2006/01/29(日) 11:55:17
>>292
今では構造体なしの生活は考えられないです。
彼女と知り合えて幸せです。
0294デフォルトの名無しさん2006/01/29(日) 11:55:21
>>289

#define swap(type, x, y) do { type t = x; x = y; y = t; } while(0)

void sort(int d[], int n)
{
int i,j;

for(i = 0; i < n; i++) {
for(j = 1; j < n -1; j++)
if(d[j-1] > d[j])
swap(int d[j - 1], a[j]);
}
}

これは昇順だから降順はif(d[j-1] > d[j])をif(d[j-1] < d[j])とすればいい。
これは前後を比較して交換するバブルソートというソーティングアルゴリズム。
02952942006/01/29(日) 11:57:25
ミスった。
正しくはswap(int, d[j - 1] , d[j]);
02962862006/01/29(日) 11:58:12
>>287>>288
どうもありがとうございます。やっと意味がわかりました!
0297265 ◆H4LNFsCSUE 2006/01/29(日) 13:05:39
すいません。>>265に書き込んだ者ですがどなたかお答えいただけませんか?
期限は明日でも構いませんので。
0298デフォルトの名無しさん2006/01/29(日) 13:13:30
C++シラネ
0299デフォルトの名無しさん2006/01/29(日) 13:46:39
>>297
1)オペレーターの記述は教科書に書いてあるはず
2)教科書無いなら、書店や図書館に置いてあるC++の本でオペレーターの定義が書いてある本を読む
3)ぐぐる
だいたい、そんな回答だった気がする。
0300デフォルトの名無しさん2006/01/29(日) 14:39:18
どなたか>>253もお願いします。
0301デフォルトの名無しさん2006/01/29(日) 14:42:36
突然期限が明日に延びるってどういうことだろう。
しかも前の締め切りは日曜の12時だし。
簡単な問題だが、答える気なくすな。
0302265 ◆H4LNFsCSUE 2006/01/29(日) 14:53:40
>>265です。
>>301申し訳ないです。できるだけ早めにご回答を頂きたかったので、
   早めに設定してしまいました。
0303デフォルトの名無しさん2006/01/29(日) 15:00:56
>>302
そういう時は嘘でも「教授に頼んで延ばしてもらった」と言うもんだ。
以下を追加。これで動く。
Complex operator+(const Complex& x, const Complex& y) {
    return Complex(x.re() + y.re(), x.im() + y.im());
}
0304265 ◆H4LNFsCSUE 2006/01/29(日) 15:17:26
>>303ご回答ありがとうございます。それはどこに書けばいいですか?また、
std::ostream& operator<<(std::ostream& os,Complex& c){
c.print(os);
return os;
}
はどこに書けばいいでしょうか?
0305デフォルトの名無しさん2006/01/29(日) 15:22:20
>>304
#include<iostream>
class Complex
{
    // 略
};
Complex operator+(const Complex& x, const Complex& y) {
    // 略
}
std::ostream& operator<<(std::ostream& os, Complex& c){
    // 略
}
int main(){
    // 略
}
0306デフォルトの名無しさん2006/01/29(日) 15:28:22
>>300
ほい。かなりいい加減だから、適当に直してね。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1569.txt
#操作間違って、スレたてちゃった。削除しなきゃ。orz
0307デフォルトの名無しさん2006/01/29(日) 15:34:34
>>300
#include<stdio.h>
#include<stdlib.h>
#define ON 1
#define OFF 0
int main(void)
{
int i,j,x,y, LIGHT[5][5]={{ON,ON,OFF,OFF,OFF},
{ON,OFF,OFF,OFF,OFF},
{OFF,OFF,OFF,ON,OFF},
{OFF,OFF,ON,ON,ON},
{OFF,OFF,OFF,ON,OFF}};
int flag;
while(1){
printf(" 01234\n");
for(i=0; i<5; i++){ printf("%d", i); for(j=0; j<5; j++){ printf("%d", LIGHT[i][j]); } printf("\n"); }
printf("x:"); scanf("%d", &y);
printf("y:"); scanf("%d", &x);
if( (x < 0) || (4 < x) || (y < 0) || (4 < y)) {printf("wrong number!!\nreinput.\n\n");continue;}
if( (x - 1) >= 0) LIGHT[x-1][y] = LIGHT[x-1][y]?OFF:ON;
if( (x + 1) <= 4) LIGHT[x+1][y] = LIGHT[x+1][y]?OFF:ON;
if( (y - 1) >= 0) LIGHT[x][y-1] = LIGHT[x][y-1]?OFF:ON;
if( (y + 1) <= 4) LIGHT[x][y+1] = LIGHT[x][y+1]?OFF:ON;
LIGHT[x][y] = LIGHT[x][y]?OFF:ON;
flag = 0; for(i=0; i<5; i++) { for(j=0; j<5; j++) { if(LIGHT[i][j] == ON) { flag=1; break; } } } if (flag == 0) break; }
printf("complete!\n");
return 0;
}

多分動くと思う。線引き色付けは自分でやってね。
0308デフォルトの名無しさん2006/01/29(日) 15:34:46
設問のほーが間違ってるんだとおもうが、oparator <<の第2引数はconstをつけるもんじゃなかろーか?
0309265 ◆H4LNFsCSUE 2006/01/29(日) 15:44:17
>>305ありがとうございました。
>>308ありがとうございました。>>305で解決しました。
03101062006/01/29(日) 16:13:40
>>106をお願いしますm(__;)m
ってかどうやら問題がだいぶ不親切で分かりにくいみたいですね・・・
ここの住人にも理解できないのに俺にできるワケねぇorz
0311デフォルトの名無しさん2006/01/29(日) 16:21:47
[1] 授業単元: プログラミングC++
[2] 問題文(含コード&リンク):
次のプログラムは学生の成績データを管理するものである。クラスRecordは1人の学生の[番号(id),名前(name),点数(score)]
を記録するもので、出力用の関数(operator<<)が定義される。成績データはクラスSeisekiのdataにRecordのリストとして記録されている。
Seisekiはoperator<<と3つのメンバ関数insert,lookup,erase_worstを持つ。その働きは
�@insert(int id,const std::string& nm, int s):[番号(id),名前(name),点数(score)]というデータを追加
�Alookup(int id):番号がidのデータを検索し、std::coutに出力する。(なければnot foundと出力)。
�Berase_worst():点数の最も悪い学生のRecordを削除
というものである。空白を埋め、プログラムを完成させよ。
プログラム:http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=26928
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc 2.9
 [3.3] 言語: C++
[4] 期限: 1月31日ですが、早めにしていただければありがたいです
よろしくお願いします。
0312デフォルトの名無しさん2006/01/29(日) 16:57:09
>>311
条件が不足している。insert()はどういう順番に追加するの?
0313デフォルトの名無しさん2006/01/29(日) 17:01:03
>>312「できれば番号順にソートしろ」とのことですが、
insert()を呼び出すごとに末尾に追加するようにしていただければ充分です。
0314デフォルトの名無しさん2006/01/29(日) 17:05:16
>>310
問題は自明なんだけど、書きかけ方が酷いんだよなあ。
もし書きかけた部分も訂正していいなら、もうちょいやってみるけど。
0315デフォルトの名無しさん2006/01/29(日) 17:16:12
>>310
ちょっと追ってみたが、、、
・Main部
char *FileName = "graph";
GetMatrix(FileName);
shortestpath();
とすると、、、
最初のElementSeparate( MatFile, NodeLabel)の中で
List[LabelNum] = atoi( IntString );
の部分でList[LabelNum]がList[2]=(*NodeLabel+2)をオーバーするんだけどw

それとノードが5個で3x3の行列容易されてもパス重み格納できなくない?
0316デフォルトの名無しさん2006/01/29(日) 17:23:43
>>311
idの番号順(昇順、小さい順)。挿入する場所を探してinsertする。
> // 点数が最も悪い学生を消去
しっかしこの辺り、背筋が寒くなる先生だなw

void Seiseki::insert(int id, const std::string& nm, int s)
{
    std::list<Record>::iterator first = data.begin(), last = data.end();
    while (first != last && first->id < id) ++first;
    data.insert(first, Record(id, nm, s));
}
void Seiseki::lookup(int id) const
{
    std::list<Record>::const_iterator first = data.begin(), last = data.end();
    while (first != last && first->id != id) ++first;
    if (first != last) std::cout << *first << std::endl;
}
void Seiseki::erase_worst()
{
    std::list<Record>::iterator first = data.begin(), last = data.end(), i = first;
    if (first != last)
        for (++first; first != last; ++first)
            if (first->score < i->score)
                i = first;
    if (i != last) data.erase(i);
}
0317310(106)2006/01/29(日) 17:24:22
>もし書きかけた部分も訂正していいなら

もうそれでお願いしますorz
とりあえずちゃんと動作してくれればなんとかなるので。
0318デフォルトの名無しさん2006/01/29(日) 17:28:54
>>317
んじゃ、入力ファイルの形式ちょうだい。

なんかファイル読み込みのあたりから狂ってる気がする。
03193112006/01/29(日) 17:46:36
>>316さん、ありがとうございました!
03203172006/01/29(日) 18:01:26
>ファイル読み込みのあたりから狂ってる気がする
え゛え゛え゛・・・先生しっかりしろよorz

入力ファイルの形式って・・・
0 1 2 3 4
0 2 0 2 0
2 0 2 1 3
0 2 0 5 4
2 1 5 0 2
0 3 4 2 0
コレだと思うですが。違うんですか(・ω・)?
0321デフォルトの名無しさん2006/01/29(日) 18:03:23
>>317(310)(106)
一応、shortsteppathの中は読み終わったよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1571.txt
動作確認していなので、間違っている可能性もあるけど。
たぶん、このスレでこれぐらいの課題は、できる人は多いけど、
やりたくない人も多いだけだと思うよ。
0322デフォルトの名無しさん2006/01/29(日) 18:11:02
>>320
1行目が何なのか、二行目は何なのか、とかそういうのを聞いてる。

106 では1行目は接点番号って書いてあるけど、たとえば

8 7 6 5
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0

みたいな入力も許されるの?
03233212006/01/29(日) 18:14:00
>>322
いや、たぶん0スタートだと思うよ。あの関数、
0スタートで書いてあったから。
0324デフォルトの名無しさん2006/01/29(日) 18:18:49
GetMatrix()の不足分。
if ( Store ) {
  Store = OFF ;
  IntString[j] = '\0' ;
  List[LabelNum] = atoi( IntString ) ;
  if(DEB) printf(" List[%d] %d", LabelNum, List[LabelNum] ) ;
  LabelNum++ ;
}

俺の力量不足なんだろうが、読むのに時間のかかるプログラムだな・・・。
0325デフォルトの名無しさん2006/01/29(日) 18:21:28
>>323
配列の添え字と、接点番号が一致している必要は無いでしょ。
0326デフォルトの名無しさん2006/01/29(日) 18:24:29
あー 読んでてイライラしてきた.

とりあえず息抜きに全部書き直してみたプログラムおいときますね
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1572.c
03273202006/01/29(日) 18:25:35
0 1 2 3 4
0 2 0 2 0
2 0 2 1 3
0 2 0 5 4
2 1 5 0 2
0 3 4 2 0
これを分かりやすく書くとこうなります
http://ccfa.info/cgi-bin/up/src/up23700.jpg
x接点とy接点との距離が数値なわけです

そして画像で表すとこうなります
http://ccfa.info/cgi-bin/up/src/up23699.jpg
0328デフォルトの名無しさん2006/01/29(日) 18:27:22
まあ・・・入力末尾に改行がないと無限ループしそーだしな・・・>モトの
おう。それくらい、キレイキレイに書いてくださると明快だなぁ>326
0329デフォルトの名無しさん2006/01/29(日) 18:29:40
>>327
それは分かるんだけど、一例でしかないでしょ。

最初の行は必ず 0 から始まる連番なの?違う場合はありうるの?それ以外の入力は考えなくていいの?
0330デフォルトの名無しさん2006/01/29(日) 18:32:36
>>325
そうだね。読み込みの関数を見てなかったから気が付かなかったけど、
グローバルでノードの名前を格納する変数を作っているみたいだね。
だから、最初のノードの名前はとりあえず0の必要はなさそう。
早とちりスマソ
0331デフォルトの名無しさん2006/01/29(日) 18:37:00
>>330
でも最終結果を表示するところではその番号を参照してないんだよな。
■ このスレッドは過去ログ倉庫に格納されています