Програма Середньомісячна температура демонструє читання даних із текстового файлу. Програма виводить у поле компонента меню вміст, сформованого програмою Погода файлу meteo.txt, а також виконує його обробку – обчислює середньомісячну температуру.

Код написання програми
#include vcl.h
#pragma hdrstop
#include "Unit1.h"
#include "DateUtils.hpp"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
/* Функція GetString читає з файлу рядок символів
від поточної позиції до першого пробілу.
значення функції - кількість прочитаних символів */
int GetString(int f, AnsiString *st);
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ComboBox1->Style = csDropDownList;
ComboBox1->Items->Add("Січень");
ComboBox1->Items->Add("Лютий");
ComboBox1->Items->Add("Березень");
ComboBox1->Items->Add("Квітень");
ComboBox1->Items->Add("Травень");
ComboBox1->Items->Add("Червень");
ComboBox1->Items->Add("Липень");
ComboBox1->Items->Add("Серпень");
ComboBox1->Items->Add("Вересень");
ComboBox1->Items->Add("Жовтень");
ComboBox1->Items->Add("Листопад");
ComboBox1->Items->Add("Грудень");
// елементи списку нумеруються з нуля
ComboBox1->ItemIndex = MonthOf( Now() ) -1 ;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int h; // дескриптор файла
h = FileOpen("meteo.txt",fmOpenRead);
if ( h == -1)
{
ShowMessage("Файл даних meteo.txt не знайден.");
return;
}
Memo1->Lines->Clear();
// Обробка файлу
AnsiString st; // рядок, прочитаний із файлу
int Is; // довжина рядка
TDateTime aDate; // дата
float temp;// температура
int nMonth; // місяць
int n = 0; // кількість днів
float sum =0 ; // сума температур
float sred; // среднє значення
AnsiString buf;
/* кожний рядок має вигляд:
ДД-ММ.ГГГГ Т
де: ДЦ.ММ.ГГГГ -дата; Т - температура */
do
{
Is = GetString(h,&st); // дата
if ( Is != 0)
{
nMonth = MonthOf (StrToDate(st)) - 1; // місяць
buf = st;
Is = GetString(h,&st); // температура
temp = StrToFloat(st);
if ( nMonth == ComboBox1->ItemIndex )
{
n++; sum = sum + temp;
buf = buf + " " + st;
Memo1->Lines->Add(buf);
}
}
} while ( Is != 0);
FileClose(h);
if ( n != 0 )
{
sred = sum / n;
Label1->Caption = "Среднє значення: " +FloatToStrF(sred,ffGeneral,3,2);
}
else
Label1->Caption = "В БД немає інформації по "
"температурі за " + ComboBox1->Text;
}
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
Label1->Caption = "";
Memo1->Text = "";
}
// Функція GetString читає з файлу рядок символів
// від поточної позиції до першого пробілу.
// значення функції - кількість прочитаних символів
int GetString(int f, AnsiString *st)
{
unsigned char buf[256]; // рядок (буфер)
unsigned char *p = buf; //вказівник на рядок
int n; // кіфлькість прочитаних байт(значення FileRead)
int len =0 ; // довжина строки
// видалити провідні пробіли
do
n = FileRead(f, p, 1);
while ((n != 0) && (*p == ' '));
while (( n != 0 ) && ( *p!=' '))
{
if ( *p == '\r')
{
n = FileRead(f, p, 1); // прочитати '\n'
break;
}
len++;
p++;
n = FileRead(f, p, 1);
}
*p = '\0' ;
if ( len !=0 )
st->printf("%s", buf) ;
return len ;
}
програмування