Ir ao conteúdo
  • Cadastre-se

C++


PESSOA

Posts recomendados

PESSOAL, POR FAVOR ME DEEM UM AUXILIO POIS PRECISO DE ALGUNS EXEMPLOS DE FUNÇÃO EM C++, SÃO PARA EXERCÍCIOS DA FACULDADE, ALGO COMO FAZER UMA FUNÇÃO PARA EXIBIR OS NUMEROS PARES QUE FOREM DIGITADOS PELO USUÁRIO. EU SOU TOTALMENTE VERDINHO NESTE EM C++. SE ALGUEM SOUBER DE ALUMA APOSTILA.  :-(P

Link para o comentário
Compartilhar em outros sites

Ok colega, eis o código:

#include <iostream.h>

#include <stdio.h>

#include <string.h>

#include <conio.h>

const int COMP = 81;   //comprimento da cadeia de caracteres

//protótipo da função inverteString

void inverteString(char*);  

int main(int argc, char **argv)

{

   char frase[COMP];

   cout << "Digite uma frase (Max. 80 caracteres): ";

   gets(frase);

   inverteString(frase);

   cout << "Frase invertida: " << frase;

   getch();

   return 0;

}

// Inverte uma cadeia de caracteres

//Essa função recebe como argumento um endereço, perceba

//que s é um ponteiro para caracteres

void inverteString(char* s)

{

   //ponteiro auxiliar, iniciar com uma cadeia nula

   char* aux = "";  

   int t;

   t = strlen(s);  

   for(int i = 0; i < t; i++)

   {        

       *(aux + i) = s[t - 1 - i];

   }

   *(aux + t) = '\0';

   strcpy(s, aux);

}

Espero ter sido útil.

Abraços

Link para o comentário
Compartilhar em outros sites

Postado Originalmente por Spiderman@13 Set. 2002,19:11

void inverteString(char* s)

{

   //ponteiro auxiliar, iniciar com uma cadeia nula

   char* aux = "";  

   int t;

   t = strlen(s);  

   for(int i = 0; i < t; i++)

   {        

       *(aux + i) = s[t - 1 - i];

   }

   *(aux + t) = '\0';

   strcpy(s, aux);

}

Esse código causa uma quebra no programa. Você inicializa a variável char* aux num endereço com uma string vazia (de um único byte, '\0'). Após isso você começa a avançar além do espaço alocado pelo compilador (que é de apenas 1 byte), e começa a escrever sobre endereço inválido.

Sugiro uma inverteString( ) assim:


void inverteString(char* s)
{
       int t = strlen(s); // tamanho da string
       char* aux = new char[t+1]; // aloca apenas o espaço necessário
       strcpy(aux, s); // copia a string e coloca o limitador nulo
       for (int i=0; i<t; i++)
               s[ i ] = aux[ t-i-1 ];
       delete aux; // libera a memória alocada
}

Link para o comentário
Compartilhar em outros sites

# Programa que lê os numeros pares ou impares digitados #

#include <iostream.h>

#include <conio.h>

void main(){

long x;

cout<<"Digite um numero por favor ";

cin>>x;

if(x%2 == 0 )

cout<<"O numero " <<x <<" digitado e  par";

else{

cout<<"O numero " <<x <<" digitado e impar";

}

getch();

clrscr();

}

Abraços !!

Link para o comentário
Compartilhar em outros sites

Essa é a solução ideal, colega DanielKO. Tentei escrever esse código sem usar alocação dinâmica de memória porque percebi que o colega Pessoa ainda não sabe todos os "macetes" da linguagem C++. O código original não chama strcpy porque faço inverteString retornar um ponteiro para caracteres. Assim, inverteString teria o seguinte protótipo:

#include <iostream.h>

...

...

char* inverteString(char*);

...

...

também não é necessário usar delete porque aux é uma variável local. Todas as variáveis locais são destruídas quando uma função termina, ok?

Valeu pela sugestão, colega!

Abraços...

Link para o comentário
Compartilhar em outros sites

Postado Originalmente por Spiderman@15 Set. 2002,14:24

também não é necessário usar delete porque aux é uma variável local. Todas as variáveis locais são destruídas quando uma função termina, ok?

aux é uma variável ponteiro local, mas a memória que eu aloquei prá ela não é local. new vai alocar memória no heap, e ela precisa ser liberada no final com um delete.

No seu código você alocou apenas 1 byte local ( char* aux = ""; ) para onde apontou o ponteiro aux. Incrementando aux vai fazer com que você tente escrever/ler numa região de memória inválida (provavelmente alguma área de código executável). O que eu fiz foi usar o new para criar um array dinamicamente (a mesma coisa que usar o malloc() em C).

Link para o comentário
Compartilhar em outros sites

aux é uma variável ponteiro local, mas a memória que eu aloquei prá ela não é local. new vai alocar memória no heap, e ela precisa ser liberada no final com um delete.

Verdade, esqueci desse detalhe!

Valeu...

:-DD

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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