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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2017, 03:40   #1
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию [си] Дополнить, чтобы программа находила произведение элементов массива расположенных между максимальным и минимальными элементами

можете дополнить чтобы программа находила произведение элементов массива расположенных между максимальным и минимальными элементами
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <malloc.h>
int main()
{
    int n,i; //количество чисел
    float *x,sum,proiz,min,max; //массив этих чисел
    setlocale(LC_CTYPE, "Rus"); //Русский язык в консоле
sum=0;
proiz=1;
    printf("Введите количество чисел в последовательности: ");
    scanf("%d", &n);
    //Выделение памяти под массив
    x = (float*)malloc(n * sizeof(float));
    //Считывание массива
    printf("Введите по одному %d чисел:\n", n);
    for( i = 0; i < n; i++){
        scanf("%f", &x[i]);
    }
min=x[0];
for (i = 0; i <n; i++)
{
if(min>x[i]) // нахождение минимального
min=x[i];
}
printf ("минимальный элемент %.f  ", min);
max=x[0];
for (i = 0; i <n; i++)
{
if(max<x[i]) // нахождение максимального
max=x[i];
}
printf ("максимальный %.f  ", max);
printf("\n");



    for( i = 0; i < n; i++) //цикл для произведения
    {
    proiz=proiz*x[i];// произведение всех элементов


    }
    printf("%f\n",proiz );


    //Освобождаем память
    free(x);
    return 0;
}
Александр121 вне форума Ответить с цитированием
Старый 30.11.2017, 08:38   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

1. искать не минимальный, а ИНДЕКС минимального
Код:
ind_min=0;
for (i = 0; i <n; i++)
{
if(x[ind_min]>x[i]) // нахождение минимального
ind_min=i;
}
2. тоже и для максимального.
...
3. использовать найденные значения для ограничения цикла вычисления указанного в задании.
Код:
    for( i = ??? ; i < ??? ; i++) //цикл для произведения
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.11.2017 в 08:41.
evg_m вне форума Ответить с цитированием
Старый 30.11.2017, 11:48   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,573
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
1. искать не минимальный, а ИНДЕКС минимального
а еще лучше, чтоб каждый раз не обращаться к x[ind_min]
Код:
ind_min=0; xmin = x[0] ;
for (i = 1; i < n; i++)
{
if(xmin>x[i]) // нахождение минимального
  { ind_min=i; xmin = x[i] } ;
}
digitalis вне форума Ответить с цитированием
Старый 30.11.2017, 12:15   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
а еще лучше, чтоб каждый раз не обращаться к x[ind_min]
не лучше. дополнительная переменная практически никакого выигрыша не даст.
а при записи вдвое больше надо присвоений.
Понятно, что и в том и в другом случае речь о микросекундах идёт (т.е. практического значения не имеет), но заводить дополнительную переменную бессмысленно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2017, 12:18   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,724
По умолчанию

Забавно наблюдать как одну и туже задачу, с практически одним и тем же кодом, от одного и того же ТС обсасываю и обсасывают... думают он будет разбираться, думать. ))
p51x вне форума Ответить с цитированием
Старый 30.11.2017, 12:34   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,573
По умолчанию

Тут извечная дилемма - что минимизировать - расход памяти или время выполнения. В данном примере, конечно, пофиг, но в серьезных задачах приходится выбирать. Что касается 2 присваиваний - так это же не каждый раз, а только если if = True, а выборку из массива проводим каждый раз, а это медленнее, чем обращение к простой переменной. Впрочем, многое зависит компилятора - "вумный" оптимизирует сам.
digitalis вне форума Ответить с цитированием
Старый 30.11.2017, 13:25   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
а выборку из массива проводим каждый раз, а это медленнее, чем обращение к простой переменной.
вот именно, что никакой "выборки" не производится. Просто значение индекса используется в качестве смещения (а базой является адрес нулевого элемента).
Хотя, конечно, тут есть нюансы - какой массив, какой компилятор и т.д. и т.п.
Но, в общем случае, использование проверки через индекс и в учебных и в реальных задачах вполне допустимо. Имхо, конечно.


Цитата:
Сообщение от p51x Посмотреть сообщение
Забавно наблюдать как одну и туже задачу, с практически одним и тем же кодом, от одного и того же ТС обсасываю и обсасывают... думают он будет разбираться, думать. ))
ага. думаете, начнёт думать над предложенными вариантами решения?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2017, 17:18   #8
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

всёровно не высчитывет
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#include <malloc.h>
int main()
{
    int n,i; //количество чисел
    float *x,sum,proiz,min,max; //массив этих чисел
    setlocale(LC_CTYPE, "Rus");//Русский язык в консоле
    int j,k;
sum=0;
proiz=1;
    printf("Введите количество чисел в последовательности: ");
    scanf("%d", &n);
    //Выделение памяти под массив
    x = (float*)malloc(n * sizeof(float));
    //Считывание массива
    printf("Введите по одному %d чисел:\n", n);
    for( i = 0; i < n; i++){
        scanf("%f", &x[i]);
    }
min=x[0];
for (i = 0; i <n; i++)
{
if(min>x[i]) // нахождение минимального
min=x[i];
j=i;
}
printf ("минимальный элемент %.f  ", min);
max=x[0];
for (i = 0; i <n; i++)
{
if(max<x[i]) // нахождение максимального
max=x[i];
k=i;
}
printf ("максимальный %.f  ", max);
printf("\n");
 
 
 
    for(j++;j<k;j++)  //цикл для произведения
    {
    proiz=proiz*x[j];// произведение не всех элементов
 
 
    }
    printf("%f\n",proiz );
 
 
    //Освобождаем память
    free(x);
    return 0;
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 30.11.2017 в 17:21.
Александр121 вне форума Ответить с цитированием
Старый 30.11.2017, 17:34   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

написал в браузере.
язык С не знаю, поэтому писал методом копирования/вставки вашего же кода.
если есть ошибки/опечатки - исправляйте:
Код:
int main()
{
    int n,i; //количество чисел
    float *x; //массив этих чисел
    float proiz; // для накопления произведения чисел
    setlocale(LC_CTYPE, "Rus");//Русский язык в консоле
    int indexMin,indexMax;
    printf("Введите количество чисел в последовательности: ");
    scanf("%d", &n);
    //Выделение памяти под массив
    x = (float*)malloc(n * sizeof(float));
    //Считывание массива
    printf("Введите по одному %d чисел:\n", n);
    for( i = 0; i < n; i++){
        scanf("%f", &x[i]);
    }
    // нахождение минимального и максимального
    indexMin=0;
    indexMax=0;
    for (i = 0; i <n; i++)
    {
        if(x[indexMin]>x[i]) 
        	indexMin=i;  // запомнили индекс минимального 
	if(x[indexMax]<x[i]) 
        	indexMax=i;  // запомнили индекс максимального
    }
    printf ("минимальный элемент %.f  \n", x[indexMin]);
    printf ("максимальный %.f  \n", x[indexMax]);
 
    if(indexMin==indexMax){
	    printf (" Индексы минимального и максимального совпадают. Нечего умножать! \n");
    }
    else{
	if(indexMin>indexMax){
	 i=indexMin; indexMin=indexMax; indexMax=i;
	}
	proiz=1;
	for(i=indexMin+1;i<indexMax;i++)  //цикл для произведения
	{
		proiz=proiz*x[i];// произведение 
 
        }
        printf("%f\n",proiz );
    }
 
 
    //Освобождаем память
    free(x);
    return 0;
}
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2017, 18:02   #10
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

спасибо огромное.ошибок нет и логика верная.
Получается если индекс indexMin>indexMax то мы их как бы
меняем и считаем с верху в низ?
Александр121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычислить сумму элементов массива, расположенных между первым и вторым отрицательными элементами. Алия13 Помощь студентам 7 18.12.2016 16:08
найти сумму элементов массива,расположенных между первым и вторым отрицательными элементами Кристюша5 Паскаль, Turbo Pascal, PascalABC.NET 0 26.05.2012 16:06
процедура-функция для нахождения Произведения элементов массива, расположенных между максимальным и ми-нимальным элементами uHkBu3uTop Паскаль, Turbo Pascal, PascalABC.NET 2 12.04.2012 19:18
Вычислить сумму элементов массива, расположенных между первым и последним положительными элементами Fitch573 Помощь студентам 4 09.01.2012 18:04
Посчитать произведение эл-ов массива, расположенных между максимальным и минимальными элементами. Fri Помощь студентам 4 23.10.2011 20:35