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

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

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

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

04.11.2012, 22:58. Просмотров 493. Ответов 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     Найти ошибку. Одномерный массив
Посмотрите здесь:

Дан одномерный массив A[N]. Найти max(a2,a4,...a2*k)+min(a1,a3,...,a2*k+1 C++
C++ Не могу найти ошибку, одномерный массив
Одномерный массив. Найти количество палиндромов. C++
Одномерный массив, найти минимальное и максимальное значение C++
Найдите плз ошибку, Одномерный массив с указателями C++
C++ Одномерный массив.Найти номера элементов меньше -10
C++ Найти ошибку. Записать 20 целых чисел в массив. Переписать отрицательные в массив А, а положительные в Б
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
758 / 691 / 124
Регистрация: 27.07.2012
Сообщений: 1,980
Завершенные тесты: 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
4284 / 1406 / 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
4284 / 1406 / 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++
4663 / 2489 / 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
4284 / 1406 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
05.11.2012, 00:20     Найти ошибку. Одномерный массив #13
Потому что все три m указывают на наибольшее число, соответственно ни один из 3-х циклов не выполнится и они так и останутся все = 2. Чем Вам мой код не подошел
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 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, если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.11.2012, 00:29     Найти ошибку. Одномерный массив #16
Цитата Сообщение от ruspat Посмотреть сообщение
если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
Если есть одинаковые максимальные элементы, то все эти одинаковые элементы учитываются.
Напишите что вводили и что выдала программа?
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:35  [ТС]     Найти ошибку. Одномерный массив #17
valeriikozlov, да, видимо я ошибся

Добавлено через 36 секунд
Такой код без ошибок? Кажется, работает, но не уверен.
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
#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[1];
    m3=a[2];
    for (i=1;i<n;i++)
    for (i=2;i<n;i++)
        if (a[i]>m1) {m1=a[i]; x=i;}
    for (i=3;i<n;i++)
    {
        if (i==x) continue;
        if (a[i]>m2) {m2=a[i]; y=i;}
    }
    for (i=3;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++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
05.11.2012, 00:38     Найти ошибку. Одномерный массив #18
Цитата Сообщение от ruspat Посмотреть сообщение
Кажется, работает, но не уверен.
я уверен )
см комментарии:
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
#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;// 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];// считаем что m1 максимальное число
    m2=a[1];
    m3=a[2];
    for (i=1;i<n;i++)
    for (i=2;i<n;i++)
        if (a[i]>m1) {m1=a[i]; x=i;}// если окажется что a[0] было максимальным числом, то x останется неопределенным
    for (i=3;i<n;i++)
    {
        if (i==x) continue;// в этом цикле учитывается значение x которое неопределено, что не есть хорошо
        if (a[i]>m2) {m2=a[i]; y=i;}// тоже самое со значением y, которое будет учитываьтся в цикле ниже
    }
    for (i=3;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;
}
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:39     Найти ошибку. Одномерный массив #19
17 - 18 строки. Что-то не то скопировали
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 00:42     Найти ошибку. Одномерный массив
Еще ссылки по теме:

C++ Одномерный массив, найти среднее значение
C++ Одномерный массив, найти сумму элементов по условию
C++ Одномерный массив: найти элемент, сумму, перегруппировать
C++ Задача на одномерный массив. Найти ошибку
Дан одномерный массив . Найти минимум и максимум C++

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

Или воспользуйтесь поиском по форуму:
ruspat
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:42  [ТС]     Найти ошибку. Одномерный массив #20
I.M., да, действительно, 17-ая лишняя)
Yandex
Объявления
05.11.2012, 00:42     Найти ошибку. Одномерный массив
Ответ Создать тему
Опции темы

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