Description
Help with the code, please. The output of the tile cost and the total number of tiles does not work.
Code on C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _crt_secure_no_deprecate
#include <stdio.h>
#include <stdlib.h>
#define _use_math_defines
#include <math.h>
#include <locale.h>
#pragma warning(disable : 4996)
// структура, представляющая информацию о плитке
typedef struct {
char type[20]; // тип плитки
double length; // длина плитки
double width; // ширина плитки
double price; // цена плитки
} tile;
// структура, представляющая информацию о помещении
typedef struct {
char name[50]; // название помещения
double length; // длина помещения
double width; // ширина помещения
double wallprotrusion; // выступы стены
double area; // площадь помещения
double volume; // объем помещения
} room;
// функция для чтения информации о строительных материалах из файла
tile* readtilesfromfile(char* filename, int* numtiles) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("не удалось открыть файл\n");
return NULL;
}
fscanf(file, "%d", numtiles);
tile* tiles = (tile*)malloc((*numtiles) * sizeof(tile));
for (int i = 0; i < *numtiles; i++) {
fscanf(file, "%s %lf %lf %lf", tiles[i].type, &tiles[i].length, &tiles[i].width, &tiles[i].price);
}
fclose(file);
return tiles;
}
// функция для записи информации о материалах, помещениях и конструкциях в файл
void writedatatofile(char* filename, room* room, int numtiles, tile* tiles) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
printf("не удалось открыть файл\n");
return;
}
// запись информации о помещении
fprintf(file, "%s %.2lf %.2lf %.2lf\n", room->name, room->length, room->width, room->wallprotrusion);
// запись информации о плитках
fprintf(file, "%d\n", numtiles);
for (int i = 0; i < numtiles; i++) {
fprintf(file, "%s %.2lf %.2lf %.2lf\n", tiles[i].type, tiles[i].length, tiles[i].width, tiles[i].price);
}
fclose(file);
}
// функция для вывода изображения помещения
void printroom(const room* room) {
int totallength = (int)room->length;
int totalwidth = (int)room->width;
for (int i = 0; i < totallength + 2; i++) {
printf("-");
}
printf("\n");
for (int i = 0; i < totalwidth; i++) {
printf("|");
for (int j = 0; j < totallength; j++) {
printf(" ");
}
printf("|\n");
}
for (int i = 0; i < totallength + 2; i++) {
printf("-");
}
printf("\n");
}
int main() {
setlocale(LC_ALL, "rus");
char filename[100];
int choice;
room room;
tile* tiles = NULL;
int numtiles = 0;
printf("введите название файла: ");
scanf("%s", filename);
// создание и открытие файла для записи
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("не удалось открыть файл\n");
return -1;
}
fclose(file);
// чтение данных из файла
tiles = readtilesfromfile(filename, &numtiles);
while (1) {
printf("\n ********************главное меню********************");
printf("\n1) рассчитать количество плиток и стоимость\n");
printf("2) вывести изображение помещения\n");
printf("3) запись информации в файл\n");
printf("4) изменить данные о помещении\n");
printf("5) считать данные из файла\n");
printf("6) вывести информацию о размерах плитки\n");
printf("7) выйти из программы\n");
printf("введите выбор (1-7): ");
scanf("%d", &choice);
switch (choice) {
case 1: // рассчитать количество плиток и стоимость
printf("введите длину помещения (в метрах): ");
scanf("%lf", &room.length);
printf("введите ширину помещения (в метрах): ");
scanf("%lf", &room.width);
printf("введите выступы стены (в метрах): ");
scanf("%lf", &room.wallprotrusion);
// вычисление площади пола
room.area = room.length * room.width;
// вычисление объема помещения
room.volume = room.area * room.wallprotrusion;
printf("площадь помещения: %.2lf м^2\n", room.area);
printf("объем помещения: %.2lf м^3\n", room.volume);
// вычисление площади и стоимости для каждой плитки
for (int i = 0; i < numtiles; i++) {
printf("введите цену за штуку плитки (в рублях): ");
scanf("%lf", &tiles[i].price);
double tilearea = tiles[i].length * tiles[i].width;
double numtotaltiles = room.area / tilearea + 0.5; // округляем результат к ближайшему целому
int roundednumtotaltiles = (int)round(numtotaltiles); // приводим результат к типу int
double totalprice = roundednumtotaltiles * tiles[i].price;
printf("для плитки %s:\n", tiles[i].type);
printf("необходимо %.0lf плиток\n", numtotaltiles);
printf("стоимость всего материала: %.2lf рублей\n", totalprice);
}
break;
case 2: // вывести изображение помещения
printf("введите название помещения: ");
scanf("%s", room.name);
printroom(&room);
break;
case 3: // запись информации в файл
writedatatofile(filename, &room, numtiles, tiles);
printf("данные успешно записаны в файл\n");
break;
case 4: // изменить данные о помещении
printf("введите длину помещения (в метрах): ");
scanf("%lf", &room.length);
printf("введите ширину помещения (в метрах): ");
scanf("%lf", &room.width);
printf("введите выступы стены (в метрах): ");
scanf("%lf", &room.wallprotrusion);
break;
case 5: // считать данные из файла
tiles = readtilesfromfile(filename, &numtiles);
break;
case 6: // вывести информацию о размерах плитки
printf("Размеры плитки:\n");
for (int i = 0; i < numtiles; i++) {
printf("Тип плитки: %s\n", tiles[i].type);
printf("Длина плитки: %.2lf\n", tiles[i].length);
printf("Ширина плитки: %.2lf\n", tiles[i].width);
printf("Цена плитки: %.2lf\n", tiles[i].price);
}
break;
case 7: // выйти из программы
printf("программа завершена\n");
return 0;
default:
printf("некорректный выбор\n");
break;
}
}
}