Форум программистов, компьютерный форум CyberForum.ru

Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 - C++

Восстановить пароль Регистрация
 
 
Алена_Коваленко
Заблокирован
20.02.2014, 00:34     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #1
Задание: Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1.

Нули из массива удалила, и теперь не знаю как вставлять 1 в полученный массив.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//
#include <iostream>
#include <conio.h>
#include <ctime>
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian" );
    int n,i,k,j;
    cout << "Введите кол-во элементов массива: ";
    cin >> n;
    int a[n];
    srand(time(NULL)|clock());
    for (i=0; i<n; i++)
        a[i]=0+rand()%15;
    cout << "Получен массив из  " << n << " элементов. Диапазон [0;15]";
    for (i=0; i<n; i++)
        cout << a[i]<< endl;
    cout << endl;
    k=n;
    
    for (i=0; i<n; i++)
    {if (a[i]==0)
       {k--;}
       else cout << a[i] << " \n";}          //массив без нулей
    cout << k<< endl;  
    
    
 /*  for (i=0; i<k; i++)
      { if (a[i]==5)
          
          
          
          }
         */
 
    _getch(); 
    return 0;
       
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2014, 00:34     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1
Посмотрите здесь:

Дан целочисленный массив, нужно исключить из него все нули C++
Одномерные массивы: Удалить из массива нули и после каждого числа, оканчивающегося на 5, вставить 1 C++
Дан массив из n целых чисел. До и после каждого числа, кратного 7, вставить число, равное 5 C++
Дан массив из n целых чисел. До и после каждого числа, кратного 7, вставить число, равное 5 C++
Дан массив из n целых чисел. До и после каждого числа, кратного 7, вставить число, равное 5 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zvoronz
 Аватар для zvoronz
270 / 237 / 21
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 00:39     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #2
Из самого массива вы ничего не удалили, вы только не выводите нули.
Так сделайте также, возьмите и если встретилось 5 то после того как выведете 5 выведите ещё и 1.
C++
1
2
3
4
5
6
7
8
9
10
........................
for (i=0; i<n; i++)
    {if (a[i]==0)
       {k--;}
       else cout << a[i] << " \n";}          //массив без нулей
      if (a[i]==5)
       {k++;
       cout << "1" << " \n";}          //массив без нулей и с 1 после 5-ки
    cout << k<< endl; 
.............
Алена_Коваленко
Заблокирован
20.02.2014, 00:44  [ТС]     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #3
zvoronz, а нули нужно удалять или просто их не выводить?
zvoronz
 Аватар для zvoronz
270 / 237 / 21
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 00:49     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #4
По условию задачи написано что вроде же как удалять. В принципе ваше решение тоже можно считать верным если как бы производится фильтрация вывода, то решение верное, если нужно передавать массив куда то дальше, то не верное.
Алена_Коваленко
Заблокирован
20.02.2014, 00:55  [ТС]     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #5
zvoronz, а как сделать чтоб удалять? Нужно сделать чтобы еще элементы сдвигались, я правильно поняла?
zvoronz
 Аватар для zvoronz
270 / 237 / 21
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 00:57     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #6
Да, вы абсолютно правы.
Алена_Коваленко
Заблокирован
20.02.2014, 01:08  [ТС]     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #7
zvoronz, сделала, теперь у меня элементы вроде как удаляются, но вот с добавлением... Получается мы берем массив, который получился, ищем 5 и ставим после него значение 1, и остальные элементы тоже сдвигаются. А как это реализовать, не могу понять.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//Г„Г*Г* Г¬Г*Г±Г±ГЁГў. ÓäГ*ëèòü ГЁГ§ Г*ГҐГЈГ® Г*óëè ГЁ ïîñëå ГЄГ*æäîãî Г·ГЁГ±Г«Г*, îêГ*Г*Г·ГЁГўГ*ГѕГ№ГҐГЈГ® Г*Г* 5, ГўГ±ГІГ*ГўГЁГІГј 1.
#include <iostream>
#include <conio.h>
#include <ctime>
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian" );
    int n,i,k,j;
    cout << "Ââåäèòå êîëè÷åñòâî ýëåìåГ*òîâ Г¬Г*Г±Г±ГЁГўГ*: ";
    cin >> n;
    int a[n];
    srand(time(NULL)|clock());
    for (i=0; i<n; i++)
        a[i]=0+rand()%15;
    cout << "Ïîëó÷åГ* ñëó÷Г*Г©Г*ûé öåëî÷èñëåГ*Г*ûé Г¬Г*Г±Г±ГЁГў ГЁГ§ " << n << " ýëåìåГ*òîâ Гў äèГ*ГЇГ*çîГ*ГҐ îò 0 äî 15:\n";
    for (i=0; i<n; i++)
        cout << a[i]<< endl;
    cout << endl;
    k=n;
    
    for (i=0; i<n; i++)
    {
        if (a[i]==0)
       {
           k--;
       for(j = i; j < k; j++) // ñäâèã âëåâî
            a[j] = a[j+1];
         i--;
         } }        
    for(i=0;i<k;i++)
    cout << a[i]<< endl;
    
    for(i=0;i<k;i++)    
    if (a[i]==5)
       {k++;
       cout << "1" << " \n";} 
 
    _getch(); 
    return 0;
       
}
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
20.02.2014, 01:30     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #8
А никого не смущает то, что объявление статического массива происходит с помощью переменной, а не константы?

Добавлено через 1 минуту
В строке int a[n]; n должна быть константой. Я вообще не понимаю как это запускается.
Алена_Коваленко
Заблокирован
20.02.2014, 01:32  [ТС]     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #9
Arkaniy, я знаю, что массив не задается переменной, но в задании не указан размер массива и я думала что так можно делать. Я ведь ее определила, перед тем как использовать.
И что теперь с этим делать?
zvoronz
 Аватар для zvoronz
270 / 237 / 21
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 01:35     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #10
Arkaniy, стандарт C++11 допускает это.
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
20.02.2014, 01:35     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #11
Цитата Сообщение от Алена_Коваленко Посмотреть сообщение
zvoronz, сделала, теперь у меня элементы вроде как удаляются, но вот с добавлением... Получается мы берем массив, который получился, ищем 5 и ставим после него значение 1, и остальные элементы тоже сдвигаются. А как это реализовать, не могу понять.
У массива ведь фиксированный размер. Если менять его, то вставить больше единиц, чем удалено было нулей не получится. В худшем случае не получится вставить ни одной единицы.
То есть, как вариант, нужно создать массив бОльшего размера, чтобы он мог вместить в себя худший случай, когда все элементы исходного, например, пятерки. И записывать в этот массив отфильтрованный результат.
Ну и у вас в задании требуется проверять не пятерки, а числа оканчивающиеся на пять. То есть 15 тоже подходит.
Проверить можно вот такой функцией (для чисел от 0 до 99):
C++
1
2
3
4
5
6
7
8
9
int end_digit(int num)
{
    return num - num / 10 * 10;
}
 
//.....
 
if(end_digit(arr[i]) == 5)
   //...
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
20.02.2014, 01:40     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #12
Алена_Коваленко, так нельзя делать. Если размер не задан, то можно его задать самостоятельно или использовать динамические структуры.
По поводу вставки элементов. Можно сделать так: для начала переписать под динамический массив - так и правильно, и необходимо.
Сначала подсчитать кол-во элементов равных 5, то есть тех, поле которых нужно поставить единицу. Затем выделяем память под еще 1 массив,но с учетом уже того количества единиц, которые нужно вставить.
И потом заполняем его элементами из первого массива и после каждой пятерки вставляем единицу.

Добавлено через 1 минуту
zvoronz, у меня 13 студия с поддержкой 11 стандарта.
Код
error C2057: expected constant expression
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
20.02.2014, 01:45     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #13
Цитата Сообщение от zvoronz Посмотреть сообщение
стандарт C++11 допускает это.
С чего бы?
8.3.4/1
In a declaration T D where D has the form
D1 [ constant-expression opt] attribute-specifier-seqopt
У ТС скорее всего mingw и там есть занятное расширение, которое позволяет так писать. Но это вне пределов стандарта.

Добавлено через 1 минуту
Цитата Сообщение от Arkaniy Посмотреть сообщение
Добавлено через 1 минуту
zvoronz, у меня 13 студия с поддержкой 11 стандарта.
Код
error C2057: expected constant expression
Все правильно, этого нет в стандарте. См. мой пост с пояснением откуда это взялось.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
20.02.2014, 01:50     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #14
DrOffset, не был знаком с этим. Погуглю на досуге.
Алена_Коваленко
Заблокирован
20.02.2014, 01:51  [ТС]     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #15
Arkaniy, а где удаление нулей, динамический массив не нужен? и оставлять так как есть?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
20.02.2014, 01:53     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #16
Алена_Коваленко, тоже нужен, но там можно схитрить и просто не напечатать их. Но массиве-то они всё равно висеть будут.
Алена_Коваленко
Заблокирован
20.02.2014, 01:57  [ТС]     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #17
Arkaniy, т.е. оставить в том виде который был сначала. Где элементы не удаляются и нет сдвига остальных элементов и нули просто не выводятся на печать?
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
20.02.2014, 02:12     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #18
Ловите.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <conio.h>
#include <iostream>
#include <iomanip>
#include <time.h>
using namespace std;
int main()
{
    setlocale(0,"");
    srand(time(NULL));
    int *arr, *res;
    int n, s = 0;
    cout << "Введите размер массива: "; cin>>n;
    arr = new int[n];
    for (int i = 0; i < n; i++)
    {
        arr[i] = rand() % 16;
        cout << setw(2) << arr[i] << ' ';
        if (arr[i] % 10 == 5)
            s++;
        if (arr[i] == 0)
            s--;
    }
    cout << endl;
 
    res = new int[n+s];
    for (int i = 0, j = 0; i < n+s; i++)
    {
        if (arr[i] == 0)
            continue;
        res[j++] = arr[i];
        if (arr[i] % 10 == 5)
            res[j++] = 1;
    }
    delete[] arr;
    
    for (int i = 0; i < n+s; i++)
        cout << setw(2) << res[i] << ' ';
    delete[] res;
 
    _getch();
    return 0;
}
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
20.02.2014, 02:14     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #19
Цитата Сообщение от Алена_Коваленко Посмотреть сообщение
Arkaniy, т.е. оставить в том виде который был сначала. Где элементы не удаляются и нет сдвига остальных элементов и нули просто не выводятся на печать?
Если оставить как было, то вы когда сдавать будете надо знать:
Что массивы на стеке с неконстантным размером - расширение GCC.
Что у вас задача решается фактически через view с фильтрацией на ваш исходный массив.
Я бы вам зачел, если бы увидел, что вы убедительны в своих ответах и знаете почему оно работает так, а не иначе, даже если условие выполнено не так как должно было быть. Но преподы бывают разные (и с разной компетенцией), а я вообще не препод, поэтому смотрите сами
Алена_Коваленко
Заблокирован
20.02.2014, 11:10  [ТС]     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1 #20
Arkaniy, это указатель?
C++
1
int *arr, *res;
Yandex
Объявления
20.02.2014, 11:10     Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 5, вставить 1
Ответ Создать тему
Опции темы

Текущее время: 13:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru