Последние новости

YoungCoder теперь и на Stepikе. Записывайтесь: https://vk.cc/75rISy

Чтобы записаться на курс, необходимо зарегистрироваться на Степике: https://vk.cc/75rIC4

Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS

воскресенье, 21 июля 2013 г.

Занятие 12. Простейшие алгоритмы для работы с одномерными массивами. Программирование для начинающих.


Добрый день друзья. Продолжаем изучать одномерные массивы. Сегодня у нас важная тема. Изучим основные алгоритмы работы с массивами: поиск в массиве и его сортировка.
Почему я говорю, что этот урок важный? Просто обработка массивов, наряду с работой со строками,  это одна из самых типичных задач в программировании.  Ни для кого не секрет, компьютеры появились для решения вычислительных задач математики.  А вычислительные задачи, обычно связаны с большим объемом однотипных данных, которые где хранятся? Ага, правильно. Массивы.
Итак, не будем тянуть быка за хвост, ухватимся сразу за рога. Начнем с самого простого.


Поиск минимального элемента в массиве.

Поставим задачку. Пускай имеется массив из целых чисел. Необходимо среди всех элементов массива, найти элемент с минимальным значением. 
Это задачка даже не на одну трубку.  Сначала взгляните на картинку, и найдите в этом столбике минимальный элемент.

Рис.1 Одномерный массив
А теперь стоп.  Задумайтесь на секундочку, как вы это сделали? Скорее всего, вы пробежались по столбику глазами, и выявили там самое меньшее число.  Аналогичную процедуру должна выполнить и наша программа.
Первым делом следует подумать, где будет храниться минимальное значение. Для него необходима отдельная переменная. Назовем её min. Сохраним в неё значение первого элемента массива, чтобы нам было с чем сравнивать. Дальше нужно пройтись по массиву. Это не сложно, организуем для этого цикл. В работе с массивами в большинстве случаев используется цикл for. Так как там сразу же есть счетчик, который меняется  каждой итерации. Теперь основная часть алгоритма. Нам нужно последовательно сравнивать элементы массива с минимальным, и если окажется так, что элемент массива меньше минимального, то следует сохранить это значение вместо него.  Вот, в принципе, и весь алгоритм.
Теперь запишем это все в виде программы.

Листинг  12.1
#include <stdio.h> 
int main(){
      int min, arr[11]={5,14,7,4,11,2,6,12,8,7,3};
      min = arr[0];
      for (int i=1; i<11; i++){
            if (arr[i]<min)
                  min = arr[i];
      }
      printf("%d\n", min);
      return(0); 
}

Обратите внимание, что в данном случае мы задали элементы массива при его объявлении. Запомните этот способ, он тоже иногда бывает полезен.  Кстати, если бы мы объявили не все элементы, а лишь часть из них, то все остальные, автоматически заполнились бы нулями. Можете это проверить самостоятельно.

В дополнение к словесному описанию проиллюстрируем картинкой работу нашей программы.

Рис. 2 Иллюстрация поиска минимума в одномерном массиве.

Еще раз посмотрите приведенный выше код, вам должно быть в нем все понятно. Аналогично можно найти максимальный элемент в массиве.

Сортировка массива.

Теперь пускай нам необходимо отсортировать массив, например, по возрастанию. То есть в начале стоит самый маленький элемент, а в конце самый большой. Будем рассматривать самый простой алгоритм сортировки – сортировка обменом. Другое название этой сортировки - сортировка «пузырьком».

Рассмотрим, как говорит мой преподаватель по курсу «методы оптимизации», философию метода.
Для определенности будем считать, что имеем дело с целочисленным массивом.  Начиная с первого элемента, поочередно сравниваем  соседние элементы, т.е. первый и второй, второй и третий, третий и четвертый и так до конца массива. Если упорядоченность массива нарушена, то меняем эти элементы местами. Так как мы упорядочиваем массив по возрастанию, в нашем случае первый элемент должен быть меньше следующего.

Давайте рассмотрим иллюстрирующую этот шаг алгоритма картинку.

Рис. 3. Пример первого шага сортировки одномерного массива методом обмена.

Как видите,  самый тяжелый элемент – тонет, то есть опускается на самый низ. А более легкие элементы, как бы всплывают, как пузырьки в воде. Отсюда, в принципе, и название алгоритма. Как видите, после одного прохода алгоритма, на последнее место. Получается, после одного шага алгоритма один элемент уже точно занимает свое место, и при следующем проходе, нам уже нет необходимости сравнивать предпоследний и последний элемент, так как последний элемент уже на своем месте и ничего менять не придется, так зачем лишнее действие? Правильно, незачем. А мы и не будем.  
Повторяя описанную процедуру n-1 раз (здесь n – размерность массива) получим полностью отсортированный массив.

На следующем рисунке проиллюстрирована работа алгоритма, на примере небольшого массива.

Рис. 4. Иллюстрация сортировки массива методом "пузырька".
Приведем код реализации алгоритма сортировки пузырьком, на языке Си. Обратите внимание на поясняющие комментарии.

Листинг 12.2
#include <stdio.h> 
int main(){
      int n=6, // размерность массива 
            arr[6]={5,14,7,4,11,2}; // массив для сортировки 
      for (int i=n-1;i>0;i--)
            for (int j=0;j<i;j++)
                  if(arr[j]>arr[j+1]){ // если порядок нарушен 
                       //меняем j и j+1 элементы массива местами 
                        int temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=tmp;
                  }
      //выводим массив на экран 
                  for (int i=0;i<n; i++)
                        printf("%d\n", arr[i]);
      return(0); 
}

Помните, мы говорили, что на каждом шаге нам нужно сокращать длину основного цикла? Т.е. сначала проходим все элементы до n-1, на следующем шаге до n-2 и т.д.  В приведенном выше алгоритме это реализовано внешним циклом. Обратите внимание, что мы впервые используем направление цикла «сверху вниз». Т.е. движемся не от единицы к n, а наоборот, от n-1 к 1.

На этом сегодняшнее занятие окончено.

Задание для практической работы.

  • Задан целочисленный массив a. Написать программу, которая ищет максимальный элемент в массиве и выводит на экран его номер. Обратите внимание не значение, а номер элемента в массиве.
  • Задан целочисленный массив  arr[1000], в котором существует минимум 10 различных значений. Найти 10 по величине элемент массива.
  • Задан целочисленный массив arr[40] . Найти количество элементов массива,  которые по модулю меньше произвольного наперед заданного числа.  Вывести количество таких элементов в массиве. 
  • Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент.
  • В уроке был приведен кусок кода, в котором с помощью дополнительной переменной меняются местами два элемента массива.  Подумайте, как можно обменять значения двух переменных, не используя дополнительной переменной.  Т.е. например, int a=3, b=5; должно стать a=5, b=3; Помните, что использовать дополнительные переменные нельзя.

При выполнении заданий, помните о нашей договоренности, код программы оформлять в виде отдельных функций.

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

78 комментариев :

  1. Первых программ код пока выложить не могу т.к. компилятора под рукой нету, в блокноте все писал :-D не проверенное выкладывать не буду :)

    Так и не разобрался как в функцию передавать массив, вроде все должно быть так же, но что-то ошибки лезут одна за другой. Попробую еще разобраться, и надеюсь у вас в уроках то же это будет.

    Последняя задача:
    int a=3, b=5;
    a+=b; //а=3+5=8
    b=a-b;//b=8-5=3
    a-=b; //a=8-3=5
    ?

    p.s. на главной (http://youngcoder.blogspot.ru/p/blog-page_16.html) видно только 11 уроков :) Все ждал 12, а оказывается уже 13 вышел :-D

    ОтветитьУдалить
    Ответы
    1. Да, есть такой грешок. Сам как-то забыл про эту страницу.=) Чтобы не пропускать обновления, можете подписаться на нашу страницу https://vk.com/lang_c

      Да, это обязательно будет в уроках.
      Ну и последняя задача умаю не требует проверки. Вы же сами видите, что получилось так, как надо.

      Удалить
  2. Задан целочисленный массив arr[n], n не больше 1000.

    Мы такого не проходили :)
    Просто так задать массив размером n нельзя. Будет ругаться на неправильный размер.

    ОтветитьУдалить
    Ответы
    1. Знаю, что не проходили. Вообще можно, конечно, задать, только не совсем просто так. ) Может быть в будущем уроке расскажу про это.
      Но сейчас не об этом.
      В задании естественно подразумевалось, что можно просто задать массив arr[100], и не париться. ) Поправлю, чтобы не вызывало смущений.

      Удалить
  3. Вторая

    #include "stdio.h"
    #include "time.h"
    #include "locale.h"
    #include "stdlib.h"

    int main () {

    int arr[1000], n = 1000, j, k=0, i;

    srand(time(NULL));

    for (i = 0; i < n; i++) {
    arr[i] = rand()%101;
    }

    for (i = n-1; i > 0; i--) {
    for (j = 0; j < i; j++) {
    if (arr[j] > arr[j+1]) {
    arr[j]+=arr[j+1];
    arr[j+1]=arr[j]-arr[j+1];
    arr[j]-=arr[j+1];
    }
    }
    }

    for (i = 0; i < n; i++) {
    if (arr[i] < arr[i+1]) {
    k++;
    if ( k == 10) {
    printf("\n10й по величине элемент массива: %d", arr[i]);
    }
    }
    }
    return (0);
    }

    ОтветитьУдалить
    Ответы
    1. Дима добрый день. Я не проверял на компиляторе, думаю вы сделали это сами, но сам ход мысли правильный. Хотя это не самый оптимальный способ решения. =)
      Оптимальность в смысле количество элементарных операций выполняемых в программе. Элементарные операции это присваивание, сложение, вычитание, умножение, деление, сравнение.

      Если это интересно, могу об этом рассказать. )

      Удалить
  4. //1st task
    #include
    int main(){
    int mas[7]={25, 14, 32, 27, 21, 5, 16}, max, n;
    max=mas[0];
    for (int i=1; i<7; i++)
    if (max<mas[i])
    {
    max=mas[i];
    n=i;
    }
    printf("No of max value %d\n", n);
    return(0);
    }

    ОтветитьУдалить
  5. //2nd task
    #include
    int main()
    {
    int arr[1000]={25, 14, 32, 27, 21, 5, 16, 50, 17, 34, 58, 41, 92, 12, 37}, n=0;
    for (int i=0; i<1000; i++)
    if (n<arr[i])
    n=arr[i];
    int big[10]={n};
    for (int i=1; i<10; i++)
    for (int j=0;j<1000; j++)
    if (big[i]<arr[j]&&arr[j]<big[i-1])
    big[i]=arr[j];
    printf("10th biggest number %d\n", big[9]);
    return(0);
    }

    ОтветитьУдалить
  6. //3rd task
    #include "stdio.h"
    int main()
    {
    int arr[40]={15, 41, 21, 64, 72, 19, 31, 4, 17, 9, 12, 34, 10, 37, 45}, def, var, cnt=0;
    printf("pls enter the number\n");
    scanf("%d", &def);
    for (int i=0; i<40; i++)
    {
    if (arr[i]<0)
    var=arr[i]*-1;
    else
    var=arr[i];
    if (var<def&&var!=0)
    cnt++;
    }//for
    printf("quantity of numbers less than defined - %d\n", cnt);
    return (0);
    }//main

    ОтветитьУдалить
    Ответы
    1. Хорошо, но свистопляска с модулем лишняя. Можно было использовать стандартную функцию.Хотя все равно, все правильно. )

      Удалить
  7. первая:

    #include
    #include
    #include

    using namespace std;

    int main(){
    int arr[5] = {3,444,5,1,33};//nomera yacheek massiva s 0
    int n=5;
    int max=0;
    int k=0;
    max = arr[0];
    for (int i=0; i<n; i++){
    if(max < arr[i]){
    max = arr[i];
    k = i;
    }

    }
    cout << "index naibolwego elementa - " << k << endl;
    system ("pause");
    }

    ОтветитьУдалить
  8. Задание 1

    #include "stdio.h"
    #define n 4
    int main()
    {
    int m[n],i,max,b=0;
    printf("Vvedite massiv\n");
    for(i=0;i<n;i++)
    scanf("%d",&m[i]);
    printf("Ishodnii massiv:\n");
    max=m[0];
    for(i=0;i<n;i++)
    printf("%3d",m[i]);
    for(i=1;i<n;i++)
    if(max<m[i])
    {
    max=m[i];
    b=i;
    }
    printf("\nMax element :%d",max);
    printf("\nNomer elementa v massive %d\n",b);// первый элемент=m[0]
    //можно написать b+1 для облегчения
    }

    ОтветитьУдалить
    Ответы
    1. Задание 2

      #include"stdio.h"
      //#include
      #define n 10
      int main()
      {
      int m[n],i,b;
      printf("Vvedite massiv iz %d elementov\n",n);
      for(i=0;i0;j--)
      for(i=0;im[i+1])
      {
      int temp=m[i];
      m[i]=m[i+1];
      m[i+1]=temp;
      }
      printf("\nSortirovannii massiv:\n");
      for(i=0;i<n;i++)
      printf("%4d",m[i]);
      printf("\nIskomoe chislo %d po velechine: \n%3d\n",b,m[b-1]);
      return 0;
      }

      Удалить
    2. Задание 3

      #include
      #define n 10
      int main()
      {
      int m[n],x,i,b=0;
      printf("Vvedite massiv iz %d elementov\n",n);
      for(i=0;i<n;i++)
      scanf("%d",&m[i]);
      printf("Vvedite chislo:\n");
      scanf("%d",&x);
      for(i=0;i<n;i++)
      {
      if(m[i]<0)
      m[i]=m[i]*(-1);
      if(m[i]<x)
      b++;
      }
      printf("\nKolichestvo chisel po moduly,menshih zadannogo:%3d\n",b);
      return 0;
      }

      Удалить
    3. Задание 4

      #include"stdio.h"
      #define n 10
      int main()
      {
      int m[n],i;
      printf("Vvedite massiv iz %d elementov\n",n);
      for(i=0;i<n;i++)
      scanf("%d",&m[i]);
      for(i=0;i<n;i++)
      {
      if(m[i]<0)
      {
      printf("Yes\n");
      return 0;
      }
      }
      printf("No");
      return 0;
      }

      Удалить
    4. Задание 5

      #include"stdio.h"
      int main()
      {
      int a=3,b=5;
      b=b+a;
      a=b-a;
      b=b-a;
      printf("%d%2d\n",a,b);
      }

      Удалить
    5. 1. Много лишнего. Но работает. И еще, если вы используете именованные константы через DEFINE, то обычно их принято обозначать большими буквами
      #define N 4

      2. Это даже не скомпилируется.))
      3. Нормально.
      4. Хорошо.
      5. Да.

      Удалить
    6. На счет первого согласен)
      Не понимаю...Куда-то съедаются символы...
      Скину по частям

      #include
      //#include
      #define n 10
      int main()
      {
      int m[n],i,b;
      printf("Vvedite massiv iz %d elementov\n",n);
      for(i=0;i<n;i++)
      scanf("%d",&m[i]); //m[i]=rand()%100
      printf("Vvedite iskomoe chislo po velechine\n");
      scanf("%d",&b);
      printf("Ishodnii massiv:\n");
      for(i=0;i<n;i++)
      printf("%4d",m[i]);

      Удалить
    7. for(int j=n-1;j>0;j--)
      for(i=0;i<j;i++)

      Удалить
    8. if(m[i]>m[i+1])
      {
      int temp=m[i];
      m[i]=m[i+1];
      m[i+1]=temp;
      }
      printf("\nSortirovannii massiv:\n");
      for(i=0;i<n;i++)
      printf("%4d",m[i]);
      printf("\nIskomoe chislo %d po velechine: \n%3d\n",b,m[b-1]);
      return 0;
      }

      Удалить
    9. скажите мне идею решения. =)))

      Удалить
    10. Так)
      Значит!Сортируем массив по возрастанию.После ищем число заданное пользователем(число по величине)...Или задание состояло не в этом?

      Удалить
    11. Можно, но затратно. Сортировка, например пузырьком это n^2 операций.
      представьте, что у вас массив из 1000 элементов.

      Можно проще и эффективнее. Хотя мне кажется в своей программе вы еще не учли, что цифры могут повторяться.))

      Удалить
  9. ZADANIE 1:

    #include
    int main()
    {
    int n,i;
    printf("Vvedite razmernost massiva \n");
    scanf("%d",&n);
    int mass[n];
    for (int i=0;i0;i--)
    if (mass[i]>max)
    {
    i=max;
    }
    printf("Naibolshee znachenie=%d\n", max);

    return (0);

    ОтветитьУдалить
    Ответы
    1. Нет, не правильно. Так просто нельзя создать массив размерность [n]. Ну и конечно же не оформлено функцией.

      Удалить
    2. В остальных программах такие же ошибки.

      Удалить
  10. #include
    int main()
    {
    int n,i;
    printf("Vvedite razmernost massiva \n");
    scanf("%d",&n);
    int mass[n];
    for (int i=0;i0;i--)
    if (mass[i]>max)
    {
    i=max;
    }
    printf("Naibolshee znachenie=%d\n", max);

    return (0);
    }

    ОтветитьУдалить
  11. Задание 2

    #include
    int main()
    {
    int mass[1000],tmp;
    for (int i=0; i<=999;i++)
    for (int i=999;i>0;i--)
    for (int j=0;jmass[j+1]){
    tmp=mass[j];
    mass[j]=mass[j+1];
    mass[j+1]=tmp;
    }
    printf("10-y elment massiva=%D \n", mass[990]);

    return (0);
    }

    ОтветитьУдалить
  12. #include
    int main()
    {
    int mass[1000],tmp;

    for (int i=999;i>0;i--)
    for (int j=0;jmass[j+1]){
    tmp=mass[j];
    mass[j]=mass[j+1];
    mass[j+1]=tmp;
    }
    printf("10-y elment massiva=%D \n", mass[990]);

    return (0);
    }

    ОтветитьУдалить
    Ответы
    1. Эта программа работает неправильно. Вы не учли, что элементы в массиве могут повторяться. )

      Удалить
  13. задание 2
    #include (())// задание 2
    #include (())
    int main ()
    {
    int arr[1000], i,n,vr;
    for (i = 0; i < 1000; i++) {//for1 заполнение массива случайными числами
    arr[i] = rand()%101;
    }//for1
    for (n=0; n<998; n++){//for 2 сортировка max-->min
    for (i=0; i<(999-n); i++){//for3
    if (arr[i] < arr[i+1]){
    vr=arr[i];
    arr[i]= arr[i+1];
    arr[i+1]=vr;
    }//if
    }//for3
    }//for2
    n=1;
    i=0;
    while(n<10){// while поиск 10-го
    if (arr[i]>arr[i+1]) n+=1;
    if (n==10) printf("\n %d", arr[i+1]);
    i++;
    }//while
    printf("\n");
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. Суть верна, и ответ скорее всего правильный. Но можно сделать оптимальнее. =)))

      Удалить
  14. задание 2
    #include ((stdio.h))// задание 2
    #include ((math.h))
    int main ()
    {
    int arr[40],n=0, i,A;
    printf ("zadaite chislo\n");
    scanf( "%d",&A);
    printf("Vvedite dannye massiva\n");
    for (i=0; i<(40); i++){//for ввод массива и расчёт кол-ва чисел с меньшим модулем
    scanf(" %d", &arr[i]);
    if (abs(arr[i]) < A) n++;
    }//for
    printf(" kol-vo chisel po modulyu < %d ravno %d \n",A,n);
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. блин! это задание 3

      Удалить
    2. Вы не оформили свою программу в виде функции. Это плохо.
      Еще плохо, что вы пишите число 40 постоянно. Лучше обозначить это переменной, или даже константой. Чтобы можно было быстро изменять количество элементов.

      Удалить
  15. //задание 4
    #include "stdio.h"

    int mis(int bam[], int);

    int main()
    {
    int arra[7];
    mis(arra, 7);
    }


    int mis( int arr[], int k)
    {
    //Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент.
    int i, j;
    j = 0;


    for ( i = 0; i < k; i++)
    {
    printf("vvodim %d 4len massiva \n", i + 1);
    scanf_s("%d", &arr[i], 1);

    if(arr[i] < 0)
    {
    j++;
    }
    }
    if( j > 0)
    {
    printf("bingo! I found minus!\n");
    }
    else
    {
    printf("=((((((((\n");
    }
    return 0;
    }

    ОтветитьУдалить
    Ответы
    1. Иван, к сожалению нет. Массив сначала нужно создать в программе, а потом уже передать его в функцию, которая определит есть ли в нем отрицательные элементы или нет. )) Переделайте, я думаю у вас легко это получится.

      Удалить
    2. #include "stdio.h"

      int mis(int arr[], int);

      int main()
      {

      int i;
      int arra[7];

      for ( i = 0; i < 7; i++)
      {
      printf("vvodim %d 4len massiva \n", i + 1);
      scanf_s("%d", &arra[i], 1);

      }
      mis(arra, 7);
      return 0;
      }

      int mis( int arr[], int k)
      {
      int minus = 0;
      int i;
      //Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент
      for ( i = 0; i < k; i++)
      {
      if(arr[i] < 0)
      {
      minus = 1;
      }
      }

      if(minus == 0)
      {
      printf("positive\n");
      }
      else
      {
      printf("negative\n");
      }
      return 0;
      }

      Удалить
    3. Я надеюсь вы сами проверили и у вас все работает. Теперь поговорим о другом.
      Старайтесь избегать вот таких непонятных чисел, как у вас семерка. Представьте, что у вас 20 разных циклов. Если нужно поменять длину массива с 7 на 100, вам придется изменить её везде. Это неудобно. Для таких целей используйте именованные константы. Подробнее о них в 20 уроке http://youngcoder.blogspot.ru/2013/12/osobennosti-chikla-for-imenovannie-constanty.html
      Задали один раз, и всем все понятно, что это и как это.))

      И второе. Можно несколько упростить вашу функцию. Вам ведь достаточно встретить один элемент отрицательный, и после этого остальной массив не проверять. Так используйте это для сокращения кода программы. =)

      Удалить
    4. #include "stdio.h"
      # define N 7

      int mis(int arr[], int);

      int main()
      {

      int i;
      int arra[N];

      for ( i = 0; i < N && (arra[i - 1] >= 0); i++)
      {
      printf("vvodim %d 4len massiva \n", i + 1);
      scanf("%d", &arra[i]);

      }
      mis(arra, N);
      return 0;
      }

      int mis( int arr[], int k)
      {
      int minus = 0;
      int i;
      //Составьте функцию, которая по заданному массиву определяет, есть ли в массиве хотя бы один отрицательный элемент
      for ( i = 0; i < k; i++)
      {
      if(arr[i] < 0)
      {
      minus = 1;

      }
      }

      if(minus == 0)
      {
      printf("positive\n");
      }
      else
      {
      printf("negative\n");
      }
      return 0;
      }

      Удалить
  16. KaDeaT спасибо за ваше время и нужные похвалы)) очень туго идет

    ОтветитьУдалить
  17. Задание 1
    #include "stdio.h>"
    int main(){
    int max,k=0,a[11]={1,14,24,32,88,4,12,54,22,3,4};
    max=a[0];
    for(int i=1; i<11; i++){
    if(a[i]>max)
    max=a[i];}
    for(int i=0; a[i]!=max; i++){
    k++;}
    printf("Nomer elementa massiva %d\n", k);
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. Не оптимально сначала искать максимальный элемент в массиве, а потом еще отдельно идти по массиву и определять его номер. Гораздо правильнее было бы завести дополнительную переменную, в которую сохранять номер максимального элемента.)

      Удалить
  18. #include
    #include
    #include

    int main()
    {
    int mas[7]={25, 14, 32, 27, 21, 5, 16}, max, n;
    max=mas[0];
    for (int i=1; i<7; i++)
    if (max<mas[i])
    {
    max=mas[i];
    n=i;
    }
    printf("max:%d\n", n);
    _getch();
    }

    написал я так вот..другие тоже так писали и вы им отвечали "хорошо", хотя программа работает как то странно...в чем проблема:без разницы какие числа у меня в массиве введены, выводится какая то цифра на экран, которая с номером массива не связанна...в данном случае выводится "Мах:2" ,хотя большее число стоит в массиве 3

    в чем проблемка?)прошу помощи

    ОтветитьУдалить
    Ответы
    1. Проблемка в невнимательности. )
      Нумерация элементов массива начинается с нуля. Именно поэтому всё не так как нужно. Более того, в вашей программе первый элемент вообще не проверяется. Т.е. если там будет максимальный элемент, то он не найдется.

      Удалить
    2. Спасибо, быстро и доступно понятно)

      Удалить
  19. #include
    #include
    #include

    int main()
    {
    int arr[40],n,a=0,b,c=0;

    printf("Vvedite 4islo:");
    scanf_s("%d",&b);

    for(int i=0;i<40;i++)
    {
    printf("Vvedite 4islo dlja massiva:");
    scanf_s("%d",&n);
    arr[i]=n;
    a++;
    if(n==0)
    {
    break;
    }
    }
    for(int i=0;i<a-1;i++)
    if(arr[i]<b)
    {
    c++;
    }
    printf("koli4estwo elementow w massive menjsche vvedennogo 4isla:%d",c);
    _getch();
    }

    ОтветитьУдалить
  20. #include
    #include
    #include

    int main()
    {
    int arr[40],n,a=0,c=0;

    for(int i=0;i<40;i++)
    {
    printf("Vvedite 4islo dlja massiva:");
    scanf_s("%d",&n);
    arr[i]=n;
    a++;
    if(n==0)
    {
    break;
    }
    }
    for(int i=0;i<a-1;i++)
    if(arr[i]<0)
    {
    c++;
    }
    printf("negative numbers:%d",c);
    _getch();
    }

    впринципе почти тоже самое, что и в задании выше...если я правильно понял постановку задачи(

    ОтветитьУдалить
  21. #include
    int main(){
    int n=6, tmp=0,// размерность массива
    arr[6]={5,14,7,4,11,2}; // массив для сортировки
    for (int i=n-1;i>0;i--)
    for (int j=0;jarr[j+1]){ // если порядок нарушен
    //меняем j и j+1 элементы массива местами
    int temp=arr[j];
    arr[j]=arr[j+1];
    arr[j+1]=tmp;
    }
    //выводим массив на экран
    for (int i=0;i<n; i++)
    printf("%d\n", arr[i]);
    return(0);
    }

    best@mydebian:~/PROGRAMMIROVANIE$ gcc listing12.12.c -lm -std=c99 -o listing12.12
    best@mydebian:~/PROGRAMMIROVANIE$ ./listing12.12
    0
    0
    0
    2
    0
    0
    /////////////////////////////////////////////////////////
    Полностью переписал программу, только пришлось объявить tmp, и вот какой результат

    ОтветитьУдалить
    Ответы
    1. А вот это что такое?

      for (int j=0;jarr[j+1])

      Из-за этого ничего не работает.

      Ну и tmp не нужна, тут моя опечатка. В этой строке
      arr[j+1]=tmp;
      очевидно нужно temp.
      Если вы поняли алгоритм, то скорее всего должны были догадаться.
      .

      Удалить
  22. задача 4
    #include "stdio.h"
    #include "stdafx.h"
    int main(){
    int n=6, k=0;
    int a[6]={-5,-14,7,4,11,-2};
    for (int i=0;i<n;i++){
    if (a[i]<0) printf ("%d element\n", k+1);
    k++;}
    return(0);
    }

    код какой-то маленький совсем получился... но вроде работает! :)

    ОтветитьУдалить
    Ответы
    1. А теперь функцию, на вход которой подается массив, а она возвращает 1 если отрицательный элемент есть, в противном случае возвращает 0. ))

      Удалить
  23. http://ideone.com/Xrq966
    Попытался разбить на функции, так компилятор только ругается и пишет непонятные фразы типа: "результатом вычисления фрагмента не является функция, принимающая 0 аргументов", уже 2 дня сижу не могу понять в чем дело. Помогите пожалуйста.

    ОтветитьУдалить
    Ответы
    1. http://ideone.com/G8Bzl7
      Таки разобрался сам, извиняюсь за панику. Спасибо за проделанную работу, очень интересно потратить время с пользой, изучая ваши уроки.

      Удалить
    2. Добрый день.
      Спасибо за добрые слова.
      Во-первых, поздравляю, что вы самостоятельно разобрались со своими ошибками. Это залог успеха вас, как программиста.
      Во-вторых, есть и печальная новость. Ни одна из ваших программ не выполняет то действие, которое от нее требуется в задании.
      1 задача. Вы выводите сам максимальный элемент, а требуется вывести его позицию в массиве.
      2 задача. Начнем с того, что в вашем массиве нет 10 различных элементов.
      0, 1, 2, 5, 12, 24, 34, 54 - всего 8. ) Далее, пусть бы их было даже 10.
      arr[1000] = {1,2,3,4,5,6,7,8,9,1,2,10,11,12,13,1};
      в этом массиве встречаются следующие элементы
      0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
      десятый по величине элемент это число 9, ваша же программа выдает 4.
      Так что придется подумать еще немного.)

      Удалить
    3. Я считал 10-й по величине элемент начиная с самого большого. Вот зачем искал максимальное. Очевидно сам себя запутал

      Удалить
  24. Этот комментарий был удален автором.

    ОтветитьУдалить
  25. Задание №2

    Программа находит 10-ый по возрастанию элемент. Кроме задания принятия массива функцией все, вроде, верно.

    #include "stdio.h"
    int min (int arr[1000], int min=arr[0]) {
    for (int i=1; i<1001; i++) {
    if (arr[i]<min) {
    min=arr[i];
    }
    }
    return (min);
    }

    ОтветитьУдалить
    Ответы
    1. Вторая часть программы

      int main () {
      int arr[1000], min=arr[0], nextmin;
      nextmin=min (arr[1000], min);
      for (int i=1; i<11; i++) {
      for (int i=0; i<1001; i++) {
      if (arr[i]>min) {
      nextmin=arr[i];
      for (int i=1; i<1001; i++) {
      if (arr[i]<nextmin) {
      nextmin=arr[i];
      }
      }
      }
      }
      }
      printf ("%d", nextmin);
      return(0);
      }

      Удалить
  26. http://pastebin.ru/rp7XW8OW
    второе задание
    Никак не могу разобраться.Отсутствует заголовок футкции.Программа без функции работает

    ОтветитьУдалить
    Ответы
    1. Так у вас там точка с запятой стоит, она там не нужна.

      Если вы ставите точку с запятой то вы просто описываете прототип функции. В таких случаях где-то ниже снова нужно написать полный заголовок и тело функции. Обычно так делают когда функций очень много. Сначала пишут их прототипы, а рядом, в комментариях, подписывают что эта функция делает. А потом, уже в отдельном месте, обычно после все программы, дают полное описании функций.

      Кстати, это не единственная ошибка у вас. )

      Удалить
    2. http://pastebin.ru/4jH2aeAz
      С freopen сколько ни пытался не получается!С rand получилось.Что за причина?Выдает правильное число,в ручную считал.Но программа ругается

      Удалить
    3. Скорее всего у вас VS 2013. Дело в том, что с некоторых пор функция freopen, как и некоторые другие, признана небезопасной. Для того, чтобы ей пользоваться нужно в программе отключить предупреждения о небезопасных функциях. Для этого добавьте самой первой строкой
      #define _CRT_SECURE_NO_WARNINGS
      либо заменяйте её безопасным аналогом
      freopen_s().

      Удалить
    4. Спасибо,Кирилл!С этим делом разобрался насилу

      Удалить
  27. http://pastebin.ru/1bZcQVyI
    Добрый день.Почему программа ругается,как только выходишь на функцию?

    ОтветитьУдалить
    Ответы
    1. Добрый день, Александр.
      А как конкретно ругается-то? Пока вижу только одну ошибку. Вы создаете динамический массив, а удаляете потом другой массив.
      Кроме того, динамический массив mass нигде не используется. Зачем же тогда вы его сделали?

      Код я немного подкорректировал. Посмотрите, разберитесь. http://pastebin.ru/KoYsst8b

      Удалить
    2. Программа ругалась:Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) .Как теперь понятно из за new и delete.Спасибо за подсказку.Кирилл!А динамический массив можно заполнить только с клавиатуры,или другие способы годятся?

      Удалить
    3. Все способы пригодны.)

      Удалить
  28. http://pastebin.ru/CNvKgFyj
    Добрый день!
    Не могу передать через return два значения в функции "обмен".Подскажите,что тут сделать?
    Как я понял,return вообще плохо передаёт сложные переменные типа mass[i] или mass10 ?
    Программа сразу выдает,что передача возможна не на всех путях.Заранее благодарен!.

    ОтветитьУдалить
  29. //Задание 1
    #include
    #include

    int main()
    {
    int max, a[10];
    std::cout<<"Vvedite znachenia elementov massiva\n";
    for (int i=0; i<10; i++)
    {
    std::cout << "Element"<> a[i];
    }
    max=a[0];
    for (int i=0; i<11;i++)
    {
    if (a[i]>max)
    {
    max=a[i];
    }
    }
    std::cout << "Max=" << max <<"\n";
    return(0);
    }

    ОтветитьУдалить
    Ответы
    1. преобразил до неузнаваемости просто) понять как оно работало тут увы не выйдет

      Удалить
  30. //Задание 2
    #include
    #include
    #include
    #include

    int main()
    {
    setlocale(LC_ALL, "Rus");
    int arr[1000],temp,n=1000;

    int arr2[1000];
    srand(time(NULL));//Рандомайз вкл

    for(int i=0;i0;i--)
    {
    for(int j=0;jarr2[j+1])
    {
    arr2[j]+=arr2[j+1];
    arr2[j+1]=arr2[j]-arr2[j+1];
    arr2[j]-=arr[j+1];// упорядочил копию
    }
    }
    }
    std::cout<<"Элемент 10="<<arr2[10]<<"\n";
    for(int p=0;p<1000;p++)
    {
    if(arr[p]==arr2[10])
    {
    std::cout<<"10 по велечине элемент="<< p <<"\n";// при совпадении значения элементов Arr с 10 значением его копии
    }
    }
    return(0);// мне же нужно было номер элемента а не значение найти верно? я же не зря копию отсеевал.... не.... зря.....?Иначе потерял бы порядок значений и всё решилось бы на элемент 10 по значению = 10элемент :D
    }

    ОтветитьУдалить
    Ответы
    1. кароче смысла выкладывать не вижу.автор не побеспокоился о надлежащем подходе к написанию коментариев. больше половины текста порой сжирает( особенно при использовании iostream, но сканф меня доканал

      Удалить
  31. Этот комментарий был удален автором.

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.