Springen naar inhoud

[c++] ascii tekens


  • Log in om te kunnen reageren

#1

Thomas de G.

    Thomas de G.


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 22 december 2011 - 10:05

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:
/* 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.

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 22 december 2011 - 10:36

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.

#3

Thomas de G.

    Thomas de G.


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 22 december 2011 - 14:36

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

#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 22 december 2011 - 15:43

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.

#5

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 22 december 2011 - 16:12

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

(en conio.h... really?)

#6

Thomas de G.

    Thomas de G.


  • 0 - 25 berichten
  • 4 berichten
  • Gebruiker

Geplaatst op 22 december 2011 - 16:57

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

#7

Landro

    Landro


  • 0 - 25 berichten
  • 18 berichten
  • Gebruiker

Geplaatst op 11 januari 2012 - 14:43

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.
char a = 65;
en
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

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

Veranderd door Landro, 11 januari 2012 - 14:55


#8

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 11 januari 2012 - 16:15

isalnum()

#9

Landro

    Landro


  • 0 - 25 berichten
  • 18 berichten
  • Gebruiker

Geplaatst op 11 januari 2012 - 19:24

isalnum()


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

#10

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 11 januari 2012 - 19:30

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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures