Міністерство освіти та науки, молоді та спорту України
Національний університет «Львівська політехніка»
Розрахункові роботи № 1 та № 2
З дисципліни «Проблемно-орієнтоване програмування»
на тему
«Редагування числових даних в текстових файлах»
Зміст
Вступ …………………………………………………………………………………………
1. Огляд літератури …………………………………………………………………
2. Формулювання задачі ……………………………………………………………
3.Укруплена блок-схема з поясненнями ……………………………………………
4. Програмна реалізація алгоритму …………………………………………………
4.1. Загальна характеристика ………………………………………………………
4.2. Вхідна та вихідна інформація, таблиця ідентифікаторів ……………………
4.3 Структура програми, опис функцій ……………………………………………
5. Інструкція користувачеві …………………………………………………………
Висновок ………………………………………………………………………………
Список літератури ……………………………………………………………………
Додатки ………………………………………………………………………………
Додаток 1. Текст програмних файлів …………………………………………
Вступ
Огляд літератури
Матеріали теоретичної частини були взяті з інтернет-ресурсів.
Текстовий файл — форма подання послідовності символів в комп'ютері. Кожен символ з використовуваного набору символів кодується у вигляді одного байта, а іноді у вигляді послідовності двох, трьох і т. д. байтів.
Текстові файли розбиваються на рядки .На сучасних платформах розбивка на рядки кодується символом зміни рядка, а іноді послідовністю двох символів (на деяких старих платформах розбивка на рядки робилося інакше). Взагалі, текстові файли можуть містити друковані символи, такі як букви, цифри й розділові знаки й деяку кількість керуючих символів, таких як знаки табуляції й зміни рядка.
Текстовим файлам протиставляються двійкові (бінарні) файли, у яких інформація організована за іншими принципами.
Велика частина комп'ютерного устаткування й програм не розрізняють текстові й двійкові файли. Існує, однак, багато програм, призначених спеціально для обробки текстових файлів або таких програм, які по різному обробляють текстові й двійкові файли. Численні мережеві протоколи, розраховані на роботу тільки з текстовими даними й не можуть обробляти довільну послідовність байтів. Програми для ручного набору текстових файлів називаються текстовими редакторами.
Числові типи даних
Цілі числа
Цілі числа не можуть містити у собі дріб. Для від'ємного числа треба ставити знак мінус (-) перед значенням (числом). Неможна використовувати кому у введені такого числа, бо інакше буде викликана синтаксична помилка. Приклади цілих чисел:
42
10000
−233000
−100
Дійсні числа
Дійсні числа можуть містити у собі як цілі, так і дробові значення з точкою відокремлення від цілої частини. Для від'ємного числа треба ставити знак мінус (-) перед значенням (числом). Приклади дійсних чисел:
20.0005
99.9
−5000.12
−9999.9991
Складні типи даних
Складні типи даних — це типи, які складаються з елементів, що відносяться до простих типів. До складних типів даних відносяться: масиви; множини; рядки; записи; файли; динамічні змінні; вказівники; лінійні списки (стеки, черги); нелінійні списки (двійкові дерева, несиметричні дерева, тексти, графи); процедурний тип; об'єкти
Рядки
Рядки — нечисловий тип даних, та використовується для збереження букв та слів. Усі рядки складаються з символів. Рядки можуть містити цифри та числа, але все одно будуть оброблятися як текст. Приклади рядків:
«A»
«Hello World»
«Телефон»
«Мені 99 років»
«1.2.3.4.5.6.7.8.9»
Діапазон числових типів даних
Кожне числовий тип даних має мінімальне та максимальне значення, яке називають діапазон значень. Важливо знати діапазон значень, особливо, коли працюєш з «маленькими» типами даних, оскільки у них можна зберігати лише значення у вузькому діапазоні. Спроба внести число, більше за доступний діапазон може призвести до помилок періоду компіляції/виконання, або до неправильних підрахунків (через відкидання) залежно від мови програмування, яка використовується.
Діапазон змінних оснований на кількості байтів відведених для збереження значення. Цілі типи даних зазвичай здатні зберігати / значень (де / — це кількість байтів, що еквівалентно до / бітів). Для інших типів даних (напр. дійсних чисел) діапазон заплутаніший, та залежить від методу зберігання інформації у ньому. Існують також типи даних, які не викоритовують весь байт, наприклад булеві, яким потрібен лише один біт, і представляє собою двійкове значення (хоча на практиці використовується весь байт, то 7 бітів залишаються невикористаними).
Формулювання задачі
В даній задачі мені необхідно розробити та реалізувати програмно алгоритм,що буде редагувати числові дані у текстових файлах.
Введення вхідних даних відбувається з клавіатури,результат виводиться на екран.
Для написання програми я використовувала середовище Borland C++.
3.Укркплена блок-схема з поясненнями
false
true
Пояснення до блок-схеми 1(функція, що пише числа прописом)
1. char* to_text(int x)// 0 - 999999
{
char res[100];
char *ptr = res;
const char *a[] = {"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
"twelve"};
2. ptr += sprintf(ptr,"%s ",a[x]);
3. ptr += sprintf(ptr,to_text(x/1000));
x %= 1000;
ptr += sprintf(ptr,"thousand ");
4. ptr += sprintf(ptr,"%s ",a[x/100]);
x %= 100;
ptr += sprintf(ptr,"hundred ");
5. switch(x/10)
{
case 2 : ptr += sprintf(ptr,"twen"); break;
case 3 : ptr += sprintf(ptr,"thir"); break;
case 5 : ptr += sprintf(ptr,"fif"); break;
case 8 : ptr += sprintf(ptr,"eigh"); break;
default : ptr += sprintf(ptr,a[x/10]); break
}
6. ptr += sprintf(ptr,"ty ");
x %= 10;
7. switch(x)
{
case 2 : ptr += sprintf(ptr,"twen"); break;
case 3 : ptr += sprintf(ptr,"thir"); break;
case 5 : ptr += sprintf(ptr,"fif"); break;
case 8 : ptr += sprintf(ptr,"eigh"); break; }
8. ptr += sprintf(ptr,"teen");
Блок-схема(2) головної функції
Пояснення до блок-схеми 2
1. int main()
{
clrscr();
char str2[150];
char *str=" ";
char *token,*digitstr;
int v=0,digit;
FILE *p,*newfile,*newfile2;
newfile=fopen("testnew.txt","wr");
2. printf("\nPomulka pru vidkrutti faylu");
3.
puts("******************** Robota iz txt faylamu ****************");
puts("======= Variantu robotu =======" );
puts("1 - stvorutu file");
puts("2 - modufikyvatu file");
scanf("%d",&v);
printf("%d",v);
4. clrscr();
p=fopen("test.txt","w");
puts(" Vvedit rjadku dljazapusy y file.");
puts("*Dlja zavershennja vvedit #+ENTER");
5. while (strcmp(str,"#")!=0)
{ scanf("%s",str); fprintf(p,"%s ",str);
7. clrscr();
puts(" ====== Moduficazia fayla =======");
puts(" 3 - zaokryglutu");
puts(" 4 - otrymatu chusla propusom");
scanf("%d",&v);
8. if (v==3)
{
puts(" Vvedit kilkist rozrjadiv dlja zaokryglennja (max. 5)");
scanf("%d",&digit);
switch(digit)
{ case 1: digitstr="%.1f ";break;
case 2: digitstr="%.2f ";break;
case 3: digitstr="%.3f ";break;
case 4: digitstr="%.4f ";break;
case 5: digitstr="%.5f ";break;
default : digitstr="%.2f ";break;
};
puts("Read from file");
while(fgets(str2,100,p)!=NULL)
{
printf("\nString = %s \n",str2);
token = strtok(str2, " ");
if (atof(token)!=0)
fprintf(newfile,digitstr,atof(token));
else
fprintf(newfile,"%s ",token);
while((token=strtok(NULL," "))!=NULL)
{
if (atof(token)!=0)
fprintf(newfile,digitstr,atof(token));
else
fprintf(newfile,"%s ",token);
}
fprintf(newfile,"\n");
}
puts("\n File is completed...");
fclose(p);
fclose(newfile);
puts("\n Vidkrytu(1-tak,0-ni)?");
scanf("%d",&v);
if (v==1)
{ puts("Resultat");
newfile2=fopen("testnew.txt","r");
while(fgets(str2,100,newfile2)!=NULL)
printf("\n %s",str2);
}
9. puts(" ===== Propusom pushutja luwe zili schisla");
puts("\n Read from file");
10. while(fgets(str2,100,p)!=NULL)
{
printf("\nString = %s \n",str2);
token = strtok(str2, " ");
if (atof(token)!=0)
fprintf(newfile,"%s(%s) ",token,to_text(atof(token)));
else
fprintf(newfile,"%s ",token);
while((token=strtok(NULL," "))!=NULL)
{
if (atof(token)!=0)
fprintf(newfile,"%s(%s) ",token,to_text(atof(token)));
else
fprintf(newfile,"%s ",token);
}
fprintf(newfile,"\n");
fclose(newfile);
12. puts("File is completed...");
puts("Vidkrytu(1-tak,0-ni)?");
scanf("%d",&v);
14. if (v==1)
{ puts("Resultat");
newfile2=fopen("testnew.txt","r");
while(fgets(str2,100,newfile2)!=NULL)
printf("\n %s\n",str2);
4. Програмна реалізація алгоритму
4.1Загальна характеристика.Ім’я програми – Program.Назва програмного файла – rozrah.Мова програмування – С.Розмір програмного файлу (у текстових рядках) – 228.Середовище реалізації програми – Borland C++.4.2. Вхідна та вихідна інформація, таблиця ідентифікаторівВхідні дані для програми зчитуються із текстового файлу test.txt , який знаходиться у тій самій директорії із файлом програми. Також передбачена можливість створення вхідного файлу програми автоматично. Всі дії користувача впорядковані за допомогою меню. Результати виконання записуються у файл, а також можуть бути виведені на екран. Таблиця ідентифікаторівstr2[150],str – робочі змінні token – змінна для роботи із словамиdigitstr – стрічка форматуванняp,newfile,newfile2 – змінні для роботи із файлами даних4.3 Структура програми, опис функційПрограма складається з основної частини та розділеної на підчастини за допомогою умовних операторів, які реалізують меню роботи програми. Також існує функція для переведення числа у стрічкову форму, тобто написання числа прописом.
Інструкція користувачеві програми
Щоб розпочати роботу з нашою програмою,потрібно вибрати один із пунктів меню,а саме: вибираємо одиничку для створення файл , двійку для його модифікації.
/
Рис. 1 Вибираємо 1 для створення файлу
/
Рис.2 Вводимо свої дані
/
Рис. 3 Вибираємо 2 для редагування файлу
/
Рис.4 Вводимо кількість розрядів для заокруглення
/
Рис.5 Виведення результату
/
Рис.6 Вибираємо 4 для запису числа прописом
/
Рис.7 Виведення результату
Висновок: Під час виконання даної розрахункової роботи
Список літератури
Програмування С/ З.Я. Шпак.-2-ге вид., доп. – Львів:Видавництво Львівської політехніки,2011. – 436 с
Павловская Т.А. Щупак Ю.А. С/С++. Структурное программирование Москва: Питер, 2003. – 238 с.
Шмидский Я.К. Программирование на языке С/С++ Москва: Диалектика, 2004. – 352 с.
Додаток 1. Текст програмного файлу «Rozrah.cpp»
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
char* to_text(int x)// 0 - 999999
{
char res[100];
char *ptr = res;
const char *a[] = {"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
"twelve"};
if(x <= 12)
{
ptr += sprintf(ptr,"%s ",a[x]);
return strdup(res);
}
if(x >= 1000)
{
ptr += sprintf(ptr,to_text(x/1000));
x %= 1000;
ptr += sprintf(ptr,"thousand ");
}
if(x >= 100)
{
ptr += sprintf(ptr,"%s ",a[x/100]);
x %= 100;
ptr += sprintf(ptr,"hundred ");
}
if(x >= 20)
{
switch(x/10)
{
case 2 : ptr += sprintf(ptr,"twen"); break;
case 3 : ptr += sprintf(ptr,"thir"); break;
case 5 : ptr += sprintf(ptr,"fif"); break;
case 8 : ptr += sprintf(ptr,"eigh"); break;
default : ptr += sprintf(ptr,a[x/10]); break;
}
ptr += sprintf(ptr,"ty ");
x %= 10;
}
if(x >= 13)
{
x %= 10;
switch(x)
{
case 2 : ptr += sprintf(ptr,"twen"); break;
case 3 : ptr += sprintf(ptr,"thir"); break;
case 5 : ptr += sprintf(ptr,"fif"); break;
case 8 : ptr += sprintf(ptr,"eigh"); break;
default : ptr += sprintf(ptr,a[x]);
}
ptr += sprintf(ptr,"teen");
}
else if(x > 0)
ptr += sprintf(ptr,"%s ",a[x]);
return strdup(res);
}
int main()
{
clrscr();
char str2[150];
char *str=" ";
char *token,*digitstr;
int v=0,digit;
FILE *p,*newfile,*newfile2;
newfile=fopen("testnew.txt","wr");
// perevirka najavnosti faylja
if((p=fopen("test.txt","r"))==NULL)
{
printf("\nPomulka pru vidkrutti faylu");
getchar();
exit(1);
}
// menu robotu programu
puts("******************** Robota iz txt faylamu ****************");
puts("======= Variantu robotu =======" );
puts("1 - stvorutu file");
puts("2 - modufikyvatu file");
scanf("%d",&v);
printf("%d",v);
if (v==1)
{ clrscr();
p=fopen("test.txt","w");
puts(" Vvedit rjadku dljazapusy y file.");
puts("*Dlja zavershennja vvedit #+ENTER");
while (strcmp(str,"#")!=0)
{ scanf("%s",str); fprintf(p,"%s ",str); }
fclose(p);
}
if (v==2)
{ clrscr();
puts(" ====== Moduficazia fayla =======");
puts(" 3 - zaokryglutu");
puts(" 4 - otrymatu chusla propusom");
scanf("%d",&v);
if (v==3)
{
puts(" Vvedit kilkist rozrjadiv dlja zaokryglennja (max. 5)");
scanf("%d",&digit);
switch(digit)
{ case 1: digitstr="%.1f ";break;
case 2: digitstr="%.2f ";break;
case 3: digitstr="%.3f ";break;
case 4: digitstr="%.4f ";break;
case 5: digitstr="%.5f ";break;
default : digitstr="%.2f ";break;
};
puts("Read from file");
while(fgets(str2,100,p)!=NULL)
{
printf("\nString = %s \n",str2);
token = strtok(str2, " ");
if (atof(token)!=0)
fprintf(newfile,digitstr,atof(token));
else
fprintf(newfile,"%s ",token);
while((token=strtok(NULL," "))!=NULL)
{
if (atof(token)!=0)
fprintf(newfile,digitstr,atof(token));
else
fprintf(newfile,"%s ",token);
}
fprintf(newfile,"\n");
}
puts("\n File is completed...");
fclose(p);
fclose(newfile);
puts("\n Vidkrytu(1-tak,0-ni)?");
scanf("%d",&v);
if (v==1)
{ puts("Resultat");
newfile2=fopen("testnew.txt","r");
while(fgets(str2,100,newfile2)!=NULL)
printf("\n %s",str2);
}
}
}
if (v==4)
{
puts(" ===== Propusom pushutja luwe zili schisla");
puts("\n Read from file");
while(fgets(str2,100,p)!=NULL)
{
printf("\nString = %s \n",str2);
token = strtok(str2, " ");
if (atof(token)!=0)
fprintf(newfile,"%s(%s) ",token,to_text(atof(token)));
else
fprintf(newfile,"%s ",token);
while((token=strtok(NULL," "))!=NULL)
{
if (atof(token)!=0)
fprintf(newfile,"%s(%s) ",token,to_text(atof(token)));
else
fprintf(newfile,"%s ",token);
}
fprintf(newfile,"\n");
fclose(newfile);
}
puts("File is completed...");
puts("Vidkrytu(1-tak,0-ni)?");
scanf("%d",&v);
if (v==1)
{ puts("Resultat");
newfile2=fopen("testnew.txt","r");
while(fgets(str2,100,newfile2)!=NULL)
printf("\n %s\n",str2);
}
fclose(p);
}
getch();
return 0;
}