Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
1

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

04.11.2012, 22:58. Показов 832. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Программа должна находить три максимальных элемента массива, но вопреки моим ожиданиям она этого не делает, а вместо этого выводит три первых элемента. В чём ошибка?
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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2012, 22:58
Ответы с готовыми решениями:

Задача на одномерный массив. Найти ошибку
#include &lt;fstream&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int fak(int...

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

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

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

19
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
04.11.2012, 23:04 2
Логика ифов внутри цикла неверна
Простой пример 1 2 3 4
Здесь 4 не пройдет ни одно из ваших условий, хотя это максимум массива
1
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:16  [ТС] 3
А можно ли как-то пройти по массиву, пропустив какой-то один конкретный элемент?
0
2278 / 1769 / 741
Регистрация: 27.07.2012
Сообщений: 5,253
04.11.2012, 23:19 4
Отсортируй массив и возьми столько максимальных, сколько тебе нужно. Кстати, что будет у тебя в программе, если число элементов в массиве будет 2?
1
576 / 559 / 47
Регистрация: 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;
   //...
}
Любителям оптимизации код явно не понравится
1
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 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]);
1
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
04.11.2012, 23:27  [ТС] 7
BumerangSP, с отрицательными элементами ведь не будет работать
0
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
04.11.2012, 23:30 8
ruspat, да не, сработало)
http://liveworkspace.org/code/... 711edba8fd
Мы ведь индекс элемента запоминаем, а не сам элемент.
1
576 / 559 / 47
Регистрация: 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;
}
0
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;
}
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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;
}
1
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:18 12
Цитата Сообщение от ruspat Посмотреть сообщение
m1=a[0];
m2=a[0];
m3=a[0];
тут
вы изначально присваиваете им максимальный элемент
1
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
05.11.2012, 00:20 13
Потому что все три m указывают на наибольшее число, соответственно ни один из 3-х циклов не выполнится и они так и останутся все = 2. Чем Вам мой код не подошел
1
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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++){...}
1
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:26  [ТС] 15
valeriikozlov, если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
05.11.2012, 00:29 16
Цитата Сообщение от ruspat Посмотреть сообщение
если есть одинаковые максимальные элементы, Ваша программа учитывает только один из них, что по сути не правильно
Если есть одинаковые максимальные элементы, то все эти одинаковые элементы учитываются.
Напишите что вводили и что выдала программа?
1
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;
}
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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;
}
1
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
05.11.2012, 00:39 19
17 - 18 строки. Что-то не то скопировали
1
0 / 0 / 0
Регистрация: 23.09.2012
Сообщений: 24
05.11.2012, 00:42  [ТС] 20
I.M., да, действительно, 17-ая лишняя)
0
05.11.2012, 00:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2012, 00:42
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru