Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2016, 23:51   #1
Jazz-
 
Регистрация: 14.10.2016
Сообщений: 8
По умолчанию Как выбрать три максимальные значения массива в Си

Задал массив. Заполнил рандомными значениями. Надо найти три максимальных, но почему то выбивает 0, какоето значение, и опять 0. В массиве 0 вообще нет. Подскажите пожалуйста, где я мог ошибится?
Код:
#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
#include <stdlib.h>


int main() 
{	double a=0, b=0, c=0;
	int i;
	double masi[25];
		for (i=0;i<25;i++)
			{  
				srand (rand()%100);
				masi[i]= rand()%100;
			}	 
		for (i=0;i<25;i++)
			{   
				srand (rand()%100);
				printf("%d\n", &masi[i]); 
			}
		
			for (i=0;i<25;i++)
			{ 
				if (masi[i]>a&&a!=0)
				{
					a=masi[i];
				}
			}

			for (i=0;i<25;i++)
			{
				if (masi[i]>b&&masi[i]!=a);
				{
					b=masi[i];
				}
			}
			for (i=0;i<25;i++)
			{
				if (masi[i]>c&&masi[i]!=b&&masi[i]!=a&&c!=0);
				{
					c=masi[i];
				}
			}
	printf("The biggest noumber's are:\n%d,\n%d,\n%d.", a, b, c);
	_getch(); 
	return 0; 
}

Последний раз редактировалось Jazz-; 15.10.2016 в 23:54.
Jazz- вне форума Ответить с цитированием
Старый 16.10.2016, 00:40   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Поскольку "a" инициализировано нулем, то условие "&&a!=0" не позволит изменить значение "a". Тоже самое с "c". При поиске трех максимумов делается примерно следующее:
Код:
if (maxcount == 0 || masi[i] > max[0]) {
    max[2] = max[1];
    max[1] = max[0];
    max[0] = masi[i];
    if (maxcount < 3) ++maxcount;
} else if (maxcount == 1 || masi[i] > max[1]) {
    max[2] = max[1];
    max[1] = masi[i];
    if (maxcount < 3) ++maxcount;
} else if (maxcount == 2 || masi[i] > max[2]) {
    max[2] = masi[i];
    if (maxcount < 3) ++maxcount;
}
После этого max[0] >= max[1] >= max[2]. Инициализировать нужно или значениями, которых не может быть в массиве, или проверять, например, сколько уже максимумов найдено (как в коде выше). Код не проверял, так что на правах идеи.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 16.10.2016 в 00:42.
BDA вне форума Ответить с цитированием
Старый 16.10.2016, 13:17   #3
Максай
Пользователь
 
Аватар для Максай
 
Регистрация: 21.07.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Jazz- Посмотреть сообщение
Задал массив. Заполнил рандомными значениями. Надо найти три максимальных, но почему то выбивает 0, какоето значение, и опять 0. В массиве 0 вообще нет. Подскажите пожалуйста, где я мог ошибится?
У Вас в коде довольно много ошибок. Например:
Код:
printf("%d\n", &masi[i]);
Как вам уже объяснили, знак & перед переменной здесь означает взятие адреса переменной, так что напечатан будет адрес элемента массива, а не его значение. Так что & здесь Вам не нужен.
Кроме того, в массиве у Вас значения типа double, для вывода их с помощью printf нужно использовать спецификатор %f, а не %d.
Подробнее о спецификаторах типа читайте: https://ru.wikipedia.org/wiki/Printf#Спецификатор_типа
Код:
if (masi[i]>b&&masi[i]!=a);
{

// ...

if (masi[i]>c&&masi[i]!=b&&masi[i]!=a&&c!=0);
{
Точка с запятой после if означает пустое выражение и весь код в фигурных скобках будет выполняться всегда, независимо от условия в if.
Код:
srand (rand()%100);
srand() задаёт зерно для последующих вызовов rand() и вызывать его достаточно один раз, но желательно с неповторяющимся значением. Обычно пишут srand(time(NULL)) где-нибудь в начале программы, используя тем самым текущее время в секундах в качестве зерна (достаточно неповторяющееся значение). А Вы разве не обратили внимания на то, что Ваша программа всегда выводит одни и те же числа?

Ну и, собственно, решение Вашего вопроса Вам уже подсказал BDA.
Подправленный код Вашей программы должен выглядеть как-то так:
Код:
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main()
{
    int i;
    double masi[25];
    double max[3] = {0, 0, 0};
    int maxcount = 0;

    srand(time(NULL));

    for (i=0;i<25;i++)
    {
        masi[i]= rand()%100;
    }

    for (i=0;i<25;i++)
    {
        printf("%f\n", masi[i]);
    }

    for (i=0;i<25;i++)
    {
        if (maxcount == 0 || masi[i] > max[0])
        {
            max[2] = max[1];
            max[1] = max[0];
            max[0] = masi[i];
            if (maxcount < 3) ++maxcount;
        }
        else if (maxcount == 1 || masi[i] > max[1])
        {
            max[2] = max[1];
            max[1] = masi[i];
            if (maxcount < 3) ++maxcount;
        }
        else if (maxcount == 2 || masi[i] > max[2])
        {
            max[2] = masi[i];
            if (maxcount < 3) ++maxcount;
        }
    }

    printf("The biggest noumber's are:\n%f,\n%f,\n%f.\n", max[0], max[1], max[2]);

    _getch();
    return 0;
}

Последний раз редактировалось Максай; 16.10.2016 в 13:23.
Максай вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
максимальные значения из 2 стобцов a1n4ik Microsoft Office Access 8 11.04.2013 08:04
Как разбить строку на три целочисленных значения в С? NoviceBeginner Общие вопросы C/C++ 3 16.09.2012 13:38
как присвоить все три значения вектору В и вывести его как массив столбец при вызове функции Tomoa Microsoft Office Excel 8 08.03.2010 20:42
Максимальные элементы двумерного массива Jasper92 Общие вопросы C/C++ 0 17.12.2009 15:23
как выбрать значения в цикле в паскале Melok Помощь студентам 5 14.12.2007 10:46