Pomoc s programom C++

Sekcia o programovaní, programovacích jazykoch...
Používateľov profilový obrázok
M1ch4l
VIP
VIP
Príspevky: 6679
Dátum registrácie: Št 21. Feb, 2008, 14:00
Bydlisko: Kysucký Lieskovec / Praha

Re: Pomoc s programom C++

Príspevok od používateľa M1ch4l »

zo srandy som to napisal s tym citanim po znaku. Strasna ifovacka (bleh). Ale funguje to. Podporujem aj viac necifernych znakov medzi cislami. V skutocnosti to netreba riesit, lebo by sa len pripocitavali nuly k suctu parnych cisel, co nesposobuje problemy. Ale nezbavil som sa toho uplne. Ked mi riadok zacina niecim, co nie je cislo, pripocita sa 0 jeden krat.
moj kod:
Spoiler: ukázať

Kód: Vybrať všetko

#include <fstream>
#include <iostream>
#include <math.h>


bool jePrvocislo (int cislo) { 
	if (cislo == 1) { //1 nie je prvocislo
		return false;
	}
	int delitel = 3; //neskusam dvojku, lebo funkcia sa vola len pre neparne cisla. Inak treba delit aj dvojkou
	int medza = std::ceil(std::sqrt((double)cislo)) +1; //delitelov staci skusat do odmocniny z cisla
	while (delitel < medza) {
		if(cislo % delitel == 0) {
			return false; //ma delitela > 1, nie je to prvocislo
		}
		delitel += 2;
	}
	return true; //nema delitela okrem 1 a seba - prvocislo
}

void spracujNum (bool ok, int& cislo, int& p, int& n, int& prv) { //zachova sa podla cisla a vynuluje ho
	if (!ok) { //nastava, ked su 2 neciferne znaky za sebou - inak by som spracovaval cislo 0. Co vlastne nevadi, lebo 0 je parna a x+0=x. Ale len pre spravnost.
		return;
	}
	if (cislo % 2 == 0) { //parne
		p += cislo;
	} else { //neparne
		n += cislo;
		if (jePrvocislo(cislo)) { //vsetky prvocisla su zaroven neparne cisla
			prv *= cislo;
		}
	}
	cislo = 0;
}

int main()
{ 

  std::ifstream ifs ("vstup.txt");
  std::ofstream ofs ("vystup.txt");

  if(ifs.is_open() && ofs.is_open()) { //test, ci su subory otvorene
	  int parne = 0, neparne = 0, prvocisla = 1;
	  int num = 0;
	  bool ok = true; //je to tu len kvoli tomu, ze umoznujem medzi cislami mat viac nez 1 znak
	  while(ifs.good()) {
		  char c = ifs.get();
		  if (c >= '0' && c <= '9') { //cifra - pridavame k cislu
			  num = 10*num + c - '0';
			  ok = true;
		  } else { //hocico ine
			  spracujNum(ok, num, parne, neparne, prvocisla);
			  if (c == '\n') { //newline - cas na vystup
				  ofs << parne << ' ' << prvocisla << ' ' << neparne << std::endl;
				  //este reset pre novy riadok
				  parne = neparne = 0;
				  prvocisla = 1;
			  }
			  ok = false;
		  }
	  }
	  ofs << parne << ' ' << prvocisla << ' ' << neparne << std::endl; //vypis posledny riadok
  }
  else {
	  std::cout << "Jeden zo suborov sa nepodarilo otvorit" << std::endl;
  }

  ifs.close();
  ofs.close();
  return 0;
}
testovaci vstup:

Kód: Vybrať všetko

.bh12 3 a 7 19 14j
1 2 ...3 4 5ac 6 7
2 4 6 8
3 5 7 11
2 7 9
9, 225, 25
Music: AKG K240 MK II / Beyerdynamic DT 770 Pro 80 Ohm @ Topping DX7 Pro
Bike: 2022 Canyon Neuron CF 8; Coffee: Chemex 6-cup
Spoiler: ukázať
CPU 7800 X3D + DeepCool AK620; MB ROG Strix B650E-E; RAM G.Skill 32GB 6000CL30; GPU 7900XT Pulse; OS SSD 980 Pro 1TB; Storage SN850X 2TB, 860 QVO 2TB; PSU ROG Strix 850W Aura; CASE Define R4 Arctic White Window; Peripherals Aorus AD27QD + DELL U2311H, Razer Huntsman V2 (red linear), Razer Basilisk V3 Pro + Razer Destructor 2, Blue Snowball
BieX
Nový používateľ
Nový používateľ
Príspevky: 39
Dátum registrácie: Ut 11. Jún, 2013, 14:19
Bydlisko: Praha

Re: Pomoc s programom C++

Príspevok od používateľa BieX »

Pre Boha! Prečo máš na vstupe nečísla, keď máš zo súboru čítať čísla? Toto je školský príklad, takže vstup je vždy správny (ak by nebol, bolo by to v zadaní).
Keď už človek rieši komunikáciu na poruchovej linke, tak už základy vie a ošetrí si to ako treba aj sám.

Dám tu teda riešenie, ako by to malo vyzerať, ak by to niekto ďalší hľadal a nepoužil to tvoje hrozitánske riešenie (nemám to ošetrené na zlý vstup, ale ak by bolo treba, určite by to bolo jednoduchšie, ako to tvoje. Stačí pri chybe preskakovať znaky, to je jeden if naviac)

Kód: Vybrať všetko

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int a, sucet = 0, riadok = 1;
    ifstream ifs;

    ifs.open ("file.txt", std::ifstream::in);
    while( ifs.good() )
    {
        ifs >> a;
        if( a % 2 == 0 )
            sucet += a;
        // akykolvek dalsi podmieneny sucet

        if( ifs.peek() == '\n' || !ifs.good() )
        {
            cout << "Sucet na " << riadok << ". riadku je " << sucet << endl;
            riadok ++;
            sucet = 0;
        }
    }

    cout << "\nDone\n";
    return 0;
}
Používateľov profilový obrázok
M1ch4l
VIP
VIP
Príspevky: 6679
Dátum registrácie: Št 21. Feb, 2008, 14:00
Bydlisko: Kysucký Lieskovec / Praha

Re: Pomoc s programom C++

Príspevok od používateľa M1ch4l »

Preco? Lebo sa to moze stat. Lebo v skolskych prikladoch to tak naschval byva. Lebo toto a tamto. Co ak tu on nedal uplne presne zadanie?

Ja nevravim, ze moje riesenie je bomba super. Len som chcel vediet ako to vypada a podelil som sa s tym.
Music: AKG K240 MK II / Beyerdynamic DT 770 Pro 80 Ohm @ Topping DX7 Pro
Bike: 2022 Canyon Neuron CF 8; Coffee: Chemex 6-cup
Spoiler: ukázať
CPU 7800 X3D + DeepCool AK620; MB ROG Strix B650E-E; RAM G.Skill 32GB 6000CL30; GPU 7900XT Pulse; OS SSD 980 Pro 1TB; Storage SN850X 2TB, 860 QVO 2TB; PSU ROG Strix 850W Aura; CASE Define R4 Arctic White Window; Peripherals Aorus AD27QD + DELL U2311H, Razer Huntsman V2 (red linear), Razer Basilisk V3 Pro + Razer Destructor 2, Blue Snowball
BieX
Nový používateľ
Nový používateľ
Príspevky: 39
Dátum registrácie: Ut 11. Jún, 2013, 14:19
Bydlisko: Praha

Re: Pomoc s programom C++

Príspevok od používateľa BieX »

Len si chcel vidieť, ako to vyzerá, dobre, to beriem. Ale ešte sa trochu zahrám na múdreho a skritizujem ten tvoj kód. Neber to, prosím, ako nejaký útok, len ako dobre mienenú radu.

Zadanie je "načítajte čísla a urobte súčet toho a hentoho v riadkoch". Preto by som očakával, že keď uvidím takýto program, tak tam presne to aj uvidím hneď na prvý pohľad. Na tvoj program keď sa pozriem, tak vidím funkciu jePrvoicislo - to beriem, tá je ok.
Ďalej vidím spracujNum - bez popisu a kopa ničnevraviacich parametrov. Netuším, čo robí.
Ďalej sa konečne dostávam k funkcií main, v ktorej očkávam, že sa budú načítavať a sčítavať nejaké čísla. Vidím tam ale nejaké načítanie znakov, podivnú premennú ok, strašnú funkciu spracujNum a zrazu vypísanie výsledku.
Akože fúha, je v tom trocha bordel. Fakt mi chvíľu trvalo, kým som vôbec pochopil, čo robí funkcia spracujNum.
Kde je chyba? Pomocné funkcie využívaš tam, kde netreba a naopak nevyužívaš tam, kde ich treba. Funkcie by mali robiť nejakú elementárnu, jednoznačne definovanú činnosť. Určite netreba (NIKDY!) používať funkce ako spracujVysledky(a,b,c,d,e,f) a v nej robiť nejaké hrozné neprehľadné kúzla.
Hlavne to použitie funkcií som chcel vytknúť. Funkcie slúžia na sprehľadnenie kódu pre človeka, tak ich tak treba aj používať. A pamätaj, po tebe to vždy číta debil, ktorý nevie, ako si to myslel. Správnejšie by to mohlo vyzerať nejako takto

Kód: Vybrať všetko

#include <fstream>
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

bool is_digit( int n )
{
    return (n >= '0') && (n <= '9');
}

// preskocim vsetky neciselne znaky
void skip_nodigits( ifstream & ifs )
{
    while( ! is_digit(ifs.peek()) )
        ifs.get();
}

// nacitam cislo
int read_int( ifstream & ifs )
{
    if( !ifs.good() )
        exit(0);

    int num = 0;
    while( ifs.good() && is_digit(ifs.peek()) )
    {
        char c = ifs.get();
        num = (num*10) + (c - '0');
    }

    return num;
}

bool is_prime( int num )
{
    if( num <= 2 )
        return false;

    int sq = sqrt( num );
    for( int i = 2; i <= sq; i++ )
        if( num % i == 0 )
            return false;

    return true;
}

int main()
{
    ifstream ifs ("file.txt");
    int sumEven = 0, sumOdd = 0, sumPrime = 0;

    if( ifs.is_open() == false )
        cout << "chyba\n";
    else
    {
        int num;
        while( ifs.good() )
        {
            skip_nodigits( ifs );
            num = read_int( ifs );

            if( num % 2 == 0 )
                sumEven += num;
            else
                sumOdd += num;

            if( is_prime(num) )
                sumPrime += num;

            if( ifs.peek() == '\n' || !ifs.good() ) // novy riadok, alebo koniec suboru
            {
                cout << "sumEven  =\t" << sumEven << "\n";
                cout << "sumOdd   =\t" << sumOdd << "\n";
                cout << "sumPrime =\t" << sumPrime << "\n\n";
                sumEven = sumOdd = sumPrime = 0;
            }
        }
    }

  ifs.close();
  return 0;
}
Používateľov profilový obrázok
M1ch4l
VIP
VIP
Príspevky: 6679
Dátum registrácie: Št 21. Feb, 2008, 14:00
Bydlisko: Kysucký Lieskovec / Praha

Re: Pomoc s programom C++

Príspevok od používateľa M1ch4l »

kritiku beriem. Prave som velmi rad, ze som dostal nejaky feedback. Je to pre mna dost cenne, pretoze som nevedel, ako na tom vlastne s programovanim som. No a ked sa pozriem na moj kod a na tvoj kod, tak by som povedal, ze som na tom dost zle. Uz som dlho tie moje programovacie schopnosti nezlepsoval, mal by som s tym daco robit. Tento tvoj kod vyzera uzasne.
Music: AKG K240 MK II / Beyerdynamic DT 770 Pro 80 Ohm @ Topping DX7 Pro
Bike: 2022 Canyon Neuron CF 8; Coffee: Chemex 6-cup
Spoiler: ukázať
CPU 7800 X3D + DeepCool AK620; MB ROG Strix B650E-E; RAM G.Skill 32GB 6000CL30; GPU 7900XT Pulse; OS SSD 980 Pro 1TB; Storage SN850X 2TB, 860 QVO 2TB; PSU ROG Strix 850W Aura; CASE Define R4 Arctic White Window; Peripherals Aorus AD27QD + DELL U2311H, Razer Huntsman V2 (red linear), Razer Basilisk V3 Pro + Razer Destructor 2, Blue Snowball
Používateľov profilový obrázok
peter68
Nový používateľ
Nový používateľ
Príspevky: 12
Dátum registrácie: Po 01. Feb, 2010, 17:30
Bydlisko: Lazy pod Makytou

Re: Pomoc s programom C++

Príspevok od používateľa peter68 »

Caute, som uplny zaciatocnik a neviem si rady s jednou vecou. Potreboval by som vymysliet nekonecny cyklus do ktoreho budem zadavat cisla, tie sa ulozia. Pismeno "Q" bude na ukoncenie smycky a následne sa vypisu cisla ktore som zadal.

Skusal som par veci ale vzdy sa mi to zacyklilo :/
BieX
Nový používateľ
Nový používateľ
Príspevky: 39
Dátum registrácie: Ut 11. Jún, 2013, 14:19
Bydlisko: Praha

Re: Pomoc s programom C++

Príspevok od používateľa BieX »

Tak ukáž, čo si skúšal :)

Návrat na "Programovanie"