r2d290 Skrevet 6. mars 2010 Del Skrevet 6. mars 2010 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
Roterau Skrevet 8. mars 2010 Del Skrevet 8. mars 2010 (endret) Er Beginning C++ Through Game Programming en bra bok å starte med for en nybegynner ? Endret 8. mars 2010 av Roterau Lenke til kommentar
Senyor de la guerra Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 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
r2d290 Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 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
Senyor de la guerra Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 Noen som har lyst til å forbedre min? Lenke til kommentar
endrebjo Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 (endret) 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 9. mars 2010 av endrebjo Lenke til kommentar
Senyor de la guerra Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 Takker, må få lært meg dette ordentlig. Lenke til kommentar
GeirGrusom Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 r2d290: Jeg tror det kan være mulig å droppe den switchen din. Ettersom det eneste som endrer seg, er bitshift operasjonen, så kan denne legges i et array. Lenke til kommentar
r2d290 Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 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
ze5400 Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 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
Leif.ross Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 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! // 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
ze5400 Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 (endret) EDIT: Herre som jeg roter her >< Endret 9. mars 2010 av ze5400 Lenke til kommentar
r2d290 Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 Fikk nok ikke den opplevelsen desverre, men ser tankegangen din med å prøve å gi meg den 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
Senyor de la guerra Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 (endret) 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! // 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 9. mars 2010 av Senyor de la guerra Lenke til kommentar
endrebjo Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 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
ze5400 Skrevet 9. mars 2010 Del Skrevet 9. mars 2010 (endret) 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 9. mars 2010 av ze5400 Lenke til kommentar
r2d290 Skrevet 10. mars 2010 Del Skrevet 10. mars 2010 Helt fantastisk hvor hjelpsomme folk var her da Tusen takk! Lenke til kommentar
Leif.ross Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) Hei, takker for hjelpen! men får denne feilmeldingen: fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory bruker visual studio 2005 btw Endret 11. mars 2010 av mr-taco Lenke til kommentar
ze5400 Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 stdafx.h inkluderer man kun om man vil bruke precompiled headers. Ta bort referansen til den så skal det nok virke. Lenke til kommentar
GeirGrusom Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 Hvis du bruker Visual Studio, burde du bare legge inn StdAfx.h, og inkludere alt der. IntelliSense har en tendens til å ikke fungere uten, dessuten minsker precompiled headers compiletiden drastisk. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå