#include <stdio.h>
#include <math.h>
#define place 35
typedef struct
{
int banngou;
double x,y;
char name[22];
int kosuu;
int tonari[9];
}mapdate;
mapdate yonezawa[35];
void read_data(char *filename)
{
{
FILE *fp;
int i,j;
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("ファイル作成失敗 \n");
}
for(i=0;i<35;i++)
{
fscanf(fp, "%d,%lf,%lf,%[^,],%d,\n",&yonezawa.banngou,&yonezawa.x,&yonezawa.y,yonezawa.name,yonezawa.kosuu,yonezawa.tonari);
for(j=0;j<yonezawa.kosuu;j++)
{
fscanf(fp,"%d",yonezawa.tonari[j]);
}
fclose(fp);
}
void main()
{
int i,j,k,banngou,banngou2;
int f=0;
read_data("map.dat");
printf("交差点の番号を入れて下さい.\n");
scanf("%d",&banngou2);
for(i=0;i<35;i++)
{
printf("%d,%lf,%lf,%s,%d,%d \n",yonezawa.banngou,yonezawa.x,yonezawa[i].y,yonezawa[i].name,yonezawa[i].kosuu,yonezawa[i].tonari);
f=1;
}
if(f==0) printf("交差点が見つかりません \n");
{
for(j=0;j<yonezawa[i].kosuu;j++)
{
printf("隣接する交差番号は%dです。\n",yonezawa[i].tonari[j]);
printf("隣接する交差名は%sです。\n",yonezawa[yonezawa[i].tonari[j]-1].name);
}
{
float A[2],B[2],d;
printf("打ち込んだ点と隣接間の距離を求める\n");
printf("打ち込んだ点のx座標:"); scanf("%lf",&A[0]);
printf("打ち込んだ点のy座標:"); scanf("%lf",&A[1]);
d=sqrt(pow(A[0]-B[0],2)+pow(A[1]-B[1],2));
printf("打ち込んだ点と隣接間の距離は%f\n",d);
}
}
}
}
}
まずもともとの問題として1.交差点番号を打ち込むと,隣接する交差点名と交差点番号および打ち込んだ交差点からの距離を表示させるプログラムを作成しなさい.という問題で外部からデータファイルmap.dat(1, 76.0, -233.0, 西米沢駅, 1, 2
2, 204.0, -249.0, 西部小学校, 5, 1, 3, 4, 17, 33
3, 177.0, -85.0, ニトリ, 3, 2, 4, 6
4, 281.0, -185.0, 木場町, 3, 2, 3, 5
5, 458.0, -158.0, 法泉寺, 3, 4, 6, 18
6, 439.0, -55.0, 徳町, 3, 3, 5, 7
7, 546.0, -64.0, 中央高校, 3, 6, 8, 9
8, 563.0, -16.0, 総合公園, 1, 7
9, 789.0, -110.0, 市役所, 3, 7, 10, 16
10, 1064.0, -174.0, 花沢郵便局, 2, 9, 11
11, 1129, -143, 花沢, 2, 10, 12
12, 1249, -457, ルートインホテル, 2, 11, 13
13, 1088, -463, 米沢駅, 3, 12, 14, 22
14, 836, -419, 大町, 3, 13, 15, 22
15, 727, -396, 大沼デパート, 4, 14, 16, 19, 21
16, 743, -317, 立町, 3, 9, 15, 17
17, 657, -294, 第一ホテル, 4, 2, 16, 18, 19
18, 675, -192, 西宮戎神社, 2, 5, 17
19, 640, -374, 興譲小学校, 3, 15, 17, 20
20, 628, -428, 門東町, 4, 19, 21, 26, 33
21, 715, -453, 花膳, 4, 15, 20, 22, 24
22, 860, -475, 相生町, 4, 13, 14, 21, 23
23, 922, -717, ホテル平成, 2, 22, 24
24, 670, -651, 南部小学校, 3, 21, 23, 25
25, 598, -643, エネオス, 3, 24, 26, 28
26, 613, -499, ファミリーマート, 3, 20, 25, 27
27, 540, -477, 上杉神社, 1, 26
28, 593, -712, 城南, 3, 25, 29, 34
29, 536, -701, 山大正門, 3, 28, 30, 31
30, 530, -742, 山形大学, 1, 29
31, 413, -672, 第二中学校, 2, 29, 32
32, 340, -636, ヤマザワ, 2, 31, 33
33, 220, -391, 直江町, 3, 2, 20, 32
34, 575, -807, 琴平神社, 2, 28, 35
35, 621, -853, 南米沢駅, 1, 34
交差番号点、x座標、Y座標、交差点名、隣接する交差点の数、隣接する交差点番号)を読み取り以上のようなものを解くのですが
以下のような文字列が出てしまいます。またそもそも答えを出すことができません。
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `_WinMain@16'
collect2: ld はステータス 1 で終了しました
変な文字列がcygwinにてあらわされるのを何とかしたいです。
Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。
#include <stdio.h>
#include <math.h>
#define place 35
typedef struct
{
int banngou;
double x, y;
char name[22];
int kosuu;
int tonari[9];
}mapdate;
mapdate yonezawa[35];
void read_data(char* filename)
{
{
FILE* fp;
int i, j;
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("ファイル作成失敗 \n");
}
for (i = 0; i < 35; i++)
{
fscanf(fp, "%d,%lf,%lf,%[^,],%d,\n", &yonezawa.banngou, yonezawa.x, &yonezawa.y, yonezawa.name, yonezawa.kosuu, yonezawa.tonari);
for (j = 0; j < yonezawa.kosuu; j++)
{
fscanf(fp, "%d", yonezawa.tonari[j]);
}
fclose(fp);
}
void main()
{
int i, j, k, banngou, banngou2;
int f = 0;
read_data("map.dat");
printf("交差点の番号を入れて下さい.\n");
scanf("%d", &banngou2);
for (i = 0; i < 35; i++)
{
printf("%d,%lf,%lf,%s,%d,%d \n", yonezawa.banngou, yonezawa.x, yonezawa[i].y, yonezawa[i].name, yonezawa[i].kosuu, yonezawa[i].tonari);
f = 1;
}
if (f == 0) printf("交差点が見つかりません \n");
{
for (j = 0; j < yonezawa[i].kosuu; j++)
{
printf("隣接する交差番号は%dです。\n", yonezawa[i].tonari[j]);
printf("隣接する交差名は%sです。\n", yonezawa[yonezawa[i].tonari[j] - 1].name);
}
{
float A[2], B[2], d;
printf("打ち込んだ点と隣接間の距離を求める\n");
printf("打ち込んだ点のx座標:"); scanf("%lf", &A[0]);
printf("打ち込んだ点のy座標:"); scanf("%lf", &A[1]);
d = sqrt(pow(A[0] - B[0], 2) + pow(A[1] - B[1], 2));
printf("打ち込んだ点と隣接間の距離は%f\n", d);
}
}
}
}
}
yonezawa は配列だろう?
よく見てごらん!
Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。
>
以下のような文字列が出てしまいます。またそもそも答えを出すことができません。
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `_WinMain@16'
collect2: ld はステータス 1 で終了しました
ーーーーー
文字列というより ”エラー” 表示ですよ。
そもそも WinMain@16 というのがおかしいよ。
main を使ってるから コンソール・アプリケーションのはずだからね。
まず Hello World!から確認してくださいね。
以下のような文字列が出てしまいます。またそもそも答えを出すことができません。
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `_WinMain@16'
collect2: ld はステータス 1 で終了しました
ーーーーー
文字列というより ”エラー” 表示ですよ。
そもそも WinMain@16 というのがおかしいよ。
main を使ってるから コンソール・アプリケーションのはずだからね。
まず Hello World!から確認してくださいね。
Re: 変な文字列がcygwinにてあらわされるのを何とかしたいです。
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
コピペミスなのか、main関数の定義がread_data関数の中に入ってしまっていますね。
これではエントリポイントとして認識されないでしょう。
また、C言語では関数のネストはGCC拡張であり、C++では使えないので、
なるべく使わないほうがいいと思います。
さらに、エントリポイントのmain関数の戻り値の型はvoidではなくintにするべきです。
voidだとC言語では処理系依存になり、C++の規格では認められません。
そして、int型のyonezawa[i].kosuuやyonezawa[i].tonari[j]をfscanf関数の書式%dに対応するところに渡しています。
%dにはint型へのポインタを渡すべきであり、これでは未定義動作になるでしょう。
(yonezawa[i].tonariに対応する書式がありませんが、これは無駄になるだけで無害です)
その上、fp == NULLのときも、メッセージを出力するだけでそのまま処理を続けてしまっていますね。
これはアクセス違反の原因になるでしょう。
ループ中、まだデータを読みたいはずのタイミングでfcloseを呼んでいるのもおかしいですね。
C99以降であればprintf関数で%lfを使ってもいいはずですが、なぜか手元の環境ではうまく動きませんでした。
%fのほうがいいでしょう。
printfの書式%dに(配列から変換された)ポインタを渡している部分があり、未定義動作になります。
確実にf=1にする処理の後にf == 0の判定があるのもおかしいですね。
ループの後、i=35でyonezawa[i]にアクセスし、範囲外なので未定義動作になりますね。
float型のA[0]やA[1]にscanfの書式%lfでデータを読み込む処理、
未初期化の自動変数(値は不定)B[0]やB[1]を計算に使う処理もあり、いずれも未定義動作になります。
これらの点などを修正したコードを以下に示します。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
コピペミスなのか、main関数の定義がread_data関数の中に入ってしまっていますね。
これではエントリポイントとして認識されないでしょう。
また、C言語では関数のネストはGCC拡張であり、C++では使えないので、
なるべく使わないほうがいいと思います。
さらに、エントリポイントのmain関数の戻り値の型はvoidではなくintにするべきです。
voidだとC言語では処理系依存になり、C++の規格では認められません。
そして、int型のyonezawa[i].kosuuやyonezawa[i].tonari[j]をfscanf関数の書式%dに対応するところに渡しています。
%dにはint型へのポインタを渡すべきであり、これでは未定義動作になるでしょう。
(yonezawa[i].tonariに対応する書式がありませんが、これは無駄になるだけで無害です)
その上、fp == NULLのときも、メッセージを出力するだけでそのまま処理を続けてしまっていますね。
これはアクセス違反の原因になるでしょう。
ループ中、まだデータを読みたいはずのタイミングでfcloseを呼んでいるのもおかしいですね。
C99以降であればprintf関数で%lfを使ってもいいはずですが、なぜか手元の環境ではうまく動きませんでした。
%fのほうがいいでしょう。
printfの書式%dに(配列から変換された)ポインタを渡している部分があり、未定義動作になります。
確実にf=1にする処理の後にf == 0の判定があるのもおかしいですね。
ループの後、i=35でyonezawa[i]にアクセスし、範囲外なので未定義動作になりますね。
float型のA[0]やA[1]にscanfの書式%lfでデータを読み込む処理、
未初期化の自動変数(値は不定)B[0]やB[1]を計算に使う処理もあり、いずれも未定義動作になります。
これらの点などを修正したコードを以下に示します。
#include <stdio.h>
#include <math.h>
#define place 35
typedef struct
{
int banngou;
double x,y;
char name[22];
int kosuu;
int tonari[9];
}mapdate;
mapdate yonezawa[35];
void read_data(const char *filename)
{
{ /* このブロックは意図がわからないが、無害なので残す */
FILE *fp;
int i,j;
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("ファイル作成失敗 \n");
return;
}
for(i=0;i<35;i++)
{
fscanf(fp, "%d,%lf,%lf,%[^,],%d",&yonezawa[i].banngou,&yonezawa[i].x,&yonezawa[i].y,yonezawa[i].name,&yonezawa[i].kosuu);
for(j=0;j<yonezawa[i].kosuu;j++)
{
fscanf(fp,",%d",&yonezawa[i].tonari[j]);
}
}
fclose(fp);
}
}
int main(void)
{
int i,j,k,banngou,banngou2;
int f=0;
read_data("map.dat");
printf("交差点の番号を入れて下さい.\n");
scanf("%d",&banngou2);
for(i=0;i<35;i++)
{
printf("%d,%f,%f,%s,%d",yonezawa[i].banngou,yonezawa[i].x,yonezawa[i].y,yonezawa[i].name,yonezawa[i].kosuu);
for(j=0;j<yonezawa[i].kosuu;j++)
{
printf(",%d",yonezawa[i].tonari[j]);
}
printf("\n");
if (banngou2 == yonezawa[i].banngou){
k=i; /* kが宣言されているのに使われていないようなので、利用する */
f=1;
}
}
if(f==0) printf("交差点が見つかりません \n");
else /* 交差点が見つかった場合のみ次の処理に進む */
{
i=k; /* 保存しておいた、番号が一致した添字を復帰する */
for(j=0;j<yonezawa[i].kosuu;j++)
{
printf("隣接する交差番号は%dです。\n",yonezawa[i].tonari[j]);
printf("隣接する交差名は%sです。\n",yonezawa[yonezawa[i].tonari[j]-1].name);
float A[2],B[2],d;
printf("打ち込んだ点と隣接間の距離を求める\n");
printf("打ち込んだ点のx座標:"); scanf("%f",&A[0]);
printf("打ち込んだ点のy座標:"); scanf("%f",&A[1]);
B[0]=yonezawa[yonezawa[i].tonari[j]-1].x;
B[1]=yonezawa[yonezawa[i].tonari[j]-1].y;
d=sqrt(pow(A[0]-B[0],2)+pow(A[1]-B[1],2));
printf("打ち込んだ点と隣接間の距離は%f\n",d);
}
}
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)