Thomas de G.
Artikelen: 0
Berichten: 4
Lid geworden op: di 08 nov 2011, 10:20

[c++] ascii tekens

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.
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [c++] ascii tekens

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.
Thomas de G.
Artikelen: 0
Berichten: 4
Lid geworden op: di 08 nov 2011, 10:20

Re: [c++] ascii tekens

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:)
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [c++] ascii tekens

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.
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [c++] ascii tekens

Ik denk dat het verstandig is als je je programma eerst eens opsplits in functies.

(en conio.h... really?)
Thomas de G.
Artikelen: 0
Berichten: 4
Lid geworden op: di 08 nov 2011, 10:20

Re: [c++] ascii tekens

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 :)
Landro
Artikelen: 0
Berichten: 18
Lid geworden op: wo 20 jan 2010, 21:21

Re: [c++] ascii tekens

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')
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [c++] ascii tekens

Landro
Artikelen: 0
Berichten: 18
Lid geworden op: wo 20 jan 2010, 21:21

Re: [c++] ascii tekens



Give a man a fish and you feed him for a day. Teach a man to fish and you feed him for a lifetime :)
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: [c++] ascii tekens

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. :)

Terug naar “Informatica en programmeren”