2016-12-05 3 views
0

Я ударил полный блокпост на этом, я не совсем хорош с указателями и обработкой файлов atm и uni. двигался слишком быстро, что я не могу угнаться ...Проблемы с программой, которая декодирует сопротивление по цвету в C

Ожидаемый ввод из файла любой из цветов из массива:
input.txt
красный, зеленый, синий
черный, белый, серый
...

, который затем выводит в файл:
output.txt
красный, зеленый, синий
сопротивление в Ом: 7000000,000000

черный, белый, серый
Сопротивление в Ом: 1000000,000000
...

мой выход прямо сейчас:
красный, зеленый, синий
Сопротивление в Ом: 0,000000

черный, белый, серый
Сопротивление в Ом: 0,000000

до сих пор вот мой код:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<math.h> 
#define size 100 

double DecodeString(char *inputString){ 
    const char *kColorTable[10] = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "gray", "white"}; 
    int i; 

    for(i=0; i<10; i++){ 
    if(strcmp(inputString, kColorTable[i]) == 0){ 
     return (double)i; 
    } 
    } 
    return -999.0; 
} 

int main(){ 
    char color[size], *token, *inputString; 
    double resistance, color1, color2, color3; 
    double value; 


    FILE *fptrin, *fptrout; 
    if(((fptrin = fopen("input.txt", "r"))==NULL) || ((fptrout = fopen("output.txt", "w")) == NULL)){ 
    printf("Error 404: File not found"); 
    exit(1); 
    } 

    while(fgets(color, size, fptrin)){ 
    token = strtok(color, ","); 
    DecodeString(token); 
    puts(""); 
    while(token != NULL){ 
     value = DecodeString(token); 
     printf("%s",token); 
     token = strtok(NULL, ","); 
    } 
    } 
    //value = DecodeString(color); 

    if (color1 == -999.0 || color2 == -999.0 || color3 == -999.0){ 
    printf("\n\nBad code -- cannot compute resistance\n"); 
    } 

    else{ 
    resistance = (10.0 * color1 + color2) *pow(10.0, color3); 

    if(resistance > 1000){ 
     printf("\n\nResistance in Kilo-ohms: %f\n",resistance); 
    } 
    else{ 
     printf("\n\nResistance in ohms: %f\n",resistance); 
    } 
    } 

    fclose(fptrin); 
    fclose(fptrout); 

    getchar(); 
    return 0; 
} 

Я застрял в моем цикле strtok, я не совсем уверен, как передать эти значения в функцию и назначение значения из функции color1, color2, color3 использовать для расчета Ом.

Я не понимаю, когда я прохожу token к DecodeString он возвращает только значение первой строки, а не каждой отдельной строки (возможно, я не хватает для цикла)

У меня есть другой код, где я на основе мой код от чьей-то функции:

#include<stdio.h> 
#include<stdlib.h> 
#include<strings.h> 
#include<math.h> 
#define size 100 

double DecodeString(char *inputString) 
{ 
    const char *kColorTable[11] = 
    {"", "black", "brown", "red", "orange", "yellow", 
     "green", "blue", "violet", "gray", "white"}; 
    int i; 

    for(i=0; i<11; i++) 
    { 
     if(strcmp(inputString, kColorTable[i]) == 0) 
     { 
      return (double)i; 
     } 
    } 
    return -999.0; 

} 

int main(void){ 
    char color[size], *token, *inputString; 
    double value; 

    FILE *fptrin, *fptrout; 
    if(((fptrin = fopen("input.txt", "r")) == NULL) || ((fptrout = fopen("output.txt", "w")) == NULL)){ 
    printf("Error 404: File not found"); 
    exit(1); 
    } 

    while(fgets(color, size, fptrin)){ 
    token = strtok(color, ","); 
    DecodeString(token); 
    puts(""); 
    while(token != NULL){ 
     value = DecodeString(token); 
     printf("%s",token); 
     token = strtok(NULL, ","); 
    } 
    //value = DecodeString(token); 
    printf("%f\n",value + value) *pow(10.0, value); 
    } 
    return 0; 
} 

Я ударил серьезный контрольно-пропускной пункт и был бы признателен за пояснения и примеры, чтобы лучше понять, что происходит.

+1

Пожалуйста, дайте вход тест, ожидаемый вывода и фактического выхода. – kaylum

+0

Я добавил вход и выход уже ... –

+0

Если в качестве входных данных используются пробелы как запятые, которые вы хотите использовать в качестве разделителей, тогда вы должны включить пробел во второй [strtok] (http: // www. cplusplus.com/reference/cstring/strtok/), например: 'token = strtok (color,", ");' – samgak

ответ

1

После логика будет работать для вас,

1.Declare двойной массив

double colord[3];

2.Now изменить время цикла,

while(fgets(color, size, fptrin)){ 
    token = strtok(color, ","); 
    colord[i] = DecodeString(token); 
    puts(""); 
    while(token != NULL){ 
     i++; 
     colord[i] = DecodeString(token); 
     printf("%s",token); 
     token = strtok(NULL, ","); 
    } 
} 
if (colord[0] == -999.0 || colord[1] == -999.0 || colord[2] == -999.0){ 
    printf("\n\nBad code -- cannot compute resistance\n"); 
} 
else{ 
    resistance = (10.0 * colord[0] + colord[1]) * pow(10.0, colord[2]); 
+0

Спасибо! это работает для меня! Не могу поверить, что я не думал об установке цвета как массива! Uni. движется слишком быстро, я почти не могу отставать! Я буду продолжать практиковать и учиться! –

Смежные вопросы