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

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

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

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

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

Задача на линейный массив.
Здравствуйте форумчане) Помогите решить задачу. Хотя бы немного направьте меня в правильное русло. Вот условие:
Занести из файла в массив результаты измерений температуры воздуха, которые проводились ежедневно в течении ноября месяца. Определить: а) день, когда первый раз температура поднялась выше нуля; 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 минут
Форумчане, что ни у кого нет даже идей?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2011, 13:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработать результаты замеров температур: найти минимум, число изменений знака (C++):

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

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

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

Найти в массиве число чередований знака - C++
В массиве Z(m) найти число чередований знака, то есть число переходов с минуса на плюс или с плюса на минус. Проблема с нулями, когда 2 и...

Используя функцию, составить программу, которая считает количество изменений знака в массиве чисел. y=f(x). В С++ - C++
Используя функцию, составить программу, которая считает количество изменений знака в массиве чисел. y=f(x). В С++.

Обработать по формуле значения из двух файлов и записать результаты в файл - C++
Задание во вложении.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
27.11.2011, 14:36 #2
А зачем сортировать массив дней? Считываете массив из файла, а затем просто пишите функции для каждого из пунктов по очереди, вот и всё, передавая в них ссылку или указатель на массив.
deathart
1 / 1 / 0
Регистрация: 07.11.2011
Сообщений: 11
27.11.2011, 14:45 #3
dimcoder, у меня похожая задача. Объясните пожалуйста поподробнее..
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
27.11.2011, 19:33  [ТС] #4
Цитата Сообщение от dimcoder Посмотреть сообщение
А зачем сортировать массив дней?
Я же говорю Вам, что запутался...единственное что я смог это как раз отсоритирвать, но как я понял мои старания оказались напрасны(
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
28.11.2011, 20:56  [ТС] #5
Ребята, натолкните меня в правильное русло)
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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;
}
Если что не понятно в коде или что-то некорректно работает, спрашивайте.
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
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 минут
http://********************/show-imag...69d23b1178b565
вот ссылка на скрин с ошибкой.
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
29.11.2011, 18:04  [ТС] #9
Я же отправил скрин)
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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];
}
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
29.11.2011, 18:17  [ТС] #11
dimcoder, а что означает
C++
1
clrscr();
Добавлено через 2 минуты
Блин все -равно не выход скинь как весь код, а то я по ошибке кажется строку удалил лишнюю.
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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;
}
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
29.11.2011, 19:06  [ТС] #13
dimcoder, Все равно не идет...вроде все верно написано, уже каждую точку с запятой перепроверил(( Слушайте, а у вас есть Dev с++?

Добавлено через 35 минут
Наконец-то...хух...исправил)
dimcoder, если вам не сложно можете вкратце объяснить работу программы?
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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 Ну и если не секрет, где такое задание взяли\Вам дали?
Вася1q
21 / 21 / 0
Регистрация: 13.09.2011
Сообщений: 311
30.11.2011, 08:00  [ТС] #15
PS Ну и если не секрет, где такое задание взяли\Вам дали?[/QUOTE]
Задали в универе) 1 курс. Плохо объясняют много требуют... стараюсь не отставать. Спасибо еще раз огромное за помощь!

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

Добавлено через 3 минуты
"(int *ar, int size)" поясните, пожалуйста, еще эту строчку...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 08:00
Привет! Вот еще темы с ответами:

Найти трехзначное число x, зная результаты вычислений с его цифрами - C++
В трехзначном числе х зачеркнули первую цифру. Когда оставшееся число умножили на 10, а произведение сложили с первой цифрой числа х, то...

Найти самое приближенное (большее чем n) число, являющееся степенью двойки. Обработать ошибки - C++
Пусть дано число n.Найти самое приближенное(большее чем n) число являющееся степенью двойки. Обработать ошибки.Вот обработать ошибки не...

Двумерные массивы Найти минимум получить новую матрицу деленные на минимум - C++
Дана матрица размером N x M. Найти в ней наименьший элемент. Получить новую матрицу, элементы которой равны элементам исходной матрицы,...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.11.2011, 08:00
Ответ Создать тему
Опции темы

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