Задание: Красный, синий и желтый называются основными цветами, потому что их нельзя получить путем смешения других цветов. При смешивании двух основных цветов получается вторичный цвет: если смешать красный и синий, то получится фиолетовый; если смешать красный и желтый, то получится оранжевый; если смешать синий и желтый, то получится зеленый. Напишите программу, которая считывает названия двух основных цветов для смешивания. Если пользователь вводит что-нибудь помимо названий «красный», «синий» или «желтый», то программа должна вывести сообщение об ошибке. В противном случае программа должна вывести название вторичного цвета, который получится в результате. Формат входных данных На вход программе подаются две строки, каждая на отдельной строке. Формат выходных данных Программа должна вывести полученный цвет смешения либо сообщение «ошибка цвета», если введён был не цвет. Примечание 1. Если смешать красный и красный, то получится красный и т.д. Написанный код работает правильно на вывод "violet" и "orange" потом на любой ввод выдаёт "orange". В чём может быть проблема? подключенная библиотека "math.h" не мешает? #include <math.h> #include <stdio.h> #include <string.h> int main () { char c1[10], c2[10]; printf("Vvedite cveta\n"); scanf("%s %s", c1, c2); if (strcmp(c1, "red") == 0 && strcmp(c2, "blue") == 0 || strcmp(c1, "blue") == 0 && strcmp(c2, "red") == 0) { printf("violet"); } else if (strcmp(c1, "red")==0 && strcmp(c2, "yelow") || strcmp(c1, "yelow") && strcmp(c2, "red")) { printf("orange"); } else if (strcmp(c1, "blue")==0 && strcmp(c2, "yelow")==0 || strcmp(c1, "yelow")==0 && strcmp(c2, "blue")) { printf("green"); } else if (strcmp(c1, "red")==0 & strcmp(c2, "red")==0) { printf("red"); } else if (strcmp(c1, "blue")==0 && strcmp(c2, "blue")==0) { printf("blue"); } else if (strcmp(c1, "yelow")==0 && strcmp(c2, "yelow")) { printf("yelow"); } else printf("oshibka cveta"); return 0; }
При подключении стандартных библиотек, ничего мешаться не должно Жёлтый = yellow Во второй ветке после strcmp(c2, "yelow") нет сравниваний, как и в некоторых других ветках (2 ветка второй, третий, четвёртый вызовы, 3 ветка четвёртый вызов, предпоследний второй вызов функции strcmp)
Celeste правильно указал (но сделал это настолько непонятно что даже я не понял) - у тебя в части условий отсутствует сравнение результата вызова strcmp c нулём, про этом любое отличное от нуля значение возвращаемое strcmp интерпретируется как true, что противоположно тому что тебе надо. #include <math.h> #include <stdio.h> #include <string.h> int main() { char c1[10], c2[10]; printf("Vvedite cveta\n"); scanf("%s %s", c1, c2); if (strcmp(c1, "red") == 0 && strcmp(c2, "blue") == 0 || strcmp(c1, "blue") == 0 && strcmp(c2, "red") == 0) { printf("violet"); } else if (strcmp(c1, "red") == 0 && strcmp(c2, "yelow") == 0 || strcmp(c1, "yelow") == 0 && strcmp(c2, "red") == 0) { printf("orange"); } else if (strcmp(c1, "blue") == 0 && strcmp(c2, "yelow") == 0 || strcmp(c1, "yelow") == 0 && strcmp(c2, "blue") == 0) { printf("green"); } else if (strcmp(c1, "red") == 0 & strcmp(c2, "red") == 0) { printf("red"); } else if (strcmp(c1, "blue") == 0 && strcmp(c2, "blue") == 0) { printf("blue"); } else if (strcmp(c1, "yelow") == 0 && strcmp(c2, "yelow") == 0) { printf("yelow"); } else printf("oshibka cveta"); return 0; } C #include <math.h> #include <stdio.h> #include <string.h> int main() { char c1[10], c2[10]; printf("Vvedite cveta\n"); scanf("%s %s", c1, c2); if (strcmp(c1, "red") == 0 && strcmp(c2, "blue") == 0 || strcmp(c1, "blue") == 0 && strcmp(c2, "red") == 0) { printf("violet"); } else if (strcmp(c1, "red") == 0 && strcmp(c2, "yelow") == 0 || strcmp(c1, "yelow") == 0 && strcmp(c2, "red") == 0) { printf("orange"); } else if (strcmp(c1, "blue") == 0 && strcmp(c2, "yelow") == 0 || strcmp(c1, "yelow") == 0 && strcmp(c2, "blue") == 0) { printf("green"); } else if (strcmp(c1, "red") == 0 & strcmp(c2, "red") == 0) { printf("red"); } else if (strcmp(c1, "blue") == 0 && strcmp(c2, "blue") == 0) { printf("blue"); } else if (strcmp(c1, "yelow") == 0 && strcmp(c2, "yelow") == 0) { printf("yelow"); } else printf("oshibka cveta"); return 0; }
Да, моё пояснение крайне кривое А так, вариант из другого форума крайне красивый: для частоповторяющегося действия введена функция, что улучшает читаемость кода Главное ошибки исправлены, а выводы сделаешь сам
Celeste, Есть говорить о читаемости/расширяемости кода, то будь это хотябы C++ я бы сделал через map - по мне так было бы удобнее добавлять новые цветовые комбинации чем со вспомогательными функциями. #include <iostream> #include <map> #include <set> #include <string> using namespace std; static map<pair<string, string>, string> ColorMix { {{"red", "blue"}, "violet"}, {{"red", "yellow"}, "orange"}, {{"blue", "yellow"}, "green"}, }; static set<string> ValidColors; int main() { for (const auto& [pair, result] : ColorMix) { const auto [mixColor1, mixColor2] = pair; ValidColors.insert(mixColor1); ValidColors.insert(mixColor2); } cout << "Vvedite cveta" << endl; string color1, color2; cin >> color1; cin >> color2; if (color1 == color2 && ValidColors.contains(color1)) { cout << color1 << endl; return 0; } for (const auto& [pair, result] : ColorMix) { const auto [mixColor1, mixColor2] = pair; if (color1 == mixColor1 && color2 == mixColor2 || color1 == mixColor2 && color2 == mixColor1) { cout << result << endl; return 0; } } cout << "oshibka cveta" << endl; return 0; } C #include <iostream> #include <map> #include <set> #include <string> using namespace std; static map<pair<string, string>, string> ColorMix { {{"red", "blue"}, "violet"}, {{"red", "yellow"}, "orange"}, {{"blue", "yellow"}, "green"}, }; static set<string> ValidColors; int main() { for (const auto& [pair, result] : ColorMix) { const auto [mixColor1, mixColor2] = pair; ValidColors.insert(mixColor1); ValidColors.insert(mixColor2); } cout << "Vvedite cveta" << endl; string color1, color2; cin >> color1; cin >> color2; if (color1 == color2 && ValidColors.contains(color1)) { cout << color1 << endl; return 0; } for (const auto& [pair, result] : ColorMix) { const auto [mixColor1, mixColor2] = pair; if (color1 == mixColor1 && color2 == mixColor2 || color1 == mixColor2 && color2 == mixColor1) { cout << result << endl; return 0; } } cout << "oshibka cveta" << endl; return 0; }