endrebjo Skrevet 23. februar 2010 Del Skrevet 23. februar 2010 (endret) 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 23. februar 2010 av endrebjo Lenke til kommentar
Senyor de la guerra Skrevet 23. februar 2010 Del Skrevet 23. februar 2010 Mye logiskt i det du sier, men var kun et mindre utdrag av programmet. Kan poste hele koden senere. Lenke til kommentar
Akidon Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 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
GeirGrusom Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 Det høres ut som en typisk "index out of bounds" feil. Lenke til kommentar
Akidon Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 alså at tabellen ikke er stor nok? Uanset hvordan hjelper z på? Og hvorfor fungerer den ene tabellen og ikke den andre? Lenke til kommentar
Akidon Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 (endret) Hjalp å øke størelsen på tabellen. Men jeg fatter ikke hvorfor. Hadde allerede økt størrelsen på den tabellen som skrev ut feil tall, uten hell. Endret 1. mars 2010 av Akidon Lenke til kommentar
GeirGrusom Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 (endret) 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 1. mars 2010 av GeirGrusom Lenke til kommentar
Akidon Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 La oss si at jeg deklarerer en tabell: tab[2] Vil ikke dette si at det blir deklarert tre integers: -tab[0] -tab[1] -tab[2] Så når jeg deklarerer tabell[4][4]; Så skulle det vere en todimensjonal tabell på 5*5 integers? Lenke til kommentar
endrebjo Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 (endret) 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 1. mars 2010 av endrebjo Lenke til kommentar
Akidon Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 Ok nå ble jeg forvirret hvem av dere har rett? o0 Lenke til kommentar
NevroMance Skrevet 1. mars 2010 Del Skrevet 1. mars 2010 Det siste er rett. int tab[n] holder av n integer plasser, siden du starter å telle på 0, vil det si at siste indeksen din blir n-1. Lenke til kommentar
GeirGrusom Skrevet 2. mars 2010 Del Skrevet 2. mars 2010 Ah seff, jeg som tullet med det jeg sa du ikke måtte tulle med ^^ Lenke til kommentar
r2d290 Skrevet 5. mars 2010 Del Skrevet 5. mars 2010 (endret) 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 5. mars 2010 av r2d290 Lenke til kommentar
ze5400 Skrevet 5. mars 2010 Del Skrevet 5. mars 2010 Sett en ny løkke på utsiden av løkken. Lenke til kommentar
r2d290 Skrevet 5. mars 2010 Del Skrevet 5. mars 2010 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
ze5400 Skrevet 5. mars 2010 Del Skrevet 5. mars 2010 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
r2d290 Skrevet 6. mars 2010 Del Skrevet 6. mars 2010 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
ze5400 Skrevet 6. mars 2010 Del Skrevet 6. mars 2010 (endret) EDIT: Ble noe galt med denne posten, så la koden i den under Tror det er noe slikt du er ute etter. Endret 6. mars 2010 av ze5400 Lenke til kommentar
ze5400 Skrevet 6. mars 2010 Del Skrevet 6. mars 2010 #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
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å