From ‘A’ and ‘a’ to ‘Z’ and ‘z’ – Solution

I don’t believe one definitive solution exists for this month’s Exercise: Output a string of upper- and lowercase letters. No, the challenge is more to discover different insights a coder has to a specific problem.

Here is the desired output string:

AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz

My first approach is one I consider the most obvious:

2022_08-Exercise-a.c

#include <stdio.h>

int main()
{
    int x;

    for( x='A'; x<='Z'; x++ )
        printf("%c%c",x,x+32);
    putchar('\n');

    return(0);
}

A for loop plows through characters 'A' through 'Z' at Line 7. The character is output at Line 8, along with its companion lowercase letter, which is x+32 (thank you ASCII table). This solution was my first stab, though it could also be done by using two variables instead:

2022_08-Exercise-b.c

#include <stdio.h>

int main()
{
    int x,y;

    for( x='A',y='a'; x<='Z'; x++,y++ )
        printf("%c%c",x,y);
    putchar('\n');

    return(0);
}

Here both x and y are initialized in the for loop. Only one terminating condition needs to be specified, x<='Z'. Then both x and y are incremented each turn. This solution avoids math in the printf() statement, but it requires a knowledge that you can perform multiple actions within a single for loop statement.

This next solution uses a while loop and a single char variable alphabet:

2022_08-Exercise-c.c

#include <stdio.h>

int main()
{
    char alphabet = 'A';

    while( alphabet!='Z'+1)
    {
        putchar(alphabet);
        putchar(alphabet+32);
        alphabet++;
    }
    putchar('\n');

    return(0);
}

The while loop spins as long as the value of alphabet doesn't equal 'Z'+1. This expression allows letters Z and z to be output, because the loop stops after Z is output. The putchar() at Line 10 adds 32 to the value of alphabet, generating lowercase letter output. Most importantly, alphabet is incremented at Line 11, which keeps the loop moving.

Now I get bizarre:

2022_08-Exercise-d.c

#include <stdio.h>

int main()
{
    /* size the array for two alphabets (26)
       and the null character */
    char a[26*2+1];
    char alpha;
    int x;

    /* do uppercase */
    alpha = 'A';
    for( x=0; x<26*2; x+=2 )
    {
        a[x] = alpha;
        alpha++;
    }

    /* do lowercase */
    alpha = 'a';
    for( x=0; x<26*2; x+=2 )
    {
        a[x+1] = alpha;
        alpha++;
    }

    /* append the null char */
    a[26+26] = '\0';

    /* output result */
    puts(a);

    return(0);
}

Two for loops fill array a[]. The first sets uppercase letters to every other position in the array. The second for loop works similarly, but for lowercase and using a[x+1] as its index value. The +1 shifts the lowercase letters over, squeezing them between uppercase letters already set in the array. It's kinda crazy, but it doesn't attain the level of insanity as this version:

2022_08-Exercise-e.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int size = 26*2+1;
    char *a;
    int x,y;
    
    /* allocate storage for two alphabets plus
       a null character */
    a = malloc( sizeof(char) * size );
    if( a==NULL )
    {
        fprintf(stderr,"Unable to allocate memory\n");
        exit(1);
    }

    /* initialize the buffer to all As */
    for( x=0; x<size; x++ )
        *(a+x) = 'A';


    /* manipulate contents */
    for( x=0,y=0; x<26*2; x+=2,y++ )
    {
        *(a+x) = *(a+x) + y;
        *(a+x+1) = *(a+x+1) + y + 32;
    }

    /* output the results */
    *(a+size-1) = '\0';
    puts(a);

    return(0);
}

My nuttiest solution uses a pointer, allocates storage, then fills the buffer with uppercase letter 'A'. The action takes place at Line 25, where a for loop uses two variables to process the buffer. The first looping variable x is increased by two each turn; variable y incremented by one.

The statements at Lines 27 and 28 adjust the value of character 'A' (already in the buffer) to create the mixed upper- lowercase string. It took a few tries for me to code something so convoluted, but it works.

I hope you came up with a working solution, easy or hard. If you're an experienced coder, I hope you wove a tapestry of statements that inspires and delights. That's the point of the exercise.

Leave a Reply