diff --git a/lab2/LongArifm.c b/lab2/LongArifm.c new file mode 100644 index 0000000..4b9f1fa --- /dev/null +++ b/lab2/LongArifm.c @@ -0,0 +1,148 @@ +#include +#include +#include +#define MAX_UNSIGNED_INT 4294967296 + +typedef struct UINT1024 { + unsigned int array[32]; +} uint1024_t; + +uint1024_t from_uint(unsigned int x) { + uint1024_t a; + for (int i = 0; i <= 31; i++) { + a.array[i] = 0; + } + a.array[0] = x; + return a; +} + +uint1024_t add_op(uint1024_t x, uint1024_t y) { + int trans_reg = 0; + uint64_t overflow = MAX_UNSIGNED_INT; + uint1024_t z = from_uint(0); + for (int i = 0; i <= 31; i++) { + uint64_t value = ((uint64_t) x.array[i] + (uint64_t) y.array[i] + trans_reg); + z.array[i] = value % overflow; + trans_reg = value / overflow; + } + return z; +} + +uint1024_t mult_op(uint1024_t x, uint1024_t y) { + uint64_t overflow = MAX_UNSIGNED_INT; + uint1024_t mlt = from_uint(0); + uint1024_t c = from_uint(0); + int count = sizeof(x.array)/sizeof(x.array[0]); + int count2 = sizeof(y.array)/sizeof(y.array[0]); +for (size_t i=0; i=0; --i) { + long long cur = x.array[i] + carry * overflow; + x.array[i] = (int)(cur / y); + carry = (int)(cur % y); +} + return x; +} + +void scanf_value(uint1024_t *x) { + char line[310]; + uint1024_t y; + y = from_uint(0); + scanf("%s", line); + for (int i = 0; i < strlen(line); i++) { + y = mult_op(y, from_uint(10)); + y = add_op(y, from_uint(line[i] - '0')); + } + for (int i = 0; i <= 31; i++) { + x->array[i] = y.array[i]; + } +} + +void printf_value(uint1024_t x) { + uint64_t overflow = MAX_UNSIGNED_INT; + uint1024_t z = from_uint(0); + uint1024_t zero = from_uint(0); + char line[310]; + memset(line, '\0', 310); + do { + uint64_t trans_reg = 0; + for (int i = 31; i >= 0; i--) { + uint64_t value = (x.array[i] + trans_reg * overflow); + z.array[i] = value / 10; + trans_reg = value % 10; + } + line[strlen(line)] = trans_reg + '0'; + x = z; + } while (memcmp(&x, &zero, sizeof(int) * 32) != 0); + for (int i = strlen(line); i >= 0; i--) { + printf("%c", line[i]); + } +} + +int main() { + uint1024_t a = from_uint(0), b = from_uint(0); + long long y = 0; + printf("Multiplication test\n"); + scanf_value(&a); + scanf_value(&b); + printf_value(mult_op(a, b)); + printf("\n"); + + printf("Segmentation test\n"); + scanf_value(&a); + scanf("%llu",&y); + printf_value(segmentation(a, y)); + printf("\n"); + + printf("Addition test\n"); + scanf_value(&a); + scanf_value(&b); + printf_value(add_op(a, b)); + printf("\n"); + + + printf("Subtraction test\n"); + scanf_value(&a); + scanf_value(&b); + printf_value(subtr_op(a, b)); + printf("\n"); +} + + + diff --git a/lab3/main.c b/lab3/main.c new file mode 100644 index 0000000..230451a --- /dev/null +++ b/lab3/main.c @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#define REQ_LEN 2500 +//=======================================ERROR +void error_5xx(FILE* file1, FILE* file2) { + + char string[REQ_LEN]; + unsigned int size_of_string = 0; + int count_errors = 0; + int first_element = 0; + int last_element = 0; + while (!feof(file1)) { + char *check = fgets(string, REQ_LEN, file1); + if (check == NULL) { + + } + size_of_string = strlen(string); + for (int i = 0; i < size_of_string; i++) { + if (string[i] == '"') { + first_element = i; + break; + } + } + for (int j = first_element + 1; j < size_of_string; j++) { + if (string[j] == '"') { + last_element = j; + break; + } + } + if (string[last_element + 2] == '5') { + fprintf(file2, "%s", string + first_element + 1); + count_errors = count_errors + 1; + } + } + printf("%d", count_errors); + +} +//=======================================TIME + +/*char Get_TimeStr(FILE *file){ + int start_pos; + char string[REQ_LEN]; + char sub_str[20]; + unsigned int size_of_string = 0; + char *check = fgets(string, REQ_LEN , file); + if (check == NULL) { + return 1 ; + } + size_of_string = strlen(string); + for (int i = 0; i < size_of_string; i++) { + if (string[i] == '[') { + start_pos = i; + break; + } + } + strncpy(sub_str,string[start_pos + 1], 20); + return sub_str; +}*/ + + + time_t Get_time(char *string) { + char month[12][4]= {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", + "Sep", "Oct", "Nov", "Dec"}; + struct tm time; + time.tm_mday = atoi(string); + for (int i = 0; i < 11; i++) + if (!strcmp(month[i], string)) { + time.tm_mon = i; + break; + } + time.tm_year = atoi(string + 7) - 1900; + time.tm_hour = atoi(string + 12); + time.tm_min = atoi(string + 15); + time.tm_sec = atoi(string + 18); + return mktime(&time); + } + +char *Time_str(char *string){ + +char *str = malloc(20); +int i = 0; +while (*(string+i) != '[' ){ + i++; +} +strncpy(str, string + i + 1, 20); + +return str; +} + + +void Time_Window(FILE *file, long long sec_period) { + long int first_pos = 0, sec_pos = 0, count = 0; + fseek(file, 0, SEEK_END); + char first_string[REQ_LEN], second_string[REQ_LEN]; + int from_end = ftell(file); + + while (sec_pos < from_end) { + fseek(file, first_pos, SEEK_SET); + fgets(first_string, REQ_LEN, file); + char *data = Time_str(first_string); + int firstTime = Get_time(data); + first_pos = ftell(file); + if (sec_pos > first_pos) { + fseek(file, sec_pos, SEEK_SET); + } + while (sec_pos < from_end) { + fgets(second_string, REQ_LEN, file); + sec_pos = ftell(file); + char *data1 = Time_str(second_string); + int lastTime = Get_time(data1); + if (difftime(lastTime, firstTime) > sec_period){ + break; + } + count++; + } + } + printf("\n"); + printf("window : %d count : %d \n", sec_period, count - 2); +} +//=======================================Main_Program + +int main(int argc, char** argv) { + int period; + FILE *log_in = fopen("123.txt", "r"); + error_5xx(log_in, stdout); + printf(" \n "); + printf("Write time period in seconds: "); + scanf("%d", &period); + Time_Window(log_in, period); + return 0; +} \ No newline at end of file diff --git a/lab4/main.c b/lab4/main.c new file mode 100644 index 0000000..46c06b2 --- /dev/null +++ b/lab4/main.c @@ -0,0 +1,173 @@ +#include +#include +#include +#include +#include + + +#define ID3_MAX_SIZE 128 + +typedef struct ID3TAG { + char signature[3]; // "TAG" + char name[30]; // имя песни + char artist[30]; // исполнитль + char album[30]; // альбом + char year[4]; // год + char description[30]; // описание + unsigned short number_in_album[1]; //номер трека в альбоме + unsigned short null_byte[1]; // нулевой байт, проверка номера в альбоме + char genre; // Жанр +} ID3TAG; + +/* Возвращает кол-во байт на 128 меньше от общего размера файла */ +long file_offset(FILE* fp) { + fseek(fp, 0, SEEK_END); // Устанавливает индикатор на 0 байт от конца + //ftell(fp) - кол-во байт от начала файла + return ftell(fp) - ID3_MAX_SIZE; // на 128 от конца +} + +int main(int argc, char* argv[]) { + setlocale(LC_ALL, "Rus"); + FILE* Filein = NULL; // Изначальный mp3 файл + FILE* Fileout = NULL; // Изменённый mp3 файл + char* mp3_name; // Название mp3 файла + char* tag; // Название тэга + char* val; // Испрльзуется в --value=val + ID3TAG* TAGS = NULL; + + /* Если 11 первых символов argv[1] == 11 первым символам '--filepath=', + то strncmp() вернёт 0 */ + if (!strncmp(argv[1],"--filepath=",11)) { + // Ссылка на следующий эл-т после '=' + mp3_name = strpbrk(argv[1], "=") + 1; + // Если файл не открывается то вывести сообщение об ошибке + if ((Filein = fopen(mp3_name, "rb")) == NULL) { + printf("Failed to open file %s for reading.\n", mp3_name); + return 0; + } + } + else { + printf("Команда --filepath= не распознана.\n"); + return 0; + } + + + // Здесь временно будет храниться вся информация из mp3 файла + char* temp = (char*) malloc(sizeof(char) * ID3_MAX_SIZE); + // Весь массив (все байты) заполняются 0 + memset(temp, 0, ID3_MAX_SIZE); + // Устанавливает индикатор на 0 байт от конца + fseek(Filein, file_offset(Filein), SEEK_SET); + // + fread(temp, 1, ID3_MAX_SIZE, Filein); + // Копируем тэги + TAGS = (ID3TAG*)(temp); + + + /* --show */ + if(!strcmp("--show", argv[2])) { + printf("\nSong Name: %s\n",TAGS->name); + printf("Artist: %s\n",TAGS->artist); + printf("Album: %s\n",TAGS->album); + printf("Year: %s\n",TAGS->year); + printf("Description: %s\n",TAGS->description); + printf("Number in album: %s\n",TAGS->number_in_album); + printf("null_byte: %s\n",TAGS->null_byte); + printf("Genre: %d\n\n",TAGS->genre); + } + /* --get */ + else if (!strncmp("--get=", argv[2], 6)) { + tag = strpbrk(argv[2], "=") + 1; + if ( !strcmp(tag, "name") ) + printf("Song Name: %s\n",TAGS->name); + + else if ( !strcmp(tag, "artist") ) + printf("Artist: %s\n",TAGS->artist); + + else if ( !strcmp("album", tag) ) + printf("Album: %s\n",TAGS->album); + + else if ( !strcmp("year", tag) ) + printf("Year: %s\n",TAGS->year); + + else if ( !strcmp("description", tag)) + printf("Description: %s\n",TAGS->description); + + else if ( !strcmp("number_in_album", tag) ) + printf("Number in album: %d\n\n",TAGS->number_in_album); + + else if ( !strcmp("null_byte", tag) ) + printf("null_byte: %d\n\n",TAGS->null_byte); + + else if ( !strcmp("genre", tag) ) + printf("Genre: %d\n\n",TAGS->genre); + + else { + printf("Unknown TAG.\n"); + return 0; + } + } + /* --set= */ + else if (!strncmp("--set=", argv[2], 6)) { + // Название тэга + tag = strpbrk(argv[2], "=") + 1; + if (!strncmp("--value=", argv[3], 8)) { + val = strpbrk(argv[3], "=") + 1; + if ( !strcmp(tag, "name") ) + memcpy(TAGS->name, val, 30); + + else if ( !strcmp(tag, "artist") ) + memcpy(TAGS->artist, val, 30); + + else if ( !strcmp(tag, "album") ) + memcpy(TAGS->album, val, 30); + + else if ( !strcmp(tag, "year") ) + memcpy(TAGS->year, val, 4); + + else if ( !strcmp(tag, "description") ) + memcpy(TAGS->description, val, 30); + + else if ( !strcmp("number_in_album", tag) ) + memcpy(TAGS->number_in_album, val, 1); + + else if ( !strcmp("null_byte", tag) ) + memcpy(TAGS->null_byte, val, 1); + + else if ( !strcmp("genre", tag) ) + memcpy(TAGS->genre, val, 1); + + } + else { + printf("Error with command --value=\n"); + return 0; + } + } + + else { + printf("Unknown command: %s\n", argv[2]); + return 0; + } + + // Закрытие изначального mp3 файла + fclose(Filein); + + if ((Fileout = fopen(mp3_name, "wb+")) == NULL) { + printf("Failed to open file %s for writing.\n", mp3_name); + return 0; + } + + // В temp2[] будут временно хранится изменённые тэги + char* temp2 =(char*) malloc(sizeof(char) * ID3_MAX_SIZE); + // Весь массив (все байты) заполняются 0 + memset(temp2, 0, ID3_MAX_SIZE); + // Записываем изменённые тэги + temp2 = (char*)TAGS; + fseek(Fileout, file_offset(Fileout), SEEK_SET); + // Записываем 128 байт из temp2[] 1 раз в Fileout + fwrite(temp2, 1, ID3_MAX_SIZE, Fileout); + free(temp2); + fclose(Fileout); + + return 0; +} \ No newline at end of file