Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Очень непонятная задача по программированию, прощу о помощи!

Алексей Левченко Ученик (85), закрыт 1 год назад
Дано K наборов ненулевых целых чисел. Признаком завершения каждого набора является число 0. Вычислить среднее арифметическое всех элементов во всех наборах.
Лучший ответ
Николай Веселуха Высший разум (359922) 1 год назад
 #include  
#include
#include
using namespace std;
int main() {
cout << "K: ";
size_t k;
cin >> k;
vector averages;
vector box;
auto value = 0;
for (size_t i = 0; i < k; ++i) {
do {
if (value) box.push_back(value);
cin >> value;
} while (value);
auto avg = accumulate(box.begin(), box.end(), 0.0) / box.size();
if (avg) averages.push_back(avg);
box.clear();
}
cout.setf(ios::fixed);
cout.precision(3);
size_t n = 0;
for (auto average : averages) cout << ++n << ". " << average << '\n';
}
Остальные ответы
Иван Колесник Ученик (82) 1 год назад
Чувак, не хочу расстраивать, но тут всем плевать (я серьезно, люди не отвечают обычно на такие вопросы, сочувствую, удачи) (и я не насмехаюсь)
Алексей ЛевченкоУченик (85) 1 год назад
поверь, есть адекватные, которые отвечают...
Мефодий Буслаев Гуру (3562) 1 год назад
Если нолик получаешь, добавляешь в конечный массив ср арифметическое и обнуляешь счетчики и продолжаешь. Задание согласен непонятное, если у тебя начало обучения 1 курс универа например, то нужно просто ср всех чисел исключая нули, если нет то как я написал - ср арф каждого набора.
ПМ20-2Мастер (1475) 1 год назад
Верно
- - Знаток (468) 1 год назад
 #include  
using namespace std;

//Вывод массив 1 набора
void outPut(int* arr, int length)
{
for (int i = 0; i < length; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}

//Увеличивает массив набора на 1 единицу
void increaseArr(int*& arr, int length)
{
int* newArr = new int[length + 1];
memcpy(newArr, arr, (length + 1) * sizeof(int));
delete[]arr;
arr = new int[length + 1];
arr = newArr;
}

//Среднее значение массива набора (записывается в последнюю клетку)
int midMean(int* arr, int length)
{
int sum = 0; //Сумма всех элементов
for (int i = 0; i < length; i++)
{
sum += arr[i];
}
return sum / length;
}

int main()
{
int K; //Количество наборов
cin >> K;
int** arr = new int*[K]; //Динамическая матрица
for(int i = 0; i < K; i++)
{
int length = 1;
arr[i] = new int[length];
for (int j = 0;; j++, length++)
{
int el; //Новый элемент
cin >> el;
arr[i][j] = el;
increaseArr(arr[i], length); //Увеличивает массив 1 набора
if (el == 0)
{
arr[i][j + 1] = midMean(arr[i], length - 1); //Дает последнему символу ср. значение всего ряда 1 набора
break;
}
}
//outPut(arr[i], length); //Я выключил, что бы не мешала, но вы можете включить, а если к length добавить + 1, то можно вывести среднее значение массива набора
}
for (int i = 0; i < K; i++)
{
for (int j = 0; arr[i][j - 1] != 0; j++)
{
if (arr[i][j] == 0) //Выводим следующий символ после нуля, то есть среднее значение массива 1 набора
{
cout << arr[i][j + 1] << endl;
}
}
}
}
Кхм... Ну Иван Колесник прав. Нормальные не будут, но я не такой, так что прошу пользуйтесь. Я не уверен на все 100, что это рабочая программа, но по крайней мере ВОЗМОЖНО она будет рабочей.
P.S.
Я еще добавил комментарии, так что посмотрите, если будут вопросы, то я попробую на них ответить, но ничего не обещаю.
shizout Мастер (1975) 1 год назад
Мой вариант на Си:
 #include  
#include
#include

#define BUFFER_SIZE 512

#define SZ(size, ptr) \
((size + 1) * (sizeof *ptr))

static const char *__next_set_ptr;

static size_t next_set(const char *str, int **dest_set)
{
size_t size = 0;
int *ptr = *dest_set;
int tmp;

if (str) {
__next_set_ptr = str;
}
else if (!__next_set_ptr) {
free(ptr);
return 0;
}
else {
free(ptr);

ptr = NULL;
}

while (*__next_set_ptr != '0') {
if (isdigit(*__next_set_ptr)) {
ptr = realloc(ptr, (size + 1) * sizeof *ptr);
ptr[size++] = *__next_set_ptr - '0';
}
else {
return 0;
}

__next_set_ptr++;
}

__next_set_ptr++;
*dest_set = ptr;
return size;
}

int main(void)
{
size_t set_size, size = 0;
char buffer[BUFFER_SIZE];
float *average = NULL;
int *set = NULL;
int i;

fgets(buffer, BUFFER_SIZE, stdin);

set_size = next_set(buffer, &set);

do {
average = realloc(average, SZ(size, average));

average[size] = 0;

for (i = 0; i < set_size; i++) {
average[size] += set[i];
}

average[size++] /= set_size;

} while (set_size = next_set(NULL, &set));

for (i = 0; i < size; i++) {
printf("set %d: %f\n", i + 1, average[i]);
}

free(average);
return 0;
}

// 12123012125012430673212054341012305430
// set 1: 1.800000
// set 2: 2.200000
// set 3: 2.500000
// set 4: 3.500000
// set 5: 3.400000
// set 6: 2.000000
// set 7: 4.000000
Надеюсь, что я правильно понял условие задачи.
Похожие вопросы