Задача На Массив

Тема в разделе "C/C++/C#", создана пользователем Deymonn, 4 янв 2013.

  1. Deymonn

    Deymonn New Member

    Регистрация:
    4 янв 2013
    Сообщения:
    4
    Симпатии:
    0
    Условие: Задан целочисленный знаковый массив из N элементов.
    Необходимо: 1) Найти среднее значение чисел в диапазоне от А до В
    2) Найти сумму элементов до минимального
    3) Найти произведение элементов после максимального
    Вот мой не до конца работающий код, точнее он сделан по пункту 1 и есть небольшой фундамент для 2 и 3 пункта. Помогите реализовать 2 и 3 пункт у самого не получается.
    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <time.h>

    int main()
    {
    int* a;
    int T=0,A,B,len, max, min;
    unsigned char r=0;
    float SZ;
    srand(time(NULL));
    printf("Vvedite razmer massiva:\n");
    do
    {
    scanf("%d", &len);                   
    } while ((len < 1));
    do{printf("\n Vvedite diaposon A= ");
    scanf("%d", &A);
    printf("\n Vvedite diaposon B= ");
    scanf("%d", &B);}while(A>B);
    a = new int[len];
    for (int i = 0; i < len; i++)
    {
    printf("%d ", a[i] = rand()%200 - 100);
    if (i == 0)                          
    {  
    min = a[0];
    max = a[0];
    continue;
    }
    if (a[i] > max)
    {
    max = a[i];

    }
    if (a[i] < min)
    {
    min = a[i];    
    }
    if((a[i]>=A)&&(a[i]<=B))
    {T+=a[i];
    r++;
    SZ=0;}
    SZ=(float)T/r;
    }
    delete []a;

    printf("\n Srednee znachenie v diaposone=%.6f", SZ);
    printf("\nMAX = %d, MIN = %d", max, min);
    getch();
    return 0;
    }
    Допустим массив из 5 элементов :
    3 5 6 -5 2
    Диапазон А=2
    Диапазон В=6
    Тогда Среднее значение в диапазоне = 2+3+5+6/4=4
    Минимальный элемент = -5
    Сумма до минимального = 3+5+6=14
    Максимальное значение = 6
    Произведение после максимального = -5*2= 10
    Сумму и произведение не получается реализовать, очень буду признателен за помощь )
     
  2. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    в одном цикле не получится
    запоминай в первом цикле не значение максимального\минимального элемента а индекс
    а во втором цикле,зная индекс проблем не будет найти сумму\произведение
     
  3. Deymonn

    Deymonn New Member

    Регистрация:
    4 янв 2013
    Сообщения:
    4
    Симпатии:
    0
    Вот попробовал не одним циклом в итоге выдает космические цифры, при любом колве ел-в в массиве произ-е и сумма одинаковые числа всегда
    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <time.h>

    int main()
    {
    int* a;
    int index,len,max,pro, min,sum;
    srand(time(NULL));
    printf("Vvedite razmer massiva:\n");
    do
    {
    scanf("%d", &len);                   
    } while ((len < 1));

    a = new int[len];
    for (int i = 0; i < len; i++)
    {
    printf("%d ", a[i] = rand()%200 - 100);
    min = a[0];
    index = 0;
    for (int i=0; i<len; i++)

    if (min>a[i])
    {
    min = a[i];
    index = i;
    }

    sum=0;
    for (i=0; i<index; i++)
    {
    sum+=a[i];
    }
    max = a[0];
    index = 0;
    for ( i=0; i<len; i++)
    if (max<a[i])
    {
    max = a[i];
    index = i;
    }
    pro = 1;
    for (i=index+1; i<len; i++)
    pro*=a[i];

    }
    delete []a;
    printf("\nSUM=%d",&sum);
    printf("\nPRO=%d",&pro);

    printf("\n MIN = %d \n MAX = %d", min, max);
    getch();
    return 0;
    }
     
  4. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    вот по этому раньше учили сначала рисовать блок-схемы,а потом только писать программы

    смотри на свою первую задачу её надо немного исправить только
    ты одним(!!) циклом ищешь среднее арифметическое и индексы(максимума и минимума)
    а вторым(после первого)
    уже считаешь сумму и произведение

    я тебе намекаю что только 2 цикла будет))
     
  5. Deymonn

    Deymonn New Member

    Регистрация:
    4 янв 2013
    Сообщения:
    4
    Симпатии:
    0
    Вот программа перестает работать на выводе рандомных элементов 8(
    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <time.h>

    int main()
    {
    int* a;

    int sum=0,pro=1,T=0,A,B,len, max, min,index,index1;
    unsigned char r=0;
    float SZ;
    srand(time(NULL));
    printf("Vvedite razmer massiva:\n");
    do
    {
    scanf("%d", &len);                   
    } while ((len < 1));
    do{printf("\n Vvedite diaposon A= ");
    scanf("%d", &A);
    printf("\n Vvedite diaposon B= ");
    scanf("%d", &B);}while(A>=B);
    a = new int[len];
    for (int i = 0; i < len; i++)
    {
    printf("%d ", a[i] = rand()%200 - 100);
    if (i == 0)                          
    {  
    min = a[0];
    max = a[0];
    continue;
    }
    if (a[i] > max)
    {
    max = a[i];
    index=i;

    }
    if (a[i] < min)
    {
    min = a[i];
    index1=i;      
    }
    if((a[i]>A)&&(a[i]<B))
    {T+=a[i];
    r++;
    SZ=0;}
    SZ=(float)T/r;
    }
    for ( i = 0; i < len; i++)
    {
    i=index+1;
    if(i<len)
    {
    pro*=a[i];
    i++;
    }

    i=0;
    if(i<index1)
    {
    sum+=a[i];
    }
    }
    delete[]a;
    printf("\n SUM=%d", sum);      
    printf("\n Pro=%d", pro);
    printf("\n Srednee znachenie v diaposone=%.6f", SZ);
    printf("\nMAX = %d, MIN = %d", max, min);
    getch();
    return 0;
    }
     
  6. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Deymonn


    Код (Text):
    if((a[i]>A)&&(a[i]<B))
    {T+=a[i];
    r++;
    SZ=0;}
    SZ=(float)T/r;
    }
    for ( i = 0; i < len; i++)
    {
    я это читать не могу, расставь нормально скобочки и отступы.
     
  7. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    быстро накидал,должно работать
    Код (C++):
    //
    #include <conio.h>
    #include <time.h>
    #include <iostream>
    using namespace std;
    void main()
    {
    setlocale(LC_ALL,".1251");
    int *a;
    int len;
    cout<<"Размер массива:";
    cin>>len;
    if(len==0)
    len++;
    a = new int[abs(len)];

    int A,B;
    cout<<"Граница A:";
    cin>>A;
    cout<<"Граница B:";
    cin>>B;
    if(A==B)
    B++;
    if(A>B)
    swap(A,B);

    int T(0);
    unsigned int r(0);
    int min(0),max(0);
    srand(time(NULL));
    for (int i=0;i<len;++i)
    {
    a[i]=rand()%200-100;
    cout<<a[i]<<" ";
    if (a[i] > a[max])
    max = i;
    if (a[i] < a[min])
    min = i;
    if( (a[i]>A) && (a[i]<B) )
    {
    T+=a[i];
    r++;
    }

    }
    float SZ(0);
    if(r!=0)
    SZ=T/r;
    cout<<"\nСреднее арифметическое в диапозоне:"<<SZ<<endl;
    int sum(0),pro(1);
    for (int i=0;i<len;i++)
    {
    if(i>max)
    pro*=a[i];
    if(i<min)
    sum+=a[i];
    }
    delete[]a;
    cout<<"Сумма до минимального:"<<sum<<endl;
    cout<<"Произведение после максимального:"<<pro<<endl;
    getch();
    }
    //
     
  8. Deymonn

    Deymonn New Member

    Регистрация:
    4 янв 2013
    Сообщения:
    4
    Симпатии:
    0
    Спасибо большое,я на с++ ничего не понимаю т.к. начал изучать си только 3 месяца назад) но тут по форумам полазил и теперь все работает!)
     
  9. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (Text):
        if(len==0)
    len++;
    почему так, если не секрет?
     
  10. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    ну мы не можем создать массив нулевой длины
    там могло стоять любое число len+=10; например
    просто я выбрал единицу
     
  11. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    нулевой можем, и скорее всего он будет работать именно так, как ожидает юзер (если он понимает что делает), но если мы так коварно увеличиваем размер массива - юзер может бесконечно удивляться (прикинь...если бы стандартные контейнеры вытворяли такие трюки?).
    Если кажется что массив нулевой длины не имеет смысла - то можно сообщить об этом юзеру, я думаю, так вернее.

    Код (Text):
    a = new int[abs(len)];
    этот код еще более невероятен. Т.е. юзер хочет создать массив отрицательной длины, но мы вместо того чтобы сказать ему что он дyрак [уберите к черту этот дебильный плагин с форума(который заменяет ругательные слова на всякую ерунду дyрак - это игра, зачем заменять это слово на "мир"?)] создадим массив какой-то левой длины, но само значение длины оставим отрицательным. Т.е. память мы зачем то выделим, но программа работать не будет. Посмотри все же на стандартные контейнеры, я думаю, они работают так как работают, потому что именно такой реакции на всякие кривые данные ожидает большинство программистов.
     
  12. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    ну на счёт длины абсолютно прав))
    нет конечно и в общем тоже (чего таить)

    просто моя цель была,чтобы программа в любом случае не падала
    + программа так тривиальна что не хочется её усложнять
    различными вещами,которые обычно необходимы\полезны\удобны\т.д.
     
  13. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    ну так-то да
     
Загрузка...

Поделиться этой страницей