Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Du har "integer-problemet" igjen. Det innleste tallet kan ikke være større enn en integer (eller long, de er vel like store), altså 2.147.483.647 (som er de 10 sifrene du tenker på).

Som forrige gang, kan det løses med long long. ;)

 

Edit: Forøvrig er det vel ikke nødvendig å bruke flyttall til dette? Det er jo strengt tatt bare heltallsoperasjoner, og i samme slengen slipper du å bruke floor().

Edit2: Og variablene kan også gjøres unsigned for å øke rekkevidden ytterligere. Eller trenger man tverrsummen av negative tall?

Endret av endrebjo
Lenke til kommentar
Videoannonse
Annonse

Dagens nøtt folkens.

 

Trodde jeg hadde begynt å få taket på klasser og tabeller etterhvert. Men dette programmet skjønner jeg meg ikke på. I starten av programet er det en liten linke med int z.

 

Denne linjen ble egentlig bare brukt for å debugge litt. Men så viste det seg plutselig at programet fungerte etter hensikten når den linjen er der.

 

Fjerner jeg den blir utskriften på første linje i gangetabellen 8 12 16. Men her skal det vere 0,0 og atter 0. Noe som også skjer hvis den dumme int stubben blir med.

 

Hvis noen finner løsning på dette slipper jeg å legge meg inn på sandviken og er dermed evig takknemlig.

 

 

//Skrevet av: Eirik Wold
//-----Biblotek som brukes---------------------------------------------------------
#include <iostream>
#include <string>
#include <cmath>

using namespace std;
//---------------------------------------------------------------------------------
// First we crate a Class.
class tabellKlasse
{
private:
	int privatTabell[5][5];

public:
void tabellFunksjon(int tall, int y , int u);
void tabellShow(int a, int s);

};

void tabellKlasse::tabellFunksjon(int tall,int y, int u){
privatTabell[y][u]= tall;
}

void tabellKlasse::tabellShow(int a, int s){
cout << privatTabell[a][s] <<" ";
}


//-----Funksjonsdeklarasjoner------------------------------------------------------
void myexit();														  //My Exit std

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


//-----Globale variabler-----------------------------------------------------------



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

int main(){
while(1){
//-----CODE GOES HERE----------------------------------------------------------
	tabellKlasse min;
	int z=1;   // Fjernes denne linjen blir utskriften fra klassen 8 12 16 på de tre første tallene
			// Men denne linjen har ingenting i programmet å gjøre.
	int tabell[4][4];
	cout << "Tallene som blir lastet inn i tabellen: " << endl;
	for ( int i=0 ; i<5; i++){
		for	( int k=0 ; k<5; k++){

		tabell[i][k]= i*k;

		min.tabellFunksjon(tabell[i][k], i, k );

		cout << tabell[i][k] << " ";			
		}
		cout<< endl;
	}
	cout << endl << endl;



	cout << "Tallene som blir lest fra klassen: " << endl;
	for ( int i=0 ; i<5; i++){	
		for ( int k=0 ; k<5; k++){	
			min.tabellShow(i,k);
		}
			cout << endl ;
	}


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

myexit();		

}
return 0;
}


//-----Funksjoner--------------------------------------------------------------------------
//-----My Exit-----------------------------------------------------------------------------

void myexit(){
	char myExit;

	cout << "Exit y/n? " << endl;
	cin >> myExit;
	myExit = tolower (myExit);

	while (myExit == 'y'){
		exit(1);
	}
}
//-----------------------------------------------------------------------------------------



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

Lenke til kommentar

sjekk at du ikke tenker 1-5 istedet for 0-4 for eksempel.

Grunnen er simpel: når du lager en int eller tabell på den måten der, blir det holdt av plass i stack-minnet til det.

Dersom du har en tabell på 5 integer, etterfulgt av et nytt integer, og du skriver til tabellen[5] så vil du effektivt skrive i det påfølgende integeret, og ikke i tabellen.

 

edit: Dette er en klassisk feil folk gjør i C/C++ programmer, og har ført til sikkerhetshull (stack overflow)

Mange compilere kan gi warning eller error på det.

Endret av GeirGrusom
Lenke til kommentar

tab[2] deklarerer et array med plass til to variabler, altså tab[0] og tab[1].

Og tab[2][2] deklarerer et array med plass til 2*2 variabler.

 

Samtidig blir det ganske greit å bruke størrelsesvariabler på den måten. Deklarerer du f.eks int size = 4; så kan du bruke denne "ubevisst" i løkker og deklarasjoner som int tab; og for (i = 0; i < size; i++){ }.

Endret av endrebjo
Lenke til kommentar

Skal lage et program som krypterer 49 tegn, med en algoritme som bitroterer den binære ascii-verdien for bokstavene.

Slik skal bitene roteres:

 

3 plasser for første tegn

5 plasser for andre tegn

4 plasser for tredje tegn

1 plass for fjerde tegn

2 plasser for femte tegn

4 plasser for sjette tegn

3 plasser for syvende tegn

2 plasser for åttende tegn

5 plasser for niende tegn

….og så gjentas syklusen for de neste 9 tegnene, osv.

 

Til nå har jeg fått til å kryptere f.eks de fire første tegnene 3 ganger mot venstre.

 

 

Jeg har to spørsmål:

1. Jeg har linja: for(int i=0; i<3;i++)

Hva kan jeg bytte ut 3-tallet med for at i skal øke helt opp til 49 uten at programmet klikker hvis jeg ikke fyller opp alle disse 49 plassene?

Sånn det er nå så klikker programmet hvis jeg skriver inn mindre enn 3 tegn, det fungerer fint hvis jeg skriver inn nøyaktig 3 tegn, og hvis jeg skriver mer enn 3 så krypterer den bare de tre første tegnene.

 

2. Hvordan skal jeg fortsette koden nå, for å få til hele den algoritmen jeg har nevnt ovenfor, for så å begynne på nytt igjen?

 

 

Takk for svar =)

 

edit: fant ut av spm 1, og redigerer koden så den nå er lik den jeg har nå.

edit2: her er koden, kompilert og testet OK:

 

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

int kode;
char kode2;


int _tmain(int argc, _TCHAR* argv[])

{

 while(1)
   { 
     char question[] = "Skriv inn koden som skal krypteres: ";
     char kryptert[] = "Koden du Onsker A kryptere er: ";
     string tekst;
     cout << question;
     getline(cin, tekst);
     cout << kryptert << tekst << "!" << endl;

     //for (int i=0; i < 3; i++)
     for(int i=0; i<tekst.length();i++)
{
  kode = (int)tekst[i];
  kode = (kode<<3);
  kode2 = (char)((kode>>8)|kode);
  cout << "kryptert " << tekst[i] << " er: " << kode2 << endl;
} // end for
   } // end while
 return 0;
} // main


Endret av r2d290
Lenke til kommentar

Dobbel for-løkke mener du? Gjorde et halv-tappert forsøk, men fikk diverse kompileringsfeil. Tenker jeg riktig, eller helt på tryne?

 

 

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

int kode;
char kode2;


int _tmain(int argc, _TCHAR* argv[])

{

 while(1)
   { 
     char question[] = "Skriv inn koden som skal krypteres: ";
     char kryptert[] = "Koden du Onsker A kryptere er: ";
     string tekst;
     int i = 0;
     cout << question;
     getline(cin, tekst);
     cout << kryptert << tekst << "!" << endl;


     for(int i=0; i<tekst.length(); i++)
{
  for(int j=0; j<tekst.length(); j++)
	    {
      kode = (int)tekst[0+10*j];
      kode = (kode<<3);
      kode2 = (char)((kode>>8)|kode);
      cout << "kryptert " << tekst[0+10*j] << " er: " << kode2 << endl;
//  	      system("pause");

	    }
  for(int k=0; k<tekst.length(); k++)
	    {
      kode = (int)tekst[1+10*k];
      kode = (kode<<5);
      kode2 = (char)((kode>>8)|kode);
      cout << "kryptert " << tekst[1+10k] << " er: " << kode2 << endl;
// 	      system("pause");

	    }
}
   } // end while
 return 0;
} // main


Lenke til kommentar

Nå roter du.

 

 

Du må dele operasjonen opp logisk, mtp. hva du skal gjøre.

 

 

Orker ikke å slenge sammen ett eksempel akkurat nå ettersom jeg ikke har VS installert, og klokken er 00:50 på natten. Om ingen svart når jeg står opp i morgen skal jeg finne fram laptopen (som har VS installert) og skrible sammen noe kjapt noe.

Lenke til kommentar

Det hadde jeg satt veldig stor pris på :)

 

Regnet med at det var mye galt der. Hadde bare ingen idé på hvordan jeg skulle gå frem, så bare rabla ned noe for å vise tankegangen min om at første bokstaven skal flyttes 0+10y plasser, neste 1+10y plasser osv.

Lenke til kommentar
#include <stdio.h>
#include <string.h>

int main()
{
char	Buffer[20];
int		BufSize	= 0;
int		BufPos	= 0;

scanf("%s", &Buffer);

BufSize	= strlen(Buffer);

while (BufPos < BufSize)
{
	int TmpPos = 0;

	while (1 == 1)
	{
		switch (TmpPos)
		{
		case 0:
			Buffer[bufPos] <<= 3;
			break;
		case 1:
			Buffer[bufPos] <<= 5;
			break;
		case 2:
			Buffer[bufPos] <<= 4;
			break;
		case 3:
			Buffer[bufPos] <<= 1;
			break;
		case 4:
			Buffer[bufPos] <<= 2;
			break;
		case 5:
			Buffer[bufPos] <<= 4;
			break;
		case 6:
			Buffer[bufPos] <<= 3;
			break;
		case 7:
			Buffer[bufPos] <<= 2;
			break;
		case 8:
			Buffer[bufPos] <<= 5;
			break;
		default:
			BufPos = 0;
			break;
		}

		if ((BufPos == BufSize) || (TmpPos == BufSize))
			break;

		if (TmpPos < 8)
			TmpPos++;

		BufPos++;
	}
}

printf("%s\r\n\r\nHer folger tallverdiene:\r\n", Buffer);

for (BufPos = 0; BufPos < BufSize; BufPos++)
{
	printf("%i: %i\r\n", (BufPos + 1), Buffer[bufPos]);
}

return 0;
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...