1 van 1

[c++] ascii tekens

Geplaatst: do 22 dec 2011, 10:05
door Thomas de G.
Ik moet voor school een opdracht maken voor programmeren, de opdracht is om een programma te schrijven, dat een rij letters (afgesloten door een .) inleest. Elk karakter wordt gecodeerd volgens een zelfbedacht algoritme en het resultaat wordt naar een tekstfile (cript.txt) geschreven. Schrijf een tweede programma dat dit bestand (cript.txt) inleest, de karakters decodeert en het resultaat op het scherm toont.

tot zover heb ik dit bij het schrijfprogramma:

Code: Selecteer alles

/* INCLUDES: */

#include	<stdio.h>

#include	<stdlib.h>

#include	<math.h>

#include <string.h>

#include <conio.h>

/* DEFINES: */

#define PI 3.141592

#define MAX_NUMBER 99

/* FUNCTION DECLARATIONS */

/* MAINPROGRAM: */

int main(void)

{

char 	chstop = 'y';

FILE 	*p_file_cript;

char 	chArr, chAlg;

   while(chstop= 'y')

   {

   	/* openen bestand: */

   	p_file_cript = fopen("cript.txt","w");

   	if(p_file_cript == NULL)

  {

  printf("cript.txt cannot be opened!");

exit(0);

  }

  /* the file is successfully opened */

  /*vraag om invoer*/

  printf("Voer katakters in van A tot Z en eindig met een '.'(punt)\n");

  chArr = getch();

 [color="#FF0000"] while(chArr != '.')

  {

  if(chArr == 'a' || chArr == 'b' || chArr == 'c' || chArr == 'd' || chArr == 'e' || chArr == 'f' || chArr == 'g' || chArr == 'h' || chArr == 'i' || chArr == 'j' || chArr == 'k' || chArr == 'l' || chArr == 'm' || chArr == 'n' || chArr == 'o' || chArr == 'p' || chArr == 'q' || chArr == 'r' || chArr == 's' || chArr == 't' || chArr == 'u' || chArr == 'v' || chArr == 'w' || chArr == 'x' || chArr == 'y' || chArr == 'z')

  {

  switch(chArr)

  {

  case 'a' : chAlg = '1';  break; case 'b' : chAlg = '2';  break;

case 'c' : chAlg = '3';  break; case 'd' : chAlg = '4';  break;

case 'e' : chAlg = '5';  break; case 'f' : chAlg = '6';  break;

case 'g' : chAlg = '7';  break; case 'h' : chAlg = '8';  break;

case 'i' : chAlg = '9';  break; case 'j' : chAlg = '0';  break;

   case 'k' : chAlg = '!';  break; case 'l' : chAlg = '@';  break;

   case 'm' : chAlg = '#';  break; case 'n' : chAlg = '$';  break;

   case 'o' : chAlg = '%';  break; case 'p' : chAlg = '^';  break;

   case 'q' : chAlg = '&';  break; case 'r' : chAlg = '*';  break;

   case 's' : chAlg = '?';  break; case 't' : chAlg = '~';  break;

   case 'u' : chAlg = '-';  break; case 'v' : chAlg = '+';  break;

   case 'w' : chAlg = '=';  break; case 'x' : chAlg = '[';  break;

   case 'y' : chAlg = '/';  break; case 'z' : chAlg = ']';  break;

}

/* schrijven naar bestand: */

fprintf(p_file_cript,"%c",chAlg);

/*nieuwe informatie naar scherm*/

printf("%c",chArr);

chArr = getch();

}[/color]

else

{

   

printf ("\nwaarde niet tussen A en Z\n");

chArr = getch();

}

}

  fclose(p_file_cript);

  /*exit program*/

if (chArr == '.')	return(0);

}

}
Ik ben volgens mij wel een heel eind de goede kant op, maar nu kan ik alleen A tot en met Z, dus geen spaties en cijfers.

Nu zei een klasgenoot dat het mogelijk is om bij het inlezen een ASCII reeks te schrijven in de trant van: waarde karakter + 1.

Dit is gelijk een stuk korter omdat dit als het goed is in 2 à 3 regels beschreven kan worden.

Nu heb ik lopen zoeken op het internet, maar daar kon ik niets vinden.

Zou iemand mij hier verder mee willen helpen?

Alvast bedankt.

Re: [c++] ascii tekens

Geplaatst: do 22 dec 2011, 10:36
door Xenion
Thomas de G. schreef:Ik ben volgens mij wel een heel eind de goede kant op, maar nu kan ik alleen A tot en met Z, dus geen spaties en cijfers.

Nu zei een klasgenoot dat het mogelijk is om bij het inlezen een ASCII reeks te schrijven in de trant van: waarde karakter + 1.
Dat is ook het eerste waar ik aan dacht toen ik je code aan het lezen was :)

Een character in C++ is eigenlijk een kleine integer die 256 verschillende waarden kan aannemen. Je kan daar dus integer operaties op uitvoeren.

Stel je hebt char a en int i: als je dan i = a doet, dan zal je zien dat i de waarde 97 krijgt.

Als je dan iets doet als a++, dan wordt a met 1 verhoogd en komt er ascii(98) = 'b' in te staan.

Re: [c++] ascii tekens

Geplaatst: do 22 dec 2011, 14:36
door Thomas de G.
Xenion schreef:Dat is ook het eerste waar ik aan dacht toen ik je code aan het lezen was :)

Een character in C++ is eigenlijk een kleine integer die 256 verschillende waarden kan aannemen. Je kan daar dus integer operaties op uitvoeren.

Stel je hebt char a en int i: als je dan i = a doet, dan zal je zien dat i de waarde 97 krijgt.

Als je dan iets doet als a++, dan wordt a met 1 verhoogd en komt er ascii(98) = 'b' in te staan.
ok, dankjewel!

maar hoe kun je dit in C-programmeertaal schrijven en waar moet ik dat in mijn programma veranderen.

nogmaals bedankt:)

Re: [c++] ascii tekens

Geplaatst: do 22 dec 2011, 15:43
door Xenion

Code: Selecteer alles

if(chArr == 'a' || chArr == 'b' || chArr == 'c' || chArr == 'd' || chArr == 'e' || chArr == 'f' || chArr == 'g' || chArr == 'h' || chArr == 'i' || chArr == 'j' || chArr == 'k' || chArr == 'l' || chArr == 'm' || chArr == 'n' || chArr == 'o' || chArr == 'p' || chArr == 'q' || chArr == 'r' || chArr == 's' || chArr == 't' || chArr == 'u' || chArr == 'v' || chArr == 'w' || chArr == 'x' || chArr == 'y' || chArr == 'z')

  {

  switch(chArr)

  {

  case 'a' : chAlg = '1';  break; case 'b' : chAlg = '2';  break;

case 'c' : chAlg = '3';  break; case 'd' : chAlg = '4';  break;

case 'e' : chAlg = '5';  break; case 'f' : chAlg = '6';  break;

case 'g' : chAlg = '7';  break; case 'h' : chAlg = '8';  break;

case 'i' : chAlg = '9';  break; case 'j' : chAlg = '0';  break;

   case 'k' : chAlg = '!';  break; case 'l' : chAlg = '@';  break;

   case 'm' : chAlg = '#';  break; case 'n' : chAlg = '$';  break;

   case 'o' : chAlg = '%';  break; case 'p' : chAlg = '^';  break;

   case 'q' : chAlg = '&';  break; case 'r' : chAlg = '*';  break;

   case 's' : chAlg = '?';  break; case 't' : chAlg = '~';  break;

   case 'u' : chAlg = '-';  break; case 'v' : chAlg = '+';  break;

   case 'w' : chAlg = '=';  break; case 'x' : chAlg = '[';  break;

   case 'y' : chAlg = '/';  break; case 'z' : chAlg = ']';  break;
Heel dit stuk is eigenlijk 'slecht':

Je zou gewoon voor elk karakter dat je krijgt de ascii waarde +1 kunnen doen.

a wordt dan b, b wordt c etc.

Coderen van een tekst wordt dan elk karakter +1 doen, en decoderen wordt dan elk karakter -1 doen.

Je kan ook ingewikkeldere codes bedenken zoals code = 2*origineel + 3 ofzo.

Je moet wel oppassen dat je niet buiten het bereik van de char gaat, dus als je boven 255 komt moet je weer bij 0 beginnen.

Re: [c++] ascii tekens

Geplaatst: do 22 dec 2011, 16:12
door EvilBro
Ik denk dat het verstandig is als je je programma eerst eens opsplits in functies.

(en conio.h... really?)

Re: [c++] ascii tekens

Geplaatst: do 22 dec 2011, 16:57
door Thomas de G.
dank julliewel voor jullie antwoorden :)

mochten mensen nog leuke ideeën hebben, zeg ze gerust, want ik moet nog veeel leren op het gebied van C-programmeren :)

Re: [c++] ascii tekens

Geplaatst: wo 11 jan 2012, 14:43
door Landro
Zoals hierboven al genoemd, is char een bijzonder variable type. Het is een 8-bit integer (waardes 0-255) waar je ook tekens aan toe kunt wijzen.

Code: Selecteer alles

char a = 65;
en

Code: Selecteer alles

char a = 'A';
doen precies hetzelfde want de ASCII waarde van de hoofdletter A is 65. Je kunt hier ook vergelijkingen op los laten zoals in de onderstaande code

Code: Selecteer alles

if(chArr >= 'a' && chArr <= 'z')

Re: [c++] ascii tekens

Geplaatst: wo 11 jan 2012, 16:15
door EvilBro

Re: [c++] ascii tekens

Geplaatst: wo 11 jan 2012, 19:24
door Landro


Give a man a fish and you feed him for a day. Teach a man to fish and you feed him for a lifetime :)

Re: [c++] ascii tekens

Geplaatst: wo 11 jan 2012, 19:30
door EvilBro
Give a man a fish and you feed him for a day. Teach a man to fish and you feed him for a lifetime :)
Dat heb ik gedaan... ik geef hem niet voor niets een link naar een c++ reference. :)