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

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

Войти
Регистрация
Восстановить пароль
 
 
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
#1

Найти ошибку. Одномерный массив - C++

04.11.2012, 22:58. Просмотров 505. Ответов 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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x;
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];
    m2=a[1];
    m3=a[2];
    for (i=3;i<n;i++)
    {if (a[i]>m1 && a[i]<m2 && a[i]<m3) m1=a[i];
        if (a[i]>m2 && a[i]<m1 && a[i]<m3) m2=a[i];
        if (a[i]>m3 && a[i]<m1 && a[i]<m2) m3=a[i];}
    printf("max elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2012, 22:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти ошибку. Одномерный массив (C++):

Задача на одномерный массив. Найти ошибку - C++
#include &lt;fstream&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int fak(int k) { return((k==1)?...

Не могу найти ошибку, одномерный массив - C++
// key.cpp: определяет точку входа для консольного приложения. // #include &lt;StdAfx.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Найдите плз ошибку, Одномерный массив с указателями - C++
Если максимальный элемент находится левее минимального элемента, то упорядочить в порядке убывания элементы, находящиеся между максимальным...

Массив: найти номера столбцов с положительными элементами и записать их в одномерный массив - C++
ввести двумерный массив I . найти номера столбцов с положительными элементами и записать их в одномерный массив, отобразить его на экране. ...

Организовать одномерный массив с вещественными числами и найти первый и последний отрицательный элемент массив - C++
Организовать одномерный массив с вещественными числами и найти первый и последний отрицательный элемент массива;

Одномерный массив. Найти наименьшие среди элементов первого массива, которые не входят во второй массив. - C++
Задано два массива. Найти наименьшие среди элементов первого массива, которые не входят во второй массив. Ни как не могу придумать:cry:, ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
04.11.2012, 23:04 #2
Логика ифов внутри цикла неверна
Простой пример 1 2 3 4
Здесь 4 не пройдет ни одно из ваших условий, хотя это максимум массива
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:16  [ТС] #3
А можно ли как-то пройти по массиву, пропустив какой-то один конкретный элемент?
John Prick
782 / 715 / 132
Регистрация: 27.07.2012
Сообщений: 2,051
Завершенные тесты: 3
04.11.2012, 23:19 #4
Отсортируй массив и возьми столько максимальных, сколько тебе нужно. Кстати, что будет у тебя в программе, если число элементов в массиве будет 2?
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
04.11.2012, 23:20 #5
вполне, запоминайте индекс этого элемента
Например
C++
1
2
3
4
5
6
int index = 5;
for (int i = 0; i < size; ++i)
{
   if (i == index)continue;
   //...
}
Любителям оптимизации код явно не понравится
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.11.2012, 23:22 #6
Нуждается в тесте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    m1=0;
    m2=1;
    m3=2;
    for (i=0;i<n;i++)
    {
     if (a[i]>a[m1] && i!=m2 && i!=m3) 
      m1=i;
    
     if (a[i]>a[m2] && i!=m1 && i!=m3) 
     m2=i;
   
     if (a[i]>a[m3] && i!=m1 && i!=m2) 
       m3=i;
    }
    printf("max elements: %d,%d,%d",a[m1],a[m2],a[m3]);
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:27  [ТС] #7
BumerangSP, с отрицательными элементами ведь не будет работать
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
04.11.2012, 23:30 #8
ruspat, да не, сработало)
http://liveworkspace.org/code/91dfea...dc7b711edba8fd
Мы ведь индекс элемента запоминаем, а не сам элемент.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:05 #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
#include <algorithm>
#include <array>
#include <iostream>
 
int main()
{
    std::array<int, 10> a = {5, 7, 1, 6, -3, 5, 42, 42, 0, 11};
 
    std::array<int, 3> result;
    std::copy(a.cbegin(), a.cbegin()+3, result.begin());
        
    for (int i = 3; i < a.size(); ++i)
    {
        auto it = std::min_element(result.begin(), result.end());
        if (a[i] > *it)
        {
            *it = a[i];
        }
    }
    std::sort(result.begin(), result.end());
    
    std::cout << result[0] << " " << result[1] << " " << result[2] << std::endl;
    system("pause");
    return 0;
}
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:14  [ТС] #10
Сделал вот так, но при вводе массива "2, 2, 1, 0, 1" выдаёт "2, 2, 2", что не есть правильно. Где ошибка на этот раз?
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x, y;
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];
    m2=a[0];
    m3=a[0];
    for (i=0;i<n;i++)
        if (a[i]>m1) {m1=a[i]; x=i;}
    for (i=0;i<n;i++)
    {
        if (i==x) continue;
        if (a[i]>m2) {m2=a[i]; y=i;}
    }
    for (i=0;i<n;i++)
    {
        if (i==x) continue;
        if (i==y) continue;
        if (a[i]>m3) m3=a[i];
    }
    printf("maximum elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.11.2012, 00:17 #11
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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    const int N=100;
    int a[N], i, n, m1, m2, m3, x;
    printf("enter dimensionality of the array: ");
    scanf("%d", &n);
    printf("enter elements of the array: ");
    for (i=0;i<n;i++)
        scanf("%d", &a[i]);
    m1=a[0];
    m2=a[1];
    m3=a[2];
    if(m1<m2) {x=m1; m1=m2; m2=x;}
    if(m1<m3) {x=m1; m1=m3; m3=x;}
    if(m2<m3) {x=m2; m2=m3; m3=x;}
    for (i=3;i<n;i++)
    {
        if(a[i]>m1)
        {
            m3=m2; m2=m1; m1=a[i];
        }
        else
        if(a[i]>m2)
        {
            m3=m2; m2=a[i];
        }
        else
        if(a[i]>m3)
            m3=a[i];
    }
    printf("max elements: %d,%d,%d",m1,m2,m3);
    getch();
    return 0;
}
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:18 #12
Цитата Сообщение от ruspat Посмотреть сообщение
m1=a[0];
m2=a[0];
m3=a[0];
тут
вы изначально присваиваете им максимальный элемент
BumerangSP
4286 / 1408 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
05.11.2012, 00:20 #13
Потому что все три m указывают на наибольшее число, соответственно ни один из 3-х циклов не выполнится и они так и останутся все = 2. Чем Вам мой код не подошел
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
05.11.2012, 00:21 #14
C++
1
2
3
m1=a[0];
    m2=a[0];
    m3=a[0];
у тебя он их и выдаёт, ничего не изменяя, т.к. a[0]=2 -максимальный элемент, и все сравнения не срабатывают
измени на, скажем
C++
1
2
3
4
m1=a[0];
m2=a[1];
m3=a[2];
for (i=3;i<n;i++){...}
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:26  [ТС] #15
valeriikozlov, если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 00:26
Привет! Вот еще темы с ответами:

Найти ошибку. Записать 20 целых чисел в массив. Переписать отрицательные в массив А, а положительные в Б - C++
Доброго времени суток. Записать 20 целых чисел в массив А. Переписать отрицательные из них подряд в массив В, а положительные - в массив C....

Матрица и одномерный массив (Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов, подсчет символов) - C++
Помогите решить задачку: Дана матрица 5х7, элементами которой являются значения символьного типа. Составить одномерный массив, содержащий...

Одномерный массив (Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах) - C++
Ввести массив из 10 вещественных чисел.Найти сумму чисел,стоящих на чётных местах. Обьясните что делать?

Одномерный массив. Найти количество палиндромов. - C++
Помогите написать программу...... Найти количество тех элементов массива, которые являются палиндромами (т.е. читаются одинаково слева...


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

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

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