Autore Topic: Programma in c++  (Letto 2452 volte)

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Programma in c++
« il: 19 Febbraio 2010, 14:45:32 »
Non so se questa è la sezione giusta, io ci provo, in caso contrario scusatemi!
allora questo è l'esercizio in c++ che non riesco a risolvere:
Codice: [Seleziona]
Sia dato un file di testo contenteti il numero di righe, 
il numero di colonne e gli elementi di una matrice di stringhe.
Si scriva un programma che produca e stampi a video una nuova matrice
ottenuta cancellando prima le righe formate da stringhe tutte uguali
e poi le colonne formate da stringhe tutti uguali.

Esempio file di input:
3
3
Carlo
Carlo
Carlo
Carlo
Marco
Gianna
Carlo
Barbara
Rina

si ottiene in uscita la matrice
Marco, Gianna
Barbara, Rina
Chi mi da una mano? Magari se mi spiegaste la logica da applicare....

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Programma in c++
« Risposta #1 il: 19 Febbraio 2010, 15:11:15 »
La sezione è giusta...tranquillo.... ;)

Per quanto riguarda il tuo programma la logica è molto semplice...mediante le funzioni che il C (e quindi il C++) mette a disposizione devi creare un dato di tipo puntatore a file e aprire il file di testo in questione. TI crei una matrice di stringhe di tipo char che contenga i 9 nomi. Leggi e inserisci i nomi i maniera ciclica dal file nella matrice. analizzi iterativamente prime i contenuti delle righe e poi delle colonne con le funzioni di comparazione delle stringhe (strcmp) e se essi sono uguali le elimini dalla matrice...

Su per giù la logica è questa.....se hai ancora problemi chiedi pure e risolviamo insieme...

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Programma in c++
« Risposta #2 il: 19 Febbraio 2010, 15:21:11 »
Grazie! ;)
Allora ho scritto questo:
Codice: [Seleziona]
#include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>

#define MAX 20

typedef char stringhe[MAX];
typedef stringhe Matrice[MAX][MAX];
Matrice M;

using namespace std;

int main()
{
   int a=0,b=0,number[2];
   fstream file;
   
   file.open("nomi",ios::in);
   for(int i=0;i<2;i++)
   {
      file>>number[i];
   }
   do
   {
      file>>M[a][b];
      b++;
      if(cin.get()=='\n') 
      {
         a++;
         b=0;
      }
   }while(!file.eof());
   file.close();
   for(int k=0;k<a;k++)
   {
      for(int j=0;j<b;j++)
      {
         cout<<M[k][j];
      }
   }
   return 0;
}
         
         
e già mi blocco, infatti non riesco poi a visualizzare ciò che ho scritto nella matrice...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Programma in c++
« Risposta #3 il: 19 Febbraio 2010, 15:27:02 »
TI restituisce qualche errore o semplicemente non stampa?

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Programma in c++
« Risposta #4 il: 19 Febbraio 2010, 15:36:20 »
non stampa

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Programma in c++
« Risposta #5 il: 19 Febbraio 2010, 15:46:02 »
Nel tuo codice non hai considerato una cosa: quando prelevi i numeri dalle prime due righe del file devi usarli poi per dimensionare i limiti del ciclo. Ti limiti a leggere le righe finchè non giungi alla fine del file ma così facendo leggi pure le prime due che in realtà non ti servono.

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Programma in c++
« Risposta #6 il: 19 Febbraio 2010, 15:54:23 »
Comunque ti consiglio di leggere così i file:

 
Codice: [Seleziona]
   //-- nome del file da leggere direttamente nella dichiarazione....puoi metterlo anche dopo...
    ifstream f("file.txt");
    //-- stringa di caratteri
    string str;

   //-- un controllo non fa mai male...
    if(!f) {
        cout<<"File inesistente!Crearlo se necessario";
        return -1;
    }

    //-- finchè il codice trova qualcosa da leggere
    while(f.good())
    {
        //-- legge riga per riga e salva il contenuto nella stringa
        getline(f, s);
        //-- copia la stringa nella matrice
        strcpy (m[a][b],s);
    }
    //-- chiude f
    f.close();

    return 0;
}

Quello che ti ho scritto è un esempio...come vedi non ho gestito la localizzazione degli indici della matrice.....se hai problemi chiedi pure...

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Programma in c++
« Risposta #7 il: 20 Febbraio 2010, 18:14:42 »
Ok, sto provando a farla più difficile di quanto sembri....e ovviamente non va....
Allora ho inserito un paio di cose, suddividendo il programma in vari files:

header.h
Codice: [Seleziona]
#ifndef HEADER_H
#define HEADER_H

#include<iostream>
#include<fstream>
#include<cstdlib>

#define MAX 20

typedef char Matrice[MAX];
typedef Matrice nomi[MAX][MAX];

class Editing
{
  int number[2];
  nomi M;
  public:
  void lettura();
  void scrittura();
}; 

#endif

lettura.cpp
Codice: [Seleziona]
#include"header.h"

using namespace std;

void Editing::lettura()
{
   int c=0,r=0;
   fstream file;
   file.open("nomi",ios::in);
   if(!file)
   {
      exit(1);
   }   
   for(int i=0;i<2;i++)
   {
      file>>number[i];
   }
   do
   {
      file>>M[c][r];
      r++;
      if(r==number[1])
      {   
         c++;
         r=0;
      }
   }while(!file.eof());
   file.close();
}

scrittura.cpp
Codice: [Seleziona]
#include"header.h"

using namespace std;

void Editing::scrittura()
{
   for(int c=0;c<number[0];c++)
   {
      for(int r=0;r<number[1];r++)
      {
         cout<<M[c][r]<<"\t";
         if(r==number[1]-1)
         {
            cout<<M[c][r]<<endl;
         }
      }
   }
}

main.cpp
Codice: [Seleziona]
#include"header.h"

using namespace std;

int main()
{
   Editing lettura();
   Editing scrittura();
   return 0;
}

tuieni però presente che di classi ne so pochissimo ho appena cominciato a studiarle quindi potrebbero esserci errori stupidi.
Ovviamente sono tutt'orecchie, mmm, no direi più tutt'occhi!!!!

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Programma in c++
« Risposta #8 il: 20 Febbraio 2010, 18:40:14 »
Non complicarti inutilmente la vita...scrivi tutto in un unico file....quando poi avrai finito e avrai visto che il tuo programma funziona bene allora passi allo studio della suddivisione in classi... ;)