Переглянути джерело

feat: add WorkingWithFilesLinux

otter 2 тижнів тому
коміт
84b7aecc85

+ 12 - 0
WorkingWithFilesLinux/.vscode/c_cpp_properties.json

@@ -0,0 +1,12 @@
+{
+    "configurations": [
+        {
+            "name": "Linux",
+            "includePath": [
+                "$/**"
+            ],
+            "defines": []
+        }
+    ],
+    "version": 4
+}

+ 7 - 0
WorkingWithFilesLinux/.vscode/launch.json

@@ -0,0 +1,7 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": []
+}

+ 10 - 0
WorkingWithFilesLinux/.vscode/settings.json

@@ -0,0 +1,10 @@
+{
+    "files.associations": {
+        "stdlib.h": "c",
+        "fcntl.h": "c",
+        "locale.h": "c",
+        "math.h": "c",
+        "unistd.h": "c",
+        "stat.h": "c"
+    }
+}

+ 29 - 0
WorkingWithFilesLinux/.vscode/tasks.json

@@ -0,0 +1,29 @@
+{
+    "tasks": [
+        {
+            "type": "cppbuild",
+            "label": "C/C++: gcc build active file",
+            "command": "/usr/bin/gcc",
+            "args": [ //аргументы для запуска
+                "-fdiagnostics-color=always",
+                "-g",
+                "${file}",
+                "-lm",
+                "-o",
+                "${fileDirname}/${fileBasenameNoExtension}"
+            ],
+            "options": {
+                "cwd": "${fileDirname}"
+            },
+            "problemMatcher": [
+                "$gcc"
+            ],
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            },
+            "detail": "Task generated by Debugger."
+        }
+    ],
+    "version": "2.0.0"
+}

BIN
WorkingWithFilesLinux/a.out


+ 1 - 0
WorkingWithFilesLinux/coefficients.txt

@@ -0,0 +1 @@
+4 12 9

BIN
WorkingWithFilesLinux/main


+ 161 - 0
WorkingWithFilesLinux/main.c

@@ -0,0 +1,161 @@
+#define _CRT_SECURE_NO_WARNINGS
+#include <stdio.h>
+#include <math.h>
+#include <malloc.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>	  //работа с файлами
+#include <unistd.h>	  // закрытие файла
+#include <sys/stat.h> //S_IRWXU
+
+double *getCoeff(int start, int end, char *arr)
+{
+	double *coeff = malloc(sizeof(double));
+	*coeff = 0;
+	int znak = 1, drob = 0, step = 0;
+	if (arr[start] == '-')
+	{
+		znak = -1;
+		start++;
+	}
+	for (int k = start; k < end; k++)
+	{
+		if ((arr[k] >= '0' && arr[k] <= '9') || arr[k] == '.')
+		{
+			if (drob == 0 && arr[k] == '.')
+				drob = 1;
+			else if (arr[k] >= '0' && arr[k] <= '9')
+			{
+				if (drob == 0)
+				{
+					*coeff = (*coeff * pow(10, step)) + (arr[k] - '0');
+					step++;
+				}
+				else
+				{
+					*coeff += (arr[k] - '0') / pow(10, drob);
+					drob++;
+				}
+			}
+			else
+				return NULL;
+		}
+		else
+			return NULL;
+	}
+	*coeff = *coeff * znak;
+	return coeff;
+}
+
+double *readFile(char *name)
+{
+	int file = open(name, O_RDONLY); // Открытие файла только для чтения NULL
+	if (file == -1)
+	{
+		printf("Ошибка чтения файла");
+	}
+	else
+	{
+		struct stat buf; //структура из файла stat.h
+		fstat(file, &buf);
+		int size = buf.st_size;
+		char *arr = malloc(size * sizeof(char));
+		read(file, arr, size);
+		close(file);
+		double *coeff = malloc(3 * sizeof(double));
+		int countSpace = 0;
+		int *index = malloc(size * sizeof(int));
+		for (int i = 0; i < size; i++)
+		{
+			if (arr[i] == ' ')
+			{
+				countSpace++;
+				index = realloc(index, countSpace * sizeof(int));
+				index[countSpace - 1] = i;
+			}
+		}
+		if (countSpace > 2)
+			return NULL;
+		int startIndex = 0; // начинается с 0, далее - все ячейки после пробела
+		double *pointer;
+		for (int i = 0; i < countSpace; i++)
+		{
+			pointer = getCoeff(startIndex, index[i], arr);
+			startIndex = index[i] + 1;
+			if (pointer)
+				coeff[i] = *pointer;
+			else
+				return NULL;
+		}
+		pointer = getCoeff(startIndex, size, arr);
+		if (pointer)
+			coeff[countSpace] = *pointer;
+		else
+			return NULL;
+		return coeff;
+	}
+}
+
+int error(char *name)
+{
+	int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); // Создать файл на чтение и запись и стереть данные если существует
+	char *message = "Файл содержит символы или другие некорректные данные";
+	write(file, message, strlen(message));
+	close(file);
+	return 0;
+}
+
+int writeRootsToFile(char *name, double a, double b, double c)
+{ 
+	char* message = malloc(50);
+	if (a == 0) // проверка корректности
+	{
+		if (b == 0)
+		{
+			if (c == 0)
+				message = "Уравнение имеет бесконечно много решений.";
+			else
+				message = "Уравнение не имеет решений.";
+		}
+		else
+		{
+			double x = -c / b; // Линейное уравнение
+			sprintf(message, "Уравнение имеет одно решение: x = %.2lf", x);
+		}
+	}
+	else
+	{
+		double D = pow(b, 2) - (double)4 * a * c;
+		if (D >= 0)
+		{
+			if (D == 0)
+			{
+				double x = (-b) / (2 * a);
+				sprintf(message, "Корень один: %0.2lf", x);
+			}
+			else
+			{
+				double x1 = (-b + sqrt(D)) / (2 * a);
+				double x2 = (-b - sqrt(D)) / (2 * a);
+				sprintf(message, "Корни уравнения: %0.2lf, %0.2lf", x1, x2);
+			}
+		}
+		else
+			message = "Корней нет";
+	}
+	int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
+	write(file, message, strlen(message));
+	close(file);
+	return 0;
+}
+
+int main()
+{
+	char *fileResult = "result.txt";
+	double *arr = readFile("coefficients.txt");
+	if (arr)
+		writeRootsToFile(fileResult, arr[0], arr[1], arr[2]);
+	else
+		error(fileResult);
+	return 0;
+}

+ 1 - 0
WorkingWithFilesLinux/result.txt

@@ -0,0 +1 @@
+Файл содержит символы или другие некорректные данные