# Simple algorithm problem

• 03-04-2005
stodd04
Simple algorithm problem
I want to write a simple encryption program that does the following: Take a file as input (redirected at the Unix prompt), and encrypt/decrypt and print each character as directed. Convert uppercase characters to the lowercase character 3 down in the alphabet, EXCEPT A, B, C which become x, y, z respectively. Convert lowercase characters to the uppercase character 2 down in the alphabet, EXCEPT a, b which become Y, Z respectively. Convert all punctuation characters (ASCII 33-47, 58-64, 91-96, and 123-126) to the punctuation character 1 down in the ASCII chart; e.g., 34 " becomes 33 !, 35 # becomes 34 ", 58 : becomes 47 /;
EXCEPT 33 ! which becomes 126 ~.

here is some sample output:
Code:

```If the file which is redirected in contains the following text: ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 01234567890 The quick brown fox jumped over the lazy    dogs. !"#\$%&'()*+,-./:;<=>?@[\]^_`{|}~ Then the output of the program should be:: xyzabcdefghijklmnopqrstuvw YZABCDEFGHIJKLMNOPQRSTUVWX 01234567890 qFC OSGAI ZPMUL DMV HSKNCB MTCP RFC JYXW    BMEQ- ~!"#\$%&'()*+,-./:;<=>?@[\]^_`{|}```
now my code looks like:
Code:

```#include <stdio.h> #include <ctype.h> #define TRUE 1; #define False 0; //function prototypes char convert(char inputChar, int *whtSpc, int *charCnt); void display(int numWords, int whtSpc); char convUpper(char inputChar); char convLower(char inputChar); char convPunct(char inputChar); int main(void) {   //initialize vars   char inputChar;   char convertedChar;   int charCnt = 0;   int numWords = 0;   int whtSpc = 0;   //while((inputChar = getchar()) != EOF)   //{   convertedChar = convert(inputChar, &whtSpc, &charCnt);   //}//end while     display(numWords, whtSpc);   return 0; }//end of main char convert(char inputChar, int *whtSpc, int *charCnt) {   char convertedChar;     while((inputChar = getchar()) != EOF)   {   if(isalnum(inputChar) == 1)   {       charCnt++;   } else if(isspace(inputChar) == 1) {       charCnt--;   }   if((charCnt >0) && (isspace(inputChar)))   {       whtSpc++;   }//end if    if(isupper(inputChar))   {   convertedChar = convLower(inputChar);   }//end if  else if(islower(inputChar))   {   convertedChar = convUpper(inputChar);   }//end if   else if(ispunct(inputChar))   {   convertedChar = convPunct(inputChar);   }   printf("%c", convertedChar);   }//end of while   return convertedChar; }//end of convert() ///////////////////////////////////////////////////////////////////////////// //Name: display() //Purpose: displays the results of the conversion ///////////////////////////////////////////////////////////////////////////// void display(int numWords, int whtSpc) {   printf("\n%20s%20s", "Description", "Quantity");   printf("\n%20s%20s", "-----------", "--------");   printf("\n%20s%20d", "Words", numWords);   printf("\n%20s%20d", "Whitespace", whtSpc);   printf("\n\n"); }//end of display() ////////////////////////////////////////////////////////////////////////////// //Name: convUpper() //Purpose: converts lowercase chars to an uppercase char 2 down ////////////////////////////////////////////////////////////////////////////// char convUpper(char inputChar) {     char convertedChar = inputChar;      if(inputChar >= 97 && inputChar <=98)   {   if(inputChar == 97)   {       convertedChar = 'Y';   } else if(inputChar == 98){       convertedChar = 'Z';   }   }//end if     if(!(isupper(convertedChar)))   {     convertedChar = toupper(inputChar + 2);   }//end if   return convertedChar; }//end of convUpper() ////////////////////////////////////////////////////////////////////////////// //Name: convLower() //Purpose: converts uppercase chars to a lowercase char 3 down ///////////////////////////////////////////////////////////////////////////// char convLower(char inputChar) {   char convertedChar = inputChar;     if(inputChar >= 65 && inputChar <= 67)   {   if(inputChar == 65)   {       convertedChar = 97;   } else if(inputChar == 66){       convertedChar = 98;   } else if(inputChar == 67){       convertedChar = 99;   }   }//end if     if(!(islower(convertedChar)))   {       convertedChar = tolower(inputChar + 3);   }//end if       return convertedChar; }//end of convLower() ///////////////////////////////////////////////////////////////////////////// //Name: convPunct() //Purpose: wrap the puctioation arround + 1 times ///////////////////////////////////////////////////////////////////////////// char convPunct(char inputChar) {   char convertedChar;   if(inputChar == '!')   {       convertedChar = '~';   } else {             convertedChar = (int)inputChar - 1;   }   return convertedChar; }//end of convPunct()```
any help would be greatly appreciated and thank you in advance. This has been bugging me all night long.
• 03-04-2005
computerfreaks

Code:

```  while((inputChar = getchar()) != EOF)   {   convertedChar = convert(inputChar, &whtSpc, &charCnt);   } while((inputChar = getchar()) != EOF)   {   if(isalnum(inputChar) == 1)   {```

You appear to be sending a character to your convert function, and then you are asking for the user to input another char which will overwrite the one sent to the function.

Code:

`display(numWords, whtSpc);`
Has this part not been completed yet??.

I am not entirely sure in fact what you are asking for here.... have you written this far and are now stuck? or is there a certain problem that you cannot overcome?
• 03-04-2005
stodd04
its reading data from a file using a linux command like this:
Code:

`a.out < t1`
yea display is not quite finnished. My main problem is getting the characters to convert properly t1 is also a text file
• 03-04-2005
quzah
Quote:

Originally Posted by computerfreaks
Code:

```while((inputChar = getchar()) != EOF)   {   if(isalnum(inputChar) == 1)   {```

There is no guarintee that isalnum, or any of the other is* functions will ever return 1. It's only guarinteed to be zero and "non zero". Therefore you should be using:
Code:

`if( isalnum( inputChar ) != 0 )`
(Is this like the theme of the day or what?)

Quzah.
• 03-04-2005
computerfreaks
I was just wondering about the theme thing myself..... you guys all from the same school or something with the same assignment??

I think you need better teachers!
• 03-04-2005
stodd04
ah... thank you very much that was very helpful
• 03-04-2005
stodd04
Nah... thats not an assignment from my class. Thank ya'll very much for you help
• 03-04-2005
quzah
Quote:

Originally Posted by computerfreaks
I was just wondering about the theme thing myself..... you guys all from the same school or something with the same assignment??

I think you need better teachers!

Actually you misunderstood. You need a better teacher. Reread my post to you.

Quzah.
• 03-04-2005
stodd04
I would say it would be more my own stupidity than the ability of the teacher
• 03-04-2005
computerfreaks
Quzah,

??? I'm not following?? I need a better teacher? which post?

I am on these boads to learn..... if I am getting something wrong, then please tell me so that I can learn from my mistakes :confused:
• 03-04-2005
quzah
Quote:

Originally Posted by computerfreaks
Quzah,

??? I'm not following?? I need a better teacher? which post?

I am on these boads to learn..... if I am getting something wrong, then please tell me so that I can learn from my mistakes :confused:

Here is the post in question:
Quote:

Quote:

Originally Posted by computerfreaks
Code:

```while((inputChar = getchar()) != EOF)   {   if(isalnum(inputChar) == 1)   {```

There is no guarintee that isalnum, or any of the other is* functions will ever return 1. It's only guarinteed to be zero and "non zero". Therefore you should be using:
Code:

`if( isalnum( inputChar ) != 0 )`
(Is this like the theme of the day or what?)

Quzah.
You seem to have misread something here I guess. I was commenting on the fact that your comparison for isalnum was wrong, and that this is the second time today that I have corrected people on incorrect return value testing on the is* functions.

To clarify once again, there is no guarintee that the return value of any of the is* functions will ever be 1. It could be 40, it could be -1, it could be any non-zero value, to mean that the test was successful.

The functions have two return states, and so, you should test them correctly:

1) If the character is not part of the set of characters being test for, then the return value is zero.
2) If the character is part of the set of characters being test for, the return value is non-zero.

That means, it can be anything at all other than zero. So testing for "1" is wrong. You should test only for "equals zero" or "not equals zero".
Code:

```if( isalnum( foo ) == 0 ) ... if( isalnum( foo ) != 0 )```
Testing for anything else may or may not work.

I could create a compiler which was 100% ANSI compataible, an have the return values of these functions be -12345 or 0, and it would be perfectly legal. In which case, your testing for "== 1" wouldn't work as you expect it to. And yet, my compiler would still be 100% ANSI compatable.

Quzah.
• 03-04-2005
stodd04
Quzah, I cannot thank you enough for your infinite programming wisdom. I am going back to the drawing board and restructring the program to add some stuff and get rid of some redundancy. I will post it fixed later. Once again thanks for your help.