1

Тема: Дії з масивами

всім привіт. поставлено завдання: визначити максимальний елемент в масиві, який закінчується введенням нуля. Я написав код, але мені замість максимального елементу виводить набір цифр(як я зрозумів це адрес елементу)

2 Востаннє редагувалося yarikwest (20.10.2015 19:17:52)

Re: Дії з масивами

yarikwest написав:

всім привіт. поставлено завдання: визначити максимальний елемент в масиві, який закінчується введенням нуля. Я написав код, але мені замість максимального елементу виводить набір цифр(як я зрозумів це адрес елементу)

ось код:

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    int n = 0;
    for (int i = -1; i != 0; n++) {
        cout << "[" << n << "]: ";
        cin >> i;
    }
    int *arr = new int[n];
    
    int MAX = arr[0];
    for (int i = 0; i < n; i++) // Починаємо з 1
    {
        if (MAX < arr[i])
            MAX = arr[i];
    }

    // Виведемо максимум
    cout << MAX << endl;
        
    _getch();
    return 0;
}

3

Re: Дії з масивами

В якому місці введені числа стають елементами масиву?

4

Re: Дії з масивами

quez написав:

В якому місці введені числа стають елементами масиву?

по ідеї в першому циклі

5

Re: Дії з масивами

yarikwest написав:

по ідеї в першому циклі

Тобто ще до того як для них виділиться пам’ять?

6

Re: Дії з масивами

0x9111A написав:

Тобто ще до того як для них виділиться пам’ять?

ось в цьому і моя проблема. Як вводити елементи масиву, незнаючи його розміру.
Бо мені в завданні треба ввести масив, і введення масиву закінчується коли ввести 0. тобто можнна ввести скількинебуть елементів, поки не введеш 0

7

Re: Дії з масивами

yarikwest написав:
quez написав:

В якому місці введені числа стають елементами масиву?

по ідеї в першому циклі

Тоді ще два питання:
- в якому місці виділяється місце під масив?
- яка з цих двох подій відбуваєтсья раніше?

8

Re: Дії з масивами

Використовуйте std::vector або виділіть масив певного розміру, і якщо введених елементів буде більше то робіть realloc

Подякували: yarikwest1

9

Re: Дії з масивами

Динамічно виділити пам'ять можна ось так :

Прихований текст
#include <iostream>

using namespace std;

void main()
{
    int n = 0; // Розмір масиву

    cout << "Input size" << endl;
    cin >> n; 

    int *arr = new int[n]; // виділяємо потрібну кількість пам'яті

    for (size_t i = 0; i < n; i++) //вводимо n чисeл
    {
        cout << "Input " << i + 1 << " element" << endl;
        cin >> arr[i];
    }

    delete[] arr;



}
Подякували: yarikwest1

10

Re: Дії з масивами

#Sparta написав:

Динамічно виділити пам'ять можна ось так :

Прихований текст
#include <iostream>

using namespace std;

void main()
{
    int n = 0; // Розмір масиву

    cout << "Input size" << endl;
    cin >> n; 

    int *arr = new int[n]; // виділяємо потрібну кількість пам'яті

    for (size_t i = 0; i < n; i++) //вводимо n чисeл
    {
        cout << "Input " << i + 1 << " element" << endl;
        cin >> arr[i];
    }

    delete[] arr;



}

можна. але в цьому випадку все рівно перед вводом елементів треба ввести скільки елементів буде. а мені потрібно, щоб ввід елементів закінчився із введенням нуля.

11

Re: Дії з масивами

Ви можете взагалі в цьому завданні не використовувати масиви. Просто заведіть змінну maximum і зчитуйте елементи до нуля по одному, кожного разу оновлюючи цю змінну.

Подякували: koala, yarikwest2

12 Востаннє редагувалося koala (20.10.2015 23:13:32)

Re: Дії з масивами

А якщо порада пана YurkoFlisk не актуальна, то:
- виділяєте певний обсяг і запам'ятовуєте, скільки вже виділено;
- заповнюєте масив по одному елементу і запам'ятовуєте в іншій змінній кількість елементів;
- якщо елементів треба більше, ніж виділено - виділяєте новий шмат, більший за попередній, і переносите туди масив, а старий видаляєте.
Саме так працює std::vector - спершу виділяє 16 елементів, а потім збільшує удвічі об'єм. Звісно, це можна встановлювати вручну (std::vector::capacity, std::vector::reserve і std::vector::shrink_to_fit).

Подякували: yarikwest1

13

Re: Дії з масивами

yarikwest написав:

всім привіт. поставлено завдання: визначити максимальний елемент в масиві, який закінчується введенням нуля. Я написав код, але мені замість максимального елементу виводить набір цифр(як я зрозумів це адрес елементу)

#include <iostream>
#include <vector>

using namespace std;
int main(){
    setlocale(LC_ALL,"Ukrainian");

    vector<int> arr;
    int i(0);
    while(cin >> i)
    {
        if(i == 0)
            break;
        arr.push_back(i);
    }
    int Max = arr[0];
    for(size_t i = 1; i < arr.size(); i++)
        if(Max < arr[i])
            Max = arr[i];
    cout << "Max= " << Max << endl;

    system("pause>>void");
    return 0;
}

14

Re: Дії з масивами

vov4ok, якщо одразу ввести 0? :)

15

Re: Дії з масивами

якщо одразу ввести 0?

Буде бо-бо...
Я б таке вирішував якось так:

    #include <iostream>
    #include <vector>
 #include <algorithm>
     
    using namespace std;
    int main(){
        setlocale(LC_ALL,"Ukrainian");
     
        vector<int> arr;
        int i(0);
        while(cin >> i)
        {
            if(i == 0)
                break;
            arr.push_back(i);
        }
        cout << "Max= " << :(!arr.empty())?max_element(arr.begin(),arr.end()):" немає" << endl;
     
        system("pause>>void");
        return 0;
    }

16 Востаннє редагувалося vov4ok (26.01.2016 20:29:58)

Re: Дії з масивами

Replace написав:

якщо одразу ввести 0? :)

Це було б безглуздо...

17

Re: Дії з масивами

Replace написав:

якщо одразу ввести 0? :)

але якщо вже так хочеться то ось - вводи скільки хочеш нулів спочатку

#include <iostream>
#include <vector>

using namespace std;
int main()
{
    setlocale(LC_ALL,"Ukrainian");
 
    vector<int> arr;
    int i(0);
    do
    {
        cin >> i;
        if(i)
            break;
        cout << "Буль ласка не починай з нуля!!" << endl;
    }while(true);
    arr.push_back(i);
    while(cin >> i)
    {
        if(i == 0)
            break;
        arr.push_back(i);
    }
    int Max = arr[0];
    for(size_t i = 1; i < arr.size(); i++)
        if(Max < arr[i])
            Max = arr[i];
    cout << "Max= " << Max << endl;
    system("pause>>void");
    return 0;
}

18

Re: Дії з масивами

Itari, тут вже питання в тому Що робити якщо перший елемент 0: продовжити введення масиву чи завершити введення.

19 Востаннє редагувалося -=ЮрА=- (26.01.2016 21:15:18)

Re: Дії з масивами

Та при вводі робіть обчислення максимального, стусанів треба надавати за оптимизацію!

#include <vector>
#include <iostream>
using namespace std;
 
int main() {
    size_t imax = -1;
    vector< int > vec;
    int val = 0;
    while( cin >> val )
    {
        if( val )
        {
            vec.push_back(val);
            if( imax == -1 )
                imax  =  0;
            else
            if( val > vec[imax] )
                imax= vec.size() - 1;
        }
    }
    if( imax != -1 )
    {
        cout<<"MAX_INDEX: "<<imax<<endl;
        cout<<"MAX VALUE: "<<vec[imax]<<endl;
    }
    return 0;
}

http://ideone.com/V2Ut9h

5 6 -3 7 11 2 3 0
  stdout copy
MAX_INDEX: 4
MAX VALUE: 11

20 Востаннє редагувалося koala (26.01.2016 22:24:51)

Re: Дії з масивами

    while( cin >> val )
    {
        if( val )

працює не так, як треба - поставте після 0 в кінці 12, побачите. Тоді вже

while( ( cin >> val ) && ( 0 != val ) )