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

Массив с указателями. Максимальный по модулю элемент массива. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
29.03.2012, 00:16     Массив с указателями. Максимальный по модулю элемент массива. #1
Помогите написать функцию, но нужно использовать только указатели

В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1. Максимальный по модулю элемент массива;

2. Сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2012, 00:16     Массив с указателями. Максимальный по модулю элемент массива.
Посмотрите здесь:

C++ Максимальный по модулю элемент массива
C++ Вычислить максимальный по модулю элемент массива
Шаблоны. В одномерном массиве вычислить максимальный по модулю элемент массива. C++
C++ максимальный по модулю элемент массива
C++ Найти максимальный элемент в каждой строке двумерного массива по модулю, и сложить их
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Serejke_qq
 Аватар для Serejke_qq
149 / 107 / 9
Регистрация: 06.07.2011
Сообщений: 224
Завершенные тесты: 2
29.03.2012, 09:40     Массив с указателями. Максимальный по модулю элемент массива. #2
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
#include <iostream>
#include <math.h>
 
using namespace std;
 
double Max(double * arr, int n);
 
int main()
{
    double * arr;
    int n;
 
    std::cout << "n = ";
    std::cin >> n;
 
    arr = new double[n];
 
    std::cout << "массив : \n";
 
    for(int i=0; i<n; i++)
        cin >> arr[i];
 
    cout << "\nМаксимальный по модулю элемент = " << Max(arr,n);
 
    delete[] arr;
 
    return 0;
}
 
double Max(double * arr, int n)
{
    double max = arr[0];
    for(int i=1; i<n; i++)
        if(abs(*(arr+i))>abs(max)) max = *(arr+i);
 
    return max;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
29.03.2012, 12:04     Массив с указателями. Максимальный по модулю элемент массива. #3
Цитата Сообщение от Serejke_qq Посмотреть сообщение
C++
1
*(arr+i)
Я конечно читал название темы, но всё равно считаю, что именно для таких вещей придумали оператор []
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
29.03.2012, 14:35  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #4
Спасибо всем огромное кто откликнулся.
А со второй частью задания может кто-то поможет?

2. Сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
30.03.2012, 15:09  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #5
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
double SpecSum (double *arr, int n)
{
 
 
for(int i=1; i<n; i++)
{   
if(*(arr+i)>0) 
int sum = *(arr+i)+(*(arr+i));
    if (*(arr+i+1)>0) 
        return sum;
     
         
}
      
}
 
 
 
 
double MassZero (double *arr, int n) 
 
for(int i=1; i<n; i++){
             if(*(arr+i)=0)
        *((arr+n)-1)=&(arr+i)
 
return arr[];   
}
Написал функции, но что-то мне кажется не правильно
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
30.03.2012, 23:57     Массив с указателями. Максимальный по модулю элемент массива. #6
Преобразование массива закончу завтра(самому интересно стало), а пока что лови вот:

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
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
using namespace std;
 
 
int main()
{
    signed int i=0, j=1, k=0, b=0;
    int* y;
    int* t;
    signed int mass[10];
 
    for(i;i<10;i++){//ввод матрицы
        cout<<"Enter "<<j++<<" element of mass: ";
        cin>>mass[i];
        cout<<endl;}
    cout<<endl<<endl;
 
    for(i=0;i<10;i++){cout<<mass[i]<<" ";}//вывод матрицы
    
    i=0;
    y=&mass[i];
    
    cout<<endl<<"Na4alnoe sost: i:"<<i<<" mass["<<i<<"]: "<<*y<<endl;//отладка-интерфейс
 
    while(k<2){//подсчёт посредством ссылок-указателей
            if(*y<0){
            y=&mass[i];
            i++;y=&mass[i];}
        else{
            y=&mass[i];
            cout<<">0; mass["<<i<<"]: "<<*y<<endl; 
            if(k<1){j=i;}
            k++; 
            i++;
            y=&mass[i];}
        }
    i--;
    
    for(k=j+1;k<i;k++){//алгоритм: сумма элементов между 1м и 2м положительными элементами
        y=&mass[k];
        b+=(*y);}
    cout<<"Summa elemevtov megdy dvymia pologitelnimi elementami: "<<b<<endl;//вывод-результат алгоритма
 
    system("pause");
    return 0;
}
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
01.04.2012, 11:48  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #7
Цитата Сообщение от Ieroglif Посмотреть сообщение
Преобразование массива закончу завтра(самому интересно стало), а пока что лови вот:
Большое спасибо!
Если не сложно посмотри с преобразованием массива, а то я запутался с этими указателями
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
01.04.2012, 22:53     Массив с указателями. Максимальный по модулю элемент массива. #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
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
using namespace std;
 
 
int main()
{
    signed int i=0, j=1, k=0, b=0, t, c=0;
    signed int first_pl=-1, second_pl=0; 
    
    int* y;
    
    signed int mass[4];
 
    for(i;i<4;i++){//ввод матрицы
        cout<<"Enter "<<j++<<" element of mass: ";
        cin>>mass[i];
        cout<<endl;}
    cout<<endl<<endl;
 
    cout<<"Massiv: ";
    for(i=0;i<4;i++){cout<<mass[i]<<" ";}//вывод матрицы
        
    i=0;
    y=&mass[i];
    
    while(k<2 && i<4){//подсчёт посредством ссылок-указателей
            if(*y<=0){
            y=&mass[i];
            i++;
            y=&mass[i];}
        if(*y>0){
            y=&mass[i];
            if(k<1){first_pl=i;}
            if(k>0){second_pl=i;}
            k++; 
            i++;
            y=&mass[i];}
        }
    
    if(first_pl==-1 || second_pl==0){cout<<endl<<"Something is wrong;"<<endl;}//если недостаточно положительны элементов
    else {
        for(k=first_pl+1;k<second_pl;k++){//алгоритм: сумма элементов между 1м и 2м положительными элементами
        y=&mass[k];
        b+=(*y);}
        cout<<endl<<"Summa elemevtov megdy dvymia pologitelnimi elementami: "<<b<<endl;}//вывод-результат алгоритма}
 
i=0;
while(i<3){
    y=&mass[i];
    if(*y==0){
        t=*y;
        j=i;
    while(i<3){
        y=&mass[i];
        *y=(*(y+1));
        i++;    }
    y=&mass[3]; 
    *y=t; 
    if(mass[j]==0 && c<4){i=j;c++;}
    else i++; }
    else i++;}
    
cout<<endl<<endl;
        for(i=0;i<4;i++){cout<<mass[i]<<" ";}//вывод матрицы
        cout<<endl;
 
    system("pause");
    return 0;
    }
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
02.04.2012, 19:09  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #9
Цитата Сообщение от Ieroglif Посмотреть сообщение
Окончательный вариант. Подправил ранее допущенные ошибки, проверил - вроде как работает ]
Ещё раз огромное спасибо!

А как сделать? Что-то никак не могу привыкнуть к этим указателям
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
02.04.2012, 21:05     Массив с указателями. Максимальный по модулю элемент массива. #10
Цитата Сообщение от jvov Посмотреть сообщение
А как сделать? Что-то никак не могу привыкнуть к этим указателям
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
Так я же это реализовал в том числе - массив преобразуется таким образом, чтобы нули были расположены в его конце.
Вот строчки, отвечающие за сортировку-преобразование(указатели в комплекте ):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i=0;
while(i<3){
    y=&mass[i];
    if(*y==0){
        t=*y;
        j=i;
    while(i<3){
        y=&mass[i];
        *y=(*(y+1));
        i++;    }
    y=&mass[3];
    *y=t;
    if(mass[j]==0 && c<4){i=j;c++;}
    else i++; }
    else i++;}
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
12.04.2012, 20:01  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i=0;
while(i<3){ пока не больше длинны массива
    y=&mass[i]; записываем в у ссылку на массив
    if(*y==0){ если равен 0
        t=*y;        0 кладем в t
        j=i;           элемент массива в j
    while(i<3){          [
        y=&mass[i];        не очень понял что это цикл делает?
        *y=(*(y+1));
        i++;    }             ]
    y=&mass[3];      ссылка на 3-ий элемент
    *y=t;                  0 записываем в 3 элемент 
    if(mass[j]==0 && c<4){i=j;c++;} если тот элемент, где был 0 равен 0 и с меньше длинны массива - становиться началом след. цикла и увиличивается с
    else i++; }   почему тут i увиличиваем?
    else i++;}   и тут?
А алгоритм получается такой, какой написал в коментах и в некоторых моментах не совсем понятно?
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
12.04.2012, 23:24     Массив с указателями. Максимальный по модулю элемент массива. #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i=0;//работу начинаем с 1го эл-та массива, у него индекс 0
while(i<3){ //проверяем все элементы за исключением последнего
    y=&mass[i]; // в у кидаем адрес эл-та
    if(*y==0){ //если равен 0
        t=*y;        //мы егозапоминаем
        j=i;         // и запоминаем его индекс
    while(i<3){          // теперь нам надо сдвинуть все эл-ты, следующие за нулевым на один шаг влево; опять же, работа ведётся до предпоследнего эл-та массива включительно
        y=&mass[i];        //запоминаем адрес текущего эл-та массива - он нулевой
        *y=(*(y+1));  // и закидываем на его место значение следущего за ним эл-та по адрес у+1;
        i++;    }           // мы увеличили индекс эл-та - перешли на следующий эл-т, т.к. нам надо сдвинуть и другие эл-ты
    y=&mass[3];      //когда мы сдвинули все эл-ты, мы записываем в у адрес последнего эл-та массива - последнюю позицию
    *y=t;                  //и ставим в эту позицию значение нулевого эл-та, мы его заранее забили в переменную t
    if(mass[j]==0 && c<4){i=j;c++;} //мы кинули нулевой эл-т назад, сдвинули последующие эл-ты влево, но не сключено, что новый эл-т, поставленный на место нулевого, также является нулём - мы не должны его упустить; также не исключено, что существует некоторое кол-во последовательно стоящих нулей - если это так, то цикл будет бесконечным, чтобы этого избежать исп-я переменная с - она указывает максимальное кол-во перестановок эл-в в массиве
    else i++; }   // если всё хорошо и поставленный элемент не является нулевым, то мы проверяем след. эл-т
    else i++;}   // в том случае, если эл-0т изначально не является нулевым, то мы проверяем след. эл-т
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
13.04.2012, 15:21  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #13
Огромнейшее спасибо тебе, ты меня очень выручил!!!

А теперь я хочу поместить полученный массив в вектор и распечатать его, но почему-то выдает не тот результат, что в массиве. Что я упустил или неправильно сделал?

C++
1
2
3
4
5
6
7
8
 
  vector<int> vec(sizeof mass);  
  
  memcpy(&vec[0], mass, sizeof mass); 
  
  printf("%i\n", &vec[0]); 
  
  system("pause");
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
14.04.2012, 13:59     Массив с указателями. Максимальный по модулю элемент массива. #14
C++
1
 printf("%i\n", &vec[0]);
Описывается вывод лишь 1го элемента с индексом "0".
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
14.04.2012, 22:31  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #15
Цитата Сообщение от Ieroglif Посмотреть сообщение
C++
1
 printf("%i\n", &vec[0]);
Описывается вывод лишь 1го элемента с индексом "0".
поменял, но почему то не то выводит... а когда просто печатаю массив, то все верно... подозреваю, что ошибка в заполнение вектра?

C++
1
2
3
4
5
6
7
vector<int> vec(sizeof mass, 3);  
  
  memcpy(&vec[0], mass, sizeof mass); 
 
  for (int i=0; i<4; i++){
  printf("%i\n", &vec[i]); 
  }



вот, что выводит -

Enter 1 element of mass: 2

Enter 2 element of mass: 3

Enter 3 element of mass: 0

Enter 4 element of mass: 5



Massiv: 2 3 0 5
Summa elemevtov megdy dvymia polog


2 3 5 0

Zadanije 3 rabota s vektorom
1069616
1069620
1069624
1069628
Press any key to continue . . .
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
15.04.2012, 10:52     Массив с указателями. Максимальный по модулю элемент массива. #16
Цитата Сообщение от jvov Посмотреть сообщение
&vec[i]
Ну так адрес же выводите.

C++
1
*(vec+i)
Нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 11:39     Массив с указателями. Максимальный по модулю элемент массива.
Еще ссылки по теме:

C++ Определить максимальный по модулю элемент элемент массива и позицию в которой он расположен
C++ Вычислить максимальный по модулю элемент массива
C++ Вычислить максимальный по модулю элемент массива

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

Или воспользуйтесь поиском по форуму:
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
15.04.2012, 11:39  [ТС]     Массив с указателями. Максимальный по модулю элемент массива. #17
Цитата Сообщение от Ieroglif Посмотреть сообщение
Ну так адрес же выводите.

C++
1
*(vec+i)
Нет?
Точно, спасибо, искал везде ошибку, а она перед носом была И не обратил внимания, что выводит, то адрес, а не значение.

вывел так -
C++
1
vec[i]
На такую запись почему, то ругался? -
C++
1
printf("%i", *(vec+i));
Yandex
Объявления
15.04.2012, 11:39     Массив с указателями. Максимальный по модулю элемент массива.
Ответ Создать тему
Опции темы

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