Кто хорошо знает С++?

Кто хорошо знает С++?

Начал изучать, нет ни какого понимания. Есть кто хорошо разбирается в с+++ ?? Нужен наставник =) к кому можно было бы обращаться с вопросами.

Задан массив целых чисел A(n). Найти
• среднее арифметическое элементов массива;
• минимальный элемент и его индекс в первой половине массива.
Из данного массива и некоторого массива того же типа, но другой
размерности B(m), сформировать общий массив С, в который переписать
удвоенные положительные значения элементов исходных массивов.
Удалить из массива С последний четный элемент.

Динамический — это пока для меня сложновато.

Данил, вот, написал программу, работает, как ты описал. С удовольствием выслушаю критику.

#include<iostream>
using namespace std;

void main()
{
    setlocale(LC_ALL, "Russian");
    int i,min,ind,n,m,g=0,k=0;
    float av = 0;

    cout << "Enter n: ";
    cin >> n;
    cout << "Enter m: ";
    cin >> m;

    int *a = new int[n];
    int *b = new int[m];

    cout << "Enter array a ("<<n<<" elements):" << endl;
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
    }

    cout << "Enter array b (" << m << " elements):" << endl;
    for (i = 0; i < m; i++)
    {
        cin >> b[i];
    }
    cout << "\n\n";

    for (i = 0; i < n; i++)
    {
        av = av + a[i];
    }
    av = av / n;
    cout << "Average: " << av << "\n\n";

    min = a[0];
    ind = 0;
    for (i = 0; i<(n / 2); i++)
    {
        if (min>a[i])
        {
            min = a[i];
            ind = i;
        }
    }
    cout << "Minimal in the first part: " << min << "\nIndex: " << ind << "\n\n";

    for (i = 0; i<n; i++)
    {
        if (a[i]>0)g++;
    }
    for (i = 0; i<m; i++)
    {
        if (b[i]>0)g++;
    }

    int *c = new int[g];
    for (i = 0; i<n; i++)
    {
        if (a[i]>0)
        {
            c[k] = a[i] * 2;
            k++;
        }
    }
    for (i = 0; i<m; i++)
    {
        if (b[i]>0)
        {
            c[k] = b[i] * 2;
            k++;
        }
    }

    cout << "Here is the array C: \n";
    for (i = 0; i < g-1; i++)
    {
        cout << c[i] << "\n";
    }
    cout << endl;
    system("pause");

}

С удовольствием выслушаю критику.

Ну, для начала, если используете system, то включите заголовок cstdlib.

Далее, необходимо исправить void main() на int main(). Тип возвращаемого значения функции main должен быть именно int. Любой другой — непереносим!

Далее:

min = a[0];
ind = 0;
for (i = 0; i<(n / 2); i++)
{
    if (min>a[i])
    {
        min = a[i];
        ind = i;
    }
}

Изначально i можно сделать равной 1, т.к. элемент a[0] уже учтен и первая итеррация бессмыслена.
Если запоминаете индекс, то можно не запоминать min, т.к. у нас есть индекс элемента. Хотя тут скорее на вкус и цвет...

Еще тут:

for (i = 0; i<n; i++)
{
    if (a[i]>0)g++;
}
for (i = 0; i<m; i++)
{
    if (b[i]>0)g++;
}

Кол-во положительных элементов можно считать сразу при вводе, чтобы не проходить лишний раз по массиву. В принципе, искать минимум можно там же.

А тут,

for (i = 0; i < g-1; i++)
{
    cout << c[i] << "\n";
}

не нужно вычитать 1, т.к. при этом отпадет вывод последнего элемента из массива, а нужно

Удалить из массива С последний четный элемент.

Спасибо за feedback, но появилось несколько вопросов:

Если используете system, то включите заголовок cstdlib.

1)Программа функционирует и без этого, зачем требуется эта библиотека?
2)Почему нельзя использовать void main(){}? Так я просто сокращаю программу на строчку «return 0;».

не нужно вычитать 1, т.к. при этом отпадет вывод последнего элемента из массива

3)И последнее: я вывожу на один элемент массива меньше и таким образом удаляю последний четный элемент, так как последний элемент в любом случае будет четным (т.к. массив образуется удвоением чисел).

1)Программа функционирует и без этого, зачем требуется эта библиотека?

На одном компиляторе — да, на другом, нет. Функиция system объявлена в cstdlib. Если у Вас работает, значит в Вашем компиляторе в iostream неявно подключается cstdlib или имеется объявление функции system. В другом компиляторе может в iostream этого не быть.

Почему нельзя использовать void main(){}? Так я просто сокращаю программу на строчку «return 0;».

стандарт определяет только два вида функции main:

int main() { /* ... */ }
//и
int main(int argc, char* argv[]) { /* ... */ }

Реализация компилятора может предоставлять и другие, но при этом теряется переносимость кода и на другом компиляторе может не скомпилироваться. Что касается return 0, то в конце функции main эта инструкция не обязательна. Если в конце main нет инструкции return 0, то поведение такое, как будто она там есть. Из Стандарта:

If control reaches the end of main without encountering a return statement, the effect is that of executing
return 0;

...

И последнее: я вывожу на один элемент массива меньше и таким образом удаляю последний четный элемент, так как последний элемент в любом случае будет четным

ну да, это я не досмотрел. Но в любом случае это вывод на один элемент меньше, а не удаление его из массива. Думаю, лучше просто уменьшить g, но это уж как автору вопроса вздумается.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.