Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
#1

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

09.12.2011, 17:42. Просмотров 740. Ответов 18
Метки нет (Все метки)

Здравствуйте форумчане!
Помогите пожалуйста грамотно (!) объяснить действия выполняющиеся в этом куске программы.
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 секунд
Только пожалуйста поподробнее. Я новичок в этом деле.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2011, 17:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Граммотное пояснение. (C++):

"СТРОКИ"(ГРАММОТНОЕ ОФОРМЛЕНИЕ) - C++
1)Задана запись, состоящая из букв. Количество букв кратно числу n.Всего в записи m слов.Длина слова- n.Составить структурированную...

Пояснение к коду - C++
Добрый день! Вопрос в следующем, есть конструктор объявленный в хелпе: virtual __fastcall TGIS_LayerSHP(); Я не понимаю...

Пояснение функции - C++
Пожалуйста объясните что делает функция, если можно с пояснением знака -&gt;, про указатели я знаю. void List::addElem2(int qt, int...

Пояснение к функциям - C++
Есть 2 функции. Не могли бы вы прокомментировать их. Или подробно описать что они делают. Заранее спасибо.bool MEqualsSth(void* first,...

Пояснение по синтаксису - C++
только не надо гнать в гугл, я не могу там найти, т.к. не могу правильно сформировать запрос... Код: //======================== ...

Пояснение typedef - C++
typedef bool (*comparator)(void* fisrt, void* second); что делает *comparator, и что это вобще ?

18
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
09.12.2011, 17:53 #2
max - индекс максимального эл-та в массиве ( тока я хз почему 1, а не 0. ну да ладно )
первый цикл находит максимум.
второй цикл, с элемента под индексом "максимальный + 1" идет до конца и ищет минимум в оставшемся куске массива
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.12.2011, 17:55 #3
Вася1q, Вы бы лучше всю программу выложили. Есть большие подозрения, что она некорректная. Либо в ней очень уж извращаются с кодом.
0
Вася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;
}
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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))
Выход за границы массива.
1
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
09.12.2011, 19:28  [ТС] #6
Цитата Сообщение от fasked Посмотреть сообщение
Выход за границы массива в случае, если нет ни одного положительного числа.
Я ввожу температуру сам. И по условию она должна быть и в плюсовом диапазоне и минусовом.
Я понял, что выход границы я не предусмотрел, но это мне честно говоря и не нужно. Я сам ввожу данные. Помогите лучше с пояснением.
0
soon
2542 / 1307 / 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 раза меняется знак.

Приводите в божеский вид, а пока "два балла, низачот"
1
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
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;
}
1
soon
2542 / 1307 / 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]. Так что это именно косяк при работе с массивом.
1
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
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;
}
1
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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;
}
И снова возможен выход за границы массива
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
10.12.2011, 17:58 #12
fasked, см вторую программу, там все ок. А в этом фрагменте выхода нет, так как 0 элемент был некоторым мусором, из-за ошибки заполнения массива.
0
soon
2542 / 1307 / 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 передается на единицу меньше нормального значения?
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,138
10.12.2011, 18:21 #14
Так я и не говорю, что это стилистически правильно и красиво.
0
BRcr
4009 / 2298 / 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]
Не выходом ли за границы массива?
0
10.12.2011, 18:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2011, 18:22
Привет! Вот еще темы с ответами:

Пояснение к готовой программе - C++
Ребзи, не могли бы вы помочь, написав мне пояснение к каждой строке программного кода?:) #include &quot;stdafx.h&quot; #include &quot;iostream&quot; ...

Нужно пояснение кода - C++
Не могу понять 2 части кода. Разъясните , пожалуйста). 1) cube ( nums , 10 ) . Для чего 10? Откуда она? Для чего nums там? 2) Не...

Пояснение структуры ORDER - C++
Народ помогите разобраться, код мне помогли накалякать с этого форума вот и некоторые непонятные строки есть, и выдает ваще какую то фигню,...

Пояснение побитовых операций - C++
Прошу объяснить на пальцах/на примере что значит следующая строчка, каким именно образом осуществляется сдвиг вправо на 4 разряда? что...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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