powiekszanie tablicy

0

Witam. Mam program, który otwiera wcześniej przygotowany plik z liczbami. Zczytuje każda linię i zamienia znak na liczbę umieszczając ją przy tym w tablicy. Chcę zrobić automatycznie powiększająca się tablicę. Początkowo ma ona rozmiar 5. Gdy ilość wczytanych liczb przekracza zakres tablicy dochodzi do powiększenia (przynajmniej teoretycznie - bo w tym miejscu program się wykrzacza). Program się kompiluje, ale gdy dochodzi do momentu powiększenia tablicy wyskakuje w konsoli okno: Program ObsługaPliku.exe przestał działać. Gdzie jest problem?

#include <iostream>
#include <fstream>
#include <conio.h>
#include<cstdlib>
using namespace std;

int main()
{
    fstream plik;
    fstream plik1;
    int liczba, rozmiarTablicy = 5;
    
    int wczytaneLiczby[rozmiarTablicy]; 
    
    char znakRozdzialu;
    int ileLiczb=0;
    int ileParzystych=0;
    int ileNieparzystych=0;
    plik1.open("c:\\_LUKASZ\\_MOJE PROJEKTY\\Dane1.txt", ios::out);
    plik.open( "c:\\_LUKASZ\\_MOJE PROJEKTY\\liczby.txt", ios::in |ios::out  );
    if( plik.good() )
    {
       
        string linia;
        int i = 0;
        cout << "W pliku znajduja sie:" << endl << endl;
        
        do
        {
           plik >> linia;
           liczba=atoi(linia.c_str());
           ileLiczb++;
           cout << i+1 << ".   " << liczba << endl;
           if (ileLiczb < (rozmiarTablicy - 1))
           {
              wczytaneLiczby[i] = liczba;
           } else 
           {
               int nowyRozmiarTablicy = 2*rozmiarTablicy;
               int nowaTablica[nowyRozmiarTablicy];
               for (int j = 0; rozmiarTablicy; j++)
               {
                   nowaTablica[j] = wczytaneLiczby[j];
               }
               rozmiarTablicy = rozmiarTablicy*2;
               for (int k = 0; rozmiarTablicy; k++)
               {
                   wczytaneLiczby[k] = nowaTablica[k];
               }
               wczytaneLiczby[i] = liczba;
                     
          }   
            i++;
               if(liczba % 2==0)
                 ileParzystych++;
               else
		         ileNieparzystych++;
                          
        } while( !plik.eof() );
        plik.close();
    } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl;
    
   plik1<<"W pliku znajdowalo sie  "<<ileLiczb<<" liczb w tym:  "<<ileParzystych <<"  parzystych  i  " <<ileNieparzystych<<"   nieparzystych";
   plik1.close();
    getch();
    return( 0 );
} 
2
  1. int *wczytaneLiczby=new int[rozmiarTablicy]; - tak samo niżej
  2. while(plik>>liczba) - i nie potrzebujesz żadnego string'a
0

@_13th_Dragon - olbrzymie dzięki za pomoc, zawsze służysz radą.
poprawiłem, ale nadal jest ten sam problem.

0

tak samo niżej = czyli zadeklarowałem również tak samo drugą tablicę którą mam w programie (nie wiem dlaczego jest '*' w deklaracji, ale bez niej program się nie kompiluje)

 
do
        {
           plik >> linia;
           liczba=atoi(linia.c_str());
           ileLiczb++;
           cout << i+1 << ".   " << liczba << endl;
           if (ileLiczb < (rozmiarTablicy - 1))
           {
              wczytaneLiczby[i] = liczba;
           } else 
           {
               int nowyRozmiarTablicy = 2*rozmiarTablicy;
               int *nowaTablica = new int [nowyRozmiarTablicy];
               for (int j = 0; rozmiarTablicy; j++)
               {
                   nowaTablica[j] = wczytaneLiczby[j];
               }
               rozmiarTablicy = rozmiarTablicy*2;
               for (int k = 0; rozmiarTablicy; k++)
               {
                   wczytaneLiczby[k] = nowaTablica[k];
               }
               wczytaneLiczby[i] = liczba;
                     
          }   
            i++;
               if(liczba % 2==0)
                 ileParzystych++;
               else
		         ileNieparzystych++;
0
           if(ileLiczb>=rozmiarTablicy)
             {
              int nowyRozmiarTablicy=2*rozmiarTablicy;
              int *nowaTablica=new int [nowyRozmiarTablicy];
              for (int j=0;rozmiarTablicy;++j) nowaTablica[j]=wczytaneLiczby[j];
              delete[] wczytaneLiczby;
              wczytaneLiczby=nowaTablica;
              rozmiarTablicy=nowyRozmiarTablicy;
             }
           wczytaneLiczby[i]=liczba;

Tak a propos pierwszej rady też nie zastosowałeś.

0

odnośnie w/w programu. dzięki pomocy _13th_Dragon doszedłem do rozwiązania problemu od którego zacząłem, ale pojawił się kolejny który ciężko mi pokonać. Tablica powiększa się jak zakładałem, ale gdy chcę wypisać wczytane do niej elementy na konsolę wychodzą mi zupełnie inne liczby. Poniżej kod i printscreen:

#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstdlib>
using namespace std;
// wczytywanie liczby do tablicy ktora automatycznie się powiększa ??
// wyswietlenie na konsoli odnalezionych liczb
// jesli wczytana jest liczba zawierajaca slowo wyswietlenie komunikatu
// jesli wczytana jest liczba kopiowanie jej do innego pliku (oddzielenie separatorami) 

int main()
{
    fstream plik;
    fstream plik1;
    int liczba, rozmiarTablicy = 5;
    
    int *wczytaneLiczby = new int[rozmiarTablicy]; 
    
    char znakRozdzialu = '   ';
    int ileLiczb=0;
    int ileParzystych=0;
    int ileNieparzystych=0;
    plik1.open("c:\\_LUKASZ\\_MOJE PROJEKTY\\Dane1.txt", ios::out);
    plik.open( "c:\\_LUKASZ\\_MOJE PROJEKTY\\liczby.txt", ios::in |ios::out  );
    if( plik.good() )
    {
       
        string linia;
        int i = 0;
        cout << "W pliku znajduja sie:" << endl << endl;
        
        do
        {
           plik >> linia;
           liczba=atoi(linia.c_str());
           ileLiczb++;
           cout << i+1 << ".   " << liczba << endl;
           wczytaneLiczby[i] = liczba;   
            i++;
            cout << "zapisana liczba do tablicy ---> " << wczytaneLiczby[i] << "   rozmiar tablicy wynosi: " << rozmiarTablicy << endl;
           if(ileLiczb>=rozmiarTablicy)
             {
              int nowyRozmiarTablicy=2*rozmiarTablicy;
              int *nowaTablica=new int [nowyRozmiarTablicy];
              for (int j=0; j == rozmiarTablicy; ++j) nowaTablica[j]=wczytaneLiczby[j];
              delete[] wczytaneLiczby;
              rozmiarTablicy=nowyRozmiarTablicy;
              wczytaneLiczby=nowaTablica;
              
              
              }
            
               if(liczba % 2==0)
                 ileParzystych++;
               else
		         ileNieparzystych++;
                          
        } while( !plik.eof() );
        plik.close();
        
    } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl;
    
   //for (int k = 0; k == rozmiarTablicy; ++k)
    //       cout << wczytaneLiczby[k] << endl;  
   plik1<<"W pliku znajdowalo sie  "<<ileLiczb<<" liczb w tym:  "<<ileParzystych <<"  parzystych  i  " <<ileNieparzystych<<"   nieparzystych";
   plik1.close();
    getch();
    return( 0 );
}

user image

0

Bo pętla: for (int j=0; j == rozmiarTablicy; ++j) nigdy nie zrobi żadnego kroku.
Oprócz tego:

  1. Jeżeli już korzystasz z C++ używaj do tego celu vector/list/map<> jeżeli chcesz to robić ręcznie to używaj: malloc/realloc/free - wygodniejsze przy zmianie rozmiaru przydzielonego obszaru.
  2. Nie musisz nic pakować do tablicy aby zliczyć ilość parzystych/nieparzystych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1