Задача про долю заданного символа на С

Дан текст. Определить в нем все слова, в которых доля заданного символа максимальна. Пример: текст: "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 шт):

Автор решения: n1tr0xs

В этой строке происходит целочисленное деление.

new_part_of_num = count_symbol / length

а нужно обычное.

new_part_of_num = float(count_symbol) / length

→ Ссылка
Автор решения: Alex_Skvortsov

Помимо того, на что указал @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)

Делает бессмысленным сравнение на равенство.

→ Ссылка
Автор решения: Sparkle Pink

учел все ответы, спасибо, вот конечный код, всё работает! :)

#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;
}
→ Ссылка