Ir ao conteúdo

Posts recomendados

Postado

Gostaria da ajuda de vocês, sou estudante e não tenho conhecimento ainda de C++.

E queria saber se alguém consegue passar esse algoritmo para linguagem C.

 

 
#include <stdio.h>
#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>
using namespace std;
#define i64 long long
i64  GCD(i64  a,i64  b){ while(b){b ^= a ^=b ^= a %=b;}  return a;}

struct point{ i64 x,y;
              point (i64 p1 , i64 p2){
                  x = p1;
                  y = p2;
              }
};

i64 poly_area( vector<point>P){ // calculate area of polygoan/convex

    i64 res = 0 , x1 ,y1,x2,y2;
    for( int i = 0 , sz = P.size() ; i < sz ; i++ ){
            x1 = P[i].x , x2 = P[(i+1)%sz].x;
            y1 = P[i].y , y2 = P[(i+1)%sz].y;
            res += ( x1 * y2 - x2 * y1 );
    }
    // res is the determinant of these points
    return fabs(res)*0.5 ;
}

i64 getBorderPoints(vector<point>P){

    i64 B = 0 ;
    int n = P.size();
    for( int i = 0, j = n - 1; i < n; j = i++ ) {

            i64 ret = GCD( abs( P[i].x - P[j].x ), abs( P[i].y - P[j].y ) );
            B += ret;
    }
    return B ;
}

int main()
{
    int i , n ;
    while(scanf("%d",&n) && n )
    {

        vector<point>P;
        for( i = 0 ; i < n ; i++ ){
                i64 x,y;
                scanf("%lld %lld",&x,&y);
                P.push_back( point(x,y) );
        }

        i64 A = poly_area(P);
        i64 B = getBorderPoints(P);
        i64 I = A + 1 - B/2 ;
        // picks theorem : A = I + B/2 - 1
        printf("%lld\n",I);
    }
}

 

  • Amei 1
Postado

@Esmeraldo Euclides Carneiro Junior   esse código não funciona , e para converter será difícil , pois  precisa criar funções que façam coisa que a linguagem c++ faz facilmente  mas em c é complicado ,   creio que seria melhor ver o que pede o enunciado e fazer já em linguagem c. então se puder / quiser poste o enunciado e ajudaremos .

  • Curtir 1
Postado

@Esmeraldo Euclides Carneiro Junior C não suporta STL/vector, mas isso pode ser substituído por alocação dinâmica. E nas funções tem que colocar o parâmetro com o tamanho do vetor,

 

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

#define i64 long long

typedef struct{
    i64 x,y;
}point;

i64 GCD(i64 a, i64 b){
    while(b){
        b ^= a ^=b ^= a %=b;
    }
    return a;
}

i64 poly_area(point *P, int n){ // calculate area of polygoan/convex
    i64 res = 0 , x1 ,y1,x2,y2;
    for( int i = 0 , sz = n ; i < sz ; i++ ){
            x1 = P[i].x , x2 = P[(i+1)%sz].x;
            y1 = P[i].y , y2 = P[(i+1)%sz].y;
            res += ( x1 * y2 - x2 * y1 );
    }
    // res is the determinant of these points
    return fabs(res)*0.5 ;
}

i64 getBorderPoints(point *P, int n){
    i64 B = 0 ;
    for( int i = 0, j = n - 1; i < n; j = i++ ){
            i64 ret = GCD( abs( P[i].x - P[j].x ), abs( P[i].y - P[j].y ) );
            B += ret;
    }
    return B ;
}

int main(){
    int n;
    while(scanf("%d",&n) && n ){
        point *P = (point *)malloc(sizeof(point) * n);
        for(int i = 0 ; i < n ; i++ ){
            scanf("%lld %lld",&P[i].x,&P[i].y);
        }
        i64 A = poly_area(P, n);
        i64 B = getBorderPoints(P, n);
        i64 I = A + 1 - B/2 ;
        // picks theorem : A = I + B/2 - 1
        printf("Valor = %lld\n",I);
        free(P);
    }
}

 

 

  • Obrigado 2
Postado
struct point{ i64 x,y;
              point (i64 p1 , i64 p2){
                  x = p1;
                  y = p2;
              }
};

 

Esse parece ser um programa em C que foi convertido errado para C++. E agora você precisa disso em C :) 

 

A única coisa que usa aí de C++ é std::vector para criar um vetor de pontos. E usa apenas os métodos size() e push_back() que, sem surpresas, retornam o tamanho e acrescentam um ponto ao vetor.

 

O vetor aí não tem um construtor explícito. Mas em C ou você cria um array de um tamanho máximo se não espera polígonos muito grandes, ou cria a partir de um valor de n como fazer em main() no seu programa original. E aí size() e push_back() são triviais: Apenas crie vetor como uma estrutura onde tem size Ponto...

 

Algo assim dá pra começar
 

typedef struct
{ 
    I64 x;
    I64 y;

}   Point;

typedef struct
{
    int     N; // quantos pontos tem agora
    Point*  vetor;

}   Vetor;

 

e não seria nada original :) 

 

E reescreva GCD, no popular o MDC em português.

 

 

 

 

 

 

 

 

  • Obrigado 1
Postado

vector em C++ tem um construtor implícito. Em C vai criar um. E não precisa ir além de algo óbvio como
 

    Vetor*		cria_vetor(unsigned);

 

Que você chamaria de modo nada original

 

    Vetor* um_vetor = cria_vetor(300);

 

por exemplo, que criaria um vetor com capacidade inicial  para 300 pontos e retornaria o endereço.

 

Uma função
 

    unsigned	size(Vetor*);

 

não seria nada criativa: retorna o tamanho do vetor, como no programa original:
 

    int tamanho = size(um_vetor);

 

E por aí vai. Escreva em torno dos dados. Não escreva de uma vez. Teste TUDO.

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...