Загрузка...

Incorrect/incorrect code operation

Thread in C/C++ created by scootcrazy Sep 26, 2023. 167 views

  1. scootcrazy
    scootcrazy Topic starter Sep 26, 2023 0 Sep 28, 2020
    Задание:
    Красный, синий и желтый называются основными цветами, потому что их нельзя получить путем смешения других цветов. При смешивании двух основных цветов получается вторичный цвет:

    если смешать красный и синий, то получится фиолетовый;
    если смешать красный и желтый, то получится оранжевый;
    если смешать синий и желтый, то получится зеленый.
    Напишите программу, которая считывает названия двух основных цветов для смешивания. Если пользователь вводит что-нибудь помимо названий «красный», «синий» или «желтый», то программа должна вывести сообщение об ошибке. В противном случае программа должна вывести название вторичного цвета, который получится в результате.

    Формат входных данных На вход программе подаются две строки, каждая на отдельной строке.

    Формат выходных данных Программа должна вывести полученный цвет смешения либо сообщение «ошибка цвета», если введён был не цвет.

    Примечание 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;
    }
     
  2. bogatiyuebok
    [IMG] используй эт
     
    1. scootcrazy Topic starter
      bogatiyuebok, спасибо, в момент написания темы не нашёл(
  3. Celeste
    Celeste Sep 26, 2023 ♕Climbing for strawberries and finding myself...♕ 9694 Oct 26, 2021
    При подключении стандартных библиотек, ничего мешаться не должно
    Жёлтый = yellow
    Во второй ветке после strcmp(c2, "yelow") нет сравниваний, как и в некоторых других ветках (2 ветка второй, третий, четвёртый вызовы, 3 ветка четвёртый вызов, предпоследний второй вызов функции strcmp)
     
    1. scootcrazy Topic starter
  4. vtlstolyarov
    Celeste правильно указал (но сделал это настолько непонятно что даже я не понял) - у тебя в части условий отсутствует сравнение результата вызова strcmp c нулём, про этом любое отличное от нуля значение возвращаемое strcmp интерпретируется как true, что противоположно тому что тебе надо.
    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;
    }
     
    1. View previous comments (2)
    2. Celeste
      Да, моё пояснение крайне кривое
      А так, вариант из другого форума крайне красивый: для частоповторяющегося действия введена функция, что улучшает читаемость кода
      Главное ошибки исправлены, а выводы сделаешь сам
    3. vtlstolyarov
      Celeste, Есть говорить о читаемости/расширяемости кода, то будь это хотябы C++ я бы сделал через map - по мне так было бы удобнее добавлять новые цветовые комбинации чем со вспомогательными функциями.

      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;
      }
    4. scootcrazy Topic starter
      vtlstolyarov, ну нам в институте принципиально с дают говорят плюса сами потом выучите(
  5. scootcrazy
    scootcrazy Topic starter Sep 27, 2023 0 Sep 28, 2020
    понял спасибо
     
Loading...
Top