2015-04-22 1 views
1

Disons que j'ai un fichier contenant plusieurs lignes de 3 colonnes:Quel est le moyen le plus efficace de trouver plusieurs sommes à partir d'un fichier?

3 1 3 
1 2 3 
4 5 6 
. . . 

L'objectif est de trouver la somme de chaque colonne. La solution est simple: faites 3 variables pour la somme puis 3 variables temporaires supplémentaires.

Cependant, cette solution ne s'adapte pas bien. Et s'il y a 6 colonnes? Ensuite, je devrais faire un total de 12 variables. Il y a d'autres façons de ne faire qu'une variable count et une variable temp et d'ajouter la variable temp à la somme correcte en utilisant le module du nombre. Mais cela semble être un hack.

Existe-t-il une meilleure façon de le faire ou une bibliothèque standard C++ destinée à cela?

+7

Utilisez un 'vecteur'. –

+0

Si vous utilisez une file d'attente, chaque ligne commence à la tête, puis avance jusqu'à ce que le caractère "\ n'", puis retourne le pointeur vers la tête. Ensuite, lorsque vous avez terminé avec tout, marchez une fois la file d'attente pour les sorties. Moins de frais généraux qu'un vecteur imo. – Fallenreaper

+0

@CoryNelson Pourriez-vous expliquer en utilisant un vecteur? – joshualan

Répondre

-1

pseudocode:

Open FilePointer (readonly) 
create a queue of ints. 
create a ptr to queue. 
read in a row. 
tokenize on space 
walk array and push onto ptr the value = value + variable 
shift ptr,  ptr = ptr->next() 
at end of row, shift ptr back to head. 
do while not EOF. 

walk queue last time, outputing the values. 
while(ptr != nullptr) { cout << ptr->value; } 
+0

Utiliser une file d'attente en C++ pour cela n'est vraiment pas une bonne idée ... – Caduchon

+0

oh, d'accord. Je n'étais pas sûr. Je pensais que vous pouviez lire dans le flux pour l'optimiser, mais j'ai pensé que ça marcherait plutôt bien. Je veux dire, cela a du sens pour moi au moins. J'adorerais un peu plus pour savoir pourquoi le mien n'est pas une bonne idée. – Fallenreaper

0

Vous pouvez utiliser un vector pour adapter dynamiquement au nombre de colonnes. Chaque élément du vecteur correspond à la somme d'une colonne.

Vous pouvez le faire de cette façon:

#include <iostream> 
#include <string>  // for using getline() 
#include <fstream>  // for file reading 
#include <sstream>  // for line parsing with stringstream 
#include <vector>  // for vectors 
#include <algorithm> // for the output trick 

using namespace std; 

int main() 
{ 
    vector<int> sum;    // intiial size is 0 
    ifstream ifs("test.txt"); 
    string line; 

    while (getline(ifs, line)) { // read file line by line; 
    stringstream ss(line); // and parse each line 
    int input; 
    for (int i = 0; ss >> input; i++) { // read columns (i counts them) 
     if (i >= sum.size())  // if there is a new column 
      sum.resize(i+1);    // resize the vector 
     sum[i]+=input;    // in any case update sum of the column 
    } 
    }     
     // when it's finished, just output the result 
    copy(sum.begin(), sum.end(), ostream_iterator<int>(cout, "; ")); 
    cout << endl; 
} 

Ce code est conçu pour une flexibilité totale: pas toutes les lignes doivent avoir le même nombre de colonnes (les colonnes manquantes sont simplement considérées comme 0).

Par exemple avec le fichier:

3 5 9 10 
2 9 8 
7 5 6 7 20 
2 4 5 6 8 

il affiche:

14; 23; 28; 23; 28; 
0

Pourquoi ne pas juste une seule variable appelée somme et une variable appelée température. Schéma de base:

Initialize sum to 0; 
while there are more lines: 
    Read 1 line of input till \n is found 
     While line has more inputs: 
      read each number out of it (using temp) 
      sum += temp 
     Next Number 
     print out sum and reset it to 0 
    Next Line 
+0

cette solution n'a besoin que d'environ 3 variables pour faire le travail et est extensible à toutes les tailles d'entrées, même l'entrée qui change le nombre de valeurs par ligne! –