russo12 Posted November 30, 2009 at 08:43 PM Report Share #298116 Posted November 30, 2009 at 08:43 PM 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 Link to comment Share on other sites More sharing options...
Baderous Posted November 30, 2009 at 08:58 PM Report Share #298118 Posted November 30, 2009 at 08:58 PM Qual é a dificuldade? Definir a struct? Link to comment Share on other sites More sharing options...
_4ndr3 Posted November 30, 2009 at 09:36 PM Report Share #298125 Posted November 30, 2009 at 09:36 PM Aqui está: struct morada{ char rua[50]; int porta; char cidd[50]; }m1; Cumprimentos Link to comment Share on other sites More sharing options...
russo12 Posted November 30, 2009 at 09:47 PM Author Report Share #298130 Posted November 30, 2009 at 09:47 PM é 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 Link to comment Share on other sites More sharing options...
_4ndr3 Posted November 30, 2009 at 09:58 PM Report Share #298133 Posted November 30, 2009 at 09:58 PM 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. Link to comment Share on other sites More sharing options...
russo12 Posted November 30, 2009 at 10:06 PM Author Report Share #298135 Posted November 30, 2009 at 10:06 PM obrigado, irei fazer isso, experimeitei o código que postou e dá erro novamente quando pede para escrever o nº da porta Link to comment Share on other sites More sharing options...
Baderous Posted November 30, 2009 at 10:06 PM Report Share #298136 Posted November 30, 2009 at 10:06 PM 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. Link to comment Share on other sites More sharing options...
russo12 Posted November 30, 2009 at 10:07 PM Author Report Share #298137 Posted November 30, 2009 at 10:07 PM Muito obrigado, pela ajuda Abraço cumprimentos Link to comment Share on other sites More sharing options...
_4ndr3 Posted November 30, 2009 at 10:09 PM Report Share #298139 Posted November 30, 2009 at 10:09 PM 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. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now