» »

[C++] Pomoč pri nalogi

[C++] Pomoč pri nalogi

«
1
2

Insane123 ::

Zdravo,
jaz bi potreboval pomoč pri tej nalogi. Načrt že imam ampak probleme imam kako bi jo izvedel. V mislih imam, da bi štel znake vsake besede saj je možno pri številih od 1 do 9 samo imeti 3,4 ali 5 znakov/črk. Potem pa bi to primerjal s besedami katere so si podobne. Ampak nevem kako bi to napisal. Mi lahko kdo pomaga prosim?

BESEDILO NALOGE:
Uporabnik vnese cifro s besedo. Izpiši besedo enkrat več na zaslon v ločene vrstice.
Izpise loči z vejico.


Načrt:
Primer: uporabnik vnese šest, mi izpišemo šestkrat na zaslon besedo šest
šest
šest, šest
šest, šest, šest
šest, šest, šest, šest
šest, šest, šest, šest, šest
šest, šest, šest, šest, šest, šest

Imamo šest vrstic, v vsaki vrstici je ena beseda več.
Število besed je toliko, v kateri vrstici smo.
  • spremenil: bluefish ()

kloko ::

V katerem programskem jeziku boš pisal rešitev?

L.p., Kloko

BlackDeath ::

Na hitro v c++ brez vejic :)
Za vejice samo še en pogojni stavek daš v while zanko pa imaš še vejice.

for (int i = 1; i <= n; i++) {
		j = 0;
		while (j != i) {
			cout << niz;
			j++;
		}
		cout << endl;
	}

Zgodovina sprememb…

Insane123 ::

Pisal bom v c++

Drugace pa blackdeath hvala za pomoc ampak finta je v tem kolkokrat se ponovi mi uporabnik ne vpise s cifro 6 ampak z besedo sest in v tem je problem kak bi to pretvoro pa vse nevem:/ ker program more delat ce mi uporabnik vpise tri z besedo

Tri
Tri, tri
Tri, tri, tri

Math Freak ::

Lahko nardiš recimo tako: najprej daš uporabniku na voljo, da vpiše številko z besedo. Potem primerjaš to besedo z vsako od devetih cifer. Ko najdeš pravo cifro, shraniš koliko krat se mora ponoviti ta beseda. Potem pa izpišeš zadevo v for zanki.

V Pythonu bi lahko koda izgledala tako:

def cifra():
    cifra = input("Vtipkaj cifro od ena do devet: ").lower()
    
    if cifra == "ena":
        print("\nena")
        return
    
    elif cifra == "dva": ponovitev = 2
    elif cifra == "tri": ponovitev = 3
    
    # itd ... #
    
    elif cifra == "devet": ponovitev = 9

    else:
        print("Ni cifra.")
        return

    besedilo = cifra
    print("\n" + besedilo)
    for i in range(ponovitev-1):
        besedilo += ", " + cifra
        print(besedilo)


Primer:

>>> cifra()
Vtipkaj cifro od ena do devet: devet

devet
devet, devet
devet, devet, devet
devet, devet, devet, devet
devet, devet, devet, devet, devet
devet, devet, devet, devet, devet, devet
devet, devet, devet, devet, devet, devet, devet
devet, devet, devet, devet, devet, devet, devet, devet
devet, devet, devet, devet, devet, devet, devet, devet, devet
>>> 

Insane123 ::

Hvali ti math freak bom probal se iz tega vun znajt in pretvorit v c++. Ali bi ti mogoče znal to c ++ ? Res hvala :)

Math Freak ::

Žal v c/c++ nisem nič programiral, samo verjamem, da ti ne bo problem pretvorit =p.

Razen da moraš deklarirat spremenljivke,
print je verjetno cout,
elif je verjetno else if,
for i in range(ponovitev-1): for (int i = 0; i < n - 1; i++) {,
input pa verjetno Console.Readline ali kaj takega.

Zgodovina sprememb…

Insane123 ::

Hvala ti bom že nekak probal sicer v c++ bom verjetno moral delat z polji :D

Insane123 ::

Trenutno imam tak kaki predlogi prosim?

Pa kak bi naredo da če je napačen vnos da sploh nebi šlo v zanko pa bi moral ponoviti vnos?
Aja pa rabo bi še če ti uporabnik vpiše: THRee in to bi mogla brat se kot three in pol izpisat.



int main(int argc, char* argv[])
{
    const int NUM_DIGITS= 10;
    string lookup[NUM_DIGITS] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    


    string someStringFromUser;
    cout<<"Enter number from 0-9 with word:"<<endl;
    getline(cin, someStringFromUser);

    int intVersionOfUserInput;
    for(int i = 0; i < NUM_DIGITS; i++)
    {
        if(someStringFromUser == lookup[i])
        {
            intVersionOfUserInput = i;
            break;
        }

    }
    string number;
    number=someStringFromUser;
    for (int i = 0; i < intVersionOfUserInput; i++)
{
    cout<<someStringFromUser<<endl;
    someStringFromUser=someStringFromUser+", "+number;
}



    system("pause");
    return 0;
}

Zgodovina sprememb…

Math Freak ::

Ponavljaj vnos besed, dokler beseda ni ena izmed cifer:

Spet v Pythonu bi izgledalo tako:
while cifra not in ("ena","dva","tri", ...):
    cifra = input("Napačen vnos. Vtipkaj cifro od ena do devet: ").lower()


Pretvori v majhne črke

BlackDeath ::

Jaz bi na tvojem mestu pretvoril v lower case in imaš problem rešen ...

std::transform(niz.begin(), niz.end(), niz.begin(), ::tolower);

Insane123 ::

hvala oba za odgovore :) Glede pretvarjanja se mi že nekaj sanja pa lahko si še tudi pogledam naloge, ki smo jih že nekaj reševali na to temo v šoli sedaj edino nevem kak bi še naredil tisto, da me nebi vrglo v zanko, če bi bil napačen vnos ampak problem je, da komaj v zanki preverja, če je isto..

Math Freak ::

getline(cin, someStringFromUser);

Za tem stavkom se shrani beseda v someStringFromUser.

Sedaj bi jaz dal:

while someStringFromUser not in lookup:
    cout<<"Wrong number. Enter number from 0-9 with word:"<<endl;
    getline(cin, someStringFromUser);


Neki na to foro.

Insane123 ::

Idejo približno vem samo problem je, da se v c++ drugače zapiše in mi to dela težave :P

Math Freak ::

Poglej to: std::find, mislim da bi to mogla bit prava zadeva.

std

Zgodovina sprememb…

technolog ::

Evo, popolna rešitev, ki te sprašuje za številko, dokler ne vpišeš česarkoli s seznama

x = ['nič', 'ena', 'dva', 'tri', ...]

vnos = nil
while vnos.nil?
    puts 'Vpiši številko:'
    vnos = x.index gets.strip
end
vnos.times {|i| puts [x[vnos]] * (i+1) * ', '}


Na isti način reši v C++.

Zgodovina sprememb…

Insane123 ::

technolog to je c++ ? D:

bom si prebral tisti link hvala :)

technolog ::

Ni, ampak je postopek isti. Mam temo odprto še od takrat, ko še ni bilo napisano jezika.

1. Inciializiraš array.
2. Dokler je it enak iterator#end, ponavljaš branje in iskanje s std::find.
3. For zanka ena v drugi, s tem da pazi, da greš v notranji za eno manj in dodaš zadnji vpis izven zanke, brez vejice.

Insane123 ::

Oprosti ampak nevem namreč nismo se tega nikdar učili, ampak bom probal rešit.

technolog ::

Tu je edina fora, da zadnji element v vrstici obravnavaš posebej (to pa pomeni, da greš z notranjo for zanko za ena manj).

int ponovitev = 6;
string zbesedo = "šest";

for (int i=0; i<ponovitev; ++i) {
    for (int j=0; j<i; ++j)
        cout << zbesedo << ", ";
    cout << zbesedo << endl;
}

Zgodovina sprememb…

Pimoz ::

#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <map>

using namespace std;

int main () {
    map<string,int> m;
    m["zero"] = 0;
    m["one"] = 1;
    m["two"] = 2;
    m["three"] = 3;
    m["four"] = 4;
    m["five"] = 5;
    m["six"] = 6;
    m["seven"] = 7;
    m["eight"] = 8;
    m["nine"] = 9;
    
    cout << "Enter number from 0-9 with word:" << endl;
    string input;
    getline(cin, input);
    transform(input.begin(), input.end(), input.begin(), ::tolower);
    
    for (int i = 1; i <= m[input]; i++) {
        for (int j = 1; j <= i; j++) {
            cout << input << ' ';
        }
        cout << endl;
    }
    
    cin.get();
    return EXIT_SUCCESS;
}

Insane123 ::

Primoz hvala za pomoc ampak rad bi te vprasal kaj tisti cin.get(); na koncu pomeni? Drugace pa bi mi lahko malo opisal delovanje te zanke saj je nene popolnoma razumem. Drugače pa bi še te rad vprašal kaj pa bi še naredil če uporabnik vpiše npr. !"&#%$/) da mora ponovit vnos?

Pimoz ::

Popravljena koda še za napačen vnos:
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <map>

using namespace std;

int main () {
    map<string,int> m;
    m["zero"] = 0;
    m["one"] = 1;
    m["two"] = 2;
    m["three"] = 3;
    m["four"] = 4;
    m["five"] = 5;
    m["six"] = 6;
    m["seven"] = 7;
    m["eight"] = 8;
    m["nine"] = 9;
    
    string input;
    while (true) {
	    cout << "Enter number from 0-9 with word:" << endl;
	    getline(cin, input);
	    transform(input.begin(), input.end(), input.begin(), ::tolower);
	    if (input != "zero" && m[input] == 0) {
	    	cout << "Wrong entry!" << endl;
	    } else break;
    }
    
    for (int i = 1; i <= m[input]; i++) {
        for (int j = 1; j <= i; j++) {
            cout << input << ' ';
        }
        cout << endl;
    }
    
    cin.get();
    return EXIT_SUCCESS;
}


system("pause") je zlobna funkcija. Uporabljal cin.get().
Povej kaj točno ne razumeš pa ti razložim. Ker zanka je precej enostavna.

technolog ::

Tisti cin.get() je slaba praksa, ignoriraj. System pause je pa še 100x slabše. Ko program zaključi, zaključi s kodo 0. Da pričakuješ še nek gibberish na koncu samo zato, ker user ne zna imet odprtega terminala, je absurdno.

Pimoz, besede so ločene z vejcami, ne presledki. Drugič, mapo se da lepš inicializirat s C++11.

Ta vrstica je absolutno napačna:

if (input != "zero" && m[input] == 0) {


pravilno je:

if (m.find(input) == m.end())

Zgodovina sprememb…

Insane123 ::

Hvala fanta za pomoč :)

Ne razumem kje se seštevajo številke kje pa vrstice? Ponavadi sem delal da sem v zanki dal
cout<<input<<endl;
input=input+", four";
i=i+1;


To je nek primer na hitro.

Zgodovina sprememb…

technolog ::

Če uporabiš plus med dvema številkama, je to navadno seštevanje

6 + 7 // (to je 13)

če pa med dvema stringoma, je to stikanje nizov:

"Hello " + "World!" // "Hello Wolrd!"

Insane123 ::

Ja samo kje pa se input sešteva med dvema zankama? Vem, da sem že tečen samo bi rad podrobno vedel kako deluje program. Ne razumem kaj dela j

Zgodovina sprememb…

technolog ::

Aja, to misliš. Input se ne sešteva, ampak se v vsaki vrstici izpiše na novo, od prvega do i-tega elementa.

Pa s tole rešitvijo si ne boš mogel pomagat, ker ločuje s presledki. Moral boš skombinirat z mojo zgoraj.

Zgodovina sprememb…

Pimoz ::

@technolog
Prosim predlagaj alternativo cin.get()
"Absolutno" je zelo huda beseda :) Sem pa popravil.
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <map>
 
using namespace std;
 
int main () {
    map<string,int> m = {{"zero", 0}, {"one", 1}, {"two", 2}, {"three", 3}, {"four", 4},
                        {"five", 5}, {"six", 6}, {"seven", 7}, {"eight", 8}, {"nine", 9}};
     
    string input;
    while (true) {
        cout << "Enter number from 0-9 with word:" << endl;
        getline(cin, input);
        transform(input.begin(), input.end(), input.begin(), ::tolower);
        if (m.find(input) == m.end()) {
            cout << "Wrong entry!" << endl;
        } else break;
    }
     
    for (int i = 1; i <= m[input]; i++) {
        for (int j = 1; j <= i; j++) {
            cout << input;
            if (j != i) cout << ", ";
        }
        cout << endl;
    }
     
    cin.get();
    return EXIT_SUCCESS;
}

technolog ::

Tole je super koda.

Alternativa cin.get() je naučit učence, kako se poganja kodo, da ti ostane terminal odprt po koncu programa.

Pimoz ::

Haha :D Ok sem se nasmejal :) Na žalost niso vsi rojeni za sistemce :) Tako kot eni nismo rojeni za programerje :)

Insane123 ::

Za map je napisalo da ne more convertat {} ali kaj so tak da sem tam zgoraj anredil tako kot si že imel prej.

if (j != i) cout << ", ";


To pa ce prav razumem pravi dokler j ni enak i izpise vejice?

Zgodovina sprememb…

technolog ::

-std=c++11

Insane123 ::

technolog je izjavil:

-std=c++11


Kaj?

Pimoz ::

To pa ce prav razumem pravi dokler j ni enak i izpise vejice?

Da.

-std=c++11

To je flag (parameter) prevajalniku, da naj uporabi standard C++11 (v katerem so dodali zgornji način inicializacije spremenljivke tipa map)

mallard ::

technolog je izjavil:

,
"Hello " + "World!" // "Hello Wolrd!"


Erm, ne ni.

technolog ::

Ne, če jo daš prevajalniku. Ja, če nočeš preveč komplicirat, da komu kaj razložiš.

Insane123 ::

Kje pa napišem to? uporabljam code blocks.

mallard ::

@technolog

Aha, OP zdaj zadevo razume, ne zna pa dat prevajalniku pravilne kode? :)

Zgodovina sprememb…

  • spremenilo: mallard ()

Pimoz ::

Madona prepucavanje za brezveze...

Settings -> Compiler -> Compiler Flags
Kljukica pri opciji "Have g++ follow the C++11 ISO C++ language standard"

Insane123 ::

haha :D hvala fantje :)

Ima mogoče kdo razlago kako deluje ukaz map? :)

Zgodovina sprememb…

Vesoljc ::

Insane123 je izjavil:

haha :D hvala fantje :)

Ima mogoče kdo razlago kako deluje ukaz map? :)


map ni ukaz, ampak template objekt.
map je asociativna struktura, ki vsebuje pare [kljuc, vrednost], se pravi nek logicen kljuc asociiras z neko poljubno vrednostjo. kot array, le da kljuc ni index tipa int, ampak poljubna "vrednost".
http://www.cplusplus.com/reference/map/...

pogugli hash map
Abnormal behavior of abnormal brain makes me normal...

Insane123 ::

Kak pa bi izpisal potem v piramidi originalni vnos?

Npr. če uporabnik vnese ThRee, da bo izpisovalo kot

ThRee
ThRee, ThRee
ThRee, ThRee, ThRee

in ne kot:

three
three, three
three, three, three

Namreč vnos se prvo mora spremenit v male črke, da se lahko kasneje primerja samo me zanima, če je kakšen ukaz, ki da vnos nazaj, kot je bil prvotno?
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <map>
  
using namespace std;
  
int main () {
    map<string,int> m = {{"zero", 0}, {"one", 1}, {"two", 2}, {"three", 3}, {"four", 4},
                        {"five", 5}, {"six", 6}, {"seven", 7}, {"eight", 8}, {"nine", 9}};
      
    string input;
    while (true) {
        cout << "Enter number from 0-9 with word:" << endl;
        getline(cin, input);
        transform(input.begin(), input.end(), input.begin(), ::tolower);
        if (m.find(input) == m.end()) {
            cout << "Wrong entry!" << endl;
        } else break;
    }
      
    for (int i = 1; i <= m[input]; i++) {
        for (int j = 1; j <= i; j++) {
            cout << input;
            if (j != i) cout << ", ";
        }
        cout << endl;
    }
      
    cin.get();
    return EXIT_SUCCESS;
}

mallard ::

Naredi kopijo stringa input preden greš čezenj s funkcijo transform. Pa jaz bi, preden se spraviš string pretvarjat v male črke, preveril da ni daljši od najdaljše besede v map-u, ker ga je brez pomena pretvarjat, če že vnaprej veš, da vnos ne bo veljaven. (Kaj, če nekdo pošlje besedilo Hamleta v standardni vnos? Defensive programming,ftw).

Zgodovina sprememb…

  • spremenilo: mallard ()

Pimoz ::

#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <map>
   
using namespace std;
   
int main () {
    map<string,int> m = {{"zero", 0}, {"one", 1}, {"two", 2}, {"three", 3}, {"four", 4},
                        {"five", 5}, {"six", 6}, {"seven", 7}, {"eight", 8}, {"nine", 9}};
       
    string input, transformedInput;
    while (true) {
        cout << "Enter number from 0-9 with word:" << endl;
        getline(cin, input);
        transformedInput = input;
        transform(transformedInput.begin(), transformedInput.end(), transformedInput.begin(), ::tolower);
        if (m.find(transformedInput) == m.end()) {
            cout << "Wrong entry!" << endl;
        } else break;
    }
       
    for (int i = 1; i <= m[transformedInput]; i++) {
        for (int j = 1; j <= i; j++) {
            cout << input;
            if (j != i) cout << ", ";
        }
        cout << endl;
    }
       
    cin.get();
    return EXIT_SUCCESS;
}

mallard ::

Ne bi ti pustil da sam kaj pogrunta?

Pimoz ::

Ne :) Ker je fun :D Sploh pa če goljufa, goljufa sam sebe. Ne rabim bit proxy za njegovo učenje.

Invictus ::

Pismo ...

Koliko enih postov za problemček začetniškega programerja za 10 minut ...
"Life is hard; it's even harder when you're stupid."

http://goo.gl/2YuS2x

Insane123 ::

Hvala za odgovor. Joj oprosti, če še nismo jemali ukaza transform pa me pač malo zanima kako bi lahko naredil, saj nebom več pisal...

Pimoz ::

U še tole sem spregledal:
Ko program zaključi, zaključi s kodo 0. Da pričakuješ še nek gibberish na koncu samo zato, ker user ne zna imet odprtega terminala, je absurdno.


EXIT_SUCCESS ni gibberish, je le prečudovit makro.
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

en mali sloncek... (strani: 1 2 3 4261 262 263 264 )

Oddelek: Loža
13166305295 (10015) janez_valva
»

Izstreljen drugi evropski satelit za širokopasovni internet

Oddelek: Novice / Znanost in tehnologija
187924 (6414) Pyr0Beast
»

C++ naloge

Oddelek: Programiranje
171149 (944) BigWhale
»

C

Oddelek: Programiranje
6955 (834) Matako
»

Velikanski DDoS napad v Ameriki

Oddelek: Novice / Varnost
82700 (2700) d0rK

Več podobnih tem