somar valores de linhas iguais

1. somar valores de linhas iguais

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 15/01/2021 - 13:53h

Ola, eu estou com um pequeno problema:
tenho uma matriz com 3 colunas enquanto os 2 primeiros elementos de linhas subsequentes forem iguais, eu preciso somar o ultimo elemento de cada linha. Se uma linha nao for igual a outra, o programa deve retornar o ultimo valor dessa linha. POr exemplo, se o arquivo for:
0 0 2
1 2 3
1 2 6
1 2 7
1 4 5
2 4 5
2 4 7
6 7 5
6 7 3
6 4 4
O programa deve retornar:
0 0 2
1 2 16
1 4 5
2 4 12
6 7 8
6 4 4

Segue abaixo o codigo que eu escrevi mas nao ta funcionando:
#include<stdio.h>
#include<stdlib.h>

static float matriz[100][100];
int main(){
FILE *a = fopen("/home/exp.dat","rf");
int i = 0;
float c,d,e;
float soma = 0;
while(!feof(a)){
fscanf(a,"%f %f %f\n",&c,&d,&e);
matriz[i][0]=c;
matriz[i][1]=d;
matriz[i][2]=e;
i++;
}
i = i-1;//até aqui foi só pra ler os dados e gravar numa matriz.

//O problema começa a partir daqui
for(int ix = 0;ix <= i; ix++){
//soma=matriz[ix][2];
if(matriz[ix+1][0] == matriz[ix][0] && matriz[ix+1][1] == matriz[ix][1]){
soma += matriz[ix+1][2];
}
else{
printf("%f %f %f\n",matriz[ix][0],matriz[ix][1],soma);
}

}
printf("%d\n",i);
fclose(a);
return 0;
}


  


2. Re: somar valores de linhas iguais

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/01/2021 - 11:22h

Você não precisa de matriz.

Programas deste tipo requerem um tratamento especial para a primeira linha. Da segunda linha em diante, você pode ter um laço de repetição que compara os dados da linha que acabou de ser lida com os da linha anterior, e tomar as ações adequadas de acordo com o resultado dessa comparação.

feof() não é a melhor forma de ver se o laço de repetição deve ser interrompido. Conforme explicado num outro tópico (https://www.vivaolinux.com.br/topico/C-C++/PROBLEMAS-COM-O-COMANDO-whilefeofa), feof() pode ser usada após a ocorrência de uma excepcionalidade com um arquivo para saber se a causa dessa excepcionalidade foi ter chegado ao fim do arquivo. Para parar o laço de repetição, o que você deve fazer é examinar o resultado devolvido pela função de leitura, que, no seu caso, é fscanf().


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


3. Re: somar valores de linhas iguais

LINER DE SOUZA SANTOS
linersantos

(usa Ubuntu)

Enviado em 16/01/2021 - 14:52h

Programas deste tipo requerem um tratamento especial para a primeira linha. Da segunda linha em diante, você pode ter um laço de repetição que compara os dados da linha que acabou de ser lida com os da linha anterior, e tomar as ações adequadas de acordo com o resultado dessa comparação

Muito obrigado pela sugestao :). So nao entendi bem como fazer isso. Eu tenho q ler duas linhas de uma vez? vc tem algum exemplo?
Obrigado desde ja.


4. Re: somar valores de linhas iguais

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/01/2021 - 15:07h

linersantos escreveu:

Programas deste tipo requerem um tratamento especial para a primeira linha. Da segunda linha em diante, você pode ter um laço de repetição que compara os dados da linha que acabou de ser lida com os da linha anterior, e tomar as ações adequadas de acordo com o resultado dessa comparação

Muito obrigado pela sugestao :). So nao entendi bem como fazer isso. Eu tenho q ler duas linhas de uma vez? vc tem algum exemplo?


Se eu mostrar como faz, vou acabar entregando a resposta pronta (até porque o que eu já disse já está muito perto da resposta final).

A leitura será sempre de uma linha de cada vez, porque essa é a própria natureza de se trabalhar com arquivos contendo texto. No entanto, após ler uma linha, você tem de ter informação suficiente a respeito da linha anterior (exceto no caso de primeira linha, que não possui anterior, e por isso mesmo eu disse que você tem de tratá-la de forma especial, antes de começar o laço de repetição) para decidir se vai fazer uma soma ou se vai imprimir o que já foi somado e começar uma soma nova.

Eu esqueci de mencionar anteriormente, mas possivelmente você vai precisar também de algum tratamento especial após ler a última linha, após sair do laço de repetição.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts