Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Cristian Kirsch Foesch

C Imprimir string em C

Recommended Posts

Galera, quando vou imprimir uma struct ela da erro e fecha o programa, como resolver?

								/*seminario
							Comandos = if, switch
							Funções = soma, troca
							Vetores e tipo construído
							Como criar e preencher estrutura*/
#include <stdio.h>
#include <stdlib.h>

struct ficha_aluno{
	float nome;
	float idade;
	float matricula;
};

struct ficha_aluno aluno;
float media (int n, float *vnotas); //Declarando a função media
int main (void)
{
printf("                                          Digite o nome do aluno(a):\n");
scanf("%s", &aluno.nome);
printf("                                          Digite a idade do aluno:\n");
scanf("%f", &aluno.idade);
printf("                                        Digite o numero de matricula:\n");
scanf("%f", &aluno.matricula);
printf("-----------------------------------------------------------------------------------------------------------------------\n\n");

float vnotas[4];
int semestre;
float media_notas;															
int i;

	for (i = 0; i < 4; i++) //Leitura das medias
{

	printf("                                         Digite os valores das notas:\n");
	scanf("%f", &vnotas[i]);    
  }                             //i
printf("-----------------------------------------------------------------------------------------------------------------------\n");
printf("                          Digite o ano de ingresso para saber em que semestre o aluno esta:\n\n");
scanf("%d", &semestre);
 if(semestre <2017){
 	printf("error 404\n");
 	printf("Semestre inserido invalido\n");
 }
	switch( semestre ){
		case 2017 :    
		printf("                                      O aluno esta no Segundo semestre\n");
		break;
		case 2018 :
		printf("                                      O aluno esta no Primeiro semestre\n");
		break;	
	}
//Chamada da função
media_notas = media(4,vnotas); 
	printf("\nQuadro de notas\n");
	printf("Nome:\n %s", aluno.nome);
 	printf( "\n                                        Media = %.1f \n", media_notas );

  
	// Se a media for maior que 7, imprime que o aluno esta aprovado 
	if(media_notas >=7){
				printf("Aluno Aprovado :)\n");
		printf("O aluno pode prosseguir para o proximo semestre\n");}
	
	// Se a media for menor que 7, imprime que o aluno esta repovado 
	else{

		printf("Aluno Reprovado :(\n");   		
   		printf("O aluno deve refazer a materia ou fazer a resolucao\n\n");}
system("pause");
return 0;
}
/*Função para cálculo da média 
   Parâmetros: 
      Recebe a quantidade de elementos n
      Recebe o endereço inicial do vetor notas em *vnotas
   Retorno: 
     Retorna a media na variavel m */
float media (int n, float *vnotas)
{
int i;
//Realiza a soma das notas   
float m = 0, soma = 0;
	for (i = 0; i < n; i++)
		soma = soma + vnotas[i]; 
//Realiza a divisão das notas pelo numero de elementos
m = soma / n; 
//Retorna a media
	return m;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

float nome;? Se fosse 3.14 poderiamos o chamar de PI. :lol:

Vamos ver si deixamos claro ja como funciona as tais estruturas.

Primeiro vamos deixar claro como funciona uma string, e como imprimila corretamente.
Para declarar uma string fazemos assim:

char nome[100];

Isso dai é um array de 100 letras maximo.

Para imprimir você deve fazer:

printf("%s", nome);

Não é preciso por & adiante de nome para imprimir. Lembre-se disso.

Para realizar a leitura fazemos:

scanf("%s", nome);

Não devemos por & adiante, tal como nos casos de float, int, etc, com strings não colocamos & adiante, lembre-se disso.

Por outro lado se seu nome tiver espaços tal como "Raul Pepino" você deve usar o scanf desta forma:

scanf("%[^\n]s", nome);

O scanf tem a "má" costume de ler até encontrar um espaço em branco, um tabulador ou até encontrar o caracter enter(\n), fazendo o scanf desta forma você garante que ele tambem faça leitura de espaços.

Até aqui nada novo, vamos ver como fariamos com as structs. Mas primeiro faça a pergunta... Que é uma struct? Antes de lhe dizer que é uma struct vou lhe dizer que é um array. Um array é um conjunto de dados, um array é umconjunto de dados do mesmo tipo. Por serem todos os dados do array do mesmo tipo significa que podemos usar os indices, tipo nome[1], nome[2], etc, internamente, como já falei, os dados tem um tamanho igual e por esse motivo ao ler os dados estamos "pulando" dados, porém todos são do mesmo tipo, então os saltos são sempre iguais, coisa que não é assim com as structs e agora veremos.

As estruturas são como arrays, conjuntos de dados, porém de tipos diferentes, em uma estrutura eu posso ter dados simples como int, float, char, etc, e incluso outros dados complexos como outras structs, isso ja da para ver que os dados não tem o mesmo tamanho e por isso com structs não podemos usar os indices como nos arrays. Então como acessamos aos dados? Isso veremos agora.

Para declarar uma estrutura fazemos:
struct Dados{
int idade;
float salario;
char nome[100];
};

Quando eu declaro essa estrutura eu não estou declarando uma variavel, eu só estou dizendo ao compilador "como será a forma" da variavel.

Para criar uma variavel eu faço:
struct Dados aluno1;

para preencher esses dados faço o seguinte:
aluno1.idade = 18; // Eu estou acessando a idade do aluno1, poderia haver aluno2, aluno3, ou incluso professor.idade.
aluno1.nota = 7.14;

Para o nome a cois ase complica um pouco, se eu não for usar scanf para ler os dados tenho que usar a função strcpy para atribuir os dados:
strcpy (aluno1.nome, "Raul Pepino"); // Aqui atribuo o nome com a função strcpy da biblioteca string.h que precisa ser declarado ao inicio do arquivo fonte.

caso queira ler com scanf e com spaços seria:

scanf("%[^\n]s", aluno1.nome);


E para imprimir?

printf("%s", aluno1.nome);


Tambem pode ser criada uma lista de alunos
struct Dados aluno[3];

E poderia preencher desta forma:
aluno[0].idade = 20;
strcpy(aluno[0].nome, "Rodolfo");

aluno[1].nota = 3.14;

E para imprimir:
printf ("%s", aluno[2].nome);

é obvio que você precisa de um while ou for para imprimir e ler arrays de estruturas. Acredito que com isso você seja capaz de imprimir o que necessite.

lhe recomendo você limpar o buffer entre leituras PRESTE ATENÇAO AQUI!!!!
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×