C言語でキーボードから20個の点のx、y座標を配列pに入力させるプログラム
のコンパイルがエラーになってしまいます。色々な書き方をしてみたのですが点の入力のコードが間違っているのかその他でエラーになっているのかが分からななく手詰まり状態という感じです。エラーの書き忘れ申し訳ないです。
Main.c:14:8: error: assigning to 'int' from incompatible type 'struct point'
pivot =p[somewhere];
^~~~~~~~~~~~~
Main.c:16:16: error: invalid operands to binary expression ('struct point' and 'int')
do{ while(p[i]<pivot)i++;
~~~~^~~~~~
Main.c:17:16: error: invalid operands to binary expression ('struct point' and 'int')
while(p[j]>pivot)j--;
~~~~^~~~~~
Main.c:19:13: error: assigning to 'int' from incompatible type 'struct point'
{ temp = p[i];p[i] =p[j];p[j] =temp;
^ ~~~~
Main.c:19:36: error: assigning to 'struct point' from incompatible type 'int'
{ temp = p[i];p[i] =p[j];p[j] =temp;
^~~~~
Main.c:24:21: error: member reference base type 'int' is not a structure or union
quicksort(first.j);/pivotより小さなデータについてquicksort()を行う/
~~~~~^~
Main.c:39:17: error: use of undeclared identifier 'n'
for (i =1;i<n;i+ +)
^
Main.c:39:23: error: expected expression
for (i =1;i<n;i+ +)
^
Main.c:40:46: warning: '&&' within '||' [-Wlogical-op-parentheses]
if(p[i].y<p[min].y ||p[i].y==p[min].y&&p[i].x>p[min].x)
~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
Main.c:40:46: note: place parentheses around the '&&' expression to silence this warning
if(p[i].y<p[min].y ||p[i].y==p[min].y&&p[i].x>p[min].x)
^
( )
Main.c:42:22: error: expected expression
temp =p[0];p[0] =[min];p[min] =temp;/関数area()を使って1番目以降の点を偏角順にソート/
^
Main.c:44:16: error: use of undeclared identifier 'n'
for(i =2;i<n;i++)
^
Main.c:45:27: error: no member named 'p' in 'struct point'
{while (area(p[top-1].p[top].p[i])<= 0)
~~~~~~~~ ^
Main.c:47:11: warning: misleading indentation; statement is not part of the previous 'while' [-Wmisleading-indentation]
temp [top];p[top] =p[i];p[i]=temp;
^
Main.c:45:6: note: previous statement is here
{while (area(p[top-1].p[top].p[i])<= 0)
^
Main.c:47:16: error: subscripted value is not an array, pointer, or vector
temp [top];p[top] =p[i];p[i]=temp;
~~~~ ^~~~
Main.c:54:1: error: unknown type name 'Void'; did you mean 'void'?
Void main(void)
^~~~
void
Main.c:54:1: error: 'main' must return 'int'
Void main(void)
^~~~
int
Main.c:58:47: error: expected expression
printf("p[%d].y=",i); scanf("%d",&p[i].y);)
^
Main.c:62:2: error: expected '}'
}
^
Main.c:55:1: note: to match this '{'
{
^
2 warnings and 16 errors generated.
C
1#include<stdio.h> 2#include<math.h> 3#define N 20 4struct point{int x,y;}; 5struct point p[N]; 6int area(struct point q1,struct point q2,struct point q3) 7{ 8 return((q1.x-q3.x)*(q2.y-q3.y)+(q2.x-q3.x)*(q3.y-q1.y)); 9} 10void quicksort(int first,int last)/*quicksort()*/ 11{int i,j,pivot,somewhere,temp; 12 if(first<last) 13 {somewhere=(first+last)/2; 14 pivot =p[somewhere]; 15 i = first;j =last; 16 do{ while(p[i]<pivot)i++; 17 while(p[j]>pivot)j--; 18 if(i<=j) 19 { temp = p[i];p[i] =p[j];p[j] =temp; 20 /*pivotより大きなデータp[i]とpivotより小さいデータo[j]を交換する*/ 21 i++;j--; 22 } 23 }while(i<=j); 24 quicksort(first.j);/*pivotより小さなデータについてquicksort()を行う*/ 25 quicksort(i,last);/*pivotより大きなデータについてquicksortを行う*/ 26 27 28 } 29 30} 31int GrahamScan() 32{ 33 int i,top,min; 34 struct point temp; 35 int area(); 36 void quicksort(); 37 38 min =0; 39 for (i =1;i<n;i+ +) 40 if(p[i].y<p[min].y ||p[i].y==p[min].y&&p[i].x>p[min].x) 41 min =i;/*最も下の番号を求める*/ 42 temp =p[0];p[0] =[min];p[min] =temp;/*関数area()を使って1番目以降の点を偏角順にソート*/ 43 top =1; 44 for(i =2;i<n;i++) 45 {while (area(p[top-1].p[top].p[i])<= 0) 46 top --;/*3点が時計回りなら中央の点を除去*/ 47 temp [top];p[top] =p[i];p[i]=temp; 48 /*i番目の点を凸包の点として登録(元のデータを破壊しないため、topとi番目の点を交換する)*/ 49 } 50 return(top+1);/*凸包の頂点を報告*/ 51 52 53} 54Void main(void) 55{ 56for(int i =0; i < N; ++i){ 57 printf("p[%d].x=",i); scanf("%d",&p[i].x); 58 printf("p[%d].y=",i); scanf("%d",&p[i].y);) 59 60 61 62}
回答4件
あなたの回答
tips
プレビュー