You are on page 1of 6

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"

Інститут ІКНІ
Кафедра ПЗ

ЗВІТ

До лабораторної роботи № 4
На тему: “Символьні рядки в С. Ввід та вивід”

З дисципліни: “Основи програмування”

Лектор:
ст.викл. каф. ПЗ
Муха Т.О.

Виконав:
ст. гр. ПЗ-15
Кочан А.А.

Прийняла:
асист. каф. ПЗ
Заводовська Н.О.

« 18 » жовтня 2021 р.

∑= ____ .

Львів – 2021
Тема роботи: Символьні рядки в С. Ввід та вивід
Мета роботи: Здобути практичні навики опрацювання текстової інформації з
врахуванням особливостей організації символьних рядків у мові С. Вивчити основні засоби
потокового вводу/виводу в С.

Індивідуальне завдання №1
Вважаючи, що введене речення з клавіатури складається з довільної кількості слів, між якими
є довільна кількість пробілів, і закінчується речення крапкою, написати програму для
розв’язання завдання:
17. Надрукувати всі слова з введеного речення, які містять понад 8 літер.

Індивідуальне завдання №2
Скласти програму на мові С, яка обчислюватиме значення виразу з лабораторної роботи №1
Додаток 1 “Обчислення заданих арифметичних виразів”

Теоритичні відомості
Рядкові константи (літерали) в мові С записуються як послідовність довільних символів
взятих у подвійні лапки: "...". В оперативній пам'яті їм виділяється ділянка, обсяг якої на
один байт більший за кількість символів у рядку. В цей додатковий байт автоматично
записується нуль-символ (‘\0’), який надалі слугуватиме ознакою кінця рядка.
Приклад:

char *pst = "Hello world!";

Для збереження в пам’яті записаного рядка компілятор виділить 13 байтів, з них 12


байтів
для символів і останній для '\0' . Адресу початку рядка отримає вказівник pst. Символьні
рядки
також можуть оголошуватися як звичайні масиви:

char імя_символьного_рядка [кількість_символів];

Оголошений нижче масив str призначений для збереження символьного рядка:

char str[150];

У str можна записати довільний символьний рядок, довжина якого не перевищує 149
символів, оскільки останнім записується нуль-символ – для нього треба обов'язково
зарезервувати один байт. Слід також пам'ятати, що перевищення встановленої в
оголошенні
кількості символів не контролюється компілятором і може призвести до небезпечних
помилок у роботі програми.
В оголошеннях символьні рядки, як і масиви символів, можна ініціалізувати. Розглянемо
декілька характерних прикладів:

char ml[20] = {'a', 'b', 'с', 'd', 'e', 'f'};


char m2[20] = {'a', 'b', 'с', 'd', 'e', ' f', '\0'};
char m3[20] = "abcdef";
char m4[ ] = "abcdef";
Код програми №1
#include <stdio.h>
#include <stdlib.h>
#define N 200

int main(){

printf("Enter your sentence:\n");

char str[N];

char* limits = " ,.;", * pw;


gets_s(str, N);
pw = strtok(str, limits);

printf("Word with 8+ letter:\n");

while (pw != NULL)


{
if (strlen(pw) >= 8)
{
printf("%s\n", pw);
}
pw = strtok(NULL, limits);
}
return 0;
}

Протокол роботи №1

Рис 1. Виведення результату


Код програми №2
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#pragma warning(disable:4996)

#define MAX 100

int main() {

time_t realTime;
FILE* logFile = fopen("log.log", "a");
char* error;

time(&realTime);
char* time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "\n\n[%s] Program started.\n", time_str);

double x, y, z;
char inputFN[MAX];

printf("Input file: ");


gets(inputFN);

FILE* input = fopen(inputFN, "rb");

if (input == NULL) {
error = "The input file doesn't exist.";
printf("%s\n", error);

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] An error ocurred: %s. Aborting program...\n", time_str, error);


return 0;
}

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Parameters file \"%s\" opened.\n", time_str, inputFN);

fread(&x, sizeof(double), 1, input);


fread(&y, sizeof(double), 1, input);
fread(&z, sizeof(double), 1, input);

fclose(input);

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Got values of variables: X = %lf; Y = %lf; Z = %lf;\n", time_str, x,


y, z);
double b = pow(1 + pow(tan(z / 2), 2), sqrt(fabs(y) + x));

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Expression calculated: b = %lf;\n", time_str, b);

char outputFN[MAX];

printf("Output file: ");


gets(outputFN);

printf("Format of output (t or b): ");

char torb;
scanf("%c", &torb);

if (torb == 't' || torb == 'T') {


FILE* output = fopen(outputFN, "w");

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Text output file \"%s\" opened.\n", time_str, outputFN);


fprintf(output, "%lf", b);
fclose(output);

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Text output file \"%s\" saved.\n", time_str, outputFN);


}
else if (torb == 'b' || torb == 'B') {
FILE* output = fopen(outputFN, "wb");

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Binary output file \"%s\" opened.\n", time_str, outputFN);


fwrite(&b, sizeof(double), 1, output);
fclose(output);

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Binary output file \"%s\" saved.\n", time_str, outputFN);


}

time(&realTime);
time_str = ctime(&realTime);
*(strchr(time_str, '\n')) = '\0';

fprintf(logFile, "[%s] Program finished.\n", time_str);

fclose(logFile);

return 0;
}

Протокол роботи №2

Рисунок 2. Результат роботи програми

Рисунок 3. Вид log-файлу

Висновки

На лабораторній роботі було розроблено дві програми:

1. Використовуючи теоритичні відомості щодо стрічок, написали програму що друкує всі


слова з введеного речення, які складаються з більш ніж 8 букв.
2. Використовуючи знання про файли, написали програму що обчислює вираз з
лабораторної роботи №1, та записує всі дії, змінні і результат в log-файл.

You might also like