Найдите Ошибку В Коде Пожалуйста

10.04.2014
3
0
#1
Ввести массив целых чисел, количество элементов которого заранее не известно. Признаком конца ввода массива является ввод четырех чисел, дающих в среднем арифметическом 10. Вывести массив на экран
Найдите и исправьте ошибку в коде пожалуйста

C++:
#include <stdio.h>
#include <iostream>
#include <windows.h>

int main (void)
{
int *a;//Массив
int n=0, i=0, s4, j, x=0, sum=0;//Размерность

printf("vvedite razmernost' massiva: ");
scanf_s("%i",&n);

a = (int*) malloc (n * sizeof(int)); // Выделяем массиву память.

for (int i = 0;i<n;i++)
{
printf("a[%i] = ",i);
scanf_s("%i",&a[i]);
}
{ 

for(i=0;; i++) {

a[i%4] = x;
sum += x;
if (i>=3) {
for(s4=j=0; j<4; j++) s4 += a[j];
if (s4==40) break;
}
}

printf("%d\n", a[j]);}
free(a);

system("pause");
return 0;
}
 

LuMee

Well-known member
02.05.2006
477
0
#2
Давненько сями не баловался.. Вот мой вариант решения "в лоб":
C++:
#include <stdio.h>
#include <iostream>
#include <windows.h>

// Размер шага для увеличения массива

#define INCREMENT 4
#define INT_SIZE sizeof(int)

int main(void) {

int* numbers = (int*)malloc(INT_SIZE * INCREMENT);
int index = 0, size = INCREMENT;

printf("Start entering numbers: \n");

int keepRunning = 1;
while(keepRunning) {
// Увеличиваем размер массива, если чувствуем, что не помещаемся
if (index + 1 == size) {
// Создаем новый массив увеличенного размера
int* tmp = (int*)malloc(INT_SIZE * (size + INCREMENT));
// Копируем содержимое старого
memcpy(tmp, numbers, size * INT_SIZE);
// Старый удаляем, чтобы не терять память
free(numbers);
numbers = tmp;
}

scanf_s("%i", &numbers[index]);

// Как только набралось хотя бы 4 элемента, можем начинать бегать по массиву 
// и проверять последние четыре значения 
if (index >= 3) {
int sum = 0;
for (int i = index - 3; i <= index; ++i) {
sum += numbers[i];
}

if (sum == 40)
keepRunning = 0;
}

index++;
}

// Ввод закончен, показываем массив
printf("[");

for (int i = 0; i < index; ++i) {
printf("%i", numbers[i]);

if (i < index - 1)
printf(", ");
}

printf("]");

free(numbers);

return 0;
}
 
10.04.2014
3
0
#3
Давненько сями не баловался.. Вот мой вариант решения "в лоб":
C++:
#include <stdio.h>
#include <iostream>
#include <windows.h>

// Размер шага для увеличения массива

#define INCREMENT 4
#define INT_SIZE sizeof(int)

int main(void) {

int* numbers = (int*)malloc(INT_SIZE * INCREMENT);
int index = 0, size = INCREMENT;

printf("Start entering numbers: \n");

int keepRunning = 1;
while(keepRunning) {
// Увеличиваем размер массива, если чувствуем, что не помещаемся
if (index + 1 == size) {
// Создаем новый массив увеличенного размера
int* tmp = (int*)malloc(INT_SIZE * (size + INCREMENT));
// Копируем содержимое старого
memcpy(tmp, numbers, size * INT_SIZE);
// Старый удаляем, чтобы не терять память
free(numbers);
numbers = tmp;
}

scanf_s("%i", &numbers[index]);

// Как только набралось хотя бы 4 элемента, можем начинать бегать по массиву 
// и проверять последние четыре значения 
if (index >= 3) {
int sum = 0;
for (int i = index - 3; i <= index; ++i) {
sum += numbers[i];
}

if (sum == 40)
keepRunning = 0;
}

index++;
}

// Ввод закончен, показываем массив
printf("[");

for (int i = 0; i < index; ++i) {
printf("%i", numbers[i]);

if (i < index - 1)
printf(", ");
}

printf("]");

free(numbers);

return 0;
}
что такое keeprunning?)
 

LuMee

Well-known member
02.05.2006
477
0
#4
Просто флажок, который используется в условии цикла. Пока он равен 1, приложение продолжает запрашивать элементы массива у пользователя. Когда сбрасывается в 0, цикл завершается, приложение переходит к показу введенного массива.
 
10.04.2014
3
0
#5
Просто флажок, который используется в условии цикла. Пока он равен 1, приложение продолжает запрашивать элементы массива у пользователя. Когда сбрасывается в 0, цикл завершается, приложение переходит к показу введенного массива.
благодарю вас!)