Ir ao conteúdo
  • Cadastre-se

C Converter C++ em C


Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!