Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Fantastisk. Ser at jeg glemte å påpeke at hvis et bit "forsvinner" ut til venstre blant de 8 bitene, så skal de dukke opp igjen fra høyre side (sånn at ingen biter forsvinner). Det skulle bli gjort ved at carry-et XOR-es med det resultatet som kommer ut i programmet ditt

 

eks:

 

e= 01100101

= 00000000 01100101

<<3 plasser:

00000011 00101000

 

 

00101000

XOR

00000011

=

00101011 = plus

 

 

Men det får bli en fin utfordring for meg å legge inn dette, prøve å forstå koden og gjøre den til mitt eget. Men tusen takk for at du tok deg tid =)

Kommer tilbake hvis det er noe mer ;)

Lenke til kommentar
Videoannonse
Annonse

Mye logiskt i det du sier, men var kun et mindre utdrag av programmet. Kan poste hele koden senere.

 

#include "stdafx.h"
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
long long number = 0;
int high = 0;
int low = 9;
int teller = 1;
float snitt = 0;
double rest = 0;
double value = 0;
double long numberpart = 0;
cout << "Tall: ";
cin >> number;

while (number > 9)
{
	rest = number%10;
	value = value + rest;
	numberpart = number/10;
	number = floor(numberpart);

	if(rest>high){high=rest;};
	if(low>rest){low=rest;};

	teller++;
}

value = value + number;
snitt = value/teller;

cout << "Tverrsummen er: " << value;
cout << endl << "Gjennomsnittet er: " << snitt;
cout << endl << "Antall siffer: " << teller;
cout << endl << "Laveste siffer er: " << low;
cout << endl << "Høyeste siffer er: " << high;
cin >> number;

return 0;
}


Lenke til kommentar

Nå har jeg modifisert koden som ze5400 hjalp meg med, så den krypterer nå riktig, og skriver ut.

 

Problemet mitt nå er at det virker som om at den betrakter mellomrom som en null-verdi, så den får ikke til å kryptere mellomrom, og lager istede en null-tag i programmet, og fortsetter videre med neste ord på en ny linje (selvom jeg ønsker alle de krypterte ordene på samme linje).

 

Vet noen hvorfor dette er et problem?

 

 

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

int kode1;
char kode2[20];


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

{

 while(1)
   {
     //         char    Buffer[20];
     char            tekst[20];
     int             BufSize = 0;
     int             BufPos  = 0;

     scanf("%s", &tekst);
     //         scanf("%s", &Buffer);

     BufSize = strlen(tekst);
     //         BufSize = strlen(Buffer);

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

  while (1 == 1)
    {
      switch (TmpPos)
	{
	case 0:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<3);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;

	case 1:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<5);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;

	case 2:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<4);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;
	case 3:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<1);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;
	case 4:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<2);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;
	case 5:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<4);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;
	case 6:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<3);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;
	case 7:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<2);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;
	case 8:
	  kode1 = (int)(tekst[bufPos]);
	  kode1 = (kode1<<5);
	  kode2[bufPos] = (char)((kode1>>8)|kode1);
	  break;
	default:
	  BufPos = 0;
	  break;
	}

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


      if (TmpPos <8)
	TmpPos++;
      else(TmpPos=0);
      BufPos++;
    }
       }
     printf("%s\r\n\r\nHer folger tallverdiene:\r\n", kode2[bufPos]);

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

   } // end while

 return 0;
} // main


Lenke til kommentar

Noen som har lyst til å forbedre min?

Jeg ser fremdeles ikke poenget med å bruke så mye flyttall.

#include <iostream>

using namespace std;

int main()
{
long long number = 0;

int high = 0;
int low = 9;
int digits = 1;
int sum = 0;
int rest = 0;

double snitt = 0;

cout << "Tall: ";
cin >> number;

while (number > 9)
{
	rest = number % 10;
	sum += rest;
	number /= 10;

	if(rest>high)
		high=rest;
	if(low>rest)
		low=rest;

	digits++;
}

if(number > high)
	high = number;
if(low > number)
	low = number;

sum += number;
snitt = (double) sum/digits;

cout << "Tverrsummen er: " << sum;
cout << endl << "Gjennomsnittet er: " << snitt;
cout << endl << "Antall siffer: " << digits;
cout << endl << "Laveste siffer er: " << low;
cout << endl << "Høyeste siffer er: " << high;

return 0;
}

Denne gjør nøyaktig det samme med bare heltall (bortsett fra snittregning på slutten).

 

Også hadde du et problem med at første siffer ikke blir sjekket mot max/min siffer.

Endret av endrebjo
Lenke til kommentar

Ja, er nok mulig å gjøre det med et nytt array også. Men vil det bli noe mindre kode av det? Du må vel uansett ha med de linjene som jeg har i hver case?

Eller vil det være lettere å få en løsning på problemet jeg har ved å sette det i et array istede?

Lenke til kommentar

Det vil være mye mindre kode å gjøre det med ett array.

 

Lot vær å gjøre det slik i koden jeg sendte deg først, da jeg selv elsker "epiphany"-øyeblikk, og trodde du kom til å få ett. (De er deilige. "Vent... Dette kan jeg jo gjøre så enkelt! Sweet!").

 

Tenk: Buffer[bufPos] <<= CycleArr[TmpPos];

Lenke til kommentar

Hei, dag 1 for meg på programmering, og prøver å lage en kode som returnerer verdien av X på en andregradslikning, men får X1:Nan når jeg kjører den. lurer på hva som er galt, her er koden! :D

 

// stringstreams

#include <iostream>

#include <string>

#include <sstream>

#include <math.h>

using namespace std;

 

int main ()

{

string mystr;

int a=0;

int b=0;

int c=0;

 

cout << "Enter A: ";

getline (cin,mystr);

stringstream(mystr) >> c;

cout << "Enter B: ";

getline (cin,mystr);

stringstream(mystr) >> b;

cout << "Enter C: ";

getline (cin,mystr);

stringstream(mystr) >> a;

cout << "Value of X1: " << (-b+sqrt(b^2-4*a*c)/(2*a)) << endl;

return 0;

}

Lenke til kommentar

Fikk nok ikke den opplevelsen desverre, men ser tankegangen din med å prøve å gi meg den :p Er vel rett og slett for uerfaren til å se sånt enda. Får se litt på det så snart jeg får tid. Er noen andre prosjekter jeg må prioritere først nå.

 

Men tror dere det med å sette det inn i array kan løse problemet mitt med at mellomrom betraktes som en null-verdi, og at den deler opp hvert ord i setningen?

 

Eks på kjøring:

 

hei på deg

(null)

 

Her er setningen kryptert:

C¼û

(null)

 

Her er setningen kryptert:

â­

(null)

 

Her er setningen kryptert:

#¼v

Lenke til kommentar

Hei, dag 1 for meg på programmering, og prøver å lage en kode som returnerer verdien av X på en andregradslikning, men får X1:Nan når jeg kjører den. lurer på hva som er galt, her er koden! :D

 

// stringstreams

#include <iostream>

#include <string>

#include <sstream>

#include <math.h>

using namespace std;

 

int main ()

{

string mystr;

int a=0;

int b=0;

int c=0;

 

cout << "Enter A: ";

getline (cin,mystr);

stringstream(mystr) >> c;

cout << "Enter B: ";

getline (cin,mystr);

stringstream(mystr) >> b;

cout << "Enter C: ";

getline (cin,mystr);

stringstream(mystr) >> a;

cout << "Value of X1: " << (-b+sqrt(b^2-4*a*c)/(2*a)) << endl;

return 0;

}

 

 

Hvorfor ikke bare slik:

 

// andregrads.cpp : Defines the entry point for the console application.
//

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

int main ()
{
float a = 0;
float b = 0;
float c = 0;

cout << "Enter A: ";
cin >> a;

cout << "Enter B: ";
cin >> b;

cout << "Enter C: ";
cin >> c;


cout << "Value of X1: " << (-b+sqrt(b*b-4*a*c))/(2*a) << endl;
cout << "Value of X2: " << (-b-sqrt(b*b-4*a*c))/(2*a) << endl;

cin >> a;
return 0;
} 

Endret av Senyor de la guerra
Lenke til kommentar
Men tror dere det med å sette det inn i array kan løse problemet mitt med at mellomrom betraktes som en null-verdi, og at den deler opp hvert ord i setningen?

 

Eks på kjøring:

 

hei på deg

(null)

 

Her er setningen kryptert:

C¼û

(null)

 

Her er setningen kryptert:

â­

(null)

 

Her er setningen kryptert:

#¼v

Den enkleste måten å lese en hel linje på er med cin.getline() (for C++) eller gets() (for C).

 

Her er hjelp til bruk av både getline(), gets(), og en løsning med rotasjonsnøklene i et array.

 

#include <iostream>

using namespace std;

static int bitPerValue = 8;
static int codeLength = 49;

char encrypt(unsigned char a, int places);

int main ()
{
int places[9] = {3, 5, 4, 1, 2, 4, 3, 2, 5};
int places2[9] = {5, 3, 4, 7, 6, 4, 5, 6, 3}; // Roterer tilbake igjen.

char code[50];
cin.getline(code, codeLength + 1);		// +1 får plass til '\0' også.
// gets(code);

// Krypterer code-strengen
for (int i = 0; i < codeLength; i++)
{
	code[i] = encrypt(code[i], places[i % 9]);
	cout << code[i];
}

cout << endl << endl;

// "Dekrypterer" code-strengen
for (int i = 0; i < codeLength; i++)
{
	code[i] = encrypt(code[i], places2[i % 9]);
	cout << code[i];
}

return 0;
}

char encrypt(unsigned char a, int places)
{
return (a >> places) | (a << (bitPerValue*sizeof(a) - places));
}

 

Lenke til kommentar

EDIT: NVM. endrebjo var før meg.

 

 

EDIT2: Helvete heller. Har jeg først opprettet posten kan jeg likegjerne poste koden.

 


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char	Buffer[40]	= { 0 };
int		CycleArr[9] = { 3, 5, 4, 1, 2, 4, 3, 2, 5 };
int		BufSize		= 0;
int		BufPos		= 0;

// Les tekst opp til 39tegn (pluss nullterminering på en byte). 39 plasser med tasteinfo, og en plass for enter - som senere nulltermineres.
while(fgets((char*)&Buffer, 41, stdin)[strlen(Buffer)-1] != (char)0x0A);

//	Nullterminer enter.
Buffer[strlen(Buffer)-1] = 0x00;	
BufSize	= strlen(Buffer);

for (BufPos = 0; BufPos < BufSize; BufPos++)
	Buffer[bufPos] = (Buffer[bufPos] << CycleArr[bufPos % 9]) | (Buffer[bufPos] >> (8 - CycleArr[bufPos % 9]));

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;
}

 

MERK: Grunnen til at min og endrebjos kode gir forsjellig resultat er at han roterer til høyre, jeg til venstre.

 

Endret av ze5400
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...