Advertisement
hurmawe

curswork_for_Lisa

May 31st, 2022 (edited)
929
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.53 KB | None | 0 0
  1. #include <stdio.h>  //чтение и печать сообщений, циклы
  2. #include <stdlib.h> //прерывание программы
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6.  
  7. char str[200];//массив под строку из файла
  8. int number = 0;//номер строки
  9.  
  10. int curly_staples(int qunter)//анализ на фигурные скобки
  11. {
  12.     //логика
  13.     //во всем файле должно быть одинаковое количество открывающихся и закрывающихся скобок
  14.     //если значение=0, то все ок
  15.     //если значение>0, то много открывающихся
  16.     //если значение<0, то много закрывающихся
  17.     for (int i = 0; i < strlen(str); i++)//смотрим всю строку
  18.     {
  19.         if (str[i] == '{')
  20.             qunter++;
  21.         else if (str[i] == '}')
  22.             qunter--;
  23.     }
  24.     return qunter;//возращаем количство скобок в этой строке
  25. }
  26. int find(char letter,int pos)//поиск закрывающей скобке, при разном написание
  27. {
  28.     //логика
  29.     //мы принимаем значение открывающей скобки
  30.     //по таблице символ отвечающий за закрытие скобки находится через символ
  31.     //поэтому мы прибавляем на 2 значения символа, и начинаю с позиции прошлого символа
  32.     //рассматриваем строчку
  33.     letter += 2;//получение закрывающего символа
  34.     int count = 1;//изначально 1 так как мы нашли открывающий символ
  35.     for (int i = pos; i < strlen(str); i++)//смотрим всю строку
  36.     {
  37.         if (str[i] == letter)//если мы нашли закрывающий символ
  38.             count = 0;//то возращаем значение в нормальное
  39.     }
  40.     return count;//возращаем результат
  41. }
  42. int find_1(char letter, int pos)//поиск закрывающей скобке, при одинаковом написание
  43. {
  44.     //логика
  45.     //мы принимаем значение открывающей скобки
  46.     //так как написание одинаковое, то просто ищем второй такой же символ
  47.     //начинаю с позиции прошлого символа
  48.     //рассматриваем строчку
  49.     int count = 1;//изначально 1 так как мы нашли открывающий символ
  50.     for (int i = pos; i < strlen(str); i++)//смотрим всю строку
  51.     {
  52.         if (str[i] == letter)//если мы нашли закрывающий символ
  53.             count = 0;//то возращаем значение в нормальное
  54.     }
  55.     return count;//возращаем результат
  56. }
  57. void staples()//анализ скобок в строке
  58. {
  59.     int count1 = 0; // []
  60.     int count2 = 0; // ()
  61.     int count3 = 0; // <>
  62.     int count4 = 0; // ""
  63.     int count5 = 0; // ''
  64.  
  65.     for (int i = 0; i < strlen(str); i++)
  66.     {
  67.         //игнорируем комментарии
  68.         if ((str[i] == '/' && str[i - 1] == '*') || (str[i] == '*' && str[i - 1] == '/') || (str[i] == '/' && str[i - 1] == '/'))
  69.             break;
  70.  
  71.         if (str[i] == '[')
  72.             count1=find('[',i);
  73.  
  74.         else if (str[i] == '(')
  75.             count2=find('(', i);
  76.  
  77.         else if (str[0] == '#' && str[i] == '<')//может находить только в строчках включения функции
  78.             count3=find('<', i);
  79.  
  80.         else if (str[i] == '"')
  81.             count4=find_1('"', i);
  82.  
  83.         else if (str[i] == '\'')
  84.             count5=find_1('\'', i);
  85.     }
  86.     if (count1 + count2 + count3 + count4 + count5 != 0)//если хотя бы одна скобка не закрыта
  87.     {
  88.         printf("Ошибка постановки скобок или кавычек в строке %d:\n", number + 1);//вывод ошибки
  89.         puts(str);
  90.     }
  91.  
  92. }
  93. void word()//анализ слова
  94. {
  95.     int lenght = strlen(str);//длина анализируемой строки
  96.     for (int i = 0; i < strlen(str); i++)//игнорирование комментариев
  97.     {
  98.         if (str[i] == '/' && str[i - 1] == '/')
  99.             lenght= i - 1;
  100.     }
  101.     int count = 0;//результат
  102.     char letters[] = { "!?#%$^&`~|№;:" };//символы которые не могут стоять в слове
  103.     for (int i = 0; i < lenght; i++)
  104.     {
  105.         if (isalpha(str[i]))//если мы нашли букву
  106.         {
  107.             while (isalpha(str[i]))//читаем все слово
  108.             {
  109.                 i++;//переход на новый символ
  110.                 for (int j = 0; j < strlen(letters); j++)//перебираем все символы
  111.                 {
  112.                     //если текущий символ есть в массив, следующее не пробел и не конец строки, и также не конец строки до комментария
  113.                     if (str[i] == letters[j] && (str[i + 1] != ' ' && str[i + 1] != '\n') && i+1 != lenght)
  114.                         count = 1;
  115.                 }
  116.             }
  117.         }
  118.     }
  119.  
  120.     if (count != 0)//результат
  121.     {
  122.         printf("Лишний символ в слове в строке %d:\n", number + 1);
  123.         puts(str);
  124.     }
  125. }
  126. void alphabet()//проверка на разные языки
  127. {
  128.     int count1 = 0;//латиница
  129.     int count2 = 0;//кирилица
  130.     int count3 = 0;//есть разные или нет
  131.  
  132.     int i;
  133.  
  134.     for (i = 1; i < strlen(str); i++)//смотрим всю строку
  135.     {
  136.         //игнорируем комментарии
  137.         if ((str[i] == '/' && str[i - 1] == '*') || (str[i] == '*' && str[i - 1] == '/') || (str[i] == '/' && str[i - 1] == '/'))
  138.             break;
  139.         if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))//если нашл англ то записываем это
  140.         {
  141.             count1 = 1;
  142.         }
  143.         else if ((str[i] >= 'А' && str[i] <= 'п') || (str[i] >= 'р' && str[i] <= 'я'))//если нашли русский то записываем
  144.         {
  145.             count2 = 1;
  146.  
  147.         }
  148.         else//если нашли не букву, то сбрасываем
  149.         {
  150.             count2 = 0;
  151.             count1 = 0;
  152.         }
  153.         if (count1 + count2 == 2)//если нашли оба языка, записываем результат
  154.         {
  155.             count3 = 1;
  156.             break;
  157.         }
  158.     }
  159.  
  160.     if (count3 != 0)//сообщение об разных языках
  161.     {
  162.         printf("Символы разных языков в слове в строке %d:\n", number + 1);
  163.         puts(str);
  164.         printf("Ошибка произошла на символе %d: %c\n\n", i + 1, str[i]);
  165.     }
  166. }
  167. int main()
  168. {
  169.  
  170.     FILE* fi;
  171.     char name[80];
  172.     int qunter = 0;
  173.  
  174.     printf("Привет сейчас проверим твой код\nВведи название файла. Добавь <.txt>\n");
  175.  
  176.     while (1)//открытие файла
  177.     {
  178.         gets(name);
  179.         if ((fi = fopen(name, "r+")) == NULL)
  180.         {
  181.             printf("Не удалось открыть файл\n");
  182.         }
  183.         else break;
  184.     }
  185.     printf("\n");
  186.     while (fgets(str, 200, fi) != NULL)// пока можем прочитать файл, считаваем оттуда строку
  187.     {
  188.  
  189.         staples();
  190.         word();
  191.         alphabet();
  192.         qunter = curly_staples(qunter);//количество фигурных скобок
  193.         number++;
  194.     }
  195.     if (qunter != 0)//сообщение о фигурных скобках
  196.     {
  197.         if (qunter < 0)
  198.             printf("Ошибка постановки фигурный скобок. Их слишком много\n");
  199.         else
  200.             printf("Ошибка постановки фигурный скобок. Их слишком мало\n");
  201.     }
  202. }
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement