Ir ao conteúdo

Posts recomendados

Postado

Como eu posso fazer pra criar um vetor de nomes? O exercício a seguir pede um vetor de nomes, uma matriz de consumo e um vetor de preços. Eu preciso criar um vetor char ou int e alocar as strings dentro de um int? Eu sei que scanf não é o mais indicado pra ler strings, fiz apenas pra testar. Mas ele sempre dá erro na hora de exibir

#include <stdio.h>
#define tf 3

void leituramatriz (int m[tf][tf]){
	int i, j;
	for (i=0;i<tf;i++)
		for (j=0;j<tf;j++){
			printf ("\nEntre com os elementos da matriz: ");
			scanf ("%d", &m[i][j]);
		}
}

void exibematriz (int m[tf][tf]){
	int i, j;
	for (i=0;i<tf;i++){
		printf ("\n");
		for (j=0;j<tf;j++){
			printf ("%d  ", m[i][j]);			
		}
	}
}

void leituraprecos (double v[tf]){
	int i;
	for (i=0;i<tf;i++){
		printf ("\nEntre com o preco: ");
		scanf ("%lf", &v[i]);
	}
}

void exibeprecos (double v[tf]){
	int i; 
	for (i=0;i<tf;i++){
		printf ("[%d]: %d", i, v[i]);
	}
}

void leituranomes (char vn[tf]){
	int i;
	for (i=0;i<tf;i++){
		printf ("\nEntre com o nome: ");
		scanf ("%s", &vn[i]);
		
	}
}


void exibenomes (char vn[tf]){
	int i; 
	for (i=0;i<tf;i++){
		printf ("\nNome: %s", vn[i]);
	}
}

double fechaconta (int m[tf][tf], double vp[tf], char vn[tf], int numesa){
	int i;
	double total;
	for (i=0;i<tf;i++){
		total = total + m[numesa][i]*vp[i];
	}
	printf ("\nMesa: %d\nNome: %s\nTotal a pagar: R$%5.2lf", numesa, vn[numesa], total);
return total;
}

void vaoembora (int m[tf][tf], double vp[tf], char vn[tf]){
	int i, j;
	int total; 
	for (i=0;i<tf;i++){
		for (j=0;j<tf;j++){
			total = total + m[i][j]*vp[i];
		}
		printf ("\nMesa: %d\nNome: %s\nTotal a pagar: R$%5.2lf", i, vn[i], total);
		total =0;
	}
}

void faturamento (int m[tf][tf], double vp[tf]){
	int i, j; 
	double total;
	for (i=0;i<tf;i++){
		for (j=0;j<tf;j++){
			total = total + m[i][j]*vp[i];
		}
	}
	printf ("\nFaturamento total: R$%5.2lf", total);
}




int main (){
	int m[tf][tf];
	char vn[tf];
	double vp[tf];
	int opcao=0, numesa;
	double totaldocliente=0;
	while (opcao != 10){
		printf ("\n\n################# MENU #####################");
		printf ("\n1 - Carrega matriz de consumo");
		printf ("\n2 - Exibe a matriz de consumo");
		printf ("\n3 - Carrega vetor de precos");
		printf ("\n4 - Exibe vetor de precos");
		printf ("\n5 - Carrega vetor de nomes");
		printf ("\n6 - Exibe vetor de nomes");
		printf ("\n7 - Fechar a conta de um cliente");
		printf ("\n8 - Calcular a conta de cada cliente");
		printf ("\n9 - Faturamento final");
		printf ("\n10 - Sair");
		printf ("\nQual a sua opcao?");
		scanf ("%d", &opcao);
		
		switch (opcao){
			case 1: leituramatriz (m);
					break;
			case 2: exibematriz (m);
					break;
			case 3: leituraprecos (vp);
					break;
			case 4: exibeprecos (vp);
					break;
			case 5: leituranomes (vn);
					break;
			case 6: exibenomes (vn);
					break;
			case 7: printf ("\nQual o nro da mesa que deseja fechar?");
					scanf ("%d", &numesa);
					totaldocliente = fechaconta (m, vp, vn, numesa);
					break;
			case 8: vaoembora (m, vp, vn);
					break;
			case 9: faturamento (m, vp);
					break;
					
		}
		
	}
}

 

 

Screenshot_1.png

Screenshot_2.png

  • Curtir 1
Postado

Para guardar um vetor de nomes tem que usar uma matriz de caracteres. Assim cada linha da matriz pode armazenar uma string contendo um nome.

char clientes[20][20];

//O nome do primeiro cliente fica na primeira posição do "vetor":
clientes[0]

 

 

 

1 hora atrás, Gabbie1 disse:

Eu sei que scanf não é o mais indicado pra ler strings, fiz apenas pra testar. Mas ele sempre dá erro na hora de exibir

 

scanf é sim o mais indicado para ler strings.

  • Obrigado 1
Postado
1 hora atrás, isrnick disse:

Para guardar um vetor de nomes tem que usar uma matriz de caracteres. Assim cada linha da matriz pode armazenar uma string contendo um nome.


char clientes[20][20];

//O nome do primeiro cliente fica na primeira posição do "vetor":
clientes[0]

 

 

 

 

scanf é sim o mais indicado para ler strings.

Ficaria mais ou menos assim?? Esse foi o mais próximo que eu consegui. Mas ainda assim no printf ele imprime tudo embolado, mistura uma palavra com a outra. Tô achando esse treco muito complicado

void leituranomes (char vn[tf][tf]){
	int i;
	for (i=0;i<tf;i++){
		printf ("\nEntre com o nome: ");
		scanf ("%s", &vn[i]);
		
	}
}


void exibenomes (char vn[tf][tf]){
	int i; 
	for (i=0;i<tf;i++){
		printf ("\nNome: %s", vn[i]);
	}
}

 

Postado

tf do número de colunas da matriz não pode ser igual a 3 nesse caso (a menos que cada nome só tivesse 2 letras...)

 

E tem algumas coisas a corrigir no scanf: Não vai & antes do nome no caso de vetores e matrizes; Seria bom colocar um espaço antes do %s na string de especificadores para limpar espaços em branco antes de começar a obter a string; E quando é feita leitura de dados na forma de string é importante indicar o número máximo de caracteres que pode ser lidos, ou seja a capacidade máxima de caracteres que podem ser guardados no vetor de caracteres, pois além disso estouraria o tamanho do vetor.

 

No caso de um vetor de 20 posições poderia guardar no máximo 19 caracteres (a última posição guardaria o caractere nulo '\0' nesse caso extremo).

 

Então ficaria assim:

scanf (" %19s", vn[i]);

 

  • Amei 1
Postado
4 horas atrás, isrnick disse:

tf do número de colunas da matriz não pode ser igual a 3 nesse caso (a menos que cada nome só tivesse 2 letras...)

 

E tem algumas coisas a corrigir no scanf: Não vai & antes do nome no caso de vetores e matrizes; Seria bom colocar um espaço antes do %s na string de especificadores para limpar espaços em branco antes de começar a obter a string; E quando é feita leitura de dados na forma de string é importante indicar o número máximo de caracteres que pode ser lidos, ou seja a capacidade máxima de caracteres que podem ser guardados no vetor de caracteres, pois além disso estouraria o tamanho do vetor.

 

No caso de um vetor de 20 posições poderia guardar no máximo 19 caracteres (a última posição guardaria o caractere nulo '\0' nesse caso extremo).

 

Então ficaria assim:


scanf (" %19s", vn[i]);

 

Eita, eu não sabia nada disso. Obrigada moço! To feliz demais porque aprendi muita coisa

adicionado 1 minuto depois

Eu tava tendo problema quando tinha que ler nomes com espaço usando scanf, por isso que comecei usar fgets. Achei que o scanf que era ruim pra ler strings. Obrigada moço!

  • Curtir 1
Postado
25 minutos atrás, Gabbie1 disse:

Eu tava tendo problema quando tinha que ler nomes com espaço usando scanf, por isso que comecei usar fgets. Achei que o scanf que era ruim pra ler strings. Obrigada moço!

 

scanf é a função mais versátil para ler dados do terminal no C.

 

No caso %s é um especificador para ler caracteres até encontrar o primeiro caractere vazio (seja ele espaço, tabulação, nova linha, ou etc), então realmente só vai conseguir ler o primeiro nome usando esse especificador pois para de ler quando encontra o espaço.

 

Mas para ler tudo que é digitado até o Enter ser apertado basta usar outro especificador de string que leia tudo até encontrar o primeiro caractere nova linha '\n'.

 

Para isso usamos o especificador %[ que é outro especificador de strings no qual você diz que caracteres deve, ou que não deve, guardar, por exemplo %[abc] só guardaria strings contendo esses 3 caracteres, como "aabbaacc", mas se colocar o caractere ^ logo após o [, como %[^123] estará indicando que os caracteres que não podem ser capturados, nesse caso qualquer coisa que não tenha 1, 2 ou 3 será capturado.

 

Então desejamos usar um especificador que leia tudo até entrar o caractere nova linha '\n' colocado ao apertar Enter no terminal cmd.exe, o que é o mesmo que dizer que vamos capturar tudo menos o caractere nova linha '\n', então usando o especificador %[ isso ficaria assim %[^\n], que vai ler tudo até achar um '\n' e para de ler aí sem capturar o '\n'.

 

Logo, nosso scanf ficaria assim:

scanf (" %19[^\n]", vn[i]);

 

  • Amei 1
Postado
9 minutos atrás, isrnick disse:

 

scanf é a função mais versátil para ler dados do terminal no C.

 

No caso %s é um especificador para ler caracteres até encontrar o primeiro caractere vazio (seja ele espaço, tabulação, nova linha, ou etc), então realmente só vai conseguir ler o primeiro nome usando esse especificador pois para de ler quando encontra o espaço.

 

Mas para ler tudo que é digitado até o Enter ser apertado basta usar outro especificador de string que leia tudo até encontrar o primeiro caractere nova linha '\n'.

 

Para isso usamos o especificador %[ que é outro especificador de strings no qual você diz que caracteres deve, ou que não deve, guardar, por exemplo %[abc] só guardaria strings contendo esses 3 caracteres, como "aabbaacc", mas se colocar o caractere ^ logo após o [, como %[^123] estará indicando que os caracteres que não podem ser capturados, nesse caso qualquer coisa que não tenha 1, 2 ou 3 será capturado.

 

Então desejamos usar um especificador que leia tudo até entrar o caractere nova linha '\n' colocado ao apertar Enter no terminal cmd.exe, o que é o mesmo que dizer que vamos capturar tudo menos o caractere nova linha '\n', então usando o especificador %[ isso ficaria assim %[^\n], que vai ler tudo até achar um '\n' e para de ler aí sem capturar o '\n'.

 

Logo, nosso scanf ficaria assim:


scanf (" %19[^\n]", vn[i]);

 

Muito mais prático! E eu batendo cabeça pra ler strings

  • Curtir 1

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!