Completing C code with D style

forkit forkit at gmail.com
Tue Nov 9 11:03:09 UTC 2021


On Monday, 8 November 2021 at 12:04:26 UTC, forkit wrote:
> On Tuesday, 2 November 2021 at 23:45:39 UTC, pascal111 wrote:
>> Next code originally was a classic C code I've written, it's 
>> pure vertical thinking, now, I converted it successfully to D 
>> code, but I think I made no much changes to make it has more 
>> horizontal thinking style that it seems D programmers care in 
>> horizontal thinking style. Is there any additions I can make 
>> in the code to make it suitable with D style or it's fine?
>>
>
> Oh man! some of those answers... whoooooohah....
>
> Here's mine, with a little of that horizontal thinking ;-)
>
> ....

And just had a little fun transposing my D code back into C.

They both produce exactly the same output.

But I tell ya.. the cognitive load .. well.. it increased 
dramatically ;-)

increased cognitive load bad!

// ==========================================

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <assert.h>

void displayResults(const char answer1, const char answer2);

int main(void)
{
     char answer1, answer2;

     while (true)
     {
         printf("Would you like in list (n=negatives, p=positives, 
b=both)? ");
         scanf_s(" %c", &answer1, 1);
         if (answer1 == 'n' || answer1 == 'p' || answer1 == 'b')
         {
             break;
         }
         printf("%c is not a valid answer. Try again.\n", answer1);
     }

     while (true)
     {
         printf("Would you like in list (e=evens, o=odds, b=both)? 
");
         scanf_s(" %c", &answer2, 1);
         if (answer2 == 'e' || answer2 == 'o' || answer2 == 'b')
         {
             break;
         }
         printf("%c is not a valid answer. Try again.\n", answer2);
     }

     displayResults(answer1, answer2);

     putchar('\n');
     return EXIT_SUCCESS;
}

void displayResults(const char answer1, const char answer2)
{
     // NOTE: 0 is neither positive or negative, but is considered 
to be even

     int numbers[11] = {-3, 14, 47, -49, -30, 15, 4, -82, 99, 26, 
0};

     // an array to store results from answer1
     int result1[sizeof(numbers) / sizeof(numbers[0])];

     // the final array that consolidates the results from answer1 
and answer2
     // must be at least this size in case it stores all elements 
from numbers.
     int finalResult[sizeof(numbers) / sizeof(numbers[0])];

     int result1Count = 0; // to keep count of number of elements 
aquired in answer1
     int result2Count = 0; // to keep count of number of elements 
aquired in answer2

     // my version of a string builder ;-)
     const int msgSize = 50; // should be large enough to hold the 
entire message.
     char *const resultMsg = (char *)malloc(msgSize);
     if (resultMsg == NULL)
     {
         exit(EXIT_FAILURE); // not enough memory!! really??!!
     }
     strcpy_s(resultMsg, 15, "\nHere are all ");

     switch (answer1)
     {
         case 'n':
             for (size_t i = 0; i < sizeof(numbers) / sizeof(int); 
i++)
             {
                 if (numbers[i] < 0)
                     result1[result1Count++] = numbers[i];
             }
             memcpy((char *)resultMsg + 14, "[negative] \0", 12);
             break;
         case 'p':
             for (size_t i = 0; i < sizeof(numbers) / sizeof(int); 
i++)
             {
                 if (numbers[i] > 0)
                     result1[result1Count++] = numbers[i];
             }
             memcpy((char *)resultMsg + 14, "[positive] \0", 12);
             break;
         case 'b':
             for (size_t i = 0; i < sizeof(numbers) / sizeof(int); 
i++)
             {
                 result1[result1Count++] = numbers[i];
             }
             break;
         default:
             // how could it ever get here??
             printf("Bad input!!\n%c is not a valid answer.", 
answer1);
             assert(0); // don't waste my time!
     }

     // debug
     /*
     {
         printf("\n[ result1Count after processing answer1 is: %d 
]\n ", result1Count);
         for (int i = 0; i < result1Count; i++)
         {
             printf("%d ", result1[i]);
         }
         putchar('\n');
     }
     */

     switch (answer2)
     {
         case 'e':
             for (int i = 0; i < result1Count; i++)
             {
                 if ((result1[i] % 2) == 0)
                     finalResult[result2Count++] = result1[i];
             }

             if (answer1 == 'b')
             {
                 memcpy((char *)resultMsg + 14, "[even]\0", 7);
             }
             else
             {
                 memcpy((char *)resultMsg + 25, "[even]\0", 7);
             }

             break;
         case 'o':
             for (int i = 0; i < result1Count; i++)
             {
                 if ((result1[i] % 2) != 0)
                     finalResult[result2Count++] = result1[i];
             }

             if (answer1 == 'b')
             {
                 memcpy((char *)resultMsg + 14, "[odd]\0", 6);
             }
             else
             {
                 memcpy((char *)resultMsg + 25, "[odd]\0", 6);
             }

             break;
         case 'b':
             for (int i = 0; i < result1Count; i++)
             {
                 finalResult[result2Count++] = result1[i];
             }
             break;
         default:
             // how could it ever get here??
             printf("Bad input!!\n%c is not a valid answer.", 
answer2);
             assert(0); // don't waste my time!
     }

     // debug
     /*
     {
         printf("\n[ result2Count after processing answer2 is: %d 
]\n ", result2Count);
         for (int i = 0; i < result2Count; i++)
         {
             printf("%d ", finalResult[i]);
         }
         putchar('\n');
     }
     */

     // sort the part of the array that we're interested in, in 
ascending order.
     int t;
     for (int i = 0; i < result2Count; i++)
     {
         for (int j = i + 1; j < result2Count; j++)
         {
             if (finalResult[i] > finalResult[j])
             {
                 t = finalResult[i];
                 finalResult[i] = finalResult[j];
                 finalResult[j] = t;
             }
         }
     }

     printf("%s numbers:\n", resultMsg);

     // print all the elements of the array
     for (int i = 0; i < result2Count; i++)
     {
         printf("%d ", finalResult[i]);
     }

     free(resultMsg);
}


// =====================================================




More information about the Digitalmars-d-learn mailing list