Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
1

Обработать результаты замеров температур: найти минимум, число изменений знака

27.11.2011, 13:56. Показов 1511. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача на линейный массив.
Здравствуйте форумчане) Помогите решить задачу. Хотя бы немного направьте меня в правильное русло. Вот условие:
Занести из файла в массив результаты измерений температуры воздуха, которые проводились ежедневно в течении ноября месяца. Определить: а) день, когда первый раз температура поднялась выше нуля; b) минимальную температуру тех дней ноября, которые следуют после последнего из самых теплых дней в этом месяце; с) сколько раз в ноябре температура меняла знак. Программную реализацию пункта b) оформить в виде функции, в которую необходимо передать в качестве параметра массив результатов ежедневных измерений температуры воздуха за ноябрь месяц.
Я создал на диске D файлик temperatura и написал часть кода:
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
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{  int n = 0; int a[30];
   ifstream f; // объявление потока для чтения
   f.open("D:\\temperatura.txt");
   if (f) {  cout << "Read file ! \n";
             while(!f.eof())
              { f >> a[n]; // чтение из файла
                n++;
              } f.close();
              for(int i=0;i < n;i++)
              cout << a[i] << " ";
          }
  else cout << "File not found \n";
  int b; int i;int j;  
  
  n =30;
  cout <<endl<<"n = ";
  cout << "Massiv a \n";
  for(j = 1; j <= n-1; j++)
     for(i = 0;i <= n-1-j; i++)
       if (a[i] > a[i+1])
         { b = a[i];
           a[i] = a[i+1];
           a[i+1] = b;
         }
  cout << "Massiv a \n";
  for(i = 0; i < n; i++)
     cout << a[i] << " ";
  cout << endl;
  system("pause");
   system("pause");
}
В общем из файла, который содержал 30 чисел наугад придуманные мной он сортирует их пузырьком. Подскажите правильно я начал решать эту задачу? Или можно по-другому ее реализовать?

Добавлено через 1 минуту
Перечитал свой пост))) извиняюсь за ошибки))

Добавлено через 26 минут
Форумчане, что ни у кого нет даже идей?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2011, 13:56
Ответы с готовыми решениями:

Найти количество изменений знака в последовательности
Задана последовательность целых чисел. Найти количество изменений знака в ней. Нужна программа на...

В целочисленном массиве найти число чередований знака, то есть число переходов с минуса на плюс или с плюса на минус.
В целочисленном массиве найти число чередований знака, то есть число переходов с минуса на плюс или...

Количество изменений знака +/- в столбце
Необходимо подсчитать кол-во изменений знака + на - и на оборот в одном столбце. подробнее в...

Найти число чередований знака
В массиве Z(m) найти число чередований знака, то есть число переходов с минуса на плюс или с плюса...

16
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
27.11.2011, 14:36 2
А зачем сортировать массив дней? Считываете массив из файла, а затем просто пишите функции для каждого из пунктов по очереди, вот и всё, передавая в них ссылку или указатель на массив.
1
1 / 1 / 0
Регистрация: 07.11.2011
Сообщений: 11
27.11.2011, 14:45 3
dimcoder, у меня похожая задача. Объясните пожалуйста поподробнее..
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
27.11.2011, 19:33  [ТС] 4
Цитата Сообщение от dimcoder Посмотреть сообщение
А зачем сортировать массив дней?
Я же говорю Вам, что запутался...единственное что я смог это как раз отсоритирвать, но как я понял мои старания оказались напрасны(
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
28.11.2011, 20:56  [ТС] 5
Ребята, натолкните меня в правильное русло)
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.11.2011, 17:31 6
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
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
 
int assign_a (int *ar, int size)
{
   for (int i = 1; i <= size; i++)
      if (ar[i] > 0)
     return i;
   return 0;            //not found
}
 
int assign_b (int *ar, int size)
{
   int max = 1;
   for (int i = 2; i <= size; i++)
      if (ar[i] > ar[max])
     max = i;
   if (max == size)
      cout << "There are no numbers after the maximal temperature." << endl;
   else
   {
   int min = max+1;
 
   for (i = min; i <= size; i++)
      if (ar[i] < ar[min])
     min = i;
   return ar[min];
   }
   return 0;
}
 
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:\\temper.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;
 
  int size = n - 1;
 
  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
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
29.11.2011, 18:00  [ТС] 7
dimcoder, спасибо)) сейчас пытаюсь разобраться с кодом, правда программа не компилируется((( пару ошибок выдает..

Добавлено через 12 минут
Может у меня что-то с компилятором? Заменил:
C++
1
2
#include <iostream.h>
#include <fstream.h>
на:
C++
1
2
#include <iostream>
#include <fstream>
добавил:
C++
1
using namespace std;
и продвинулся немного вперед. Где еще ошибки в коде могут быть?

Добавлено через 7 минут

вот ссылка на скрин с ошибкой.
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.11.2011, 18:02 8
Так ща посмотрим... Clrscr можете убрать (экран очищает). Надо подумать над ошибкой:
In function assing_b(int*, int)
name lookup of i changed for new ISO 'for' scoping using absolete binding at i
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
29.11.2011, 18:04  [ТС] 9
Я же отправил скрин)
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.11.2011, 18:13 10
Попробуйте заменить ваш код на следующий:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int assign_b (int *ar, int size)
{
   int max = 1;
   for (int i = 2; i <= size; i++)
      if (ar[i] > ar[max])
     max = i;
   int min = max+1;
 
   for (i = min; i <= size; i++)
      if (ar[i] < ar[min])
     min = i;
   return ar[min];
}
0
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
29.11.2011, 18:17  [ТС] 11
dimcoder, а что означает
C++
1
clrscr();
Добавлено через 2 минуты
Блин все -равно не выход скинь как весь код, а то я по ошибке кажется строку удалил лишнюю.
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.11.2011, 18:17 12
Цитата Сообщение от Вася1q Посмотреть сообщение
dimcoder, а что означает
Очистка экрана. Полезная функция. Предоставляется библиотекой conio.h


Цитата Сообщение от Вася1q Посмотреть сообщение
Блин все -равно не выход скинь как весь код, а то я по ошибке кажется строку удалил лишнюю.
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
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
 
int assign_a (int *ar, int size)
{
   for (int i = 1; i <= size; i++)
      if (ar[i] > 0)
     return i;
   return 0;            //not found
}
 
int assign_b (int *ar, int size)
{
   int max = 1;
   for (int i = 2; i <= size; i++)
      if (ar[i] > ar[max])
         max = i;
   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 = 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:\\temper.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;
 
  int size = n - 1;
 
  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
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
29.11.2011, 19:06  [ТС] 13
dimcoder, Все равно не идет...вроде все верно написано, уже каждую точку с запятой перепроверил(( Слушайте, а у вас есть Dev с++?

Добавлено через 35 минут
Наконец-то...хух...исправил)
dimcoder, если вам не сложно можете вкратце объяснить работу программы?
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
29.11.2011, 19:44 14
Насколько я понимаю, у Вас есть проблемы с пониманием, того как работает функция.
Ну начнём с того, что создаём массив из 40 элементов и записываем в него из файла значения. Т.к. про файлы предоставили код Вы, то предполагаю вы это понимаете.
-----------------------------------------------
C++
1
int *aPtr = a;
aPtr - это указатель на область памати, в которой храниться массив a. По сути массив a - это и есть указатель на область памяти, но константный.А следовательно строку кода:
C++
1
assign_a(aPtr, size)
мы могли бы записать как:
C++
1
assign_a(a, size)
Возможно Вы спросите, почему нельзя передать массив по значению, когда создаётся копия массива при передаче в функцию. Пример:
C++
1
assign_a(int a[], size)
Можно, но в случае передачи массива с помощью указателя, необходимость копировать весь массив отпадает - мы копируем указатель. Почему? Вес указателя в памяти - 2 байта. А указатель массива - кол-во элементов*2 байта (если работаем с int).

PS А так, я бы посоветовал Вам почитать литературу. Там обычно всё это грамматно расписывается, ну а если что - сразу на форум.

PS А лучше напишите, что конкретно не понятно (алгоритм или синтаксис), потому-что расписывать всю программу - это ппц.

PS Ну и если не секрет, где такое задание взяли\Вам дали?
1
21 / 21 / 3
Регистрация: 13.09.2011
Сообщений: 314
30.11.2011, 08:00  [ТС] 15
PS Ну и если не секрет, где такое задание взяли\Вам дали?[/QUOTE]
Задали в универе) 1 курс. Плохо объясняют много требуют... стараюсь не отставать. Спасибо еще раз огромное за помощь!

Добавлено через 5 минут
Еще один вопрос возник, а что означает "assign_a" точнее само выражение "assign"? Правильно ли я понял, что это присвоение значения?

Добавлено через 3 минуты
"(int *ar, int size)" поясните, пожалуйста, еще эту строчку...
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
30.11.2011, 11:09 16
assign_a - это просто имя функции. Assign - от assignment (задание). То есть вместо assign_a вы могли бы написать Moya_funciya или podprogramma. Но вообще то принято давать функциям осмысленные имена (summa, print_result).

Объявляется функция так:

Тип_возвращаемого_значение Имя_функции (параметры, то есть то что принимает функция извне)
{
//Тело функции
}

Пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int sum_a_b(int a, int b)
{
   int c;
   c = a + b;
   return c;   //return - возвратить
   //ну или просто можно было бы записать:
   //return a+b;
}
 
//Пример вызова функции:
 
main ()     //По факту - main это та же функция
{
   int per1, per2;
   cin >> per1 >> per2;
   cout << sum_a_b(per1, per2) << endl; //Пример вызова функции sum_a_b 
 
   getch();    //Остановка экрана
 
   return 0;
}
Тип возвращаемого значения - это то что функция возвращает туда, откуда её вызвали (в нашем случае - это int). То есть когда компилятор видит sum_a_b(per1, per2), он передаёт этой функции управление, она делает то, что от неё требуют (в нашем случае вычисляет сумму).

(int *ar, int size)

Представьте, что функция - это простая программа. И когда вам она требуется, вы её вызываете, и она возвращает вам результат её работы. Но программа может потребовать какие либо данные. В нашем случае, мы передаём ей массив и его размер. Мы их передаём их через этот список. В примере мы передаём ей per1 и per2. Но, она с именно с этими переменными не оперирует - она далает их копии и называет их a и b. В списке параметров, параметры перечисляются через запятую, каждый раз указывая тип переменной. Пример
int func(int a, int b)

Неправильно было бы записать так:
C++
1
int func(int a, b);
Иногда функция может и не брать и не возвращать никакого значения. Для этого существует тип void. Пример:
C++
1
2
3
4
void print_HELLO_WORLD(void)
{
   cout << "Hello world!" << endl;
}

Надеюсь, объяснил понятно , но опять же советую вам скачать какую нибудь книгу, коих валом в интернете, погуглите, там будут объяснять нормально.
1
0 / 0 / 0
Регистрация: 22.05.2014
Сообщений: 8
17.09.2014, 12:55 17
кто нибудь ПОЖАЛУЙСТА напишите точно такой код на языке java, пожалуйста ...
0
17.09.2014, 12:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2014, 12:55
Помогаю со студенческими работами здесь

Найти в массиве число чередований знака
В массиве Z(m) найти число чередований знака, то есть число переходов с минуса на плюс или с плюса...

Подсчитать количество изменений знака во введенной последовательности
Ввести последовательность чисел, количество которых заранее неизвестно. Последовательность чисел...

Количество изменений знака в каждой строке массива
Дано файл в котором записана прямоугольная матрица целых чисел.Для каждой строки подсчитать...

Обработать результаты экзамена
Написать программу, которая обрабатывает результаты экзамена. Для каждой оценки программа должна...


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

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