Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Felipe SP

[Resolvido] Exercicio Matriz e Arquivos

Recommended Posts

Boa tarde pessoal,

 

Estou no ultimo ano de Engenharia e só falta 1 matéria para eu acabar o curso. Exatamente programação 2. Tenho muita dificuldade em linguagem C.

 

Sei que a matéria não é dificil, mas não entra na minha cabeça de jeito nenhum.

 

E para me formar, estou dependendo de um exercicio que o professor me passou para resolver e não faço a minima ideia de como resolvê-lo.

 

Tentei, Tentei muitas vezes mas praticamente não sai do ZERO, portanto, nem é viável postar aqui o que conseguir fazer.

 

Preciso de uma ajuda de vocês, para não ter que fazer DP desta única matéria no próximo semestre.

 

Ai vai o exercicio que tenho que fazer.

 

A distância entre várias cidade é dada pela tabela abaixo em Km. Construa um programa em C, que leia a tabela que está gravada em um arquivo do tipo texto ( uma distância por linha) , e grava em outro arquivo texto (exerc.txt) a distância calculada entre as cidades que será requisitada via teclado.

 

O texto da gravação devera ser " A distância entre a cidade x e a cidade y é: ........z"

 

Onde x é a primeira cidade digitada no teclado

 

y é a segunda cidade digitada no teclado

 

z é a distância calculada com base no arquivo texto.

 

OBS: A cada execução do programa, a distância anterior calculada deverá ser apagada.

 

Tabela ( é uma matriz 5 x 5 )

 

00 30 28 05 12

30 00 10 17 28

28 10 00 03 11

05 17 03 00 80

12 28 11 80 11

 

 

Explicação do professor:

 

Ele disse que essa tabela é a primeira coisa a fazer. Deve ser digitada em bloco de notas uma distancia por linha.

 

Depois o programa em C, lê esse arquivo.

 

Quando o programa é executado, a primeira coisa que ele pede é a cidade 1 por exemplo digitamos 3, portanto, é uma cidade da coluna 4.

 

Depois o programa pede a cidade 2 e por exemplo digitamos 2, portanto, é uma cidade da linha 3.

 

O resultado ao invés de ser mostrado na tela, seria gravado em outro arquivo (exerc) que no nosso exemplo o resultado seria 03 ( coluna 4 x linha 3).

 

OBS: O programa deve ser feito usando apenas comando básicos, como for, whlie, if, else, ponteirosm arquivos, vetores e matrizes. POis ele não deu nada além disso. E seu eu aparecer com um programa que seja além do que ele ensinou, ele não aceitará.

 

 

Conto com o apoio de vcs.

 

Abraço.

 

Att,

 

Felipe

 

 

PS: Desculpe pelo enorme texto que escrevi, é que já estou entrando em desespero por causa dessa matéria......rs..rs...rs......

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi direito essa matriz:

00 30 28 05 12

30 00 10 17 28

28 10 00 03 11

05 17 03 00 80

12 28 11 80 11

 

O último elemento nã deveria ser 00 em vez de 11?

 

Pelo que entendi é isto:

 

A11 (distância entre cidade 1 e cidade 1) -> 00

A12 (distância entre cidade 1 e cidade 2) -> 30

Consequentemente, A55 deveria ser 00, não 11

 

 

Essa matriz está no arquivo? Ou está no programa e deve ser salva no arquivo?

 

 

Esse programa usa muito manipulação de arquivos. Você tem que saber, pelo menos, ler um arquivo com C. Senão complica, mesmo

 

http://www.vivaolinux.com.br/artigo/Manipu...em-C-(parte-1)/

http://www.vivaolinux.com.br/artigo/Manipu...em-C-(parte-2)/

http://www.google.com/search?ie=UTF-8&...+arquivos+fgets

 

fgets() lê uma linha do arquivo. Depois de ler a linha cujo valor deseja saber, use a função atoi() para transformar em inteiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo,

 

A matriz é exatamente da maneira que escrevei.

 

Na coluna 5 e linha 5 seria assim:

 

A distância entre a cidade 5 (coluna) e a cidade 5 (linha) é de 11Km.

 

Outro exemplo

 

A distância entre a cidade 4 (coluna) e a cidade 3 (linha) é de 3Km

 

A distância entre a cidade 2 (coluna) e a cidade 5 (linha) é de 28Km.

 

Deu para entender ?

 

Em relação a outra pergunta, essa matriz, tem que estar escrita em um arquivo ( no bloco de notas ). Antes de iniciar o desenvolvimento do programa em C, primeiro deve-se escrever essa matriz no bloco de notas. Cada numero em uma linha. Segue a sequencia:

 

00

30

28

05

12

30

00

10

e assim por diante.

 

Então ficarão 25 linhas escritas nesse arquivo.

 

AI sim, fazemos um programa que irá ler esse arquivo e mostrar as distâncias.

 

Mas tem outro detalhe, essa distância ao invés de mostrar na tela, deve ser salva em outro arquivo do bloco de notas, ou seja, ao final do programa teremos dois arquivos. O Inicial da matriz + o dos resultados das distâncias.

 

Deu pra entender ou compliquei tudo ?

 

Abraços.

 

Att,

 

Felipe

Compartilhar este post


Link para o post
Compartilhar em outros sites

A matriz é exatamente da maneira que escrevei.

Na coluna 5 e linha 5 seria assim:

A distância entre a cidade 5 (coluna) e a cidade 5 (linha) é de 11Km.

Isso que não faz sentido para mim. A distância entre a cidade 5 e a cidade 5 é de 11km? Mas é a mesma cidade. Veja as distâncias entre as cidades 1 e 1, 2 e 2, 3 e 3 e 4 e 4; todas são de 0.

Note que os elementos Mij são iguais aos elementos Mji (para quaisquer i e j)

 

 

 

Enfim... veja como obter uma linha específica de um arquivo.

 

Considerando este arquivo:

arquivo.txt

linha 1
linha 2
linha 3
linha 4
linha 5

Para pegar uma certa linha:

#include <stdio.h>

int main()
{
	FILE *fp;
	char str[20];
	int linha, i = 1;
	
	printf("Qual linha deseja obter? ");
	scanf("%d", &linha);
	
	fp = fopen("arquivo.txt", "r");
	
	while ( fgets(str, 30, fp) )
	{
		if (linha == i)
			break;
		
		i++;
	}
	
	fclose(fp);
	
	printf("Linha desejada:\n%s\n", str);
	
	return 0;
}

fgets() lê uma linha do arquivo. Então compara-se o valor do contador i com o valor de "linha". Se foram iguais, é porque o conteúdo de "str" é o que o usuário buscou, então pára-se o loop com break, caso contrário incrementa o contador e faz novo fgets()

 

http://www.cplusplus.com/reference/clibrar...tdio/fopen.html

http://www.cplusplus.com/reference/clibrar...tdio/fgets.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo,

 

Mil desculpas..... Mas você estava certo.

 

Naquela situação de distância entre cidade 5 e cidade 5, realmente o numero é 00, ou seja,

 

A distância entre a cidade 5 e cidade 5 é igual a 0 Km.

 

Eu olhei outro exercicio. Me desculpe.

 

 

Vi esse programa que você me passou e consegui entende-lo. Já me ajudou muito. Para concluir o trabalho, eu precisaria que ao invés da distância ser mostrada na tela, ela teria que ser gravada em OUTRO arquivo de texto.

 

Ou seja, ao executar o programa ele irá pedir a primeira cidade, ai você digita. Depois o programa pede a segunda cidade e você digita novamente. E ai a distância entre essas cidades, teria que aparecer em um arquivo texto e NÃO na tela.

 

Entendeu ?

 

 

 

Abraço e obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem problemas. É que eu achei estranho aquele 11 em vez de 00. Algo estava errado, mesmo

 

Para salvar dados em arquivos, dá para usar a função fprintf. é bem semelhante a printf. A diferença é que o primeiro parâmetro é o ponteiro para o arquivo onde a mensagem será salva:

 

int main()
{
	FILE *fp;
	char str[] = "String para ser salva em arquivo";
	
	fp = fopen("saida.txt", "w");
	
	fprintf(fp, "%s", str);
	
	fclose(fp);
	
	return 0;
}

http://www.cplusplus.com/reference/clibrar...io/fprintf.html

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

 

OBS: é sempre bom verificar se fopen() não retornou NULL. Não fiz isso nos exemplos, pois eram só exemplos. :P Mas é bom comparar com NULL, para que o programa não gere erros ao ler ou salvar o arquivo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.

 

Mas ai eu preciso CRIAR esse NOVO arquivo no programa também né ?

 

 

Pq no inicio do programa eu tenho que pedir para ele LER o arquivo com as distâncias.

 

 

 

Eu posso fazer isso no programa.

 

Pedir para ele Ler um arquivo e salvar as informações em outro ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim. VocÊ pode fazer isso. O arquivo de saída nem precisa existir. Usando a opção "w" no fopen(), o programa cria o arquivo.

 

Primiro você vai ler o arquivo e encontrar a linha. Depois var fechar esse arquivo. Em seguida abrirá o arquivo de saída, salvará o dado nele e o fechará.

 

Basicamente:

fp = fopen(arquivo de entrada, "r")
ler o arquivo e encontrar a linha
flose(fp)

Agora você abre o arquivo de saída. Pode usar o mesmo ponteiro
fp - fopen(saida, "w")
salva os dados
fclose(fp)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza.

 

Entendi como ficará a estrutura do programa.

 

Você já meu ajudou com o ponta pé inicial.

 

Tentarei fazer de maneira completa agora.

 

 

Amanha postarei novamente para informar se consegui resolver este problema.

 

 

 

Grande abraço e muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,

 

Estou tentando fazer o programa, mas me deparei com outra dificuldade.

 

Entendi perfeitamente a maneira de ler uma linha do arquivo e mostrar na tela, mas no caso do exercicio pede-se o seguinte.

 

No arquivo de texto são 25 linhas, cada linha com uma distância. E para mostrar na tela a linha quq eu qro, seria atraves de 2 comandos que seriam digitados na tela.

 

Exemplo:

 

Cidade 1: Digitariamos 3

 

Cidade 2: Digitariamos 2

 

00 30 28 05 12

30 00 10 17 28

28 10 00 03 11

05 17 03 00 80

12 28 11 80 11

 

 

Ai na tela mostraria o resultado 10 de acordo com a nossa matriz.

 

Mas essa matriz esta digitada em um arquivo de texto, linha a linha. E esse resultado 10 corresponderia a linha numero 8 certo ?

 

Ai a pergunta é:

 

Para chegar na linha 8 eu teria que usar alguma expressão matématica ?

 

Pq para ele apontar para a linha 8 seria atraves de 2 comandos digitados na tela.

 

Ai pensei em colocar algo no programa algo assim:

 

 

for ( i=0 ; i<(cid2-1)*5)+cid1)

 

E de acordo com o noss exemplo de cidade 1 = 3 e cidade 2 = 2

 

((cid2 - 1)*5+cid1) -> (2-1)*5 + 3 -> Resultado seria 8 que é a linha que quero mostrar.

 

Fiz os testes com varias cidades e deu certo a conta.

 

Mas o problema é q não consigo colocar isso no programa, pois sempre dá erro.

 

Olha como está no momento.

 

#include <stdio.h>

int main()
{
	 FILE *fp;
	 char str[20];
	 int cid1,cid2,i;

	 printf("Cidade 1: ");
	 scanf("%d", &cid1);

	  printf("Cidade 2: ");
	  scanf("%d", &cid2);

	 fp = fopen("tabela.txt", "r");

	 while ( fgets(str, 30, fp))
	 {
		for (i=0;i<((cid2-1)*5)+cid1;i++)
		  {
		  printf ( "distancia e:\n%s\n", str);
				 }
				 }
			 fclose(fp);

	 return 0;
}

 

O programa até roda, mas não da maneira que deveria ser.

 

 

Estou no caminho certo ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com base no seu exemplo (elemento 3 da linha 2), basta fazereste cálculo:

 

((linha_desejada - 1) * numero de colunas da matriz) + coluna_desejada

 

Com os núemros do exemplo:

 

((2 - 1) * 5 ) + 3

1 * 5 + 3

8

 

Elemento 4 da linha 3:

( (3 - 1) * 5) + 4

2 * 5 + 4

14

 

Não precisa de loop; apenas um smiples cálculo.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficou assim

 

#include <stdio.h>

int main()
{
	 FILE *fp;
	 char str[20];
	 int cid1,cid2,i;

	 printf("Cidade 1: ");
	 scanf("%d", &cid1);

	  printf("Cidade 2: ");
	  scanf("%d", &cid2);

	 fp = fopen("tabela.txt", "r");

	 while ( fgets(str,30,fp));

		i=(((cid2-1)*5)+cid1);

		  printf ( "distancia e:\n%s\n",str);

			  fclose(fp);

	 return 0;
}

 

Mas na tela, sempre está imprimindo o resultado 00. Para qualquer cidade que digito o resultado é 00.

 

 

O que pode estar errado ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

vocÊ tem que iniciar a variável i com 1 e incrrementá-la dentro do loop while.

Você fechou o while com ";".

Você deve calcular o valor da linha fora do loop

 

veja:

#include <stdio.h>

int main()
{
	 FILE *fp;
	 char str[20];
	 int cid1,cid2,i = 1, linha;

	 printf("Cidade 1: ");
	 scanf("%d", &cid1);

	  printf("Cidade 2: ");
	  scanf("%d", &cid2);
	  
	  linha = (((cid2-1)*5)+cid1);

	 fp = fopen("tabela.txt", "r");

	 while ( fgets(str,30,fp))
	 {
	 	if (i == linha)
	 		break;
	 	
	 	i++;
	 }
	 
	 fclose(fp);

	  printf ( "distancia e:\n%s\n",str);

	  
	 return 0;
}

Se não entender alguma parte, avise. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só não entendi o que acontece dentro do loop While.

 

 

 

Agora vou tentar fazer que ao invés dos resultados serem exibidos na tela, ele sejam exibido em outro arquivo tipo texto.

 

Se tiver mais dúvidas eu entro em contato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo.

 

O exercicio completo ficou assim:

 

#include <stdio.h>

int main()
{
	  FILE *fp;
	  char str[20];
	  int cid1,cid2,i = 1, linha;

	  printf("Cidade 1: ");
	  scanf("%d", &cid1);

		printf("Cidade 2: ");
		scanf("%d", &cid2);
	  
		linha = (((cid2-1)*5)+cid1);

	  fp = fopen("tabela.txt", "r");

	  while ( fgets(str,30,fp))
	  {
		 if (i == linha)
				 break;
		 
			i++;
	  }
	 
	  fclose(fp);


	  fp = fopen("exerc.txt", "w");

		fprintf(fp, "%s", str);


	  return 0;
}

 

Testei e funcionou.

 

 

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

faltou o fclose() no final para fechar o arquivo de saída.

 

 

O loop while faz o seguinte:

 

( antes de começar a ler o arquivo, o valor de i é 1, o que corresponde que a linha 1 será lida)

* lê uma linha (mais precisamente a linha i) do arquivo com fgets()

* verifica se o valor de i é igual ao de "linha", a fim de saber se o valor de str é o conteúdo da linha buscada.

* se for, pára o loop com break

* caso contrário, incrementa o valor de i e faz nova leitura da linha (agora a leitura será na linha seguinte à anterior)

faz comparacção de i com "linha"

...

 

Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi sim.

 

Agora posso dar como conluído este exercicio.

 

 

Aproveitandoo tópico.

 

E se o professor pedisse de ao inves de ler essa matriz de distâncias do arquivo. Ele pedisse para ler direto do programa C.

 

Ou seja,

 

Eu teria que no desenvolvimento do programa já deixar essa matriz pronta e qdo executa-se o programa, ele pediria a cidade 1, a cidade 2 e a resposta a apareceria na tela mesmo.

 

A matriz já teria que ser digitada no corpo do programa certo.

 

Vê se isto está correto

 

Delcarar a matriz

 

int m[5][5] = { 00,30,28,05,12,30,00,10,17 ...............00 }

 

Está certo ?

 

 

Pq tentei fazer este mesmo programa acima, sem utilizar "arquivos" e não consegui tb.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse caso é bem mais simples, pois você simplesmente imprimiria o valor de matriz[linha][coluna], onde "linha" e "coluna"' são os números das cidades.

 

Está errada a forma como você declarou essa matriz. Pense assim: uma matriz é um vetor de vetores. Logo, cada índice de um vetor é outro vetor. Então tem que declarar assim:

 

int matriz[3][3] = {
							 {1, 2, 3},
							 {4,. 5, 6},
							 {7, 8, 9}
						   };

Essa é uma matriz de 3 por 3, mas a de 5 por 5 é semelhante. Coloquei o código disposto de uma forma a facilitar bem a leitura. http://forum.imasters.com.br/public/style_emoticons/default/natal_smile.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.