C++ hjälp sökes

Diskussion i 'Off Topic' startad av Grejkan, 30 jun 2011.

  1. Grejkan

    Grejkan Baby Droid Medlem

    Blev medlem:
    24 dec 2010
    Inlägg:
    25
    Mottagna gillanden:
    2

    MINA ENHETER

    Jag håller just nu på med att läser upp mitt betyg i Programmering C C++ och har fastnat på en uppgift där jag ska ta emot en text sträng och sedan mata ut Antal stora, små bokstäver och antal siffror.

    Har frågat min lärare och han vill att jag ska använda if(text >= 'A' && text <= 'Z') för att kunna avgöra bokstäverna. Då det är ett tag sen jag programmerade så går det lite trögt.

    Finns det någon vänlig kodknackare som kanske skulle kunna förklara hur jag ska gå till väga?

    Tack på förhand!
     
  2. Irregular Programming

    Irregular Programming Teen Droid Medlem

    Blev medlem:
    29 jul 2009
    Inlägg:
    352
    Mottagna gillanden:
    13

    MINA ENHETER

    Konvertera om bokstäverna till respektive ascii kod, så har du löst problemet.
     
  3. MiniMax

    MiniMax Teen Droid Medlem

    Blev medlem:
    27 jan 2011
    Inlägg:
    424
    Mottagna gillanden:
    45

    MINA ENHETER

    Är tveksam till om t ex Ä har en ASCII kod. A'et i ASCII står för American.

    Börja med att hitta någon biblioteksrutin som hanterar reguljära uttryck (regular expressions) och som har förutdefinierade uttryck för stora och små bokstäver och siffror.

    Sedan tar du bokstäverna i texten, en för en, och kollar via ett reg-ex vilken grupp det tillhör.
     
  4. henca

    henca Senior Droid Medlem

    Blev medlem:
    30 dec 2009
    Inlägg:
    1 337
    Mottagna gillanden:
    218

    MINA ENHETER



    Ok, eftersom läraren sagt sådar kan vi alltså anta att vi bara behöver ta hänsyn till bokstäverna a-z, det gör livet väldigt mycket lättare!

    Då ett boolskt uttryck är det samma som heltalet 1 som sant och 0 som falskt går det att utnyttja till att göra koden lite enklare:

    void count_chars(const char *szIn, int *piUpperCase, int *piLowerCase, int *piNumbers)
    {
    int i=0;
    for(*piUpperCase=0, *piLowerCase=0, *piNumbers=0 ; szIn ; i++)
    {
    *piUpperCase += (szIn >= 'A' && szIn <= 'Z');
    *piLowerCase += (szIn >= 'a' && szIn <= 'z');
    *piNumbers += (szIn >= '0' && szIn <= '9');
    }
    }

    Men det största problemet med den här uppgiften är nog inte att hitta en lösning. Det viktiga är att du förstår lösningen och sedan kan tänka ut en ny och i någon mening snyggare lösning. T ex kanske du bör optimera lösningen med avseende på exekveringstid, antal rader eller läsbarhet. Det vore ju inte riktigt snyggt att bara planka en kodsnutt från nätet rakt av.

    m v h Henrik
     
  5. Irregular Programming

    Irregular Programming Teen Droid Medlem

    Blev medlem:
    29 jul 2009
    Inlägg:
    352
    Mottagna gillanden:
    13

    MINA ENHETER

    Rabbla up alfabetet A - Z och säg till när du når bokstaven Ä. ;)


    Vad han vill göra är simpelt.

    PHP:
    if( static_cast<int>(text[i]) >= static_cast<int>('A') && static_cast<int>(text[i]) <= static_cast<int>('Z') )
    Tvivlar på att hans kurs beblandar sig med reg-ex överhuvudtaget.
     
    Last edited: 1 jul 2011
  6. Heda

    Heda Kid Droid Medlem

    Blev medlem:
    3 mar 2011
    Inlägg:
    49
    Mottagna gillanden:
    5

    MINA ENHETER

    Det du behöver göra är att dela upp stängen i char.
    en char har ett värde precis som en siffra så där A är minst och Z störst.
    Vill du jämföra en char använder du 'A' istället för "A" som man använder till string
     
  7. Irregular Programming

    Irregular Programming Teen Droid Medlem

    Blev medlem:
    29 jul 2009
    Inlägg:
    352
    Mottagna gillanden:
    13

    MINA ENHETER

    Du har rätt, hade för mig att man inte kunde göra så i c++, var länge sedan jag höll på med det. :)
     
  8. Grejkan

    Grejkan Baby Droid Medlem

    Blev medlem:
    24 dec 2010
    Inlägg:
    25
    Mottagna gillanden:
    2

    MINA ENHETER

    Har suttit nu ett par dagar men jag får det verkligen inte att funka :( Ibland har jag lyckats få det att räkna första bokstaven och ibland inte. SKa jag använda en while-loop eller for? och isåfall hur?

    Detta är min kod förtillfället:
    Kod:
    //Var tvungen att tabort <> för det syntes inte annars
    #include iostream
    #include string
    
    using namespace std;
    
    int main()
    {
    	int stora = 0, sma = 0, tal = 0, i;
    	string text;
    
    	cout << "Mata in en text: ";
    	getline(cin, text);	
    	
    	if(text[i] >= 'A' && text[i] <= 'Z')
    	{
    		stora++;
    		{
    			else(text[i] >= 'a' && text[i] <= 'z');
    			{
    				sma++;
    			}
    			else if(text[i] >= '0' && text[i] <= '9');
    			{
    				tal++;
    			}
    		}
    	}
    
    	cout << "Stora: " << stora << endl;
    	cout << "Små: " << sma << endl;
    	cout << "Tal: " << tal << endl;
    
    	return 0;
    }
     
    Last edited: 6 jul 2011
  9. Heda

    Heda Kid Droid Medlem

    Blev medlem:
    3 mar 2011
    Inlägg:
    49
    Mottagna gillanden:
    5

    MINA ENHETER

    Var en del fel i din kod.
    Den fungerade inte ens att komilera för mig, men så här så ska det funka:

    Kod:
    //Var tvungen att tabort <> för det syntes inte annars
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	int stora = 0, sma = 0, tal = 0; //i är bättre att ha inne i for loopen
    	string text;
    
    	cout << "Mata in en text: ";
    	getline(cin, text);	
    
    	/*loopa så lång som strängen är*/
    	for(int i=0; i < text.length() ;i++)
    	{
    		if(text[i] >= 'A' && text[i] <= 'Z')
    		{
    			stora++;
    		}	//denna var på fel håll
    
    		/*	Här ska det vara else if och inte else
    			och det skall inte vara ; efter en if sats*/
    		else if(text[i] >= 'a' && text[i] <= 'z')
    		{
    			sma++;
    		}
    		else if(text[i] >= '0' && text[i] <= '9')	//ingen ;
    		{
    			tal++;
    		}
    	}
    
    	cout << "Stora: " << stora << endl;
    	cout << "Små: " << sma << endl;
    	cout << "Tal: " << tal << endl;
    
    	return 0;
    }
    
    
     
    Last edited: 6 jul 2011
    Grejkan gillar detta.
  10. Grejkan

    Grejkan Baby Droid Medlem

    Blev medlem:
    24 dec 2010
    Inlägg:
    25
    Mottagna gillanden:
    2

    MINA ENHETER

    Kom på att jag glömde skriva att jag fick kompilerings fel, my bad :( Massor med tack :D
     
  11. Irregular Programming

    Irregular Programming Teen Droid Medlem

    Blev medlem:
    29 jul 2009
    Inlägg:
    352
    Mottagna gillanden:
    13

    MINA ENHETER

    Tips,

    Ladda ner visual studio 2010 Express från Microsoft om du inte redan gjort det. Känner jag programeringslärare rätt så sitter du säkert och kämpar i en föråldrad version av borland eller ännu värre notepad.

    I VS får du direkt reda på var och vad du gjort för fel. (Med vissa reservationer)
     
    Last edited: 7 jul 2011