Finlandia_C
Finlandia_C

Reputation: 395

Using for loops to print specific "non-vowel, vowel, non-vowel" words

I have a task to print a list of words made up of "non-vowel, vowel, non-vowel", i.e bab, bac, bad, bad ... through to zuz.

I have managed to create a code which does the first two letters but gets lost on the last loop and prints only '}' - which seems strange to me. The code is below:

#include <stdio.h>
#include <string.h>


int check_vowel(char c);
int check_consonant(char c);
int main ()
{

char c, c2, c3;
int cnt;

for (cnt = 0; cnt <= c; cnt++)
{
    for (c = 'a'; c <= 'z'; c++)
    {
        if (check_vowel(c) == 0)
        {           
            for (c2 = 'a'; c2 <= 'z'; c2++)
            {
                if (check_consonant(c2) == 0)
                {
                    for (c3 = 'a'; c3 <= 'z'; c3++);
                    {
                        if (check_vowel(c3) == 0)
                        {
                        cnt++;
                        printf("%d || %c%c%c\n", cnt, c, c2, c3);
                        }
                    }
                }       
            }
        }
    }
}



printf("Total names = %d", cnt);

return 0;

}

int check_vowel(char c)

{
    switch(c) 
    {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
    return 1;
        default:
    return 0;
    }
}

int check_consonant(char c)
{
    switch(c)
    {
    case 'b':
    case 'c':
    case 'd':
    case 'f':
    case 'g':
    case 'h':
    case 'j':
    case 'k':
    case 'l':
    case 'm':
    case 'n':
    case 'p':
    case 'q':
    case 'r':
    case 's':
    case 't':
    case 'v':
    case 'w':
    case 'x':
    case 'y':
    case 'z':
        return 1;
    default:
        return 0;
    }
}

The outputs are along the lines of: 1 || ba} 2 || be} etc

Upvotes: 0

Views: 98

Answers (2)

Luis Colorado
Luis Colorado

Reputation: 12698

Why don't try to iterate only over the proper sets:

static const char cons[] = "bcdfghjklmnpqrstvwxyz";
static const size_t cons_sz = sizeof cons - 1;

static const char vowels[] = "aeiou";
static const size_t vowels_sz = sizeof vowels - 1;

for (i = 0; i < cons_sz; i++)
    for (j = 0; j < vowels_sz; j++)
        for (k = 0; k < cons_sz; k++)
            printf("%c%c%c\n", cons[i], vowels[j], cons[k]);

Upvotes: 0

user824425
user824425

Reputation:

The first bug is in this line:

for (c3 = 'a'; c3 <= 'z'; c3++);

Because of the semicolon at the end of that line, the iteration body is "do nothing". The block of code after it (from { to }) is just treated as something to do after this loop. When you enter this block of code, c3 will always be {, because it's the first character after z (in most character encodings). The fix: remove the semicolon.

The second bug is in the choice of conditions. The condition check_vowel(c3) == 0 (what you wrote) is not equal to check_consonant(c3) == 1 (what you want). For instance, { is not a vowel, but that doesn't make it a consonant. The fix: make your conditions positive.

Upvotes: 5

Related Questions