Just nu i M3-nätverket
Jump to content

Array och räkna tecken


AnnaGK

Recommended Posts

Hjälp! Känner mej helt borta i huvudet och får inte till nedan. Ska försöka bygga ett program där jag skriver in ett antal tecken. Sedan ska jag räkna ut hur många gånger varje tecken förekommer.

Har försökt med flera sätt att få ner arrayen f[] till sista funktionen men får inte till det.

Får felmeddelande om:

|109|error: expected constructor, destructor, or type conversion before '<<' token|

|111|error: expected unqualified-id before "for"|

|111|error: expected constructor, destructor, or type conversion before '<' token|

|111|error: expected constructor, destructor, or type conversion before '++' token|

 

Koden som följer:

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


const int ANTAL_BOKSTAVER = 26;  //A-Z

//--------------------------------------------------------
// Funktionsdeklarationer:


void berakna_histogram_abs(const string &str);
void skriv_histogram_abs(const int f[]);

//--------------------------------------------------------
// Huvudprogram:

int main()
{
string rad;
cout<<"Mata in en rad text: ";
getline(cin,rad);

// Anrop av funktioner som beräknar och skriver
// ut frekvensen av bokstäver i strängen rad
berakna_histogram_abs(rad);
skriv_histogram_abs ();

 return 0;
}


//--------------------------------------------------------
// Funktionsdefinitioner:

// Dekl. av funktion som beräknar och skriver ut ett
// frekvenser av bokstäverna i strängen s
// str är indata (värdeparameter) till funktionen
void berakna_histogram_abs(const string &str)
{

 // En array f att lagra frekvensen i
 // Antal platser är lika med antalet olika bokstäver
 int f[ANTAL_BOKSTAVER];

 //Nollställ f:
 for (int i=0; i<ANTAL_BOKSTAVER; i++)
f[i] = 0;
 // Loopa igenom hela strängen, tecken för tecken
 for ( int i=0; i< (int) str.length(); i++)
{
 	int index;


 	// Om tecknet är en gemen
 	if (str.at(i)>='a' && str.at(i)<='z')
{
     	// räkna ut platsen i arrayen
  index = str.at(i) - 'a';
     	// uppdatera räknaren på rätt plats
  f[index]++;
}

 	// Om tecknet är en versal
 	if (str.at(i)>='A' && str.at(i)<='Z')
{
  // räkna ut platsen i arrayen
  index = str.at(i) - 'A';
  // uppdatera räknaren på rätt plats
  f[index]++;
}

}
}

 //Skriv ut frekvensen i en tabell
void skriv_histogram_abs( );

  cout<<"\nBokstav\tFrekvens\n";
 // Loopa över alla platser i arrayen
 for (int i=0; i<ANTAL_BOKSTAVER; i++)
{
 	// Konvertera platsen till ett teckenvärde
char b = char (i+'A');
if (f[i]) cout << b << "\t" << f[i] <<endl;
}

Link to comment
Share on other sites

Du har deklarerat f inuti en funktion/metod vilket innebär att f inte längre finns när metoden avslutas. Har du lärt dig något om klasser?

Link to comment
Share on other sites

En enkel lösning är att göra om f till en global variabel. Flytta f från din funktion och deklarera den globalt. Din andra funktion skall ej längre h f som inparameter; behövs ej då f är global. Kolla gärna in 'scope of variables' på http://www.cplusplus...rial/variables/

 

Exempelvis

 

const int ANTAL_BOKSTAVER = 26; //A-Z

int f[ANTAL_BOKSTAVER];

//--------------------------------------------------------

// Funktionsdeklarationer:

Link to comment
Share on other sites

Tack för era svar.

Cecilia: Tyvärr har vi inte kommit in på klasser ännu.

T_M: Vi får inte använda oss av globala variabler och inte av pekare heller.

 

Har försökt flytta upp variabeln int f[] till main och lagt in retur int f[]; på funktionen berakna_histogram_abs men får ändå at jag har för få argument för att beräkna

|42|error: too few arguments to function 'int berakna_histogram_abs(std::string, int*)'|

55|error: at this point in file|

|43|error: too few arguments to function 'void skriv_histogram_abs(int*)'|

|56|error: at this point in file|

In function 'void berakna_histogram_abs(std::string, int*, int&)':|

|73|error: declaration of 'int f [26]' shadows a parameter|

|103|error: return-statement with a value, in function returning 'void'|

|111|error: expected constructor, destructor, or type conversion before '<<' token|

|113|error: expected unqualified-id before 'for'|

|113|error: expected constructor, destructor, or type conversion before '<' token|

|113|error: expected constructor, destructor, or type conversion before '++' token|

 

Har sökt på nätet för att hitta hur man ska göra men inte fått napp. Har en hjärna som snurrar rätt bra just nu sad.gif

Blir att sätta sej och läsa igenom all dokumentation igen och se om jag kan hitta något.

Link to comment
Share on other sites

Koden kommer här:

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


const int ANTAL_BOKSTAVER = 26;  //A-Z

//--------------------------------------------------------
// Funktionsdeklarationer:


int berakna_histogram_abs(const string str, int frekvens[]);
void skriv_histogram_abs(int frekvens[]);

//--------------------------------------------------------
// Huvudprogram:

int main()
{
string rad;
int frekvens[];

cout<<"Mata in en rad text: ";
getline(cin,rad);
berakna_histogram_abs(rad);
skriv_histogram_abs ();

 return 0;
}


//--------------------------------------------------------
// Funktionsdefinitioner:

// Dekl. av funktion som beräknar och skriver ut ett
// frekvenser av bokstäverna i strängen s
// str är indata (värdeparameter) till funktionen
void berakna_histogram_abs(const string str, int frekvens[])
{

 // En array frekvens att lagra frekvensen i
 // Antal platser är lika med antalet olika bokstäver
 int frekvens[ANTAL_BOKSTAVER];

 //Nollställ f:
 for (int i=0; i<ANTAL_BOKSTAVER; i++)
frekvens[i] = 0;
 // Loopa igenom hela strängen, tecken för tecken
 for ( int i=0; i< (int) str.length(); i++)
{
 	int index;


 	// Om tecknet är en gemen
 	if (str.at(i)>='a' && str.at(i)<='z')
{
     	// räkna ut platsen i arrayen
  index = str.at(i) - 'a';
     	// uppdatera räknaren på rätt plats
  frekvens[index]++;
}

 	// Om tecknet är en versal
 	if (str.at(i)>='A' && str.at(i)<='Z')
{
  // räkna ut platsen i arrayen
  index = str.at(i) - 'A';
  // uppdatera räknaren på rätt plats
  frekvens[index]++;
}

}
return frekvens[ANTAL_BOKSTAVER];
}

 //Skriv ut frekvensen i en tabell
void skriv_histogram_abs(int frekvens[]);

  cout<<"\nBokstav\tFrekvens\n";
 // Loopa över alla platser i arrayen
 for (int i=0; i<ANTAL_BOKSTAVER; i++)
{
 	// Konvertera platsen till ett teckenvärde
char b = char (i+'A');
if (frekvens[i]) cout << b << "\t" << frekvens[i] <<endl;
}

Link to comment
Share on other sites

Du måste se över hur du anropar dina funktioner i main så att de matchar deklarationerna annars får man felmeddelanden av typen "too few arguments", samt flytta frekvens till main.

Link to comment
Share on other sites

Nu har jag fått till det så att första funktionen fungerar (om jag skriver med den andra funktionen i den första men den ska vara uppdelad enligt uppgiften. rolleyes.gif

Men den andra får jag fel på:

In function `void berakna_histogram_abs(const std::string&, int*)':|

|98|error: a function-definition is not allowed here before '{' token|

|106|error: expected `}' at end of input|

Nu får jag i alla fall inte felet om too few arguments. Tack för tipset Cecilia!thumbsup.gif

 

 

Link to comment
Share on other sites

Och här kommer koden :-)

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


const int ANTAL_BOKSTAVER = 26;  //A-Z

//--------------------------------------------------------
// Funktionsdeklarationer:

void berakna_histogram_abs(const string &str, int f[]);
void skriv_histogram_abs(int f[]);

//--------------------------------------------------------
// Huvudprogram:

int main()
{
 string rad;
 cout<<"Mata in en rad text: ";
 getline(cin,rad);

 int f[ANTAL_BOKSTAVER];
 berakna_histogram_abs(rad,f);// Anrop av funktion som beräknar rekvensen av bokstäver i strängen rad
 skriv_histogram_abs (f);// Anrop av funktion som skriver ut frekvensen av bokstäver i strängen rad

 return 0;
}

//--------------------------------------------------------
// Funktionsdefinitioner:

// Funktion som beräknar frekvenser av bokstäverna i strängen
void berakna_histogram_abs(const string &str, int f[])
{
 //Nollställ frekvens:
 for (int i=0; i<ANTAL_BOKSTAVER; i++)
f[i] = 0;

 // Loopa igenom hela strängen, tecken för tecken
 for ( int i=0; i< (int) str.length(); i++)
{
 	int index;

 	// Om tecknet är en gemen
 	if (str.at(i)>='a' && str.at(i)<='z')
{
     	// räkna ut platsen i arrayen
  index = str.at(i) - 'a';
     	// uppdatera räknaren på rätt plats
  f[index]++;
   	}

 	// Om tecknet är en versal
 	if (str.at(i)>='A' && str.at(i)<='Z')
{
  // räkna ut platsen i arrayen
  index = str.at(i) - 'A';
  // uppdatera räknaren på rätt plats
  f[index]++;
   	}
}

}


// Funktion som skriver ut frekvenser av bokstäverna i strängen
void skriv_histogram_abs(int f[])
{
 cout<<"\nBokstav:\tFrekvens:\n";  //Skriv ut frekvensen i en tabell
 // Loopa över alla platser i arrayen
 for (int i=0; i<ANTAL_BOKSTAVER; i++)
{
   	char b = char (i+'A');// Konvertera platsen till ett teckenvärde
   	if (f[i]) cout << b << "\t" << f[i] <<endl;
}
}

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...