Guest User

Untitled

a guest
Dec 21st, 2015
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.49 KB | None | 0 0
  1. 6 лаба
  2. /**
  3. * bmpfilter.c -- программа для наложения фильтров на
  4. * изображение в формате BMP
  5. *
  6. * Copyright (c) 2015, Belyakov Sergey <putinlovesme@not.you>
  7. *
  8. * This code is licensed under a MIT-style license.
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13.  
  14. /*
  15. * Структура заголовка файла в формате BMP
  16. */
  17. typedef struct {
  18. char id1;
  19. char id2;
  20. unsigned int file_size;
  21. unsigned int reserved;
  22. unsigned int bmp_data_offset;
  23. unsigned int bmp_header_size;
  24. unsigned int width;
  25. unsigned int height;
  26. unsigned short int planes;
  27. unsigned short int bits_per_pixel;
  28. unsigned int compression;
  29. unsigned int bmp_data_size;
  30. unsigned int h_resolution;
  31. unsigned int v_resolution;
  32. unsigned int colors;
  33. unsigned int important_colors;
  34. } bmp_header;
  35.  
  36. void bmp_read(char *str, bmp_header *header, float **data);
  37. void bmp_write(char *str, bmp_header *header, float *data);
  38. void bmp_grayscale(float *bmpSrc, float *bmpDst, bmp_header *header);
  39. void bmp_blur(float *bmpSrc, float *bmpDst, bmp_header *header);
  40.  
  41.  
  42. int main(int argc, char **argv)
  43. {
  44. /* Заголовок файла в формате BMP */
  45. bmp_header header;
  46.  
  47. /* Цвета пикселей входного и выходного файлов */
  48. float *data_in, *data_out, *data_out2;
  49.  
  50. /* Число пикселей в одном цветовом слое */
  51. long int size;
  52.  
  53. /* При запуске программы должны быть заданы имя входного
  54. и имя выходного файлов */
  55. if (argc != 3)
  56. {
  57. fprintf(stderr, "Usage: inout <InFile> <OutFile>\n\n");
  58. exit(EXIT_FAILURE);
  59. }
  60.  
  61. /* Читаем заголовок и данные файла BMP, заданного argv[1] */
  62. bmp_read(argv[1], &header, &data_in);
  63.  
  64. /* Вычисляем количество пикселей в одном цветовом слое */
  65. size = header.height * header.width;
  66.  
  67. /* Выделяем память под цвета пикселей выходного файла */
  68. data_out= (float*)malloc(3 * size * sizeof(float));
  69. data_out2 = (float*)malloc(3 * size * sizeof(float));
  70.  
  71.  
  72. /* Преобразуем в черно-белую гамму */
  73. bmp_grayscale(data_in, data_out, &header);
  74.  
  75. /*Делаем размытие*/
  76. bmp_blur(data_out, data_out2, &header);
  77.  
  78. /* Записываем результат в файл, заданный argv[2]) */
  79. bmp_write(argv[2], &header,data_out2);
  80. }
  81.  
  82.  
  83. /*
  84. * Открывает файл изображения в формате BMP (24 бита на пиксель, True Color)
  85. * и извлекает заголовок и данные. Для дальнейшей обработки цвета распределяются
  86. * по трем цветовым плоскостям (RGB) и представляются числами с плавающей точкой.
  87. */
  88. void bmp_read(char *str, bmp_header *header, float **data)
  89. {
  90. FILE *bmp_file;
  91. unsigned long int size,i,j,w,h,m;
  92. unsigned char *ptr;
  93.  
  94. /* Открываем файл в формате BMP */
  95. bmp_file = fopen(str,"r");
  96.  
  97. /* Выводим диагностику, если файл открыть не удалось */
  98. if (bmp_file == NULL)
  99. {
  100. printf("File \"%s\" couldn't be opened.\n\n", str);
  101. exit(EXIT_FAILURE);
  102. }
  103.  
  104. /* Считываем 56 байтов заголовка */
  105. i = fread(header, 54, 1, bmp_file);
  106.  
  107. /* Копируем данные заголовка */
  108. for (i = 0; i < 51; i++)
  109. {
  110. ptr = (unsigned char*)(header) + (55 - i);
  111. *ptr = *(ptr - 2);
  112. }
  113.  
  114. /* Выводим диагностику, если глубина цвета отлична от 24 bpp */
  115. if (header->bits_per_pixel != 24)
  116. {
  117. printf("Sorry, but this program can handle only 24-bit"
  118. "true color mode pictures.\n\n");
  119. exit(EXIT_FAILURE);
  120. }
  121.  
  122. size = header->width * header->height;
  123.  
  124. (*data) = (float*)malloc(3 * size * sizeof(float));
  125.  
  126. if ((*data) == NULL)
  127. {
  128. printf("Not enough memory for reading picture.\n\n");
  129. exit(EXIT_FAILURE);
  130. }
  131.  
  132. fseek(bmp_file, 54, SEEK_SET);
  133.  
  134. /* Считываем значения цветовых компонентов, преобразуя к виду
  135. с плавающей точкой */
  136. w=header->width;
  137. h=header->height;
  138.  
  139. /* m - кол-во пикселей, которые нужны для кол-ва, кратного 4 */
  140. m = (4 - (w*3)%4)%4;
  141.  
  142. /* Считываем цвета, записывая поочередно красный, зеленый, синий в один массив,
  143. преобразуя в числа с плавающей точкой */
  144. for(i = 0; i < h; i++){
  145. for(j=0; j < w; j++) {
  146.  
  147. (*data)[i*w+j] = (float)fgetc (bmp_file) / 255;
  148. (*data)[i*w+j + size] = (float)fgetc (bmp_file) / 255;
  149. (*data)[i*w+j + 2 * size] = (float)fgetc (bmp_file) / 255;
  150. }
  151. /* Считываем пустые байты, сколько не хватает до кол-ва, кратного 4 */
  152. if (m != 0) {
  153. for (j = 0; j < m; j++) {
  154. fgetc (bmp_file);
  155. }
  156. }
  157. }
  158. fclose(bmp_file);
  159. }
  160.  
  161.  
  162. /*
  163. * Сохраняет изображение в файле формате BMP (24 бита на пиксель, True Color)
  164. */
  165. void bmp_write(char *str, bmp_header *header, float *data)
  166. {
  167. FILE *bmp_file;
  168. unsigned long int size,i,w,h,j,n,m;
  169. unsigned char *ptr, *buf;
  170.  
  171. size = header->width * header->height;
  172.  
  173. /* Открываем файл BMP */
  174. bmp_file = fopen(str,"w");
  175.  
  176. /* Выводим диагностику, если открыть не удалось */
  177. if (bmp_file == NULL)
  178. {
  179. printf("File \"%s\" couldn't be opened.\n\n",str);
  180. exit(EXIT_FAILURE);
  181. }
  182.  
  183. w=header->width;
  184. h=header->height;
  185.  
  186. /* Удаляемы выравнивание заголовка */
  187. for (i = 2; i < 56; i++)
  188. {
  189. ptr=(unsigned char*)(header) + i;
  190. *ptr = *(ptr + 2);
  191. }
  192.  
  193. /* Записываем заголовок */
  194. j = fwrite(header, 54, 1, bmp_file);
  195.  
  196. /* Проверяем, сколько нужно пикс. до кол-ва, кратного 4 */
  197. m = (4 - (w*3) %4)%4;
  198.  
  199. /* Записываем цвета пикселей в файл */
  200. for (i = 0; i < h; i++){
  201. for (j=0; j < w; j++){
  202.  
  203. fputc ((int)(data[i*w + j] * 255), bmp_file);
  204. fputc ((int)(data[i*w+j + size] * 255), bmp_file);
  205. fputc ((int)(data[i*w+j + 2 * size] * 255), bmp_file);
  206. }
  207. if (m != 0) {
  208. for (n = 0; n < m; n++){
  209. /* Дополняем картинку нулевыми байтами для кратности ширины на 4 */
  210. fputc(0, bmp_file);
  211. }
  212. }
  213. }
  214. fclose(bmp_file);
  215. free(data);
  216. }
  217.  
  218.  
  219. /*
  220. * Преобразует цвета пикселей в черно-белую гамму
  221. * (30% красного + 59% зеленого + 11% синего)
  222. */
  223. void bmp_grayscale(float *bmp_src, float *bmp_dst, bmp_header *header)
  224. {
  225. unsigned int layer, i, j;
  226.  
  227. /* Получаем линейные размеры изображения*/
  228. unsigned int w = header->width;
  229. unsigned int h = header->height;
  230.  
  231. /* Для каждого цветового слоя*/
  232. for (layer = 0; layer < 3; layer++)
  233. {
  234. /* Для всех строк пикселей*/
  235. for (i = 0; i < h; i++)
  236. {
  237. /*Для каждого пикселя*/
  238. for(j = 0; j < w; j++)
  239. {
  240. /* Преобразуем в черно-белое, константы 0, 1, 2
  241. оставлены в явном виде для простоты понимания*/
  242. bmp_dst[layer * h * w + i * w + j] =
  243. 0.11 * bmp_src[0 * h * w + i * w + j]
  244. + 0.59 * bmp_src[1 * h * w + i * w + j]
  245. + 0.30 * bmp_src[2 * h * w + i * w + j];
  246. }
  247. }
  248. }
  249. }
  250.  
  251. /* Для размытия необходимо подсчитать вокруг пикселя в радиусе 3 пикселей, т.е. квадрат 7х7,
  252. среднее значение каждого цвета и записать в данный пиксель */
  253.  
  254. void bmp_blur(float *bmp_src, float *bmp_dst, bmp_header *header){
  255.  
  256. /*счетчики*/
  257. int i, j,k,l;
  258. unsigned long int size;
  259. unsigned int w = header->width;
  260. unsigned int h = header->height;
  261.  
  262. size=w*h;
  263. for (i=0; i < h; i++){
  264. for(j=0; j< w; j++){
  265. /*переменные, в которые будут помещены цвета каждого цвета*/
  266. float red = 0;
  267. float green = 0;
  268. float blue = 0;
  269. /*счетчик кол-ва пикселей*/
  270. int f= 0;
  271. /*границы квадрата вокруг пикселя*/
  272. int left, right, up, down;
  273.  
  274. /* Находим границу слева */
  275. if(-j < - 3){
  276. left = -3;
  277. }
  278. else{
  279. left = -j;
  280. }
  281.  
  282. /* Находим границу справа */
  283. if( w-j-1 > 3){
  284. right = 3;
  285. }
  286. else {
  287. right = w-j-1;
  288. }
  289. /* Находим границу сверху */
  290. if(-i < - 3){
  291. up = -3;
  292. }
  293. else{
  294. up = i;
  295. }
  296.  
  297. /* Находим границу снизу */
  298. if( h-i-1 > 3){
  299. down = 3;
  300. }
  301. else{
  302. down = h-i-1;
  303. }
  304.  
  305.  
  306. for (k=up; k <=down ; k++){ /* Обходим квадрат по вертикали */
  307. for (l=left; l <= right; l++){ /*Обходим квадрат по горизонтали */
  308. red +=bmp_src[(i+k)*w+j+l]; /* Складываем все красные цвета */
  309. green +=bmp_src[(i+k)*w+j+l+size]; /* Складываем все зеленые цвета */
  310. blue +=bmp_src[(i+k)*w+j+l+2*size]; /* Складываем все синие цвета */
  311. f++; /*Считаем кол-во пикселей*/
  312. }
  313. }
  314.  
  315.  
  316. /* Ищем среднее значение для каждого цвета */
  317. red=red/f;
  318. green=green/f;
  319. blue=blue/f;
  320.  
  321.  
  322. /* Записываем ср.значения в данный пиксель */
  323. bmp_dst[i*w+j]=red;
  324. bmp_dst[i*w+j+size]=green;
  325. bmp_dst[i*w+j+2*size]=blue;
  326. }
  327. }
  328. }
  329.  
  330.  
  331. 7 лаба
  332.  
  333. /**
  334. * bwt.c — программа вычисления преобразования Барроуза-Уилера входной
  335. * строки
  336. *
  337. * Copyright (c) 2015, Belyakov Sergey <putinlovesme@not.you>
  338. *
  339. * This code is licensed under a MIT-style license.
  340. */
  341.  
  342. #include <stdio.h>
  343. #include <stdlib.h>
  344. #include <string.h>
  345.  
  346. /* Максимально допустимое количество байт (однобайтовых символов)
  347. * входной строки, включая символ перевода строки и терминальный нуль,
  348. * т.е. реально обрабатываются строки длиной не более MAXLINE - 2 байт
  349. */
  350.  
  351. #define MAXLINE 255
  352.  
  353. int main()
  354. {
  355. /* Таблица преобразования */
  356. char transform_table [MAXLINE][MAXLINE] = { 0 };
  357. /* Вспомогательный массив номеров строк для сортировки */
  358. char row_numbers [MAXLINE];
  359.  
  360. /* Исходная строка */
  361. char source_line [MAXLINE];
  362. /* Длина исходной строки */
  363. int source_length;
  364.  
  365. /* Счетчики */
  366. int i, j, k;
  367.  
  368. /* Получаем входную строку, контролируя длину вводимых данных */
  369. fgets (source_line, MAXLINE, stdin);
  370.  
  371. source_length = strlen (source_line);
  372.  
  373. /* Анализируем, помещается ли введенная строка в буфер целиком */
  374. if (source_line [source_length - 1] != '\n') {
  375. fprintf (stderr, "Вами введена слишком длинная входная строка\n");
  376. fprintf (stderr, "Максимально допустимое количество символов: %d\n", MAXLINE - 2);
  377. exit (EXIT_FAILURE);
  378. }
  379.  
  380. /* Обрезаем завершающий символ перевода строки */
  381. source_line [--source_length] = '\0';
  382.  
  383. /* Инициализируем массив номеров строк таблицы преобразования */
  384. for (i = 0; i < source_length; i++) {
  385. row_numbers [i] = i;
  386. }
  387.  
  388. /* Строим таблицу преобразования (циклических сдвигов)
  389. РЕАЛИЗУЙТЕ САМОСТОЯТЕЛЬНО */
  390. printf("Transform_table:\n");
  391. for (i = 0; i < source_length; i++) {
  392. for (j = 0; j < source_length; j++) {
  393. transform_table[i][j] = source_line[j];
  394. printf("%c", transform_table[i][j]);
  395. }
  396.  
  397. printf("\n");
  398. int temp = source_line[0];
  399. for (j = 0; j < source_length; j++) {
  400. source_line[j] = source_line[j+1];
  401. }
  402.  
  403. source_line[source_length-1] = temp;
  404. };
  405.  
  406. strcpy(row_numbers, transform_table[0]);
  407.  
  408. /* Сортируем таблицу преобразования, используя вспомогательный массив
  409. номеров строк РЕАЛИЗУЙТЕ САМОСТОЯТЕЛЬНО */
  410. char temp2[MAXLINE] = {0};
  411. int check = 1;
  412. while (check)
  413. {
  414. check = 0;
  415. for (i = 0; i < (source_length - 1); i++) {
  416. // printf("%d, %s\n",i ,transform_table[i]);
  417. if (strcmp(transform_table[i], transform_table[i + 1]) > 0)
  418. {
  419. strcpy(temp2, transform_table[i]);
  420. strcpy(transform_table[i], transform_table[i + 1]);
  421. strcpy(transform_table[i + 1], temp2);
  422. check = 1;
  423. }
  424. }
  425. }
  426.  
  427. printf("\nresult: ");
  428.  
  429. /* Вывод результата преобразования: элементов последнего столбца таблицы */
  430. for (i = 0; i < source_length; i++) {
  431. printf ("%c", transform_table [i][source_length - 1]);
  432. }
  433. printf ("\n");
  434. return 0;
  435. }
  436.  
  437. 8 лаба
  438.  
  439. /**
  440. * elephant.c -- поиск слова в игре Дуплеты
  441. *
  442. * Copyright (c) 2015, Belyakov Sergey <putinlovesme@not.you>
  443. *
  444. * This code is licensed under a MIT-style license.
  445. */
  446. #include <stdio.h>
  447. #include <stdlib.h>
  448. #include <string.h>
  449. #define MAX_WORDS 1000
  450. #define WORDS_LENGHT 10
  451.  
  452. int main(int argc, char*argv[])
  453. {
  454. /* Файл словаря */
  455. FILE* dict = NULL;
  456. /* Файл цепочки */
  457. FILE* chain = stdin;
  458. /* Число слов в цепочке */
  459. int chain_number = 0;
  460. /* Цепочка */
  461. char chain_words[MAX_WORDS][WORDS_LENGHT];
  462. /* Текущее слово */
  463. char current_word[WORDS_LENGHT];
  464. /* Признак успешного поиска подходящего слова для цепочки */
  465. int found = 0;
  466. /* Проверяем, указан ли файл словаря */
  467. if(argc < 2) {
  468. fprintf(stderr, "Не задан файл словаря\n");
  469. exit(EXIT_FAILURE);
  470. }
  471. /* Открываем файл словаря, контролируя ошибки */
  472. dict = fopen(argv[1], "r");
  473. if (dict == NULL) {
  474. fprintf (stderr, "Не удалось открыть файл словаря\n");
  475. exit(EXIT_FAILURE);
  476. }
  477. /* Проверяем, задан ли файл цепочки */
  478. if (argc >= 3) {
  479. chain = fopen(argv[2], "r");
  480. if (chain == NULL ){
  481. fprintf(stderr, "Не удалось открыть файл цепочки слов\n");
  482. exit (EXIT_FAILURE);
  483. }
  484. }
  485. /* Считываем цепочку слов, сразу печатая их на стандартный вывод */
  486. while (fscanf(chain, "%s", chain_words[chain_number]) > 0) {
  487. printf("%s\n", chain_words[chain_number]);
  488. chain_number++;
  489. }
  490. /* Выполняем поиск подходящего слова в словаре */
  491. while (fscanf(dict, "%s", current_word) > 0) {
  492. /* Сравниваем очередное слово со всеми словами цепочки */
  493. int i;
  494. for(i = 0; i < chain_number; i++) {
  495. if(strcmp(current_word, chain_words[i]) == 0) {
  496. break;
  497. }
  498. }
  499. /* Если слово встречается в цепочке, игнорируем его */
  500. if(i < chain_number) continue;
  501. /* Проверяем, что новое слово отличается одной буквой */
  502. int diff = 0;
  503. int len = strlen(current_word);
  504. diff = test(diff, len, chain_number, current_word, chain_words);
  505. if(diff > 1) continue;
  506. //Если слово подошло, завершаем обработку словаря
  507. found = 1;
  508. break;
  509. }
  510. if (found) {
  511. printf("%s\n", current_word);
  512. } else {
  513. printf("-\n");}
  514. /* Завершаем работу с файлами */
  515. fclose(dict);
  516. if (chain != stdin) {
  517. fclose(chain);
  518. }
  519. return 0;
  520. }
  521. /*функция находит кол-во различий между словами*/
  522. int test(int diff, int len, int chain_number, char *current_word, char chain_words[MAX_WORDS][WORDS_LENGHT])
  523. {
  524. int i;
  525. for(i = 0; i < len; i++) {
  526. if(current_word[i] != chain_words[chain_number - 1][i]) {
  527. diff++;
  528. }
  529. }
  530. return diff;}
  531.  
  532. 9 лаба
  533.  
  534. /**
  535. * romandate.c -- вывод даты в римском представлении
  536. *
  537. * Copyright (c) 2015, Belyakov Sergey <putinlovesme@not.you>
  538. *
  539. * This code is licensed under a MIT-style license.
  540. */
  541.  
  542.  
  543. #include <time.h>
  544. #include <stdio.h>
  545. #include <stdlib.h>
  546. #include <string.h>
  547.  
  548. /** convert_dec_to_roman -- преобразует целое число в строковое представление
  549. *
  550. * Параметры:
  551. * roman - строка для записи результата преобразования
  552. * decimal - исходное целое
  553. * n - ограничение на длину результата
  554. * Возвращаемое значение:
  555. * функция возвращает -1 при любой ошибке
  556. */
  557. int convert_dec_to_roman (char *roman, unsigned int decimal, size_t n)
  558. {
  559. const int arabar[13] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
  560. const char romanar[13][2] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
  561. char romanin[n];
  562. int i, j = 0;
  563. for (i = 0; i < n; i++) {romanin[i] = NULL;}
  564. for (i = 13; i >= 0; i--) {
  565. while (arabar[i] <= decimal) {
  566. romanin[j++] = romanar[i][0];
  567. if (romanar[i][1] != NULL) {romanin[j++] = romanar[i][1];}
  568. decimal -= arabar[i];
  569. }
  570. }
  571. strcpy(roman, romanin);
  572. }
  573.  
  574. /** get_roman_date -- преобразует дату в строковое представление
  575. *
  576. * Параметры:
  577. * romandate - строка для записи даты римскими числами
  578. * now - структура времени
  579. * n - ограничение на длину результата
  580. * Возвращаемое значение:
  581. * функция возвращает -1 при любой ошибке
  582. */
  583. int get_roman_date (char *romandate, struct tm *now, size_t n)
  584. {
  585. int dec = now;
  586. convert_dec_to_roman(romandate, dec, n);
  587. }
  588.  
  589. int main (int argc, char *argv[])
  590. {
  591. /* Код программы */
  592. // time_t a = time(NULL);
  593. // printf("%d\n", a);
  594. struct tm* tme = localtime(&a);
  595. printf("%d/%d/%d %d:%d:%d \n",tme->tm_year+1900, tme->tm_mon+1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
  596.  
  597. char roman[100];
  598. int date;
  599. //Записываем дату римскими цифрами в формате ДЕНЬ.МЕСЯЦ.ГОД ЧАСЫ:МИНУТЫ
  600. date = tme->tm_mday; // Получаем день и преобраз. его
  601. get_roman_date(roman, date, 100);
  602. printf("%s.", roman);
  603.  
  604. date = tme->tm_mon+1; // Получаем месяц и преобраз.
  605. get_roman_date(roman, date, 100);
  606. printf("%s.", roman);
  607.  
  608. date = tme->tm_year+1990; // получаем год и преобраз.
  609. get_roman_date(roman, date, 100);
  610. printf("%s", roman);
  611.  
  612. date = tme->tm_hour; // получаем час и преобраз.
  613. get_roman_date(roman, date, 100);
  614. printf(" %s:", roman);
  615.  
  616. date = tme->tm_min; // получаем минуты и преобразов.
  617. get_roman_date(roman, date, 100);
  618. printf("%s\n", roman);
  619.  
  620. printf("%d.%d.%d %d:%d\n",tme->tm_mday, tme->tm_mon+1, tme->tm_year+1900, tme->tm_hour, tme->tm_min); //дата в стандартном формате арабскими цифрами
  621.  
  622. system("pause");
  623. return EXIT_SUCCESS;
  624. }
Add Comment
Please, Sign In to add comment