С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753

Как сделать GUI на основе множеств?

29.04.2023, 21:29. Показов 2087. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь с написанием учебного примера.
Есть слова рядом с галочками. Например в столбик:
молоко "поле для галочки"
чайная заварка "поле для галочки"
какао "поле для галочки"
кофейный порошок "поле для галочки"
сахар "поле для галочки"
мороженное "поле для галочки"
сок "поле для галочки"
Снизу кнопка Анализировать.
Если поставить галочки на молоко, сахар, "кофейный порошок", то после нажатия кнопки Анализировать должно вывести "Кофе с молоком".
При выборе какао, сахар, молоко должно вывести "Какао напиток"
При выборе сахар, молоко должно вывести:
"Кофе с молоком" или "Какао напиток". То есть прямо оба значения чтобы отобразилось одновременно и между ними слово или. Перед выводом результат должен заносится в переменную, чтобы если захочется использовать его в другом виде, чтобы можно было взять оттуда.
Мороженное и сок для множества Коктейль.

Добавлено через 1 час 28 минут
Мне надо, чтобы это было например в виде html страницы.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2023, 21:29
Ответы с готовыми решениями:

Построить на основе множеств четвертое множество Х на основе свойств операций со множествами
Есть три множества А,B,C , нужно построить на их основе четвертое множество Х на основе свойств операций со множествами. Известно,...

Как создать элемент GUI на основе префаба?
Необходимо динамически создать N элементов интерфейса (в данном случае кнопок). Создаю префаб кнопки, вешаю его на скрип, НО как теперь...

Как создать программу (экзешник) с GUI на основе кода консольного приложения?
Народ как создать программу если есть код С++ ? Хочу создать программу с окнами ! тип (exe) приложение! Есть исходный код в С++ Программа...

25
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
04.05.2023, 05:53
Лучший ответ Сообщение было отмечено supmener как решение

Решение

index.html:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
  <head>
    <title>Recipes</title>
  </head>
  <body>
    <div id="table-container"></div>
    <button id="analyze">Анализировать</button>
    <p id="answer"></p>
    <script src="index.js"></script>
  </body>
</html>
index.js:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const ingredients = [
  { id: "milk", name: "Молоко" },
  { id: "tea", name: "Чайная заварка" },
  { id: "cocoa", name: "Какао" },
  { id: "coffee", name: "Кофейный порошок" },
  { id: "sugar", name: "Сахар" },
  { id: "ice-cream", name: "Мороженое" },
  { id: "juice", name: "Сок" },
];
 
const recipes = [
  { name: "Кофе с молоком", ingredients: ["milk", "coffee", "sugar"] },
  { name: "Какао-напиток", ingredients: ["milk", "cocoa", "sugar"] },
  { name: "Коктейль", ingredients: ["ice-cream", "juice"] },
];
 
const template = (ingredients) => `
  <table>
    <thead>
      <tr>
        <th>Ингредиент</th>
        <th></th>
      </tr>
    </thead>
    <tbody>
      ${ingredients
        .map(
          (ingredient) =>
            `<tr>
          <td><label for="ingredient-${ingredient.id}">${ingredient.name}</label></td>
          <td><input id="ingredient-${ingredient.id}" type="checkbox" data-id="${ingredient.id}" /></td>
        </tr>`
        )
        .join("")}
    </tbody>
  </table>
`;
 
const container = document.querySelector("#table-container");
const button = document.querySelector("#analyze");
const answer = document.querySelector("#answer");
 
container.innerHTML = template(ingredients);
 
button.addEventListener("click", () => {
  const selected = [...document.querySelectorAll("input[data-id]:checked")].map(
    (input) => input.dataset.id
  );
 
  const possibleRecipes = recipes.filter((recipe) => {
    const recipeSet = new Set(recipe.ingredients);
    for (let ingredient of selected) {
      if (!recipeSet.has(ingredient)) {
        return false;
      }
    }
 
    return true;
  });
 
  answer.innerText = possibleRecipes.length
    ? possibleRecipes.map((recipe) => `"${recipe.name}"`).join(" или ")
    : "Нет рецептов с такими ингредиентами";
});
Демо: https://larissarosalene-playgr... p/recipes/
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
07.05.2023, 11:04  [ТС]
Здравствуйте. Благодарю.
Добавил часть диагностики для автомобиля в пример.
Прошу изменить код программы таким образом, чтобы вместо "Нет рецептов с такими ингредиентами", например добавляло тег линии <hr> и писало другой результат ниже.
Например.
Если поставить галочку на:
тряска двигателя
и на:
Какао
Чтобы программа не выводила "Нет варианта диагностики", а писала: "тряска двигателя: датчик детонации", затем добавляла линию и ниже писала: "Какао: Какао-напиток". А если было указано Молоко и Какао, то чтобы для этого случая писала "Какао, Молоко: Какао-напиток".

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const ingredients = [
 
  { id: "pereboi_v_rabote_dvigatelya_na_holostom_hodu_(osobenno_v_holodnoe_vremya_goda)", name: "перебои в работе двигателя на холостом ходу (особенно в холодное время года)" },
  { id: "slishkom_vysokie_ili_nizkie_oboroty_dvigatelya_na_holostom_hodu", name: "слишком высокие или низкие обороты двигателя на холостом ходу" },
  { id: "problemy_s_zapuskom_dvigatelya_(v_sil'nye_morozy)", name: "проблемы с запуском двигателя (в сильные морозы)" },
  { id: "snizhenie_moshchnosti_dvigatelya", name: "снижение мощности двигателя" },
  { id: "slabo_razgonyaetsya", name: "слабо разгоняется" },
  { id: "ne_tyanet_osobenno_v_zagruzhennom_sostoyanii_i_pri_dvizhenii_na_poddem", name: "не тянет, особенно в загруженном состоянии и при движении на подъем" },
  { id: "pereraskhod_goryuchego", name: "перерасход горючего" },
  { id: "uvelichennyj_raskhod_topliva_(na_10_20_prochentov)", name: "увеличенный расход топлива (на 10…20%)" },
  { id: "tryaska dvigatelya", name: "тряска двигателя" },
  { id: "problemy_s_zapuskom_dvigatelya", name: "проблемы с запуском двигателя" },
  { id: "zatrudnennyj_zapusk_dvigatelya_na_holodnuyu_na_goryachuyu_i_v_drugih_rezhimah", name: "Проблемы с запуском двигателя,\n причем при любых условиях — \n«на холодную», «на горячую» и в других режимах" },
  
  { id: "neustojchivaya_rabota_dvigatelya", name: "неустойчивая работа двигателя" },
{ id: "plavayushchie_rabochie_oboroty_dvigatelya", name: "плавающие рабочие обороты двигателя" },
{ id: "plavayushchie_holostye_oboroty_dvigatelya", name: "плавающие холостые обороты двигателя" },
{ id: "provaly_v_dvizhenii_mashiny", name: "«Провалы» в движении машины" },
{ id: "pri_nazhatii_na_pedal_akseleratora_ona_otvechaet_ne_srazu", name: "при нажатии на педаль акселератора она отвечает не сразу" },
{ id: "pri_sbrose_pedali_akseleratora_dvigatel_glohnet", name: "при сбросе педали акселератора двигатель глохнет" },
{ id: "zagoraetsya_Check_Engine", name: "загорается Check Engine" },
 
  { id: "milk", name: "Молоко" },
  { id: "tea", name: "Чайная заварка" },
  { id: "cocoa", name: "Какао" },
  { id: "coffee", name: "Кофейный порошок" },
  { id: "sugar", name: "Сахар" },
  { id: "ice-cream", name: "Мороженое" },
  { id: "juice", name: "Сок" },
];
 
const recipes = [
 
{ name: "датчик распредвала (ELM 327: P0340, P0342, P0343)", ingredients: 
["zatrudnennyj_zapusk_dvigatelya_na_holodnuyu_na_goryachuyu_i_v_drugih_rezhimah",
"neustojchivaya_rabota_dvigatelya",
"plavayushchie_rabochie_oboroty_dvigatelya",
"plavayushchie_holostye_oboroty_dvigatelya",
"provaly_v_dvizhenii_mashiny",
"pri_nazhatii_na_pedal_akseleratora_ona_otvechaet_ne_srazu",
"slabo_razgonyaetsya",
"ne_tyanet_osobenno_v_zagruzhennom_sostoyanii_i_pri_dvizhenii_na_poddem",
"pri_sbrose_pedali_akseleratora_dvigatel_glohnet",
"uvelichennyj_raskhod_topliva_(na_10_20_prochentov)",
"zagoraetsya_Check_Engine"] },
 
{ name: "датчик температуры всасываемого воздуха", ingredients: 
["pereboi_v_rabote_dvigatelya_na_holostom_hodu_(osobenno_v_holodnoe_vremya_goda)",
"slishkom_vysokie_ili_nizkie_oboroty_dvigatelya_na_holostom_hodu",
"problemy_s_zapuskom_dvigatelya_(v_sil'nye_morozy)",
"snizhenie_moshchnosti_dvigatelya",
"pereraskhod_goryuchego"] },
 
{ name: "датчик детонации", ingredients: 
["tryaska dvigatelya",
"snizhenie_moshchnosti_dvigatelya",
"problemy_s_zapuskom_dvigatelya",
"pereraskhod_goryuchego",
""] },
 
  { name: "Кофе с молоком", ingredients: ["milk", "coffee", "sugar"] },
  { name: "Какао-напиток", ingredients: ["milk", "cocoa", "sugar"] },
  { name: "Коктейль", ingredients: ["ice-cream", "juice"] },
];
 
const template = (ingredients) => `
  <table border = 1px>
    <thead>
      <tr>
        <th>Ингредиент</th>
        <th></th>
      </tr>
    </thead>
    <tbody>
      ${ingredients
        .map(
          (ingredient) =>
            `<tr>
          <td><label for="ingredient-${ingredient.id}">${ingredient.name}</label></td>
          <td><input id="ingredient-${ingredient.id}" type="checkbox" data-id="${ingredient.id}" /></td>
        </tr>`
        )
        .join("")}
    </tbody>
  </table>
`;
 
const container = document.querySelector("#table-container");
const button = document.querySelector("#analyze");
const answer = document.querySelector("#answer");
 
container.innerHTML = template(ingredients);
 
button.addEventListener("click", () => {
  const selected = [...document.querySelectorAll("input[data-id]:checked")].map(
    (input) => input.dataset.id
  );
 
  const possibleRecipes = recipes.filter((recipe) => {
    const recipeSet = new Set(recipe.ingredients);
    for (let ingredient of selected) {
      if (!recipeSet.has(ingredient)) {
        return false;
      }
    }
 
    return true;
  });
 
  answer.innerText = possibleRecipes.length
    ? possibleRecipes.map((recipe) => `"${recipe.name}"`).join(" или ")
    : "Нет варианта диагностики";
});
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
10.05.2023, 01:18
Разбить на два UI что ли?

HTML5
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
  <head>
    <title>Recipes</title>
  </head>
  <body>
    <div id="cars"></div>
    <div id="drinks"></div>
    <script src="index.js"></script>
  </body>
</html>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
class UI {
  constructor({ ingredients, recipes, title, errorMessage, columnName }) {
    this.ingredients = ingredients;
    this.recipes = recipes;
    this.title = title;
    this.errorMessage = errorMessage;
    this.columnName = columnName;
    this.id = crypto.getRandomValues(new Uint8Array(10)).join("-");
 
    this.root = null;
    this.button = null;
    this.result = null;
 
    this.ingredientMap = new Map();
    this.ingredients.forEach((ingredient) =>
      this.ingredientMap.set(ingredient.id, ingredient)
    );
  }
 
  render(container) {
    container.innerHTML = this.template();
    this.root = document.getElementById(`table-${this.id}`);
    this.button = document.getElementById(`analyze-${this.id}`);
    this.result = document.getElementById(`answer-${this.id}`);
    this.button.addEventListener("click", this.analyze.bind(this));
  }
 
  analyze() {
    const selected = [
      ...this.root.querySelectorAll("input[data-id]:checked"),
    ].map((input) => input.dataset.id);
 
    const possibleRecipes = this.recipes.filter((recipe) => {
      const recipeSet = new Set(recipe.ingredients);
      for (let ingredient of selected) {
        if (!recipeSet.has(ingredient)) {
          return false;
        }
      }
 
      return true;
    });
 
    this.result.innerText = possibleRecipes.length
      ? possibleRecipes
          .map(
            (recipe) =>
              `"${selected
                .map((id) => this.ingredientMap.get(id)?.name)
                .join(", ")}: ${recipe.name}"`
          )
          .join(" или ")
      : this.errorMessage;
  }
 
  template() {
    return `
      <table id="table-${this.id}" border="1px">
        <caption>${this.title}</caption>
        <thead>
          <tr>
            <th>${this.columnName}</th>
            <th></th>
          </tr>
        </thead>
        <tbody>
          ${this.ingredients
            .map(
              (ingredient) =>
                `<tr>
                  <td><label for="ingredient-${ingredient.id}">${ingredient.name}</label></td>
                  <td><input id="ingredient-${ingredient.id}" type="checkbox" data-id="${ingredient.id}" /></td>
                </tr>`
            )
            .join("")}
        </tbody>
      </table>
 
      <button id="analyze-${this.id}">Анализировать</button>
      <p id="answer-${this.id}"></p>
    `;
  }
}
 
const cars = new UI({
  ingredients: [
    {
      id: "pereboi_v_rabote_dvigatelya_na_holostom_hodu_(osobenno_v_holodnoe_vremya_goda)",
      name: "перебои в работе двигателя на холостом ходу (особенно в холодное время года)",
    },
    {
      id: "slishkom_vysokie_ili_nizkie_oboroty_dvigatelya_na_holostom_hodu",
      name: "слишком высокие или низкие обороты двигателя на холостом ходу",
    },
    {
      id: "problemy_s_zapuskom_dvigatelya_(v_sil'nye_morozy)",
      name: "проблемы с запуском двигателя (в сильные морозы)",
    },
    {
      id: "snizhenie_moshchnosti_dvigatelya",
      name: "снижение мощности двигателя",
    },
    { id: "slabo_razgonyaetsya", name: "слабо разгоняется" },
    {
      id: "ne_tyanet_osobenno_v_zagruzhennom_sostoyanii_i_pri_dvizhenii_na_poddem",
      name: "не тянет, особенно в загруженном состоянии и при движении на подъем",
    },
    { id: "pereraskhod_goryuchego", name: "перерасход горючего" },
    {
      id: "uvelichennyj_raskhod_topliva_(na_10_20_prochentov)",
      name: "увеличенный расход топлива (на 10…20%)",
    },
    { id: "tryaska dvigatelya", name: "тряска двигателя" },
    {
      id: "problemy_s_zapuskom_dvigatelya",
      name: "проблемы с запуском двигателя",
    },
    {
      id: "zatrudnennyj_zapusk_dvigatelya_na_holodnuyu_na_goryachuyu_i_v_drugih_rezhimah",
      name: "Проблемы с запуском двигателя,\n причем при любых условиях — \n«на холодную», «на горячую» и в других режимах",
    },
    {
      id: "neustojchivaya_rabota_dvigatelya",
      name: "неустойчивая работа двигателя",
    },
    {
      id: "plavayushchie_rabochie_oboroty_dvigatelya",
      name: "плавающие рабочие обороты двигателя",
    },
    {
      id: "plavayushchie_holostye_oboroty_dvigatelya",
      name: "плавающие холостые обороты двигателя",
    },
    { id: "provaly_v_dvizhenii_mashiny", name: "«Провалы» в движении машины" },
    {
      id: "pri_nazhatii_na_pedal_akseleratora_ona_otvechaet_ne_srazu",
      name: "при нажатии на педаль акселератора она отвечает не сразу",
    },
    {
      id: "pri_sbrose_pedali_akseleratora_dvigatel_glohnet",
      name: "при сбросе педали акселератора двигатель глохнет",
    },
    { id: "zagoraetsya_Check_Engine", name: "загорается Check Engine" },
  ],
  recipes: [
    {
      name: "датчик распредвала (ELM 327: P0340, P0342, P0343)",
      ingredients: [
        "zatrudnennyj_zapusk_dvigatelya_na_holodnuyu_na_goryachuyu_i_v_drugih_rezhimah",
        "neustojchivaya_rabota_dvigatelya",
        "plavayushchie_rabochie_oboroty_dvigatelya",
        "plavayushchie_holostye_oboroty_dvigatelya",
        "provaly_v_dvizhenii_mashiny",
        "pri_nazhatii_na_pedal_akseleratora_ona_otvechaet_ne_srazu",
        "slabo_razgonyaetsya",
        "ne_tyanet_osobenno_v_zagruzhennom_sostoyanii_i_pri_dvizhenii_na_poddem",
        "pri_sbrose_pedali_akseleratora_dvigatel_glohnet",
        "uvelichennyj_raskhod_topliva_(na_10_20_prochentov)",
        "zagoraetsya_Check_Engine",
      ],
    },
    {
      name: "датчик температуры всасываемого воздуха",
      ingredients: [
        "pereboi_v_rabote_dvigatelya_na_holostom_hodu_(osobenno_v_holodnoe_vremya_goda)",
        "slishkom_vysokie_ili_nizkie_oboroty_dvigatelya_na_holostom_hodu",
        "problemy_s_zapuskom_dvigatelya_(v_sil'nye_morozy)",
        "snizhenie_moshchnosti_dvigatelya",
        "pereraskhod_goryuchego",
      ],
    },
    {
      name: "датчик детонации",
      ingredients: [
        "tryaska dvigatelya",
        "snizhenie_moshchnosti_dvigatelya",
        "problemy_s_zapuskom_dvigatelya",
        "pereraskhod_goryuchego",
        "",
      ],
    },
  ],
  title: " Диагностика автомобиля",
  errorMessage: "Нет варианта диагностики",
  columnName: "Неисправность",
});
 
const drinks = new UI({
  ingredients: [
    { id: "milk", name: "Молоко" },
    { id: "tea", name: "Чайная заварка" },
    { id: "cocoa", name: "Какао" },
    { id: "coffee", name: "Кофейный порошок" },
    { id: "sugar", name: "Сахар" },
    { id: "ice-cream", name: "Мороженое" },
    { id: "juice", name: "Сок" },
  ],
  recipes: [
    { name: "Кофе с молоком", ingredients: ["milk", "coffee", "sugar"] },
    { name: "Какао-напиток", ingredients: ["milk", "cocoa", "sugar"] },
    { name: "Коктейль", ingredients: ["ice-cream", "juice"] },
  ],
  title: "Напитки",
  errorMessage: "Нет такого напитка",
  columnName: "Ингредиент",
});
 
cars.render(document.querySelector("#cars"));
drinks.render(document.querySelector("#drinks"));
Демо: https://larissarosalene-playgr... p/recipes/
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
10.05.2023, 05:46  [ТС]
Нет, все должно быть в одном UI . Заголовок и подзаголовок: "рецепты, ингредиент" не нужно добавлять. Кнопка анализировать должна быть одна. Возможно, попробую придумать еще 1 пример, чтобы было более понятнее.

Добавлено через 2 минуты
Заголовок и подзаголовок-диагностика автомобиля, неисправность нужно оставить.


Добавлено через 50 минут
Другой пример. В UI: мука. Вода. Сахар. Яйца. Соль. Колбаса. Помидоры. Соус.
В коде список ингредиентов для кекса-это мука, вода, яйца, соль, сахар.
Список ингредиентов для хлеба-это мука, вода, соль.
Список ингредиентов для пиццы-это мука, вода, соль, колбаса, помидоры, соус.
Если выбрать мука и вода, то выведет "кекс" или "хлеб", или "пицца".

Если поставить галочки на сахар, помидоры, колбаса, соль, то должно вывести:
Сахар: "кекс"
Линия
Помидоры, колбаса: "пицца"
Линия
Соль: "кекс" или "хлеб" или "пицца"

Добавлено через 2 часа 16 минут
Извиняюсь, что где-то неправильно выбрал регистр в начальной букве слова и не там поставил некоторые запятые возможно. Потому что набирал с телефона, а не на компьютере, поэтому так получилось в новом примере в этот раз.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
10.05.2023, 12:56
supmener, есть более полная формулировка с чётким ТЗ? По какому принципу вы хотите разбивать ингредиенты на группы, почему отдельно "Сахар", отдельно "Помидоры" и "Колбаса", отдельно "Соль"?
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
10.05.2023, 16:34  [ТС]
Потому что сахар встречается в этом Примере только в кексе. Помидоры и колбаса встречаются здесь только в Пицце.

Добавлено через 1 минуту
Соль входит во все перечисленные блюда.

Добавлено через 1 час 31 минуту
Списки для последнего примера смогу подготовить в выходные дни, чтобы это не отнимало у вас лишнее время.

Добавлено через 49 минут
Еще нужно добавить сортировку, чтобы то, что имеет больше совпадений было выше, то есть в данном случае выше будет строка с помидорами и колбасой.

Добавлено через 3 минуты
Имею в виду, в результатах анализа.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
10.05.2023, 17:05
supmener,
я просто удивляюсь терпению Eva Rosalene,
чувак, ты сам что сделал-то? или ты только задачи ставить хочешь? если так - расстрою тебя, хреново у тебя выходит
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
12.05.2023, 21:38  [ТС]
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const ingredients = [
  { id: "muka", name: "Мука" },
  { id: "voda", name: "Вода" },
  { id: "saxar", name: "Сахар" },
  { id: "iaicha", name: "Яйца" },
  { id: "soli", name: "Соль" },
  { id: "kolbasa", name: "Колбаса" },
  { id: "pomidori", name: "Помидоры" },
  { id: "sous", name: "Соус" },
];
 
const recipes = [
  { name: "Кекс", ingredients: ["muka", "voda", "soli", "iaicha", "saxar"] },
  { name: "Хлеб", ingredients: ["muka", "voda", "soli"] },
  { name: "Пицца", ingredients: ["muka", "voda", "soli", "kolbasa, "pomidori, "sous"] },
];
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
13.05.2023, 09:30
supmener, вряд ли я тебя расстрою, если скажу, что здесь нужна СУБД.

Таблица "Ингредиент":
Code
1
2
3
4
5
6
7
8
9
id;name
1;Вода
2;Сахар
3;Яйца
4;Соль
5;Колбаса
6;Помидоры
7;Соус
8;Мука
Таблица "Рецепт":
Code
1
2
id;name
1;Кекс
Таблица "Ингредиенты в рецепте"
Code
1
2
3
4
5
6
id;recipe_id;ingredient_id;value
1;1;8;
2;1;1;
3;1;4;
4;1;3;
4;1;2;
Вот как раз и пример для sqlite, про которую ты писал в соседней теме. sql-запросы на создание таблиц, заполнение данных и получения рецепта кекса как раз осилишь.
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
13.05.2023, 10:07  [ТС]
Так ведь без СУБД первоначальный вариант работал.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
14.05.2023, 20:54  [ТС]
А как чекбоксы к СУБД приделать, чтобы не только на ПК, а и на смартфоне также можно было запускать программу?

Добавлено через 2 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Таблица "Ингредиенты в рецепте"
Это выглядит не интуитивно понятно и кажется, что можно сделать ошибку при написании программы. Если бы таблицу только с цифрами после первой строки не надо было составлять вручную, то это кажется, что было бы удобнее.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
19.05.2023, 19:14
Цитата Сообщение от supmener Посмотреть сообщение
Это выглядит не интуитивно понятно и кажется, что можно сделать ошибку при написании программы.
Суррогатные первичные ключи, нормализация базы данных - всё ок, не вижу проблем.

Код отдельно, данные лежат отдельно, плюс ссылочная целостность гарантирует, что нельзя будет указать несуществующий рецепт или несуществующий ингредиент.

Базу данных не обязательно набирать руками, можно написать "админку" с красивыми формочками ввода. Типичное CRUD-приложение.
2
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
19.05.2023, 19:39  [ТС]
Хотелось бы, чтобы работало и на компьютере и на смартфоне, одновременно с одной базы данных. Преимущественно надо на Андроид в данный момент. Или сразу и на ПК тоже, если в браузере на Javascript, например для облегчения задачи программирования.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.05.2023, 04:48
sqlite слабо подходит для одновременного доступа из нескольких клиентов.

В любом случае тебе нужен бэкенд (на любом языке программирования), который будет подключаться к СУБД и предоставлять http api. Возможно, ещё рендерить на сервере html;

И фронтенд на js, который будет брать данные из бэкенда и отрисовывать из в браузере, хоть десктопа, хоть мобильника.

Так что считай по пальцам, что тебе нужно:
1) сервер, где будет хоститься СУБД и бэкенд
2) спроектировать структуру БД и подключить СУБД к бэкенду
3) написать сам бэкенд
4) написать фронтенд

Делается по порядку, у тебя же сейчас готово только часть 4 пункта
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
01.06.2023, 18:23  [ТС]
В решении, предложенном Eva Rosalene, не нажимается кнопка Анализировать на смартфоне с Андроид в браузере Chrome.
Как сделать, чтобы работало и кроме этого что вписать, чтобы увеличить размер шрифта до видимого состояния для всего тектса, то есть для кнопки Анализировать и для текста у Checkboxов на смартфоне с Андроид?
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
  <head>
        <meta charset="UTF-8">
        <title>Рецепты</title>
        <style>
 
        </style>
  </head>
  <body>
    <div id="table-container"></div>
    <button id="analyze">Анализировать</button>
    <p id="answer"></p>
    <script src="index.js"></script>
  </body>
</html>
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.06.2023, 19:11
HTML5
1
<meta name="viewport" content="width=device-width, initial-scale=1" />
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
01.06.2023, 19:33  [ТС]
Благодарю. Размер шрифта увеличился. Только кнопка не нажимается и не видно другого текста и чекбоксов.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
03.06.2023, 17:35  [ТС]
Сконвертировал в apk программой и заработало.
Website 2 apk builder https://github.com/praveshagrawal/HTML-to-APK.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
09.06.2023, 22:52  [ТС]
Человек написал эту программу, как просил здесь, чтобы переделали. Только проблема в том, что файлы настроек нужно каждый раз загружать вручную через окошки выбора. Как прописать, чтобы они подгружались сами по себе?
Вложения
Тип файла: zip archive_proga.zip (2.9 Кб, 2 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2023, 22:52
Помогаю со студенческими работами здесь

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер выполняет определенные действия, и нужно запустить этот...

Как сделать GUI
Привет всем! Подскажите как реализовать GUI для UPX. Сам UPX положил в ресурсы, напишите Plizz код, чтобы при нажатии упаковать...

Как сделать GUI меню
Как сделать GUI меню как в Visual basic 6 1). выделение элементов 2). панель инструментов 3). кнопки для добавления кнопок в GUI

Как сделать красивый GUI?
Как делается красивое GUI , или есть встроенные штуки типо devexpress Еще еть похожие на devexpress , Спасибо за ответы!

Как сделать GUI на PyQt?
Дизайнер задействовал из PySide2. QT 5.15.2. Переписал код из примера, но при предпросмотре при наведении и нажатии, кнопки не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru