Форум программистов, компьютерный форум CyberForum.ru

Граммотное пояснение. - C++

Войти
Регистрация
Восстановить пароль
 
Вася1q
 Аватар для Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
09.12.2011, 17:42     Граммотное пояснение. #1
Здравствуйте форумчане!
Помогите пожалуйста грамотно (!) объяснить действия выполняющиеся в этом куске программы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{  
   int max = 1;
   for (int i = 2; i <= size; i++)
      if (ar[i] > ar[max])
         max = i;
         
   int min = max+1;
   for (int i = min; i <= size; i++)
      if (ar[i] < ar[min])
         min = i;
   return ar[min];
}
int assign_c (int *ar, int size)
{
    int k = 0;
    for (int i = 1; i < size; i++)
    if ((ar[i] < 0) && (ar[i+1] > 0))
         k++;
   return k;
}
Думаю для Вас это не составит особого труда.

Добавлено через 36 секунд
Только пожалуйста поподробнее. Я новичок в этом деле.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
 Аватар для co6ak
406 / 499 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
09.12.2011, 17:53     Граммотное пояснение. #2
max - индекс максимального эл-та в массиве ( тока я хз почему 1, а не 0. ну да ладно )
первый цикл находит максимум.
второй цикл, с элемента под индексом "максимальный + 1" идет до конца и ищет минимум в оставшемся куске массива
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.12.2011, 17:55     Граммотное пояснение. #3
Вася1q, Вы бы лучше всю программу выложили. Есть большие подозрения, что она некорректная. Либо в ней очень уж извращаются с кодом.
Вася1q
 Аватар для Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
09.12.2011, 18:35  [ТС]     Граммотное пояснение. #4
fasked, почему же? Вот весь код:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <fstream>
using namespace std;
int assign_a (int *ar, int size) //size - размер массива (в данном случае число дней)
{
   for (int i = 1; i <= size; i++)
      if (ar[i] > 0)
   return i;
   return 0;            
}
int assign_b (int *ar, int size) //assign_Здесь буква задания(a, size)
{  
   int max = 1;
   for (int i = 2; i <= size; i++)
      if (ar[i] > ar[max])
         max = i;
         
   int min = max+1;
   for (int i = min; i <= size; i++)
      if (ar[i] < ar[min])
         min = i;
   return ar[min];
}
int assign_c (int *ar, int size)
{
    int k = 0;
    for (int i = 1; i < size; i++)
    if ((ar[i] < 0) && (ar[i+1] > 0))
         k++;
   return k;
}
int main(void)
{
   int n = 0, a[40];
   ifstream f;
   f.open("D:\\temperatura.txt");
   if (f) {
      while(!f.eof()) {
         n++;
         f >> a[n];
      }
      f.close();
      for(int i = 1; i <= n - 1;i++)
         cout << a[i] << " ";
      cout << endl << endl;
   }
int *aPtr = a;//aPtr - это указатель на область памати, в которой храниться массив a.
int size = n - 1;
cout << "Число дней: " << size << endl;
cout << "день, когда первый раз температура поднялась выше нуля: " << assign_a(aPtr, size) << endl;
cout << "минимальную температуру тех дней  ноября, которые следуют после последнего из самых теплых дней в этом месяце: "<< assign_b(aPtr, size) << endl;
cout << "столько раз в ноябре температура меняла знак : " << assign_c(aPtr, size) << endl;
system("pause");
return 0;
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
09.12.2011, 18:47     Граммотное пояснение. #5
Цитата Сообщение от Вася1q Посмотреть сообщение
почему же?
6 строка:
C++
1
for (int i = 1; i <= size; i++)
Выход за границы массива в случае, если нет ни одного положительного числа.
14 строка:
C++
1
for (int i = 2; i <= size; i++)
Выход за границы массива.
19 строка:
C++
1
for (int i = min; i <= size; i++)
Выход за границы массива.
28 строка:
C++
1
if ((ar[i] < 0) && (ar[i+1] > 0))
Выход за границы массива.
Вася1q
 Аватар для Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
09.12.2011, 19:28  [ТС]     Граммотное пояснение. #6
Цитата Сообщение от fasked Посмотреть сообщение
Выход за границы массива в случае, если нет ни одного положительного числа.
Я ввожу температуру сам. И по условию она должна быть и в плюсовом диапазоне и минусовом.
Я понял, что выход границы я не предусмотрел, но это мне честно говоря и не нужно. Я сам ввожу данные. Помогите лучше с пояснением.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.12.2011, 21:10     Граммотное пояснение. #7
Цитата Сообщение от Вася1q Посмотреть сообщение
Я понял, что выход границы я не предусмотрел, но это мне честно говоря и не нужно. Я сам ввожу данные. Помогите лучше с пояснением
Написали код, и сами не поняли, что он делает? Круто.

1) Заполняется массив из файла.
2) Выводится на экран
3) Создается указатель на 1-й элемент массива.
4) Заводится переменная size.
5) Вызывается assign_a, которая возвращает первый день, когда температура была выше нуля, либо 0
6) Вызывается assign_b, в котором сначала находится положение максимального элемента, затем положение минимального. Возвращает минимальный элемент.
7) Ну и наконец вызывается assign_c, которая, якобы, подсчитывает перемену знака. На самом деле, если разобраться везде с первым элементом(а его упорно игнорируют на протяжении всей программы), то эта функция валится на тесте -1 1 -1 1, выдавая ответ 2, хотя тут 3 раза меняется знак.

Приводите в божеский вид, а пока "два балла, низачот"
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,110
10.12.2011, 09:07     Граммотное пояснение. #8
Цитата Сообщение от soon Посмотреть сообщение
его упорно игнорируют на протяжении всей программы
Не знаю, может у меня компилятор какой то не такой, но его упорно игнорируют на протяжении всей программы, потому что он - мусор. То есть если в файле есть последовательность 1 2 3 4 5, то в массиве будет последовательность x 1 2 3 4 5. Во всяком случае у меня именно так. Отсюда, fasked, и "выход за границы массива". Попросил бы Вас написать что у вас выводят эти 2 строки:
C++
1
2
 for(int i = 0; i < n;i++)
         cout << a[i] << " ";
Хотя да, не могу частично не согласиться с 7 пунктом soon, следовало бы написать так:
C++
1
2
3
4
5
6
7
8
int assign_c (int *ar, int size)
{
    int k = 0;
    for (int i = 1; i < size; i++)
    if ((ar[i] < 0) && (ar[i+1] > 0) || (ar[i] > 0) && (ar[i+1] < 0))
         k++;
   return k;
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.12.2011, 10:15     Граммотное пояснение. #9
Цитата Сообщение от dimcoder Посмотреть сообщение
в массиве будет последовательность x 1 2 3 4 5
Она такая будет, потому, что
Цитата Сообщение от Вася1q Посмотреть сообщение
C++
1
2
3
4
while(!f.eof()) {
    n++;
    f >> a[n];
}
Сначала n инкрементируется, а потом считывается в a[1]. Так что это именно косяк при работе с массивом.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,110
10.12.2011, 11:25     Граммотное пояснение. #10
Здесь косяков вроде нет:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
 
int assign_a (int *ar, int size)
{
   for (int i = 0; i < size; i++)
      if (ar[i] > 0)
     return i;
   return 0;            //not found
}
 
int assign_b (int *ar, int size)
{
   int max = 0;
   for (int i = 1; i < size; i++)
      if (ar[i] >= ar[max])
     max = i;
 
   if (max == size-1)     //Esli maximal element - posledniy
   {
      cout << "!!!No items found...!!!\n!!!Zero will be returned.!!!" << endl;
      return 0;
   }
 
   int min = max+1;
 
   for (i = min; i < size; i++)
      if (ar[i] < ar[min])
     min = i;
   return ar[min];
}
 
int assign_c (int *ar, int size)
{
   int k = 0;
 
   for (int i = 0; i < size-1; i++)
      if ((ar[i] < 0) && (ar[i+1] > 0) || (ar[i] > 0) && (ar[i+1] < 0))
     k++;
   return k;
}
 
main()
{
   int n = 0, a[40];
 
   ifstream f;
 
   f.open("D:\\temper.txt");
   if (f)
   {
      for (n = 0; !f.eof(); n++)
      {
     f >> a[n];
      }
 
      n--;
 
      f.close();
 
      for(int i = 0; i < n; i++)
     cout << a[i] << " ";
 
      cout << endl << endl;
   }
 
  int *aPtr = a;
 
  int size = n;
 
  cout << "size = " << size << endl;
  cout << "Min after NULL = " << assign_a(aPtr, size) << endl;
  cout << "The minimal temperature after the maximal temperature: "
       << assign_b(aPtr, size) << endl;
  cout << "Number of the sign-changing: " << assign_c(aPtr, size) << endl;
 
  getch();
 
  clrscr();
 
  return 0;
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
10.12.2011, 17:51     Граммотное пояснение. #11
Цитата Сообщение от dimcoder Посмотреть сообщение
Хотя да, не могу частично не согласиться с 7 пунктом soon, следовало бы написать так:
C++
1
2
3
4
5
6
7
8
int assign_c (int *ar, int size)
{
    int k = 0;
    for (int i = 1; i < size; i++)
    if ((ar[i] < 0) && (ar[i+1] > 0) || (ar[i] > 0) && (ar[i+1] < 0))
         k++;
   return k;
}
И снова возможен выход за границы массива
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,110
10.12.2011, 17:58     Граммотное пояснение. #12
fasked, см вторую программу, там все ок. А в этом фрагменте выхода нет, так как 0 элемент был некоторым мусором, из-за ошибки заполнения массива.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.12.2011, 18:17     Граммотное пояснение. #13
C++
1
2
3
4
5
6
7
for(int i = 0; i < size; ++i)
    sum += arr[i]
 
//////////////////////////////////////
 
for(int i = 1; i <= size; ++i)
    sum += arr[i]
Навскидку скажите, в каком коде с большей степенью вероятности будет выход за границу массива?
Так что правильно fasked говорит, путь даже там и нет выхода за границу, но писать так явно не стоит. Кто ж знает, что size передается на единицу меньше нормального значения?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,110
10.12.2011, 18:21     Граммотное пояснение. #14
Так я и не говорю, что это стилистически правильно и красиво.
BRcr
 Аватар для BRcr
4004 / 2293 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
10.12.2011, 18:22     Граммотное пояснение. #15
Цитата Сообщение от dimcoder Посмотреть сообщение
А в этом фрагменте выхода нет, так как 0 элемент был некоторым мусором, из-за ошибки заполнения массива.
Цитата Сообщение от dimcoder Посмотреть сообщение
C++
1
2
for (int i = 0; i < size-1; i++)
* * * if ((ar[i] < 0) && (ar[i+1] > 0) || (ar[i] > 0) && (ar[i+1] < 0))
Когда в цикле переменная i станет равна индексу последнего элемента массива, чем по вашему будет следующее обращение:
C++
1
ar[i+1]
Не выходом ли за границы массива?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.12.2011, 18:35     Граммотное пояснение. #16
Цитата Сообщение от dimcoder Посмотреть сообщение
Так я и не говорю, что это стилистически правильно и красиво.
Да я, в принципе, не про вас. В большей степени про ситуацию

Добавлено через 10 минут
Цитата Сообщение от BRcr Посмотреть сообщение
Не выходом ли за границы массива?
Кстати да, я тут тоже сглупил. В программе ТС переменная size была на 1 меньше реального количества элементов, поэтому там все хитрым образом не падало. А в программе
dimcoder-а, либо не выведется последний элемент в массиве, либо выйдет за границы массива.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,110
10.12.2011, 18:49     Граммотное пояснение. #17
Цитата Сообщение от BRcr Посмотреть сообщение
когда в цикле переменная i станет равна индексу последнего элемента
Не станет:
C++
1
i < size-1;
+
C++
1
n--;
в начале программы. Ну никак не выйдет.
soon, честно говоря не въехал в предложение:
Цитата Сообщение от soon Посмотреть сообщение
либо не выведется последний элемент в массиве, либо выйдет за границы массива.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.12.2011, 19:12     Граммотное пояснение. #18

Не по теме:

Цитата Сообщение от dimcoder Посмотреть сообщение
либо не выведется последний элемент в массиве, либо выйдет за границы массива.
Поясню. Если запустить это под виндой
C++
1
2
3
for(n = 0; !f.eof(); ++n)
        f >> tmp;
    std::cout << n;
И в текстовом файле будет одна едиственная цифра - "1", то вывод будтет 1. А если под линуксом, то уже 2.


Касательно программы. Ну, как я уже сказал, при тесте "1" в int main n станет равной 0, и не выведется единственный элемент массива. Он выведется, если добавить в файл \n. В общем, это будет зависеть от того, как представлены данные в файле. Так что можете это замечание просто проигнорировать
Касательно выхода за границу. Я не помню(смешно звучит, но это так), что именно меня смутило в вашей программе, и при повторном изучении, я не вспомнил, за что я тогда зацепился, поэтому приношу свои извинения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2011, 19:15     Граммотное пояснение.
Еще ссылки по теме:

C++ Пояснение typedef
Пояснение по синтаксису C++
C++ Пояснение рекурсии в Ханойских башнях
Пояснение структуры ORDER C++
C++ Дайте пояснение о рекурсии функции

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

Или воспользуйтесь поиском по форуму:
BRcr
 Аватар для BRcr
4004 / 2293 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
10.12.2011, 19:15     Граммотное пояснение. #19
Цитата Сообщение от dimcoder Посмотреть сообщение
Не станет:
C++
1
i < size-1;
ну да, точно - не станет... ну и кривущее же решение!
Yandex
Объявления
10.12.2011, 19:15     Граммотное пояснение.
Ответ Создать тему
Опции темы

Текущее время: 12:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru