Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zadanie z matury rozszerzonej 2011

Ostatnio zmodyfikowano 2013-04-28 12:08
Autor Wiadomość
kejkun
Temat założony przez niniejszego użytkownika
[C++] Zadanie z matury rozszerzonej 2011
» 2013-04-27 21:57:09
Witam, znalazlem na stronie kod, ktory probowalem popawic , aby dzialal, niestety nadal nie dziala
wywala blad " out of range"  po wlaczeniu, jak go naprawic ?
 o to kod :

C/C++
#include <iostream>
#include <conio.h>
#include <fstream>
#include <sstream>


using namespace std;

int main()
{
    fstream plik, plik2, plik3; //tu "zaczepimy" otwierany plik
    ofstream zapis, wpisz1; //tu otworzymy pliki do zapisu
    int dlugosc, parzyste = 0;
    string napis;
   
    //a)Ile jest liczb parzystych w całym pliku?
   
    //a
    plik.open( "  e:/liczby.txt", ios::in );
    zapis.open( "  e:/zadanie6.txt", ios::out );
   
    for( int i = 0; i < 1000; i++ )
    {
        getline( plik, napis ); //wczytanie
        dlugosc = napis.length(); //zapisuje dlugosc
        if( napis.substr( dlugosc - 1, 1 ) == "0" ) parzyste++;
        //ostatnia cyfra to 1?
    }
    zapis << "a) " << parzyste << "\n"; //zapis do pliku
    plik.close();
   
   
    //b
    plik2.open( "  c:/liczby.txt", ios::in ); //otwieram plik
    dlugosc = 0; string najwieksza;
    bool wieksza = true;
   
    for( int i = 0; i < 1000; i++ )
    {
        getline( plik2, napis ); //wczytuję linie
        if( napis.length() > dlugosc ) { najwieksza = napis; dlugosc = napis.length(); }
        //   sprawdzam tylko dlugosc
        else if( napis.length() == dlugosc )
        {
            wieksza = true;
            //niżej sprawdzam kolejne cyferki
            for( int j = 0; j < dlugosc; j++ )
            {
                //jesli wczytana cyferka większa,
                //cała liczba wczytana jest większa
                if( najwieksza[ j ] < napis[ j ] ) break;
                //jeśli cyferka mniejsza, cała liczba mniejsza
                else if( najwieksza[ j ] > napis[ j ] ) { wieksza = false; break; }
            }
            if( wieksza ) { dlugosc = napis.length(); najwieksza = napis; }
            //jęsli spełniony podmieniam
        }
    }
   
    int wartosc = 0;
    int potega = 1;
    for( int i = 0; i < dlugosc; i++ )
    {
        if( najwieksza.substr( dlugosc - i - 1, 1 ) == "1" ) wartosc += potega;
       
        potega *= 2;
    }
    zapis << "b)" << najwieksza << " " << wartosc << "\n";
    plik2.close();
   
    //c
    plik3.open( "  c:/liczby.txt", ios::in );
    int ilosc = 0;
    wartosc = 0;
   
   
    for( int i = 0; i < 1000; i++ )
    {
        getline( plik3, napis );
        if( napis.length() == 9 ) //sprawdzam długość
        {
            ilosc++;
            potega = 1;
            //wartosc=suma wszystkich 9-cyfrowych
            //w dziesiętnym
            for( int j = 0; j < dlugosc; j++ )
            {
                if( najwieksza.substr( dlugosc - j - 1, 1 ) == "1" ) wartosc += potega;
               
                potega *= 2;
            }
           
        }
    }
    zapis << "c) " << "\n"; //<tutaj zamiana na dwójkowy ;
    //zapisuje 1 lub 0 do tablicy, cały czas liczę ile cyfr
    int i = 0;
   
    int tablica[ 100 ];
   
    while( wartosc != 0 )
    {
        if( wartosc % 2 == 0 ) { tablica[ i ] = 0; wartosc = wartosc / 2; }
        else { tablica[ i ] = 1; wartosc = wartosc / 2; }
        i++;
    }
    //zapisuje je kolejno, OD KOŃCA
    while( i > 0 )
    {
        i--;
        zapis << tablica[ i ];
       
    }
    plik3.close();
    zapis.close();
    getch();
}
tu mozna pobrac plik :
http://maturzysta.dlastudenta.pl/artykul /Egzamin_maturalny_informatyka,6986.html
P-81317
Monika90
» 2013-04-28 07:06:07
C/C++
plik.open( "  e:/liczby.txt", ios::in );
zapis.open( "  e:/zadanie6.txt", ios::out );
Tak się nie da otworzyć plików, bo masz dwie spacje na początku nazwy.
Poza tym, okropnie wygląda ten Twój program, podziel go na funkcje, a komentarze takie jak "//otwieram plik", albo "//wczytuję linie" są bez sensu.
P-81326
kejkun
Temat założony przez niniejszego użytkownika
» 2013-04-28 10:18:02
faktycnie wystarczylo to , aby program zadziałał , lecz nadal nie dziala podpunkt c)
w sensie nic nie zapisuje do pliku, pomysl czemu ??
P-81327
pekfos
» 2013-04-28 11:52:45
A ścieżka jest poprawna?
P-81337
kejkun
Temat założony przez niniejszego użytkownika
» 2013-04-28 12:00:52
dzieki wielkie !  ślepy chyba jestem :P

Przy okazji:
mamy czesc kodu :
C/C++
else if( napis.length() == dlugosc )
{
    wieksza = true;
    //niżej sprawdzam kolejne cyferki
    for( int j = 0; j < dlugosc; j++ )
    {
        //jesli wczytana cyferka większa,
        //cała liczba wczytana jest większa
        if( najwieksza[ j ] < napis[ j ] ) break;
        //jeśli cyferka mniejsza, cała liczba mniejsza
        else if( najwieksza[ j ] > napis[ j ] ) { wieksza = false; break; }
    }
    if( wieksza ) { dlugosc = napis.length(); najwieksza = napis; }
    //jęsli spełniony podmieniam
}
program działa poprawnie bez niej,
i srednio ogarniam ten zapis szczerze mowiac,

ale sadze , ze chodzi o to, ze jak program znajdzie np. 3 liczby   o dlugosci 9 , to porownuje ich wspolczynniki( kolejne cyfry ) ?
bo tutaj to srednio to widzę .
P-81340
pekfos
» 2013-04-28 12:08:14
Ten kod sprawdza, czy jeden tekst jest większy od aktualnie największego (o takiej samej długości). Bez sensu jest tu przypisanie
C/C++
dlugosc = napis.length();
Skoro ten kod jest w warunku
C/C++
if( napis.length() == dlugosc )
.

Coś za dużo czasu jest na tej maturze, wystarczyło użyć
std::lexicographical_compare <>
. ;)
P-81343
« 1 »
  Strona 1 z 1