Загрузка...

Неправильная/некорректная работа кода

Тема в разделе C/C++ создана пользователем scootcrazy 26 сен 2023. 170 просмотров

  1. scootcrazy
    scootcrazy Автор темы 26 сен 2023 0 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 Автор темы
      bogatiyuebok, спасибо, в момент написания темы не нашёл(
  3. Celeste
    Celeste 26 сен 2023 ♕Climbing for strawberries and finding myself...♕ 9694 26 окт 2021
    При подключении стандартных библиотек, ничего мешаться не должно
    Жёлтый = yellow
    Во второй ветке после strcmp(c2, "yelow") нет сравниваний, как и в некоторых других ветках (2 ветка второй, третий, четвёртый вызовы, 3 ветка четвёртый вызов, предпоследний второй вызов функции strcmp)
     
    1. scootcrazy Автор темы
  4. vtlstolyarov
    vtlstolyarov 26 сен 2023 468 8 янв 2022
    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. Посмотреть предыдущие комментарии (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 Автор темы
      vtlstolyarov, ну нам в институте принципиально с дают говорят плюса сами потом выучите(
  5. scootcrazy
    scootcrazy Автор темы 27 сен 2023 0 28 сен 2020
    понял спасибо
     
Загрузка...
Top