21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте форумчане!
Помогите пожалуйста грамотно (!) объяснить действия выполняющиеся в этом куске программы.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2011, 17:42
Ответы с готовыми решениями:

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

Пояснение функции
Пожалуйста объясните что делает функция, если можно с пояснением знака -&gt;, про указатели я знаю. ...

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

Пояснение к функциям
Есть 2 функции. Не могли бы вы прокомментировать их. Или подробно описать что они делают. Заранее...

18
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
09.12.2011, 17:53 2
max - индекс максимального эл-та в массиве ( тока я хз почему 1, а не 0. ну да ладно )
первый цикл находит максимум.
второй цикл, с элемента под индексом "максимальный + 1" идет до конца и ищет минимум в оставшемся куске массива
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
09.12.2011, 17:55 3
Вася1q, Вы бы лучше всю программу выложили. Есть большие подозрения, что она некорректная. Либо в ней очень уж извращаются с кодом.
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
09.12.2011, 19:28  [ТС] 6
Цитата Сообщение от fasked Посмотреть сообщение
Выход за границы массива в случае, если нет ни одного положительного числа.
Я ввожу температуру сам. И по условию она должна быть и в плюсовом диапазоне и минусовом.
Я понял, что выход границы я не предусмотрел, но это мне честно говоря и не нужно. Я сам ввожу данные. Помогите лучше с пояснением.
0
2554 / 1319 / 178
Регистрация: 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
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
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
2554 / 1319 / 178
Регистрация: 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
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
10.12.2011, 17:58 12
fasked, см вторую программу, там все ок. А в этом фрагменте выхода нет, так как 0 элемент был некоторым мусором, из-за ошибки заполнения массива.
0
2554 / 1319 / 178
Регистрация: 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
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
10.12.2011, 18:21 14
Так я и не говорю, что это стилистически правильно и красиво.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.12.2011, 18:35 16
Цитата Сообщение от dimcoder Посмотреть сообщение
Так я и не говорю, что это стилистически правильно и красиво.
Да я, в принципе, не про вас. В большей степени про ситуацию

Добавлено через 10 минут
Цитата Сообщение от BRcr Посмотреть сообщение
Не выходом ли за границы массива?
Кстати да, я тут тоже сглупил. В программе ТС переменная size была на 1 меньше реального количества элементов, поэтому там все хитрым образом не падало. А в программе
dimcoder-а, либо не выведется последний элемент в массиве, либо выйдет за границы массива.
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
10.12.2011, 18:49 17
Цитата Сообщение от BRcr Посмотреть сообщение
когда в цикле переменная i станет равна индексу последнего элемента
Не станет:
C++
1
i < size-1;
+
C++
1
n--;
в начале программы. Ну никак не выйдет.
soon, честно говоря не въехал в предложение:
Цитата Сообщение от soon Посмотреть сообщение
либо не выведется последний элемент в массиве, либо выйдет за границы массива.
0
2554 / 1319 / 178
Регистрация: 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. В общем, это будет зависеть от того, как представлены данные в файле. Так что можете это замечание просто проигнорировать
Касательно выхода за границу. Я не помню(смешно звучит, но это так), что именно меня смутило в вашей программе, и при повторном изучении, я не вспомнил, за что я тогда зацепился, поэтому приношу свои извинения.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.12.2011, 19:15 19
Цитата Сообщение от dimcoder Посмотреть сообщение
Не станет:
C++
1
i < size-1;
ну да, точно - не станет... ну и кривущее же решение!
0
10.12.2011, 19:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2011, 19:15
Помогаю со студенческими работами здесь

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

Пояснение по коду
Плиз хелп с кодом, если не сложно, напишите комментарии к // Add // Remove // Get, не понимаю, что...

Пояснение по шаблонам2
ISO 14882:2003 14.5.4.3/2 Не понял каким образом при инстанцировании шаблона класса...

Пояснение по шаблонам
В стандарте 2003 года(ISO) 14.5.4/8 есть такая фраза: &quot;A non-type argument is non-specialized if...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru