Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
1

В заданном одномерном массиве исключите все числа, равные заданному числу

14.03.2010, 19:02. Показов 2050. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В данном одномерном массиве a(m) исключите все числа,равные заданному числу k. массив a(m) уплотните,и напечатайте результат.

у меня вопрос,связанный с уплотнением массива.как это сделать???остальное понимаю все,как реализовать,проблема с этой частью.
помогите пожалуйста))
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2010, 19:02
Ответы с готовыми решениями:

Проверить, имеются ли в данном одномерном массиве элементы равные заданному числу
29. Решить задачу в Turbo Pascal.С клавиатуры вводится число, проверить, имеются ли в данном...

В данном одномерном массиве исключите все вхождения заданного числа. Массив уплотните и напечатайте результат
Помогите пожалуйста! Очень нужно решение В данном одномерном массиве исключите все вхождения...

В заданном одномерном массиве целого типа найти те элементы, произведение цифр которых равно заданному числу
В заданном одномерном массиве целого типа найти и напечатать те элементы, произведение цифр которых...

В массиве, заполненном случайными числами, найти все элементы, равные заданному числу
Заполните массив случайными числами в интервале . Введите число X и найдите все значения, равные X.

19
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.03.2010, 10:22 2
memmove ?
быстрее, конечно, перегнать все подходящие числа в другой массив
а потом один раз применить memcpy

представляю массив из ста элементов, из которых один подходящий, а остальные удаляемые
memmove будет работать впустую
0
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
15.03.2010, 19:56  [ТС] 3
дополнительный массив нельзя заводить(((

можно ли например ввести еще один цикл типа:
C
1
2
3
4
5
6
7
8
9
 for (i=1;i<m;i++)
   {  
     if (a[i]==k)
       for (j=1;j<m;j++)
     {
        a[j]=a[j+1];
      }
   m-=1;
    }
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.03.2010, 20:27 4
Пушистик,
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
#include <iostream>
 
int Remove(int* arr, int size, int key)
{
  int result = 0;
 
  for (int i = 0; i < size; ++i)
    if (arr[i] == key){
      for (int j = i; j < size - 1; ++j)
        arr[j] = arr[j + 1];
      ++result;
  }
 
  return size - result;       
}
 
int main()
{
  int arr[] = {1, 2, 3, 1, 5, 6};
  int size = Remove(arr, sizeof(arr) / sizeof(arr[0]), 1);
 
  for (int i = 0; i < size; ++i)
   std::cout << arr[i] << " ";
 
  return 0;
}
0
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
15.03.2010, 20:38  [ТС] 5
CyBOSSeR, а вы не могли бы немного разъяснить???))
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.03.2010, 20:39 6
Пушистик, что конкретно?
0
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
15.03.2010, 20:42  [ТС] 7
int Remove(int* arr, int size, int key) вот это не понятно...
result=0 это я так понимаю типа флага???
return size - result;и еще std::cout << arr[i] << " ";
1
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
15.03.2010, 20:49 8
Более правильная версия:
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
#include <iostream>
 
int Remove(int* arr, int size, int key)
{
  int result = size;
 
  for (int i = 0; i < result; ++i)
    if (arr[i] == key){
      --result;
 
      for (int j = i; j < result; ++j)
        arr[j] = arr[j + 1];
 
      arr[result] = key;
    }
 
    return result;       
}
 
int main()
{
  int arr[] = {1, 2, 3, 1, 5, 6};
  int size = Remove(arr, sizeof(arr) / sizeof(arr[0]), 1);
 
  for (int i = 0; i < size; ++i)
    std::cout << arr[i] << " ";
 
  return 0;
}
Цитата Сообщение от Пушистик Посмотреть сообщение
int Remove(int* arr, int size, int key)
Функция уплотняющая массив перенося в конец элементы равные key.
Возвращает размер уплотненного массива.
Цитата Сообщение от Пушистик Посмотреть сообщение
result=0 это я так понимаю типа флага???
Нет. Это возвращаемый результат (размер уплотненного массива).
Цитата Сообщение от Пушистик Посмотреть сообщение
std::cout << arr[i] << " ";
Выводит i-ый элемент массива arr и пробел.
2
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
15.03.2010, 20:56  [ТС] 9
CyBOSSeR, спасибо вам огромное!!!
и еще вопрос:эту часть кода нужно вставлять сразу после:
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
#include "stdafx.h"
#include <conio.h>
#include "testing.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
 
int mas[20]; //объявление массива
int m; //объявление размеров массива
int k,i; //дополнительные переменные
 
scanf("%d",&k);
scanf("%d",&m); // ввод размера массива
if (m<2 || m>20) //проверка размера массива
{
error_printf ("Invalid input data");
} //конец проверки размера
else
{
for (i=0; i<m; i++) //цикл ввода массива
{
scanf ("%d", &mas[i]); //чтение каждого элемента массива
if (mas[i]>1000 || mas[i]<-1000) //сразу при вводе проверка каждого элемента массива заданным ограничениям
{
error_printf ("Invalid input data");
WAIT_ANY_KEY
return 0;
}
}
1
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
15.03.2010, 22:10 10
от себя добавлю. На счет удаления
C++
1
2
3
4
5
int var[10]{1,2,3,4,5,6,7,8,9,};
int k=4;
for(int i=0;i<10;i++){
if(var[i]==k)var[i]=0;
}
0
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
16.03.2010, 21:27  [ТС] 11
МедведЪ, спасибки))

вот что у меня получилось:
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
46
47
48
49
50
51
52
53
54
55
#include "stdafx.h"
#include <conio.h>
#include "testing.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
int arr[20]; //объявление массива
int m; //объявление размеров массива
int k,i,j,n; //дополнительные переменные
 
input_printf("input number k  "); 
scanf("%d",&k); //ввод числа для сравнения с элементами массива
input_printf("input the size of the array m  ");
scanf("%d",&m); // ввод размера массива
if (m<2 || m>20) //проверка размера массива
{
 printf("wrong input numbers");
} //конец проверки размера
else
{
for (i=0; i<m; i++) //цикл ввода массива
{
input_printf("input elements of the array A  ");
scanf ("%d", &arr[i]); //чтение каждого элемента массива
if (arr[i]>1000 || arr[i]<-1000) //сразу при вводе проверка каждого элемента массива заданным ограничениям
{
 printf("wrong elements of the array");
WAIT_ANY_KEY
return 0;
}
}
}
n=0;
  for (i = 0; i <m;i++)
  { 
      if (arr[i] ==k)
    { 
      for (j = i; j < m;j++)
      { 
          arr[j] = arr[j + 1];
      }
      n++;
      m--;
      i--;
  }
  }    
for (i=0; i<m; i++) //цикл вывода массива
{ if (n==m)
   {printf("no solution");}
   else 
    printf("%d ",arr[i]);
}
WAIT_ANY_KEY 
return 0; 
}


не работает случай, когда все элементы массива равны заданному числу k
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.03.2010, 04:51 12
C
1
2
            for (j = i; j < m; j++) { 
                arr[j] = arr[j + 1];
выход за край

а это
C
1
m--;
не проверяется на выход за левый край массива
чтобы сделать, введи m равное еденице и элемент равный k
1
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
17.03.2010, 20:18  [ТС] 13
а что значит,если при m больше диапазона [2,20] он мне на экран кроме сообщения об ошибке выводит какие-то непонятные цифры -858993460???количество этих повторений зависит от введенного m и равно ему...как с этим бороться???))
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.03.2010, 05:14 14
когда ввёл неправильное m, сразу выходи из программы с return EXIT_FAILURE;
там цикл в конце
0
8 / 8 / 0
Регистрация: 10.12.2009
Сообщений: 15
18.03.2010, 12:34  [ТС] 15
ммммм,я переставила } в одном месте и все заработало правильно)))
1
49 / 49 / 13
Регистрация: 21.04.2009
Сообщений: 265
18.03.2010, 13:14 16
CyBOSSeR, привет! Учу С++ уже 200 лет, но ни как не пойму почему ты (и не только ты) в своем коде где объявляешь функцию там ее и описываешь? В книжке написано что надо сначало объявить прототип функции, а потом ее описать. Прочитал недавно что то по встроенные функции у них синтаксис такой же как у тебя, только перед типом возвращаемого значения стоит "волшебное" слово inline.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.03.2010, 13:16 17
Цитата Сообщение от grrrrr Посмотреть сообщение
Учу С++ уже 200 лет, но ни как не пойму почему ты в своем коде где объявляешь функцию там ее и описываешь? В книжке написано что надо сначало объявить прототип функции, а потом ее описать. Прочитал недавно что то по встроенные функции у них синтаксис такой же как у тебя, только перед типом возвращаемого значения стоит "волшебное" слово inline.
Синтаксис у подставляемых функций такой же как и у обычных.
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
18.03.2010, 13:18 18
grrrrr:
В данном случаем программа не разбивается на модули *.h и *.cpp: интерфейс и реализацию.
поэтому: то что делает CyBOSSeR особой роли не играет.
Ответ: Объявление и определение.
1
49 / 49 / 13
Регистрация: 21.04.2009
Сообщений: 265
18.03.2010, 13:31 19
Я как бы так и думал! Просто в книжке так написано вот и спросил. Пока буду придерживаться книжки, т.к. более понятен код для меня. Спасибо!
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
18.03.2010, 13:38 20
В общем прототипы нужны чтобы можно было использовать функции в любой последовательности:
Например такой вариант будет работоспособен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void foo();
void bar();
 
int main()
{
    bar();
}
 
void bar()
{
    foo();
}
 
void foo()
{
    std::cout << "foo" << std::endl;
}
Если же прототипами не пользоваться то может возникнуть следующая ситуация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void bar()
{
    foo();
}
 
void foo()
{
    std::cout << "foo" << std::endl;
}
 
int main()
{
    bar();
}
Ошибка компиляции, функция foo() неизвестна.

Переписав это следующим образом все становится опять хорошо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void foo()
{
    std::cout << "foo" << std::endl;
}
void bar()
{
    foo();
}
 
int main()
{
    bar();
}
Поэтому в небольших программках запись с использованием прототипов в принципе и не нужна, если соблюдать правильный порядок объявлений
1
18.03.2010, 13:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2010, 13:38
Помогаю со студенческими работами здесь

Напечатать все совершенные числа, меньшие или равные заданному числу
Спасибо заранее тем, кто может помочь У меня есть вопрос, чтобы написать на языке C ...

Определить есть ли в данном массиве элементы, равные заданному числу
Ввести массив G вещественных чисел. Определить есть ли в данном массиве элементы, равные заданному...

Функция дублирующая в целочисленном массиве элементы равные заданному числу
Описать процедуру DoubleX(A, N, X), дублирующую в целочисленном массиве A размера N элементы,...

Описать функцию, которая дублирует в одномерном целочисленном массиве элементы, равные числу X
Описать функцию, которая дублирует в одномерном целочисленном массиве элементы, равные числу X....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru