Ir ao conteúdo
  • Cadastre-se

C++ Dificuldades básicas dobre for


Posts recomendados

Oi, sou novo neste fórum, e estou aprendendo C++

Bom estou com um problema para fazer um programa, ele somente recebe informações de código do aluno, no caso 3 alunos, código, nome, duas notas, depois ele exibe na tela o código, nome e a média dos alunos.

Eu sei que e programa iniciante, mas estou aprendendo, usei o for para ele, mas esta dando errado não sei onde estou errando neste programa, se alguém puder me ajudar agradeço muito.

 

deixei algumas bibliotecas a mais estou testando tudo, o problema é quando vou digitar as notas, eu não to entendendo qual o problema dele, eu tinha colocado outro for dentro do cadastro mas tirei pois pensava que este era o problema, cheguei a conclusão que precisava de ajuda mesmo kkkk, pretendo depois continuar mas preciso saber o que entendi errado no que to errado para poder prosseguir. Muito obrigado desde já, segue o código:

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main ()
{
 int Cod[3],N1[3],N2[3],M[3],x,y;
 char Nome [3][20];
 system("cls");
 printf ("\nPrograma de cadsatro de alunos:\n");

 printf ("Informe os dados dos alunos:");

 for (y=0; y<=3; y++){
    printf ("\nCodigo do aluno");
    scanf("%d",&Cod[y]);
    printf ("\nNome do aluno");
    scanf("%d",&Nome[y]);
    printf ("\nNota1");
    scanf("%d",&N1[y]);
    printf ("\nNota2");
    scanf("%d",&N2[y]);
    M[y]=(N1[y]+N2[y])/2;
 }
 system("cls");
 printf ("\nInformacoes cadastradas\n");
 for (y=0; y<=3; y++){
    printf ("\nCodigo do aluno:");
    printf ("%d\n",&Cod[y]);
    printf ("\nNome do aluno:");
    printf ("%d\n",&Nome[y]);
    printf ("\nMedia do aluno:");
    printf ("%d\n",&M[y]);
  }
 getch();
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Bom dia.

scanf("%d",&Nome[y]);

Para ler uma string, você não usa o &. O "%d" deveria ser "%s".

http://linguagemc.com.br/string-em-c-vetor-de-caracteres/

 

Você declarou as notas e média tudo como inteiro. Então a média vai ser um inteiro "arredondado".

 

Uma dúvida. Se você vai guardar média, você precisa guardar as notas também? Você pode usar N1 e N2 puros, só tendo que usar vetor na média.

 

char Nome [3][20];

Aqui eu  não lembro se é [3][20] ou [20][3].

adicionado 1 minuto depois

Ahh

O printf também não usa &.

Link para o comentário
Compartilhar em outros sites

Grato, realmente funcionou, eu tinh me esquecido %s vi isso em algum lugar, mas porque usa & isso que não entendi,

Tem ainda um erro no calculo da média.

Eu entendi o que quis falar colocar um for nas notas, bom vou tentar hoje a noite ...

agora a media da uns valores estranhos... sera que tenho que colocar tudo como float?

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main ()
{
 int Cod[3],N1[3],N2[3],M[3],x,y;
 char Nome [3][20];
 system("cls");
 printf ("\nPrograma de cadsatro de alunos:\n");

 printf ("Informe os dados dos alunos:");

 for (y=0; y<=3; y++){
    printf ("\nCodigo do aluno:");
    scanf("%d",&Cod[y]);
    printf ("\nNome do aluno:");
    scanf("%s",Nome[y]);
    printf ("\nNota1:");
    scanf("%d",&N1[y]);
    printf ("\nNota2:");
    scanf("%d",&N2[y]);
    M[y]=(N1[y]+N2[y])/2;
 }
 system("cls");
 printf ("\nInformacoes cadastradas\n");
 for (y=0; y<=3; y++){
    printf ("\nCodigo do aluno:");
    printf ("%d",Cod[y]);
    printf ("\nNome do aluno:");
    printf ("%s",Nome[y]);
    printf ("\nMedia do aluno:");
    printf ("%d",M[y]);
  }
 getch();
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
4 minutos atrás, robertoitalia disse:

 

agora a media da uns valores estranhos... sera que tenho que colocar tudo como float?

 

V

36 minutos atrás, Math.Pi disse:

 

Você declarou as notas e média tudo como inteiro. Então a média vai ser um inteiro "arredondado".

 

Vai dar valor incorreto se forem inteiros.

 

 

5 minutos atrás, robertoitalia disse:

Grato, realmente funcionou, eu tinh me esquecido %s vi isso em algum lugar, mas porque usa & isso que não entendi,

 

Essa parte eu sempre me complico pra explicar. Então vou deixar uma citação:

Citação

Note que não usamos o & antes do str. Isto porque não é uma variável. Lembra de vetores, que quando queríamos poder modificar o vetor como um todo passávamos somente seu nome como parâmetro das funções? Pois com string é a mesma coisa. Como queremos que scanf modifique o string, passamos seu nome no parâmetro (sem o &).

http://www.ic.unicamp.br/~norton/disciplinas/mc1022s2005/06_10.html

@Simon Viegas responde melhor

 

 

22 minutos atrás, robertoitalia disse:

Eu entendi o que quis falar colocar um for nas notas, bom vou tentar hoje a noite ...

Mas eu não disse isso rsrs. Deixará o programa mais limpo. Mas a minha ideia é você usar vetor somente na média, não precisando guardar as 3 notas de todos os alunos, já que não usará na resposta.

Link para o comentário
Compartilhar em outros sites

Sobre a utilização do & antes do nome da variável...

 

Quando declaramos uma variável como:

int x;

Estamos reservando um espaço na memória onde iremos guardar dados do tipo inteiro, e acessamos este local da memória através do nome da variável "x".

 

Para poder sempre acessar o mesmo lugar com os dados na memória a variável deve 'saber' em onde na memória esses dados estão localizados, ou seja, deve ter uma referência indicando um endereço de memória onde os dados são guardados.

 

Para obter essa referência usa-se o símbolo & antes do nome da variável. E chamamos &x de 'a referência de x'.

 

Então quando você faz isto:

scanf("%d", &x);

Está passando a referência de x como parâmetro da função scanf(), assim a função tem como saber em que lugar da memória o valor lido por ela deve ser guardado.

 

Existe um tipo especial de variável chamada ponteiro, cuja função é guardar endereços de memória, e dizemos que 'um ponteiro aponta para um endereço de memória'.

 

Na função scanf a referência que foi passada como parâmetro será armazenada num ponteiro, e quando a função fizer modificações no valor no lugar da memória que é apontado por este ponteiro estará de fato alterando o valor da variável x, assim quando a função é concluída o valor inteiro obtido por scanf() poderá ser acessado através da variável x, como sempre fazemos.

 

 

 

Vetores são diferentes de variáveis comuns, pois seu nome sem os colchetes já é uma referência, logo não se usa o & antes do nome para obter a referencia.

Ex:

char v[10];
scanf("%10s", v); //passa a referência para o vetor v como parâmetro

Entretanto, precisamos usar & para acessar a referência de uma única posição do vetor, pois essa posição é uma "variável".

Ex:

scanf("%c", &v[0]); //passa a referência para a posição de índice 0 do vetor

 

 

Daí já dá pra ver o padrão e entender como funciona para o caso de matrizes:

int m[10][20];

m; //referência para a matriz m
m[3]; //referência para a linha de índice 3, pois a linha é um vetor
&m[1][5]; //referência para a posição da matriz com coordenadas (1, 5)

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

entendi então todas variáveis inteiras float, string, ... precisa do ponteiro.

se eu tiver então um vetor não precisa de referencia..

mas e no caso 

 char Nome [3][20];
    scanf("%s",Nome[y]);
então não estamos fazendo referência a uma posição na memória? isso que fiquei com duvida,

o que percebi e que quando falamos em variáveis inteiras, float e assim por diante temos que colocar & agora na variavel string não, esta como vetor ai, mas não estou me referindo a um local na memória quando coloco no scanf o [y]?

Link para o comentário
Compartilhar em outros sites

@robertoitalia No exemplo que você citou "char Nome[3][20];" é uma matriz de char com dimensão 3 x 20.

 

E ao fazer "Nome[y]" está pegando a referência de 1 linha da matriz , a linha com índice y, e como citei anteriormente a linha de uma uma matriz é vetor, nesse caso um vetor de 20 posições (logo segue as mesma regras que expliquei para qualquer vetor).

 

(Veja o exemplo de matriz no fim do meu post anterior.)

 

Note que você pode ter vetores e matrizes de qualquer tipo:

float matriz_de_float[3][20];

int matriz_de_int[3][20];

 

Logo, esse comportamento não é algo exclusivo de strings. As mesmas regras valem para qualquer tipo, não importa se é char, int, float, etc...

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