Программа выводит на экран неправильную среднюю длину последовательности - C (СИ)
Формулировка задачи:
Всем привет!Просьба помочь с одним заданием,я сам как-бы с ним справился,но ответ не тот что нужен.Прошу вашей помощи)Заранее спасибо!Проблема в том,что он выводит на экран неправильную среднюю длину последовательности!И что значить Ratio в данном коде?Вот два вопроса с которыми я не могу справится,и прошу вас дорогие Форумчане не отказать мне в помощи!
Задание:Решить задачу с помощью цикла. Номер задания определяется остатком от деления варианта на восемь
Найти в массиве символов среднюю длину последовательностей из двух и более символов.
Вот код:
#include "stdio.h"
double SendString(char *str, int size)
{
int Count = 0, Length = 0;
int j, Lng = 0;
char buf = str[0];
for(j = 0; j < size; j++)
{
if ((str[j] == buf) && (j < size - 1))
Lng++;
else if ((str[j] == buf) && (j = size - 1))
{
Length = Length + Lng + 1;
Count++;
}
else
{
if (Lng >= 2)
{
Length = Length + Lng;
Count++;
}
Lng = 1;
buf = str[j];
}
}
printf("\nString: %s", str);
printf("\nCount = %i", Count);
printf("\nLength = %i", Length);
if (Length + Count <= 1)
return 0;
else
return (double)Length / (double)Count;
}
main()
{
char mystring[] = "alllz00777777mdloooo";
int isize = 20;
printf("\nRatio = %f", SendString(mystring, isize));
}Решение задачи: «Программа выводит на экран неправильную среднюю длину последовательности»
textual
Листинг программы
#include <stdio.h>
double calculateAverageLength(char* str) {
int length = 0;
int count = 0;
do {
char* s = str;
char c = *str;
while (c && c == *(++str));
if (str - s > 1) {
length += str - s;
++count;
}
} while (*str);
return count ? (double)length / count : 0.0;
}
int main(void) {
char mystring[] = "alllz00777777mdloooo";
printf("Average length: %.3lf", calculateAverageLength(mystring));
return 0;
}
Объяснение кода листинга программы
- В функции
calculateAverageLengthопределены две переменные типаint:lengthиcount. Значение переменнойlengthинициализируется нулем, а значение переменнойcountинициализируется нулем. - Затем в функции
calculateAverageLengthиспользуется циклdo-while, который выполняется до тех пор, пока значение первого символа строки не станет равным нулю. - Внутри цикла определен еще один цикл
while, который выполняется до тех пор, пока значение следующего символа строки не станет отличным от значения текущего символа. - Внутри цикла
whileпроверяется, если длина подстроки, которую уже обработал цикл, больше одного символа, то к переменнойlengthприбавляется разница между текущим и предыдущим указателями на строку, а к переменнойcountприбавляется единица. - После окончания цикла
do-whileвозвращается значение переменнойcount. Если значение переменнойcountбольше нуля, то возвращается результат деления значения переменнойlengthна значение переменнойcount. Если значение переменнойcountравно нулю, то возвращается ноль. - В функции
mainопределена строка-линейный массивmystring, который содержит символыalllz00777777mdloooo. - Затем с помощью функции
printfвыводится на экран сообщениеAverage length: %.3lf, где значение переменнойlengthзаменяется результатом вызова функцииcalculateAverageLengthс аргументомmystring. - В конце функции
mainвозвращается ноль, что означает успешный конец работы программы.