Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2013, 17:35   #1
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию Удалить элементы массива.закончить программу.Язык Си.

Задание: удалить из массива В (50) все элементы, кратные 3 или 5.
Задаю массив, ищу в нем не кратные элементы, записываю их в новый массив под который, как я понимаю, память должна выделять динамически.Главная проблема в том, когда выделяю динамически память появляется ошибка.

Мой код программы:
Код:
#include <stdio.h>
#include <stdlib.h>
const int n = 10;
int main()
{
int mas[n], *A, a=3, b=5, c, i;
A = new int [c]; // выделение памяти
if ( A == NULL ) { // если не удалось выделить
printf("Не удалось выделить память");
return 1; // выход по ошибке, код ошибки 1
}
	
for(i=0;i<n;i++) /* заполняю рандомными числами*/
    mas[i] = 0+rand()%10;
for(i=0;i<n;i++) /*вывожу их на экран*/
printf("%d, ", mas[i]);
for(i=0;i<n;i++)
{
	if(mas[i]%a!=0 && mas[i]%b!=0)
	{
		
	}
}

getchar();
}
После if я должен был записать оставшиеся элементы в новый массив, но память уже выделяется с ошибкой.

Последний раз редактировалось Stilet; 30.11.2013 в 18:01.
East Undia Trading вне форума Ответить с цитированием
Старый 30.11.2013, 18:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это проект Си а не Си++ судя по всему.
Пересоздавай проект.

Кстати переменка c у тебя не инициализированна. Массив создастся (если создастся) неправильно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.11.2013, 18:10   #3
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Stilet, я понимаю что здесь все очень плохо.Но начинаю все сам писать, отсюда и такие вопросы.
Чтобы пересоздать проект нужно знать что делать дальше.Я хотел.Создать массив с рандом значениями от 0 до 10, по условию подобрать нужные значения и записать их в новый массив с динамичным выделением памяти.
East Undia Trading вне форума Ответить с цитированием
Старый 30.11.2013, 19:45   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да ради бога )
Еще раз и по порядку создай проект, и укажи в свойствах что это С++.
В классическом Си будет так:
Код:
A = (int*) malloc(sizeof(int)*c);
Просто внимательнее смотри как проект создаешь, и все должно быть ок.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.12.2013, 00:14   #5
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Мне и нужно на классическом Си написать.Что же поделать, когда в книге о языке Си пишут примеры на С++ никак на это не указывая.
East Undia Trading вне форума Ответить с цитированием
Старый 01.12.2013, 00:53   #6
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

И так на данный момент вот что получилось

Знаю что в задании 50 элементов, но мне пока 10 удобно работать.
Я убрал рандом числа, т.к. зачем они?Выделил динамическую память, но как видно потерялся ноль, оно не мудрено 0/на что-то = 0.В общем условие у меня не верно, как вариант сдвинуть элементы чтобы отсчет начинался с 1, а не с 0.
Усложню себе задание: нужно сделать это задание через указатели, вот что у меня получилось:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
const int n = 50;
int main()
{
setlocale(LC_ALL, "rus");
int mas[n], *A, *Q, a=3, b=5, c, i;	
Q=&mas[n];
A = (int*) malloc(sizeof(int)*c);
for(i=0;i<n;i++) /* заполняю рандомными числами*/
    Q[i] = i;
for(i=0;i<n;i++) /*вывожу их на экран*/
printf("%d, ", Q[i]);
printf("\n");
for(i=0;i<n;i++)
{
	if(Q[i]%a!=0 && Q[i]%b!=0)
	{
		A[c]=Q[i];
		printf("%d ", A[c]);
	}
}
getchar();
}
Программа не компилируется и вылетает без ошибки.Возможно я чего-то не замечаю, а может вообще не верну рассуждал.

Последний раз редактировалось Stilet; 01.12.2013 в 01:09.
East Undia Trading вне форума Ответить с цитированием
Старый 01.12.2013, 01:27   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Q=&mas[n];
Это зачем? Почему везде вместо Q не использовать сам mas?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.12.2013, 01:30   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>

int
main()
{
    int *A, a = 3, b = 5, n, m = 0, i;
    printf("Input N\n");
    scanf("%d", &n);
    if (n <= 0)
        return -1;
    A = (int *) malloc(sizeof(int) * n);
    for(i = 0; i < n; printf("%d ", A[i++] = i));
    printf("\n");
    for (i = 0; i < n; ++i)
        if (A[i] % a && A[i] % b)
            A[m++] = A[i];
    n = m;
    for (i = 0; i < n; printf("%d ", A[i++]));
    getchar();
    free(A);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.12.2013, 02:16   #9
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Stilet, сейчас остались два не решенных вопроса, как правильно написать указатель чтобы он, как не странно, указывал на массив?И как сделать чтобы элементы массива начинались с единицы, сдвигом, наверно?
Товарищ BDA, написал через указатель с динамическим выделением памяти, но у меня есть еще задания на эту тему, программы которых я уже написал и они работают отлично, но там тоже надо переписать через указатели.
Видимо мой вариант, сверху, не верен, может, надо через функцию?
East Undia Trading вне форума Ответить с цитированием
Старый 01.12.2013, 03:03   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>

int
main()
{
    int *A, *Q, a = 3, b = 5, n, i;
    printf("Input N\n");
    scanf("%d", &n);
    if (n <= 0)
        return -1;
    A = (int *) malloc(sizeof(int) * n);
    Q = A;
    for(i = 0; i < n; ++i) {
        A[i] = i + 1;
        printf("%d ", A[i]);
    }
    printf("\n");
    for (i = 0; i < n; ++i)
        if (A[i] % a && A[i] % b) {
            *Q = A[i];
            ++Q;
        }
    n = Q - A;
    for (i = 0; i < n; ++i)
        printf("%d ", A[i]);
    getchar();
    free(A);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить элементы массива. Маx Паскаль, Turbo Pascal, PascalABC.NET 7 24.09.2012 04:47
По массивам, SOS! из целочисленного массива удалить из массива элементы, встречающиеся менее 3-х раз prelest' Паскаль, Turbo Pascal, PascalABC.NET 1 23.05.2011 22:37
удалить из массива уникальные элементы хочу узнать Помощь студентам 2 26.09.2010 19:22
Как удалить нулевые элементы из массива? Diman_kemNVK Помощь студентам 2 13.04.2010 15:54
Удалить элементы массива Маськ@ Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2008 17:46