[C++]Hur får jag min funktion att funka?

Avdelningen för programmering, nätverk samt alternativa OS.
Post Reply
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

[C++]Hur får jag min funktion att funka?

Post by Snouser »

Kan någon svara på varför denna inte funkar?

Code: Select all

#include <cstdlib> 
#include <ctime> 
#include <iostream>

using namespace std;
int randNummer();
int main() 
{ 

for (int h = 0; h < 16; h++)
{
    cout << randNummer[h];
}   
    cin.ignore(10,'\n');
    cin.get();
}

int randNummer()

{
    srand((unsigned)time(0)); 
    int randNummer[100]; 
    for(int f = 0; f < 16; f++)
    { 
        randNummer[f] = (rand()%10)+1; 
    }
    
        for(int p = 0; p < 16; p++)
    { 
        return randNummer[p]; 
    }
    

}
Meningen är att den ska slumpgenerera 16 tecken och skriva ut den på skärmen. Jag är tvungen att använda funktion, så ta hällst inte bort de.
User avatar
linc
Administratör
Posts: 7602
Joined: 2002-02-13 22:22:11
Location: Skåneland
Contact:

Post by linc »

* Funktionen randNummer() anropas aldrig från main().
* Arrayen med int:ar, randNummer[100] definieras lokalt i funktionen randNummer(), så den kan inte användas utanför den funktionen.
* return lämnar funktionen direkt, lägger du return i en loop så som du har gjort itererar den enbart en gång och lämnar funktionen därefter.
hej.
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

Post by Snouser »

Hur ska ja göra för att den ska skriva 16 siffror på raken någonstans i main?

Ja läser fortfarande Programmering A, så förklara gärna.
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Re: [C++]Hur får jag min funktion att funka?

Post by derfian »

Snouser wrote: Hur ska ja göra för att den ska skriva 16 siffror på raken någonstans i main?

Ja läser fortfarande Programmering A, så förklara gärna.
Du verkar ha blandat ihop vad de olika delarna av programmet skall göra.. Just nu så generar randNummer() 16 slumptal, och den anropas 16 gånger från main (Om mitt antagande att cout << randNummer[h]; egentligen borde vara cout << randNummer(); är korrekt). Om du istället gör att randNummer returnerar ett slumptal och anropar det 16 gånger från main bör du få det resultat du vill ha.

Dessutom, det bör vara bättre att endast köra srand((unsigned)time(0)) en gång från main, så inte slumptalsgeneratorn genererar samma siffror varje gång du vill generera ett slumptal.
Last edited by derfian on 2006-12-11 1:19:43, edited 1 time in total.
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

Post by Snouser »

Har du något exempel :D
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

Jag skulle skrivit randNummer() så här.

Code: Select all

int randNummer()
{
	return (rand()%10)+1;
}
Det enda du måste göra sedan är att skriva ut resultatet av randNummer() 16 gånger.
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

Post by Snouser »

Tack!

Denna fukar

Code: Select all

#include <cstdlib>
#include <ctime>
#include <iostream>

using namespace std;
int randNummer();
int main()
{
    for(int f = 0; f < 16; f++)
    {
        cout << randNummer();
    }
  
    cin.ignore(10,'\n');
    cin.get();
}
    int randNummer()
    {
    return (rand()%10)+1;
    } 
Nu till nästa problem.

Hur gör jag för att lagra den totala genererade siffrorna i en char?
Jag har nämligen en funktion som använder char.
Så om den te.x innehåller siffrona (i delar) 1234567899876543 vill ja att den ska spara de i en char som heter passkey.

Några tips?
User avatar
trappski
Posts: 2310
Joined: 2004-09-25 23:53:15
Location: Örebro

Post by trappski »

fört och främst behöver du en array att lagra alla tecken i...
char array[storlek];
sedan räcker det med att du modifierar din for loop lite.

istället för :

Code: Select all

cout<< randNummer();
kan du skriva:

Code: Select all

array[index] = randNummer();
 cout << array[index]; 
En arrays index börjar på noll och slutar på storlek-1 så en array med 16 platser har index 0-15. Så det är relativt lämpligt att använda for loopens variabel som index i det här fallet.
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

Post by Snouser »

Trappski wrote:fört och främst behöver du en array att lagra alla tecken i...
char array[storlek];
sedan räcker det med att du modifierar din for loop lite.

istället för :

Code: Select all

cout<< randNummer();
kan du skriva:

Code: Select all

array[index] = randNummer();
 cout << array[index]; 
En arrays index börjar på noll och slutar på storlek-1 så en array med 16 platser har index 0-15. Så det är relativt lämpligt att använda for loopens variabel som index i det här fallet.
Nu har jag kommit så långt så att fel dyker upp som ja inte kan lösa själv.

Någon som kan svara på varför jag får felet jag får och hur ja kan åtgärda de.

Ja skickar med hela programet så att ni kan se de i helhet.


Code: Select all

#include <iostream> 
#include <iomanip>
#include <cstdlib> 
#include <ctime>
using namespace std;
int randomPasskey(); 
int main () 
{ 

  char passkey[32] = "";
  int tusenTal1, tusenTal2, hundraTal1, hundraTal2, tioTal1, tioTal2, enTal1; 
  int totalFourth, totalThird, totalSecond, totalFirst, total;
  int ggr;
  int rand[1000];
  double krypteratMed1, krypteratMed2, krypteratMed3, krypteratMed4;
  double krypteradeTecken[1000]; 
  double meddelande[1000];
  char med[300];
  int total1[100];
  double orginal2, orginal3, orginal4, orginal5[200];
  char meny = 0;
  int password1;
  int algo;
  algo = 0;
  ggr = 0; //Nollsäller antal

  int tid = 0;//Definerar pause kommandot
    
   while(true)//Loop
   {

   if (tid >= 1)//Pause i programet
    {
            cout << endl;
            system("pause");
            cout << endl;
    }
         
    //Meny
    if (tid != 1)//Välkommen visas ej andra gången
    {
    cout << "Välkommen till Encryptia" << endl;
    cout << endl;
    }
    
    cout << "#### Meny ####";
    cout << endl;
    cout << endl;
    cout << "(1) Kryptera";
    cout << endl;
    cout << "(2) Dekryptera";
    cout << endl;
    cout << "(3) Algoritm";
    cout << endl;
    cout << "(#) Avsluta";
    cout << endl;
    
    cin >> meny; //Inmatning
    
    if (meny == '1')//Kryptera
    {
    algo++;
    cout << "Meddelande(avsluta med #): " << endl;
    cin >> med;
    
    cout << "Vi rekomenderar följande: " << endl;
    
    for(int index=0; index<16; index++) //Loopar 16ggr, slump passkey
    { 
    rand[index] = randomPasskey();
    cout << rand[index];
    }
    
    cout << "Vill du använda denna passkey?" << endl;
    char val1;
    cin >> val1;
    
    if (val1 == 'j')
    {
             for (int q = 0; q < 16; q++)
             {
              passkey[] += rand[q];
             }
    }
    
    else        
    {
    cout << "Skriv in din passkey (16 tecken)" << endl;
    cin >> passkey;
    }
    
    int antal = 0;
    
    for (int n = 0; n < 16; n++)
    {
    antal++;
    //Uträkning för 1000-tal
    tusenTal1 = passkey[n] - '0';
    tusenTal2 = tusenTal1*1000;
    
    n++;
    //Uträkning för 100-tal
    hundraTal1 = passkey[n] - '0';
    hundraTal2 = hundraTal1*100;
    
    n++;
    //Uträkning för 10-tal
    tioTal1 = passkey[n] - '0';
    tioTal2 = tioTal1*10;
    
    n++;
    //Uträkning för 1-tal
    enTal1 = passkey[n] - '0';
    total = 0;
    total = tusenTal2+hundraTal2+tioTal2+enTal1;
    
    if (antal == 1)//Sparar första 4 nr
    {
              totalFirst = total;
    }
    
    else if (antal == 2)
    {
              totalSecond = total;
    }
    
    else if  (antal == 3)
    {
              totalThird = total;
    }
    
    else if (antal == 4)
    {
              totalFourth = total;
    }
   
    }

    for (int b = 0; b < 100; b++)
    {
        if (med[b] != '#')
        {
         total1[b] = (int)med[b];
         
         ggr++;
         }
         
         else
         {
          b = 200;
         }        
    }
    
    for (int a = 0; a < ggr; a++)
    {
     orginal2 = total1[a]-totalFirst;
     orginal3 = orginal2+totalSecond;
     orginal4 = orginal3-totalThird;
     orginal5[a] = orginal4+totalFourth;
     }
        
    for (int f = 0; f < ggr; f++)
    {
    cout << f << "a: " << orginal5[f] << endl;
    }
             tid++;
    }
    
    else if (meny == '2')//Dekryptera
    {
    cout << "Skriv in din passkey (16 tecken)" << endl;
    cin >> passkey;
    
    
    int antal = 0;
    

    for (int n = 0; n < 16; n++)
    {
    
    antal++;
    //Uträkning för 1000-tal
    tusenTal1 = passkey[n] - '0';
    tusenTal2 = tusenTal1*1000;
    
    //Uträkning för 100-tal
    n++;
    hundraTal1 = passkey[n] - '0';
    hundraTal2 = hundraTal1*100;
    
    //Uträkning för 10-tal
    n++;
    tioTal1 = passkey[n] - '0';
    tioTal2 = tioTal1*10;
    
    //Uträkning för 1-tal
    n++;
    enTal1 = passkey[n] - '0';
    total = 0;
    total = tusenTal2+hundraTal2+tioTal2+enTal1;
    
    if (antal == 1)//Sparar första 4 nr
    {
              totalFirst = total;
    }
    
    
    else if (antal == 2)
    {
              totalSecond = total;
    }
    
    else if  (antal == 3)
    {
              totalThird = total;
    }
    
    else if (antal == 4)
    {
              totalFourth = total;
    }
   
    }
    cout << "Här kommer du att få möjligheten att mata in ditt krypterade meddelande." << endl;
    cout << "([ENTER] mellan varje)" << endl;
    cout << "Hur många tecken vill du mata in?" << endl;
    int antalTecken;
    cin >> antalTecken;
    cout << "Skriv nu in dina tecken" << endl;
    
    int igen = antalTecken+1;
    
    for (int o = 0; o < antalTecken; o++)
    {
          cin >> krypteradeTecken[o];
    }
    
     for (int p = 0; p < igen; p++)
     {
     krypteratMed1 = krypteradeTecken[p]-totalFourth;
     krypteratMed3 = krypteratMed2+totalThird;
     krypteratMed2 = krypteratMed1-totalSecond;
     orginal5[p] = krypteratMed3+totalFirst;
     }
     
     cout << "Meddelandet är: ";
     for (int h = 1; h < igen; h++)
     
     {
     cout << (char)orginal5[h];
     }
             tid++;
     }
    
    else if (meny == '3')//Algoritm
    {
             cout << "För att komma åt denna funktion kräver att du har rättigheterna." << endl;
             cout << "Skriv in ditt lösenord för att fortsätta." << endl;
             
             cin >> password1; //lösenord användaren matar in
             int password2 = 123456789; //Orginal lösenord
             if (password2 == password1)
             
             {
                 if (algo >= 1)
                 
                 {
                    cout << "Din passkey är: " << passkey << endl;
                    cout << "Så här funkar det: " << endl;
                    
                         for (int c = 0; c < ggr; c++)
                         {
                         
                         cout << c << ":a" << endl;
                         cout << orginal2 << " = " << total1[c]<< " - " << totalFirst << endl;
                         cout << orginal3 << " = " << orginal2 << " + " << totalSecond << endl;
                         cout << orginal4 << " = " << orginal3 << " - " << totalThird << endl;
                         cout << orginal5[c] << " = " << orginal4 << " + " << totalFourth << endl;
                         cout << endl;
                         }
                         cout << "Siffrorna är baserade på föregående kryptering" << endl;
                 }
             }
                 
             
             else
             {
                 cout << "Du har inte rättigheterna för denna funktion" << endl;
                 cout << "Vill du skaffa de, så kräver det att du registrerar dig" << endl;
                 cout << "För vidare registrering, se menyn och/eller Hjälp menyn";
             }
             
             cout << endl << endl;
             tid++;
    }
    
    else if (meny == '#')
    {
         break;
    }
    
    else
    {
        cout << "Du måste välja något från menyn.";
        cout << endl;
        cout << "Kom i håg att du alltid kan välja # för att avsluta.";
        tid++;
    }
    
    
}
    cin.ignore(10,'\n');
    cin.get();
    return 0;
}

//Funktioner\\

//Slump funktion, genererar passkey
int randomPasskey() 
{
 {
   return (rand()%10)+1;
 }
}
//Slut
    

User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

Oj.

Förklara gärna vad ditt program ska utföra. Det finns säkerligen något bättre och enklare sätt att lösa problemet.
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

Post by Snouser »

Om vi tar mitt problem direkt.

När man startar programet så kommer man till en meny, i detta fallet väljer man (1) kryptering. Den frågar sedan efter ordet man vill kryptera. När den har gjort de så kräver den att man skriver i en passkey. Det är här felet är. Den genererar då fram en slumpmässig 16 siffrig passkey och frågar om man vill använda den eller om man vill skapa en egen. Väljer man att skapa använda den genererade så är de men ingen att den autogenererade passkeyn ska lägga sig i char veriabeln passkey. Om man istället svarar nej och väljer att skapa sin egen så ska den lägga den inmatade passkeyn i veriabeln passkey.

De som inte funkar just nu är att den inte lägger den själv genererade passkeyn i veriablen passkey, utan de blir (om de änns funkar) bara en massa tecken (hus, hjärtan, glada gubbar). Ja vill att den te.x ska spara (i detta fall) rand[0] (int veriabel) i char veriabeln passkey. Eftersom den ligger i en loop så vill ja sedan att den ska lägga till rand[1] så att char veriabeln passkey ytteligare får ett tecken.

Om nu min funktion genererar fram talet 7 och lägger den i rand[0], då vill ja att den ska skicka över den till char variabeln passkey. Efter de kanske den genererar den fram talet 3, den ska då lägga till de i veriabeln passkey. Passkey veriabeln innehåller nu 2 tecken, 7 och 3 och (73). Den ska upprepa denna procedur 16 ggr.

Ja hoppas att ni fattar vad ja menar. Om ni testar att kompilerar programet så kanske ni kan lista ut vad felet är. Jag har själv kört fast.
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

Bara en liten funderare, om du bara genererar siffror till din passkey är väl char en definitionsmässig dålig datatyp att använda?
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

Post by Snouser »

Stämmer.

Men eftersom ja la till den funktionen efteråt så blir jag illa tvungen att lagra siffrorna i char.
User avatar
lyckegard
Posts: 2190
Joined: 2002-03-11 20:30:35

Post by lyckegard »

Kommentera i koden... Det brukar hjälpa.
Försök att kommentera bättre i alla fall.
wham bam thank-you ye -ma'am
User avatar
derfian
Posts: 472
Joined: 2004-02-13 0:18:46
Location: Dorotea / Linköping
Contact:

Post by derfian »

lyckegard wrote:Kommentera i koden... Det brukar hjälpa.
Det skulle i alla fall hjälpa mig att förstå vad som pågår i koden.

Kan ju ta det till sin spets och bara skriva kommentarer först och sedan fylla på med kod.

exempel:

Code: Select all

int main()
{
    // Visa meny
    // Användaren vill kryptera
        // Fråga efter meddelande
        // Generera passkey
        // Fråga om passkey godtages av användare
    // Användaren vill dekryptera
    // Användaren vill kika på algoritmen
    // Användaren vill avsluta
}
Snouser
Posts: 9
Joined: 2006-12-11 0:52:10

Post by Snouser »

Ja gjorde ett "program" där bara funktionen för mitt problem finns.
Plus en massa komentarer

Någon som kanske förstår hur de funkar nu :D

Code: Select all

#include <iostream> 
#include <iomanip>
#include <cstdlib> 
#include <ctime>
using namespace std;
int randomPasskey(); //Slump "generatorn" funktionen (se längst ner)
int main () 
{ 
    char med;
    char passkey[32] = ""; //Nolställer passkey
    int rand[1000];
    cout << "Meddelande(avsluta med #): " << endl; //Ställer en fråga
    cin >> med; //Matar min okrypterade meddelande
    
    cout << "Vi rekomenderar följande: " << endl; //Skriver ut ett meddelande
    
    for(int index=0; index<16; index++) //Loopar 16ggr, slump passkey
    { 
    rand[index] = randomPasskey(); //Infogar random funktionen 
    cout << rand[index]; //Skriver ut en slump passkey
    }
    
    cout << "Vill du använda denna passkey?" << endl;
    char val1; 
    cin >> val1;//Matar in j (ja) eller n (nej)
    
    if (val1 == 'j') //Om användaren svarar j (ja)
    {
             for (int q = 0; q < 16; q++) //loopar 16 ggr
             {
              passkey[] += rand[q]; //Lägger ett slump tal 16 ggr i char veriabeln passkey
             }
    }
    
    else //Om användaren svarar n (nej)   
    {
    cout << "Skriv in din passkey (16 tecken)" << endl;
    cin >> passkey; //Användaren matar i stället in sin egen passkey
    }
    
    cout << passkey; //Skriver ut passkeyn som är angiven
    
    }
    cin.ignore(10,'\n'); //Vet ej vad denna används till, men de funkar inte utan den
    cin.get(); //Vet ej vad denna används till, men de funkar inte utan den
    return 0;
}

//Funktioner\\

//Slump funktion, genererar passkey
int randomPasskey() 
{
 {
   return (rand()%10)+1; //Retunerar ETT slump tal
 }
}
//Slut
    
Post Reply