Заблокирован
1

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

20.02.2014, 00:34. Показов 4446. Ответов 23
Метки нет (Все метки)

Задание: Дан массив. Удалить из него нули и после каждого числа, оканчивающегося на 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;
       
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2014, 00:34
Ответы с готовыми решениями:

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

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

Дан массив. Удалить из него нули и после каждого числа, оканчивающего на 5, вставить 1
Помогите исправит ошибки import java.util.Scanner; import java.util.Random; public class...

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

23
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 00:39 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; 
.............
0
Заблокирован
20.02.2014, 00:44  [ТС] 3
zvoronz, а нули нужно удалять или просто их не выводить?
0
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 00:49 4
По условию задачи написано что вроде же как удалять. В принципе ваше решение тоже можно считать верным если как бы производится фильтрация вывода, то решение верное, если нужно передавать массив куда то дальше, то не верное.
0
Заблокирован
20.02.2014, 00:55  [ТС] 5
zvoronz, а как сделать чтоб удалять? Нужно сделать чтобы еще элементы сдвигались, я правильно поняла?
0
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 00:57 6
Да, вы абсолютно правы.
1
Заблокирован
20.02.2014, 01:08  [ТС] 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;
       
}
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
20.02.2014, 01:30 8
А никого не смущает то, что объявление статического массива происходит с помощью переменной, а не константы?

Добавлено через 1 минуту
В строке int a[n]; n должна быть константой. Я вообще не понимаю как это запускается.
0
Заблокирован
20.02.2014, 01:32  [ТС] 9
Arkaniy, я знаю, что массив не задается переменной, но в задании не указан размер массива и я думала что так можно делать. Я ведь ее определила, перед тем как использовать.
И что теперь с этим делать?
0
273 / 241 / 56
Регистрация: 29.05.2012
Сообщений: 889
20.02.2014, 01:35 10
Arkaniy, стандарт C++11 допускает это.
0
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,250
20.02.2014, 01:35 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)
   //...
1
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
20.02.2014, 01:40 12
Алена_Коваленко, так нельзя делать. Если размер не задан, то можно его задать самостоятельно или использовать динамические структуры.
По поводу вставки элементов. Можно сделать так: для начала переписать под динамический массив - так и правильно, и необходимо.
Сначала подсчитать кол-во элементов равных 5, то есть тех, поле которых нужно поставить единицу. Затем выделяем память под еще 1 массив,но с учетом уже того количества единиц, которые нужно вставить.
И потом заполняем его элементами из первого массива и после каждой пятерки вставляем единицу.

Добавлено через 1 минуту
zvoronz, у меня 13 студия с поддержкой 11 стандарта.
Код
error C2057: expected constant expression
1
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,250
20.02.2014, 01:45 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
Все правильно, этого нет в стандарте. См. мой пост с пояснением откуда это взялось.
2
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
20.02.2014, 01:50 14
DrOffset, не был знаком с этим. Погуглю на досуге.
0
Заблокирован
20.02.2014, 01:51  [ТС] 15
Arkaniy, а где удаление нулей, динамический массив не нужен? и оставлять так как есть?
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
20.02.2014, 01:53 16
Алена_Коваленко, тоже нужен, но там можно схитрить и просто не напечатать их. Но массиве-то они всё равно висеть будут.
0
Заблокирован
20.02.2014, 01:57  [ТС] 17
Arkaniy, т.е. оставить в том виде который был сначала. Где элементы не удаляются и нет сдвига остальных элементов и нули просто не выводятся на печать?
0
107 / 107 / 21
Регистрация: 29.08.2012
Сообщений: 453
20.02.2014, 02:12 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;
}
1
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,250
20.02.2014, 02:14 19
Цитата Сообщение от Алена_Коваленко Посмотреть сообщение
Arkaniy, т.е. оставить в том виде который был сначала. Где элементы не удаляются и нет сдвига остальных элементов и нули просто не выводятся на печать?
Если оставить как было, то вы когда сдавать будете надо знать:
Что массивы на стеке с неконстантным размером - расширение GCC.
Что у вас задача решается фактически через view с фильтрацией на ваш исходный массив.
Я бы вам зачел, если бы увидел, что вы убедительны в своих ответах и знаете почему оно работает так, а не иначе, даже если условие выполнено не так как должно было быть. Но преподы бывают разные (и с разной компетенцией), а я вообще не препод, поэтому смотрите сами
1
Заблокирован
20.02.2014, 11:10  [ТС] 20
Arkaniy, это указатель?
C++
1
int *arr, *res;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2014, 11:10
Помогаю со студенческими работами здесь

Дан текст. Вставить в него до и после каждого числа кавычки
Дан текст. Вставить в него до и после каждого числа кавычки

Дан текст. Вставить в него до и после каждого числа кавычки
Дан текст. Вставить в него до и после каждого числа кавычки

Дан массив из n целых чисел. До и после каждого числа, кратного 7, вставить число, равное 5
нужно сделать вставку в массив.

Дан массив из n целых чисел. До и после каждого числа, кратного 7, вставить число, равное 5
надо осуществлять в этом же массиве A, не знаю как это сделать.... using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru