Wiki

Clone wiki

CPL01 / week5

Uitwerkingen weekopdrachten 5.4 en 5.5.

In week 5 hebben jullie elkaar feedback gegeven. Niet iedereen heeft die week feedback gehad van een docent. Vandaar dat we een mogelijke uitwerking van de laatste twee deelopdrachten op deze pagina publiceren. Bedenk dat er nog veel meer correcte antwoorden mogelijk zijn.

Oplossing voor excercise 5.4

#!C

#include <stdio.h>
#include <math.h>
#include <stdbool.h>

int calcE12Base(int n)
{
    int value = -1;

    if(n >= 1 && n <= 12)
    {
        value = round(10 * pow(10, (n-1)/12.0));
    }

    return value;
}

int realE12Base(int n)
{
    int value;

    switch(n)
    {
    case 1:
        value = 10;
        break;
    case 2:
        value = 12;
        break;
    case 3:
        value = 15;
        break;
    case 4:
        value = 18;
        break;
    case 5:
        value = 22;
        break;
    case 6:
        value = 27;
        break;
    case 7:
        value = 33;
        break;
    case 8:
        value = 39;
        break;
    case 9:
        value = 47;
        break;
    case 10:
        value = 56;
        break;
    case 11:
        value = 68;
        break;
    case 12:
        value = 82;
        break;
    default:
        value = -1;
    }

    return value;
}

double E12Value(int n, int p, bool calculate)
{
    double value = -1.0;

    if(calculate)
    {
        value = calcE12Base(n);
    }
    else
    {
        value = realE12Base(n);
    }

    if(value > 0 && p >= -3 && p <= 9)
    {
        value *= pow(10, p);
    }

    return value;
}

void printResistorValue(double value)
{
    double exponent = log10(value);
    int base1000exponent = (int) floor(exponent/3);
    char metricPrefix;
    value /= pow(10, base1000exponent * 3);

    switch (base1000exponent)
    {
        case -1 :
            metricPrefix = 'm';
            break;
        case 0 :
            metricPrefix = ' ';
            break;
        case 1 :
            metricPrefix = 'k';
            break;
        case 2 :
            metricPrefix = 'M';
            break;
        case 3 :
            metricPrefix = 'G';
            break;
    }
    if(value < 10)
    {
        printf("%3.1f%c", value, metricPrefix);
    }
    else
    {
        printf("%3.0f%c", value, metricPrefix);
    }
}

void printE12(bool calculate)
{
    for(int p = -3; p <= 9; p++)
    {
        for(int n = 1; n <= 12; n++)
        {
            printResistorValue(E12Value(n, p, calculate));
            printf(" ");
        }
        printf("\n");
    }
}

int main()
{
    printE12(true);

    printf("\n");

    printE12(false);

    return 0;
}

Je kunt het programma downloaden door hier te klikken.

Oplossing voor excercise 5.5

#!C
#include <stdio.h>
#include <stdbool.h>
#include <math.h>

/* Function to transfer color code from IEC 60062:2016 into an integer.
   returns 10 on error.

    Black   BK  0
    Brown   BN  1
    Blue    BU  6
    Gold    GD  -1
    Green   GN  5
    Gray    GY  8
    Orange  OG  3
    Pink    PK  -3
    Red     RD  2
    Silver  SR  -2
    Violet  VT  7
    Yellow  YE  4
*/

int colorCodeToInt(char c1, char c2)
{
    switch(c1)
    {
    case 'B':
        switch (c2)
        {
        case 'K':
            return 0;
        case 'N':
            return 1;
        case 'U':
            return 6;
        }
        break;
    case 'G':
        switch (c2)
        {
        case 'D':
            return -1;
        case 'N':
            return 5;
        case 'Y':
            return 8;
        }
        break;
    case 'O':
        if (c2 == 'G')
        {
            return 3;
        }
        break;
    case 'P':
        if (c2 == 'K')
        {
            return -3;
        }
        break;
    case 'R':
        if (c2 == 'D')
        {
            return 2;
        }
        break;
    case 'S':
        if (c2 == 'R')
        {
            return -2;
        }
        break;
    case 'V':
        if (c2 == 'T')
        {
            return 7;
        }
        break;
    case 'Y':
        if (c2 == 'E')
        {
            return 4;
        }
        break;
    }
    return 10;
}

int readBand(bool readSignificant)
{
    char c1, c2, dummy;
    int band;
    do
    {
        fflush(stdin); // clear keyboard buffer
        scanf("%c%c", &c1, &c2);
        band = colorCodeToInt(c1, c2);
        if (band == 10 || (readSignificant && band < 0))
        {
            printf("This is not a valid color code. Try again: ");
        }
    }
    while (band == 10 || (readSignificant && band < 0));
    return band;
}

// reuse printResistorValue from exercise 5.4
void printResistorValue(double value)
{
    double exponent = log10(value);
    int base1000exponent = (int) floor(exponent/3);
    char metricPrefix;
    value /= pow(10, base1000exponent * 3);

    switch (base1000exponent)
    {
        case -1 :
            metricPrefix = 'm';
            break;
        case 0 :
            metricPrefix = ' ';
            break;
        case 1 :
            metricPrefix = 'k';
            break;
        case 2 :
            metricPrefix = 'M';
            break;
        case 3 :
            metricPrefix = 'G';
            break;
    }
    if(value < 10)
    {
        printf("%3.1f%c", value, metricPrefix);
    }
    else
    {
        printf("%3.0f%c", value, metricPrefix);
    }
}

bool isE12(int value)
{
    switch(value)
    {
    case 10:
    case 12:
    case 15:
    case 18:
    case 22:
    case 27:
    case 33:
    case 39:
    case 47:
    case 56:
    case 68:
    case 82:
        return true;
    }
    return false;
}

int main(void)
{
    char answer, dummy;
    do
    {
        int band1, band2, band3;
        printf("Enter the first color code: ");
        band1 = readBand(true);
        printf("Enter the second color code: ");
        band2 = readBand(true);
        printf("Enter the third color code: ");
        band3 = readBand(false);
        printf("The value of this resistor is ");
        int significant = band1*10 + band2;
        printResistorValue(significant * pow(10, band3));
        printf("\n");
        if (isE12(significant))
        {
            printf("This value belongs to the E12 series\n");
        }
        else
        {
            printf("This value does not belong to the E12 series\n");
        }
        printf("Do you want to continue? ");
        do
        {
            fflush(stdin); // clear keyboard buffer
            scanf("%c", &answer);
            if (answer != 'Y' && answer != 'N')
            {
                printf("Not a valid answer. Try again (type Y or N): ");
            }
        }
        while (answer != 'Y' && answer != 'N');
    }
    while (answer == 'Y');
    return 0;
}

Je kunt het programma downloaden door hier te klikken.

Updated