• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

russo12

estrutura (struct)

9 mensagens neste tópico

Boas,

Preciso de ajuda para fazer um um pequeno programa onde crio uma estrutura (struct) chamada tipo_endereço na qual temos como campos a rua, n_porta e cidade.

Será que me podem ajudar??? agradecia

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui está:

  struct morada{

      char rua[50];

      int porta;

      char cidd[50];

  }m1;

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é que eu sou novo nisto mas o código que fiz foi este:

#include <iostream>
#include <stdio.h>
using namespace std;
int main () 
{
struct tipo_endereco {
	char rua [20];
	char cidade [20];
	int n_porta;
}p1, p2, p3;
p1.n_porta = 0;
cout << "Escreva o nome de uma rua: ";
gets (p1.rua)'\n';
cout << "Escreva o nome de uma cidade: ";
gets (p2.cidade)'\n';
cout << "Escreva o numero da porta: ";
gets (p3.n_porta)'\n';
system("pause");
}

não percebo disto, o problema é que dá-me erro é na parte quando mando escrever o nº da porta e bloqueia-me a consola

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Isso no Visual Studio já dá uma carrada de erros porque estás a meter new lines no gets, está a usar o gets também para obter um inteiro quando o gets é para strings. usa cin >> p1.n_porta.

Outra coisa, porque fazes para cada p1 um campo? Não há necessidade de criares um p para cada campo...

Isto é de âmbito escolar ou pessoal? Se escolar, convém ler a teoria também.

Aqui está o programa, aconselho-te a rever os conceitos básicos do cout, cin e gets.

#include <iostream>
#include <stdio.h>
using namespace std;
int main () {
   struct morada {
      char rua [20];
      char cidade [20];
      int  porta;
   }p;
   // Obter dados
   cout << "Nome da Rua: ";
   gets (p.rua); // uso do gets para obter string com espaços
   cout << "Nome da cidade: ";
   gets (p.cidade); // uso do gets para obter string com espaços
   cout << "Numero da Porta: ";
   cin >> p.porta; // uso do cin porque é um inteiro
}

Nota do moderador: atenção ao fornecimento de código que resolva integralmente os problemas escolares (ou não) dos utilizadores. É uma prática desaconselhada porque, na maioria dois casos, não ajuda a compreender o problema, embora seja a maneira mais fácil de responder.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado, irei fazer isso, experimeitei o código que postou e dá erro novamente quando pede para escrever o nº da porta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os tipos de dados definidos pelo programador definem-se sempre fora da função main. Logo, a 1ª alteração que tens de fazer é mover a definição da struct para fora da main.

A 2ª alteração que tens de fazer é no cabeçalho da função main. Este apenas pode ter 2 formas:

int main(void) //não recebe valores via linha de comandos

ou

int main(int argc, char** argv) //recebe valores via linha de comandos

Neste caso, como não estás a passar nenhum argumento aquando da invocação do programa, deverás optar pela 1ª forma sugerida.

A 3ª alteração que tens de fazer apagar aquele p1, p2, p3, e colocá-los na main da seguinte forma:

struct tipo_endereco p1, p2, p3;

Assim, estás a indicar que crias 3 structs (p1, p2 e p3) do tipo tipo_endereco. Para escreveres este código de forma mais económica, podes usar um typedef, que basicamente indica a criação de um novo tipo de dados:

typedef struct tipo_endereco {
      char rua [20];
      char cidade [20];
      int n_porta;
} TipoEndereco;

Assim, podes referenciar structs deste tipo da seguinte forma:

TipoEndereco p1, p2, p3;

Outra alteração que tens de fazer é deixar de usar a função gets para ler o que quer que seja. Isto deve-se ao facto de esta função não ter controlo qualquer sobre o tamanho do input lido, podendo gerar facilmente buffer overflows. Para contornar este problema podes usar 1 de 2 funções:

- scanf, indicando nesta o tamanho do input a ser lido:

scanf("%20[^\n]",str); //lê no máximo 20 caracteres para uma string ou, caso o input seja menor que 20, lê até encontrar um '\n' que indica mudança de linha

- fgets que, sendo semelhante à gets, suporta controlo do tamanho do input:

fgets(str,sizeof(str),stdin); //lê do teclado (stdin) input que vai guardar na string str, cujo tamanho é dado por sizeof(str)

Como estás a usar uma mistura de C com C++ (estás a usar o cout para imprimir texto), talvez queiras considerar o uso de funções de leitura de C++, através do cin.

Também tens de alterar a forma como lês o valor da porta, uma vez que é um valor inteiro, e estás a ler como se fosse uma string.

Por fim, deves retirar o system("PAUSE") e substituir por getchar() (em C) ou cin.get() (em C++), uma vez que essa instrução torna o teu código dependente do SO onde executa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado, irei fazer isso, experimeitei o código que postou e dá erro novamente quando pede para escrever o nº da porta

Não tive quaisquer problemas a introduzir o nº de porta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora