Ir ao conteúdo
  • Cadastre-se
Renanzinthhh

o printf dentro do for sai todo desalinhado, help

Recommended Posts

Bom gente, estou fazendo um algoritmo aqui pra n ficar a toa, porém n consigo definir o porque disso.

O erro estranho está quando selecionamos a opção 1 e damos o nome e a matrícula, dps que imprime na tela, sai desalinhado.

Help.

#include <stdio.h>#include <string.h>#include <locale.h>#include <time.h>#include <stdlib.h>	struct dados {		char nome[3][60];		int matr;	};	struct dados aluno[3];		int main()		{			setlocale(LC_ALL,"Portuguese");						int i=0;			char esc;						for(i=0; i<80; i++)				{					printf("#");				}		do		{			printf("#                                                                              #");			printf("# Sistema escolar                                                              #");			printf("#------------------------------------------------------------------------------#");			printf("# Centro Federal de Educação Tecnológica Celso Suckow da Fonseca     2015      #");			printf("#------------------------------------------------------------------------------#");			printf("#                                   	    Data: %s - Hora: %s #",__DATE__,__TIME__);			printf("#------------------------------------------------------------------------------#");			printf("#                                                                              #");			printf("# Menu de escolhas:                                                            #");			printf("# 1 - Registrador de alunos                                                    #");			printf("# 2 - Registrador de notas                                                     #");			printf("# 3 - Mostrar alunos aprovados                                                 #");			printf("# 4 - Mostrar alunos reprovados                                                #");			printf("#                                                                              #");			printf("# Selecione uma opção: ");			scanf("%d", &esc);			system("cls");			switch(esc)				{					case 1: printf("\tRegistrador de alunos\n\n");					printf("Informe o nome dos alunos:\n\n");					for (i=0; i<3; i++)						{							fflush(stdin);							printf("Aluno %d: ", i+1);							fgets(aluno[i].nome[i],60,stdin);							printf("Matrícula: ");							scanf("%d", &aluno[i].matr);							printf("\n");							}						system("cls");						for(i=0;i<3;i++)							{								printf("%s %d", aluno[i].nome[i], aluno[i].matr);							}						break;												default:							printf("Opção inválida");					}			break;		} while	(esc != 4);			system("pause");		system("pause");		return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por algum motivo o fgets esta inserindo um "new line" no final do nome, ai quando você vai imprimir ele ele também imprime como se fosse um \n. Da pra fazer isso dai, mas creio que tenha alguma solução mais confiável.

 

    #include <stdio.h>    #include <string.h>    #include <locale.h>    #include <time.h>    #include <stdlib.h>    	struct dados {    		char nome[60];    		int matr;    	};    	struct dados aluno[3];    	int main()    		{    			setlocale(LC_ALL,"Portuguese");    			int i=0;    			char esc;    			for(i=0; i<80; i++)    				{    					printf("#");    				}    		do    		{    			printf("\n#                                                                              #");    			printf("\n# Sistema escolar                                                              #");    			printf("\n#------------------------------------------------------------------------------#");    			printf("\n# Centro Federal de Educação Tecnológica Celso Suckow da Fonseca     2015      #");    			printf("\n#------------------------------------------------------------------------------#");    			printf("\n#                                   	    Data: %s - Hora: %s #",__DATE__,__TIME__);    			printf("\n#------------------------------------------------------------------------------#");    			printf("\n#                                                                              #");    			printf("\n# Menu de escolhas:                                                            #");    			printf("\n# 1 - Registrador de alunos                                                    #");    			printf("\n# 2 - Registrador de notas                                                     #");    			printf("\n# 3 - Mostrar alunos aprovados                                                 #");    			printf("\n# 4 - Mostrar alunos reprovados                                                #");    			printf("\n#                                                                              #");    			printf("\n# Selecione uma opção: ");    			scanf("%d", &esc);    			system("cls");    			switch(esc) {    					case 1: printf("\nRegistrador de alunos\n");    					printf("Informe o nome dos alunos:\n");    					for (i=0; i<3; i++) {    							fflush(stdin);    							printf("Aluno %d: ", i+1);    							fgets(aluno[i].nome,60,stdin);    							printf("Matrícula: ");    							scanf("%d", &aluno[i].matr);    							aluno[i].nome[strlen(aluno[i].nome)-1] = '\0';    							printf("\n");                }                  system("cls");                  for(i=0;i<3;i++) {    								printf("%s - %d\n", aluno[i].nome, aluno[i].matr);    							}    						break;    						default:    							printf("Opção inválida");    			}    			break;    		} while	(esc != 4);    			system("pause");    		system("pause");    		return 0;    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu, deu certo.

E em relação a parte do nome caso uma pessoa tenha digitado algum numero no nome pedir para repetir, aparecendo "Número inserido no nome, repita por favor"

 

E um teste para a matrícula caso a pessoa tenha digitado alguma letra, porém será somente números...

 

Tentei fazer o teste de condição aqui, porém a minha lógica hoje não estão lá essas coisas :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é mais complicado, porque você vai ter que percorrer a string, posição por posição, e comparando se o aquela posição é um numero ou não. Não sei se tem alguma função que faça isso nas bibliotecas do C, só conheço essa maneira.

EX:

#include <stdlib.h>int main() {char nome[40] = "teste12ab3ab4";int i;for (i = 0; nome[i] != '\0'; i++){  if (nome[i] < 'A')    printf("nome[%d]: nao eh uma letra!\n", i);}system("pause");}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz algo tipo isso lá no código, na linha 62. https://ghostbin.com/paste/whmea#L62

 

Porém apareceu a msg de erro no Dev:

63 32 C:\Users\Renanzinth\Desktop\Algoritmos Temporários\Sist Escolar.cpp [Error] ISO C++ forbids comparison between pointer and integer [-fpermissive]

 

 

ps: Estou fazendo um algoritmo "complexo" tipo esse pra tentar saber mais do que a faculdade ensina.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está comparando uma string toda com um char. o que você está fazendo é tipo isso:

 

aluno[i].nome != '\0'é a mesma coisa que perguntar: "O nome ciro é diferente da letra c?"o correto é algo assim:aluno[i].nome[pos] != '\0'

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





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

×