Задача про долю заданного символа на С
Дан текст. Определить в нем все слова, в которых доля заданного символа максимальна. Пример: текст: "Veni, vidi, vici" ("Пришел, увидел, победил"). Символ: "i". Результат: слова "vidi", "vici", доля символа i равна 0.5. Написал вот так, но в результате выводит почему-то весь список, а не те слова у которых максимальная доля...
#include "pch.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
int count_symbol, num_of_elements, i, g;
float new_part_of_num, part_of_num, length;
char element[80], symbol;
part_of_num = 0;
printf_s("enter nubmer of elements in array:");
scanf_s("%d", &num_of_elements);
char result[80] = "";
printf_s("enter symbol:");
symbol = getchar(); getchar(); getchar();
for (i = 0; i < num_of_elements; i++) {
count_symbol = 0;
printf_s("enter element:");
cin.getline(element, sizeof(element));
length = strlen(element);
for (g = 0; g < length; g++) {
if (element[g] == symbol)
count_symbol++;
}
new_part_of_num = float (count_symbol) / length;
if (new_part_of_num >= part_of_num) {
new_part_of_num = part_of_num;
strcat_s(result, element);
strcat_s(result, " ");
}
if (new_part_of_num = part_of_num) {
strcat_s(result, element);
strcat_s(result, " ");
}
if (new_part_of_num > part_of_num) {
new_part_of_num = part_of_num;
strcpy_s(result, element);
strcat_s(result, " ");
}
}
printf("result: %s\n", result);
return 0;
}
Ответы (3 шт):
В этой строке происходит целочисленное деление.
new_part_of_num = count_symbol / length
а нужно обычное.
new_part_of_num = float(count_symbol) / length
Помимо того, на что указал @n1tr0xs, есть еще одна ошибка, здесь:
if (new_part_of_num = part_of_num) { //присваивание вместо сравнения!
strcat_s(result, element);
strcat_s(result, " ");
}
Правильно так:
if (new_part_of_num == part_of_num) {
strcat_s(result, element);
strcat_s(result, " ");
}
А с учетом того, что мы имеем дело с компьютерным представлением чисел, которое может быть неточным, еще правильнее так:
float eps = 0.000001
if (abs(new_part_of_num - part_of_num) < eps) { //равны с точностью до 0.000001
strcat_s(result, element);
strcat_s(result, " ");
}
Где abs:
float abs(float x){
if(x > 0) return x;
else return -x;
}
Вообще присваивание вместо сравнения - распространенная опечатка)
Заметил еще кое-что:
if (new_part_of_num > part_of_num) { //выше уже было то же самое с ">=" и "==", здесь, вероятно, должно быть "<"
new_part_of_num = part_of_num;
strcpy_s(result, element);
strcat_s(result, " ");
}
Ну и
if (new_part_of_num >= part_of_num)
Делает бессмысленным сравнение на равенство.
учел все ответы, спасибо, вот конечный код, всё работает! :)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
setlocale(0, "ru");
int count_symbol, num_of_elements;
float new_part_of_num, part_of_num = 0, length, eps = 0.000001, ravn;
char element[80], symbol, result[80] = "";
cout << "Сколько слов хотите ввести? ";
cin >> num_of_elements;
cout << "Введите символ: ";
cin >> symbol;
getchar();
for (int i = 0; i < num_of_elements; i++)
{
count_symbol = 0;
cout << "\nВведите слово: ";
cin.getline(element, 80);
length = strlen(element);
for (int j = 0; j < length; j++)
{
if (element[j] == symbol)
{
count_symbol++;
}
}
new_part_of_num = float(count_symbol) / length;
ravn = new_part_of_num - part_of_num;
if (new_part_of_num > part_of_num || ravn < eps)
{
part_of_num = new_part_of_num;
}
}
cout << "Повторный ввод слов" << endl;
for (int i = 0; i < num_of_elements; i++)
{
count_symbol = 0;
cout << "\nВведите слово: ";
cin.getline(element, 80);
length = strlen(element);
for (int j = 0; element[j] != '\0'; j++)
{
if (element[j] == symbol)
{
count_symbol++;
}
}
new_part_of_num = float(count_symbol) / length;
if (new_part_of_num == part_of_num)
{
strcat_s(result, element);
strcat_s(result, " ");
}
}
cout << "максимальная доля была обнаружена в словах: " << result << ", доля = " << part_of_num;
return 0;
}