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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
#1

Задачи массивы( объяснение) - C++

28.11.2011, 20:07. Просмотров 2462. Ответов 19
Метки нет (Все метки)

Здравствуйте,не могли бы помочь в написании кода и обьяснить некоторые подробности
есть несколько типов задач, по массивам которые хотелось бы разобрать
первая это сортировка,но я ее сделал и вышло так
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
#include <iostream>
using namespace std;
int main()
{
        double x1,x2;
        double a, b, c;
        cout<<"The quadratic decision\nEnter in one line value of factors and press <Enter>\n";
        cin>>a>>b>>c;
        if(a==0)
        {
                cout<<"The equation isn't square";
        }
        else
        {
                double d=b*b-4*a*c;
                if(d<0)
                {
                        cout<<"The equation has no decision in the valid area";
                }
                if(d==0)
                {
                        cout<<"The equation has 2 identical roots of the equation:\n";
                        x1=-b/(2*a);
                        cout<<"x = "<<x1;
                }
                if(d>0)
                {
                        cout<<"Equation roots:\n";
                        d=sqrt(d);
                        x1=(-b+d)/(2*a);
                        x2=(-b-d)/(2*a);
                        cout<<"x1 = "<<x1<<"\n"<<"x2 = "<<x2;
                }
        }
        return 1;
}
про возрастание и убывание разница в знаке одном,но вот первый вопрос для объяснения:
я обращаюсь к памяти динамически через функции malloc/free, как измениться код если через функции new\delete, а так же если статически?

далее,есть, типы задач, на сложение/вычитание/умножение(скалярное произведение) двух массивов
как я понял, для этого нужно задать три массива, два на вход,один на выход с нужным действием?

но вот второй вопрос, как измениться отдельные фрагменты кода ( на примере моего примера с пузырьком)
то есть: чтобы шло по схеме
1)Выделяем память под массив(ы) небольшого объема5-10элементов
2)Массив(ы) вводятся с клавиатуры.( желательно на примере cin и cout( до get и printoff не дорос
3)Массив(ы) обрабатываются функцией(сложение и т.д.)
4) Массив(ы) выводятся на экран.
и третье, вот тоже самое но для определения минимума(максимума) массива и индекса минимума(максимума)
я подумал, что минимум и максимум, можно сделать пузырьком убрав ненужные значения, а оставив первое(последнее)верно ли это?
и так же объяснить что измениться в вводе выводе

буду очень вам признателен
начал разбирать с++ ( а точнее в среде QT) и столкнулся вот с такими проблемами
заранее спасибо.
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 20:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задачи массивы( объяснение) (C++):

Объяснение задачи на шаблоны - C++
#include &lt;iostream&gt; using namespace std; template &lt;typename A&gt; class Real{ A a; public: Real (){a=0;} Real (A b){a=b;}...

Задачи на массивы - C++
Помогите написать программы на С++ пожалуйста.

Массивы - задачи - C++
http://www.ii4.ru/images/7078611.JPG http://www.ii4.ru/images/1839532.JPG задачи на C++ срочно нужно знакомому...

Задачи на массивы С++ - C++
1)решить двумя способоми, сначала используя одномерный массив а потом двумерный.( и только с помощьюь массивов,никак по другому) ...

Задачи на массивы - C++
Здравствуйте, многоуважаемые пользователи! Прошу Вас помощи в начинающих заданиях. Не знаю сюда ли пишу. 1. Дан N-элементный...

Массивы(задачи) - C++
Начал изучать язык Си.Не могу решить задачи.Прошу помощи в решении: 1.Дано 2(два) массива из цифр: а)найти сумму б)разность ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ZaVyLoN
83 / 83 / 6
Регистрация: 26.10.2009
Сообщений: 269
28.11.2011, 20:27 #2
Цитата Сообщение от Depressa Посмотреть сообщение
про возрастание и убывание разница в знаке одном,но вот первый вопрос для объяснения:
я обращаюсь к памяти динамически через функции malloc/free, как измениться код если через функции new\delete, а так же если статически?
Код никак не измениться, если я ничего не путаю.
Главное не смешивай new и malloc/
Основная проблема, связанная с функциями malloc()/free(), заключается в том, что эти функции ничего не знают о конструкторах и деструкторах.
Это на заметку.

Цитата Сообщение от Depressa Посмотреть сообщение
далее,есть, типы задач, на сложение/вычитание/умножение(скалярное произведение) двух массивов
как я понял, для этого нужно задать три массива, два на вход,один на выход с нужным действием?
Все правильно, нужен 3-й.

Добавлено через 1 минуту
Цитата Сообщение от Depressa Посмотреть сообщение
первая это сортировка,но я ее сделал и вышло так
Сортировка 3-х введенных чисел?
1
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
28.11.2011, 20:32  [ТС] #3
простите
не тот код ввел
вот сортировка
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
#include <iostream> 
#include <stdlib.h> 
using namespace std; 
 
void sort(char* a, int size); 
void mas_out(char* a, int size); 
void mas_in(char* a, int size); 
 
int main(int argc, char *argv[]) 
{ 
    char* mas; 
    int size; 
    cout << "Enter size: "; 
    cin >> size; 
    mas = (char*)malloc(size); 
    mas_in(mas, size); 
    mas_out(mas, size); 
    sort(mas, size); 
    mas_out(mas, size); 
    free(mas); 
    return 0; 
} 
 
void mas_in(char* a, int size) 
{ 
    for (int i=0; i<size; ++i) 
        cin >> a[i]; 
} 
 
void sort(char* a, int size) 
{ 
    for (int i=0; i<size; ++i) 
        for(int ii=size-1; ii>i; --ii) 
        { 
            if (a[ii-1]<a[ii]) 
            { 
                char temp = a[ii-1]; 
                a[ii-1] =  a[ii]; 
                a[ii] = temp; 
            } 
        } 
} 
 
void mas_out(char* a, int size) 
{ 
    for(int i=0; i<size; ++i) 
        cout << (int)a[i] << "(" << a[i] << ") "; 
    cout << endl; 
}
ну и сама суть всех вопросов
как будет изменяться
вот эти коды
C++
1
2
3
4
5
void mas_in(char* a, int size) 
{ 
    for (int i=0; i<size; ++i) 
        cin >> a[i]; 
}
а так же
C++
1
2
3
4
5
6
void mas_out(char* a, int size) 
{ 
    for(int i=0; i<size; ++i) 
        cout << (int)a[i] << "(" << a[i] << ") "; 
    cout << endl; 
}




по поводу malloc/free отличие от new and delete только , что во вторых вместо ( )--[ ]?
а как задается обращение к памяти статически?
0
ZaVyLoN
83 / 83 / 6
Регистрация: 26.10.2009
Сообщений: 269
28.11.2011, 20:41 #4
Цитата Сообщение от Depressa Посмотреть сообщение
но вот второй вопрос, как измениться отдельные фрагменты кода ( на примере моего примера с пузырьком)
то есть: чтобы шло по схеме
1)Выделяем память под массив(ы) небольшого объема5-10элементов
2)Массив(ы) вводятся с клавиатуры.( желательно на примере cin и cout( до get и printoff не дорос
3)Массив(ы) обрабатываются функцией(сложение и т.д.)
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
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
int *add (int *temp1, int* temp2)
{
    int* result = new int [3];
    for(int i = 0; i < 3; i++)
    {
        result[i] = temp1[i] + temp2[i];
    }
    
    return result;
}
 
int main()
{
 
    int *mas1 = new int [3];
    int *mas2 = new int [3];
 
    cout << "Enter mas1: " << endl
    for(int i = 0; i < 3; i++)
    {
        cin >> mas1[i];
    }
    
    cout << "Enter mas2: " << endl
    for(int i = 0; i < 3; i++)
    {
        cin >> mas2[i];
    }
    
    add(mas1, mas2);
    
 
    return 0;
}
писал в блакноте, надеюсь ошибок нет. Только не вывел результирующий массив.
Только непонятно что Вам нужно изменить, точнее какой фрагмент кода.

Если Вам нужно изменить память, кусок или что-то сделать с ней, добавить..
Тогда почитайте про realloc
1
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
28.11.2011, 20:52  [ТС] #5
Цитата Сообщение от ZaVyLoN Посмотреть сообщение
писал в блакноте, надеюсь ошибок нет. Только не вывел результирующий массив.
Только непонятно что Вам нужно изменить, точнее какой фрагмент кода.
Если Вам нужно изменить память, кусок или что-то сделать с ней, добавить..
Тогда почитайте про realloc
я просто по задач однотипным прохожу, там изменяется только сама функция( какие есть я написал),тип данных да способы вызыва памяти
как пример была сортировка пузырьком
есть вот такие
Напишите функцию, которая вычисляет скалярное произведение двух массивов. Массивы содержат элементы типа unsigned short. Каждый массив передается в функцию через пару параметров - указатель на первый элемент, и размер массива. 

Также напишите две функции: первая - для вывода элементов массива на экран и вторая - для ввода с клавиатуры. 

В функции main протестируйте работу Ваших функций. Память под массив(ы), с которыми идет работа, выделять/освобождать динамически, через операторы new/delete




Напишите функцию, которая вычисляет индекс минимального элемента массива. Массив содержит элементы типа unsigned long long. Массив передается в функцию через два параметра - указатель на первый элемент, и размер массива. 

Также напишите две функции: первая - для вывода элементов массива на экран и вторая - для ввода с клавиатуры. 

В функции main протестируйте работу Ваших функций. Память под массив(ы), с которыми идет работа, выделять статически. 




Напишите функцию, которая вычисляет максимальный элемент массива. Массив содержит элементы типа char. Массив передается в функцию через два параметра - указатель на первый элемент, и размер массива. 

Также напишите две функции: первая - для вывода элементов массива на экран и вторая - для ввода с клавиатуры. 

В функции main протестируйте работу Ваших функций. Память под массив(ы), с которыми идет работа, выделять/освобождать динамически, через операторы new/delete





вот они,вроде бы однотипны, но разобраться что будет каждый раз меняться в
C++
1
void mas_out(in)
не могу понять, не могли бы обьяснить на паре примеров


схема действий во всех задачах такова:
пишем вызов памяти( статик или динамик)
потом ввод
потом саму функцию(зависит от того что дано)
а потом вывод на экран
я прав?
0
ZaVyLoN
83 / 83 / 6
Регистрация: 26.10.2009
Сообщений: 269
28.11.2011, 21:02 #6
C++
1
2
3
int* ccc = new int[20];
// &
int* ccc = (int*)malloc(20);
В данном случае эффект будет один и тот же.




Цитата Сообщение от Depressa Посмотреть сообщение
ну и сама суть всех вопросов
как будет изменяться
вот эти коды
Это если вместо malloc использовать new?
ответ: никак

Добавлено через 9 минут
Цитата Сообщение от Depressa Посмотреть сообщение
схема действий во всех задачах такова:
пишем вызов памяти( статик или динамик)
потом ввод
потом саму функцию(зависит от того что дано)
а потом вывод на экран
я прав?

да, все правильно.
> потом саму функцию(передаете в нее параметры)
1
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
28.11.2011, 21:08  [ТС] #7
я сейчас наберу тут функцию, проверите её на ошибки?
0
ZaVyLoN
83 / 83 / 6
Регистрация: 26.10.2009
Сообщений: 269
28.11.2011, 21:12 #8
Цитата Сообщение от Depressa Посмотреть сообщение
я сейчас наберу тут функцию, проверите её на ошибки?
Набирайте.
Если не я, то кто-нибудь еще проверит
1
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
28.11.2011, 21:47  [ТС] #9
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
void sort(int* a, int size);
void mas_out(int* a, int size);
void mas_in(int* a, int size);
 
int main(int argc, char *argv[])
{
    int* mas;
    int size;
    cout << "Enter size: ";
    cin >> size;
    mas = (int*)malloc(size);
    mas_in(mas, size);
    mas_out(mas, size);
    sort(mas, size);
    mas_out(mas, size);
    free(mas);
    return 0;
}
void mas_in(int* a, int size)
{
    for (int i=0; i<size; ++i) // запись в массив, правильно?
        cin >> a[i];
}
void sort(int* a, int size)
 
 
{
    int* max, maxi; //максимум и его индекс
    max=a[0];
    for (int i=1; i < size;++i)// сравнение элементов
    {
        if (a[i] > max)
        {
            max=a[i]; maxi=i;// процесс обработки
        }
    }
}
void mas_out(int* a, int size)
{
    cout << "Maksimal'nij element massiva " << max << " s indeksom " << maxi+1 << endl;
    cout << endl;
}


вот что вышло на максимальный и индекс максимума
боюсь напутал начиная c
C++
1
int* max, max ini
так как QT начал ругаться в количестве 6 раз как раз на те строчки
0
ZaVyLoN
83 / 83 / 6
Регистрация: 26.10.2009
Сообщений: 269
28.11.2011, 22:05 #10
Цитата Сообщение от Depressa Посмотреть сообщение
for (int i=0; i<size; ++i) // запись в массив, правильно?
Используйте постфиксный инкримент.
i++;


Цитата Сообщение от Depressa Посмотреть сообщение
int* max, maxi; //максимум и его индекс
Вам достаточно переменной типа int. Уберите *.
И перстанет ругаться



Цитата Сообщение от Depressa Посмотреть сообщение
void mas_out(int* a, int size)
{
cout << "Maksimal'nij element massiva " << max << " s indeksom " << maxi+1 << endl;
cout << endl;
}

Компилятор будет ругаться на
C++
1
cout << "Maksimal'nij element massiva " << max << " s indeksom " << maxi+1 << endl;
Т.к. перменные не объявлены.

здесь не совсемпонятно что должна делать фун-ция mas_out
напишите что должна делать ф-ция mas_out
1
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
28.11.2011, 22:37  [ТС] #11
C++
1
cout
должен выводить после задания размера и ввода массива максимум и его индекс
остальные ошибки ушли спасибо)
что-то типо
C++
1
2
3
4
5
6
void mas_out(char* a, int size) 
{ 
    for(int i=0; i<size; ++i) 
        cout << (int)a[i] << "(" << a[i] << ") "; 
    cout << endl; 
}
как для сортировки
0
ZaVyLoN
83 / 83 / 6
Регистрация: 26.10.2009
Сообщений: 269
29.11.2011, 01:29 #12
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
void mas_in(int* a, int size); 
void mas_out(int* a, int size);
void sort(int* a, int size);
 
int main(int argc, char *argv[])
{
    int size;
    cout << "Enter size: ";
    cin >> size;
    int* mas = (int*)malloc(size);
 
    cout << "Enter massive: " << endl;
    mas_in(mas, size);
    cout << endl;
    
    
    cout << "Massive: " << endl;
    mas_out(mas, size);
    cout << endl;
    
 
    sort(mas, size);
    cout << "Sort Massive: " << endl;
    mas_out(mas, size);
    cout << endl;
    
    free(mas);
    mas = NULL;
    return 0;
}
void  mas_in(int* a, int size)
{
    for (int i = 0; i < size; i++) 
        cin >> a[i];
}
 
void sort(int* a, int size)
{
    int max;    
    // сортировка "метод пузырька"
    for (int i=0; i < size; i++)
    {
        for(int j = 0; j < size - i - 1; j++)
        {
            if(a[j] >= a[j + 1]) // если нужно по убыванию, меняешь знак на <
            {
                max = a[j];
                a[j] = a[j + 1];
                a[j + 1] = max;
            }
        }
        
    }
}
 
 
void mas_out(int* a, int size)
{
    for(int i=0; i < size; i++) 
        cout << "a[" << i << "] = " << a[i] << endl;
}
Если нужно макс. эл. и его индекс, тогда можно сделать вот так.
Дописать фун-цию mas_out.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void mas_out(int* a, int size)
{
    int max = 0, index = 0;
    for(int i=0; i < size; i++) 
        cout << "a[" << i << "] = " << a[i] << endl;
    max = a[0];
    for(int i = 0; i < size; i++)
    {
        
        if(a[i] >= max)
        {
            max = a[i];
            index = i;
        }
    }
 
    cout << "Max el.: a[" << index << "] = " << max << endl;
}
Добавлено через 35 минут
Табуляция почему-то сбилась, выровняешь.
Будет читабельней и разборчивей.
1
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
29.11.2011, 17:21  [ТС] #13
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
void sort(int* a, int size);
void mas_out(int* a, int size);
void mas_in(int* a, int size);
 
int main(int argc, char *argv[])
{
    int* mas;
    int size;
    cout << "Enter size: ";
    cin >> size;
    mas = (int*)malloc(size);
    mas_in(mas, size);
    mas_out(mas, size);
    sort(mas, size);
    mas_out(mas, size);
    free(mas);
    return 0;
}
void mas_in(int* a, int size)
{
    for (int i=0; i<size; i++) // запись в массив, правильно?
        cin >> a[i];
}
void sort(int* a, int size)
 
 
{
    int min, mini; //
    min=a[0];
    for (int i=1; i < size;++i)// сравнение элементов
    {
        if (a[i] < min)
        {
            min=a[i]; mini=i;// процесс обработки
        }
    }
}
void mas_out(int* a, int size)
{
        int min = 0, index = 0;
        for(int i=0; i < size; i++)
                cout << "a[" << i << "] = " << a[i] << endl;
        min = a[0];
        for(int i = 0; i < size; i++)
        {
 
                if(a[i] <= min)
                {
                        min = a[i];
                        index = i;
                }
        }
 
        cout << "Min el.: a[" << index << "] = " << min << endl;
}
похоже на тоже самое но для минималки?
0
ZaVyLoN
83 / 83 / 6
Регистрация: 26.10.2009
Сообщений: 269
29.11.2011, 17:29 #14
Цитата Сообщение от Depressa Посмотреть сообщение
похоже на тоже самое но для минималки?
Цитата Сообщение от Depressa Посмотреть сообщение
if(a[i] <= min)
Да, все правильно.
1
Depressa
3 / 3 / 0
Регистрация: 26.11.2011
Сообщений: 83
29.11.2011, 18:32  [ТС] #15
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
void random_mas(int* mas, int size);
void mas_out(int* mas, int size);
 
 
int main(int argc, char *argv[])
{
    int* mas;
    int size;
    cout << "Enter size: ";
    cin >> size;
    mas = (int*)malloc(size);
    mas_out(mas, size);
    random_mas(mas, size);
    mas_out(mas, size);
    free(mas);
    return 0;
}
 
 
void random_mas(int* mas, int size)
{
    for (int i=0; i<size; ++i)
        mas[i]=rand();
}
 
void mas_out(int* mas, int size)
{
    for(int i=0; i<size; ++i)
        cout << (int)mas[i] << " ";
 
}
вот что вышло для рандомного заполнения, есть одно но
он заполяет если пишу размер допустим 4, то в два раза больше значений, и так далее


ошибку нашел,лишний
C++
1
mas_out(mas, size);
правильно?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2011, 18:32
Привет! Вот еще темы с ответами:

Задачи на массивы - C++
1.дан массив А(11).все элементы этого массива из интервала (с,d) обнулите,найдите сумму остальных. 2.Дан одномерный массив А. найти...

задачи на C++, на массивы - C++
дана такая задача: дан линейный массив А, состояий из N элементов. Составить прорграмму удаления в массиве всех элементов, значения...

Задачи на массивы в С++ - C++
Здравствуйте, помогите пожалуйста с решением 2 задач: 1. Даны целые числа a1, ..., a30. Все члены последовательности с четными...

задачи на текст и массивы - C++
Помогите пожалуйста с лабораторкой. Я больше по Паскалю, а в Си плаваю, и очень мелко... 1. Ввести с клавиатуры предложение. Удалить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.11.2011, 18:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru