1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
1

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

29.03.2012, 00:16. Показов 3490. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать функцию, но нужно использовать только указатели

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

2. Сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2012, 00:16
Ответы с готовыми решениями:

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

Массив: Вычислить максимальный по модулю элемент массива...
Оформить каждый пункт задачи выбранного варианта в виде функции. Все необходимые данные для функций...

Массив: Получить массив делением всех элементов исходного массива на максимальный по модулю элемент...
получить новый массив делением всех элементов исходного массива на элемент массива, крупнейший по...

Дан двумерный массив. Заменить максимальный по модулю элемент на минимальный по модулю элемент
Дан двумерный массив. Заменить максимальный по модулю элемент на минимальный по модулю элемент.

16
199 / 142 / 57
Регистрация: 06.07.2011
Сообщений: 300
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;
}
1
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
29.03.2012, 12:04 3
Цитата Сообщение от Serejke_qq Посмотреть сообщение
C++
1
*(arr+i)
Я конечно читал название темы, но всё равно считаю, что именно для таких вещей придумали оператор []
0
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
29.03.2012, 14:35  [ТС] 4
Спасибо всем огромное кто откликнулся.
А со второй частью задания может кто-то поможет?

2. Сумму элементов массива, расположенных между первым и вторым положительными элементами.
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
0
1 / 1 / 4
Регистрация: 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[];   
}
Написал функции, но что-то мне кажется не правильно
0
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
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;
}
1
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
01.04.2012, 11:48  [ТС] 7
Цитата Сообщение от Ieroglif Посмотреть сообщение
Преобразование массива закончу завтра(самому интересно стало), а пока что лови вот:
Большое спасибо!
Если не сложно посмотри с преобразованием массива, а то я запутался с этими указателями
0
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
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;
    }
1
1 / 1 / 4
Регистрация: 28.09.2011
Сообщений: 113
02.04.2012, 19:09  [ТС] 9
Цитата Сообщение от Ieroglif Посмотреть сообщение
Окончательный вариант. Подправил ранее допущенные ошибки, проверил - вроде как работает ]
Ещё раз огромное спасибо!

А как сделать? Что-то никак не могу привыкнуть к этим указателям
Преобразовать массив таким образом, чтобы элементы, равные нулю, располагались после всех остальных.
0
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
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++;}
0
1 / 1 / 4
Регистрация: 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++;}   и тут?
А алгоритм получается такой, какой написал в коментах и в некоторых моментах не совсем понятно?
0
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
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т изначально не является нулевым, то мы проверяем след. эл-т
1
1 / 1 / 4
Регистрация: 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");
0
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
14.04.2012, 13:59 14
C++
1
 printf("%i\n", &vec[0]);
Описывается вывод лишь 1го элемента с индексом "0".
1
1 / 1 / 4
Регистрация: 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 . . .
0
19 / 19 / 2
Регистрация: 23.06.2011
Сообщений: 238
15.04.2012, 10:52 16
Цитата Сообщение от jvov Посмотреть сообщение
&vec[i]
Ну так адрес же выводите.

C++
1
*(vec+i)
Нет?
1
1 / 1 / 4
Регистрация: 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));
0
15.04.2012, 11:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2012, 11:39
Помогаю со студенческими работами здесь

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

Вычислить max2-min2 , где max-максимальный по модулю элемент массива, а min -минимальный по модулю
Дан массив размера 6 x 2 с элементами вещественного типа. Написать программу для вычисления...

Определить максимальный по модулю элемент элемент массива и позицию в которой он расположен
Помогите пожалуйста решить задачку по с++; Задан одномерный массив В , состоящий из n...

Массив: Найти максимальный по модулю элемент, а строку, которая содержит этот элемент, переслать в вектор
Создать двумерный массив i=3,j=4 формула вычисления элементов a=(sqr(i)*i)+4*(sqr(j)-15 ...


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

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

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