# Thread: Simple algorithm problem

1. ## 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.

2. The first thing that I would note about this is the following:

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?

3. 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

4. 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.

5. 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!

6. ah... thank you very much that was very helpful

7. Nah... thats not an assignment from my class. Thank ya'll very much for you help

8. 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.

9. I would say it would be more my own stupidity than the ability of the teacher

10. 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

11. 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
Here is the post in question:
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.

12. 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.

Popular pages Recent additions