知識、知恵のカタマリ

[PR]365日、乾かない肌へ。

解決済

このプログラム見てください。

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

#define NVALUE 30

#define MAXSIZE NVALUE

struct City{
float x;
float y;
};

struct Country{
struct City cities[MAXSIZE];
int size;
};

struct Itine{
float quality;

int route[MAXSIZE];
int noc;
};

float plength(struct Itine *tour,struct Country *pcountry)
{
int i,j;
double dy;
double dx;

float length=0.0;

for(i=0;i<tour->noc;i++){

j=i+1;
if(j==tour->noc)
j=0;

struct City &c1=pcountry->cities[tour->route[i]-1];
struct City &c2=pcountry->cities[tour->route[j]-1];


double dx = c1.x-c2.x;
double dy = c1.y-c2.y;
length+=(float)sqrt(dx*dx+dy*dy);
}

return length;
}



なんか間違っていますか?

2006-10-10 17:39の質問
この質問と回答を読んで役に立った場合は「役に立つ質問」に投票してください。投票が多い質問は、役に立つ質問一覧に掲載され、より多くの人に見てもらうことができます。
Ads By Google

回答(1)

1.

2006-10-10 20:39:28ベスト
プログラムの論理そのものに踏み込んだ発言はできませんが、不思議な箇所がありますね。
dx、dy がforループの外と内で定義されています。通常は、外側の定義だけでいいのでは?

あと、なんか Cっぽい書き方けど、コンパイラはC++なんですかね。
だったら、わざわざ、struct City とか書かなくても、City だけでもいいような。
でも、これは、好き好きってやつ?
回答レベル : アドバイス

どうもすみません…

Ads By Google

コメント(7)

#1.  p\df
2006-10-10 19:27:17

質問の仕方が間違ってます。
どのような仕様のプログラムで何がしたいのかを明記しないと 検証ができません。

#2.  respective
2006-10-10 20:59:54

>>たのたのさん

すみません、エラーが出てしまったので、
そのエラーの部分を見てもらいたかったのです。

2006-10-10 21:56:36

Cなら数箇所文法エラー。C++ならコンパイルは通りますが、C++のプログラムには見えないですね。

C++なら、mainを正しく書けばエラーにはならないですよ。たぶん、エラーは他の部分だと思います。

C++流に書くなら、class Countryを作って、その中に距離を求めるメソッドを置くのが自然。

あと、設計的に、構造体の中の配列のバウンダリーがわからないので危ないです。

2006-10-10 23:29:13

処理系がC++かな~っと思ったのは、参照が使われてるようなので。
あと、一緒にエラーメッセージも添えてもらえるとよかったかもしれませんね。

蛇足ですが、class Country も sturct Country も似たりよったりです。好きに使えばいいと思いますよ。そのうちメソッドとかメンバーとか使えるようになりますよ。
がんばれ!

#5.  respective
2006-10-11 00:44:47

そうですね、C++としてコンパイルしたらエラーが格段に少なくなりました!
でもやはりエラーが残っています。
もう一度見直してみたいと思います。

2006-10-11 01:26:46

>>#4
Cで書くなら、struct Countryに関数ポインタを置いて・・・という話ですよね。オブジェクト指向なCプログラム結構好きですよw

2006-10-11 01:55:32

>>#5
Cとして書きたいなら、参照による宣言:
struct City &c1=...;
のようなものは使えません。この書き方は、右辺にエイリアスをつけるものなので、どうしてもやりたければ、
struct City *c1=&(...);
のように、ポインタ宣言でアドレスを代入するとよいと思いますが、混乱するような使わない方が吉です。

また、変数の定義・宣言は、途中に書いてはいけなくて、スコープの先頭に並べないといけません。
{
int i;
double dx;
struct Country c1;
...
この後に手続きを書く
}
これは、C++でも作法として覚えておいた方がいいです。現に、double dxは2回定義されていますので。

もうひとつアドバイスすると、コメントを書いてからプログラムをした方がよいと思います。

トラックバック

トラックバックURL: