Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> //чтение и печать сообщений, циклы
- #include <stdlib.h> //прерывание программы
- #include <ctype.h>
- #include <string.h>
- char str[200];//массив под строку из файла
- int number = 0;//номер строки
- int curly_staples(int qunter)//анализ на фигурные скобки
- {
- //логика
- //во всем файле должно быть одинаковое количество открывающихся и закрывающихся скобок
- //если значение=0, то все ок
- //если значение>0, то много открывающихся
- //если значение<0, то много закрывающихся
- for (int i = 0; i < strlen(str); i++)//смотрим всю строку
- {
- if (str[i] == '{')
- qunter++;
- else if (str[i] == '}')
- qunter--;
- }
- return qunter;//возращаем количство скобок в этой строке
- }
- int find(char letter,int pos)//поиск закрывающей скобке, при разном написание
- {
- //логика
- //мы принимаем значение открывающей скобки
- //по таблице символ отвечающий за закрытие скобки находится через символ
- //поэтому мы прибавляем на 2 значения символа, и начинаю с позиции прошлого символа
- //рассматриваем строчку
- letter += 2;//получение закрывающего символа
- int count = 1;//изначально 1 так как мы нашли открывающий символ
- for (int i = pos; i < strlen(str); i++)//смотрим всю строку
- {
- if (str[i] == letter)//если мы нашли закрывающий символ
- count = 0;//то возращаем значение в нормальное
- }
- return count;//возращаем результат
- }
- int find_1(char letter, int pos)//поиск закрывающей скобке, при одинаковом написание
- {
- //логика
- //мы принимаем значение открывающей скобки
- //так как написание одинаковое, то просто ищем второй такой же символ
- //начинаю с позиции прошлого символа
- //рассматриваем строчку
- int count = 1;//изначально 1 так как мы нашли открывающий символ
- for (int i = pos; i < strlen(str); i++)//смотрим всю строку
- {
- if (str[i] == letter)//если мы нашли закрывающий символ
- count = 0;//то возращаем значение в нормальное
- }
- return count;//возращаем результат
- }
- void staples()//анализ скобок в строке
- {
- int count1 = 0; // []
- int count2 = 0; // ()
- int count3 = 0; // <>
- int count4 = 0; // ""
- int count5 = 0; // ''
- for (int i = 0; i < strlen(str); i++)
- {
- //игнорируем комментарии
- if ((str[i] == '/' && str[i - 1] == '*') || (str[i] == '*' && str[i - 1] == '/') || (str[i] == '/' && str[i - 1] == '/'))
- break;
- if (str[i] == '[')
- count1=find('[',i);
- else if (str[i] == '(')
- count2=find('(', i);
- else if (str[0] == '#' && str[i] == '<')//может находить только в строчках включения функции
- count3=find('<', i);
- else if (str[i] == '"')
- count4=find_1('"', i);
- else if (str[i] == '\'')
- count5=find_1('\'', i);
- }
- if (count1 + count2 + count3 + count4 + count5 != 0)//если хотя бы одна скобка не закрыта
- {
- printf("Ошибка постановки скобок или кавычек в строке %d:\n", number + 1);//вывод ошибки
- puts(str);
- }
- }
- void word()//анализ слова
- {
- int lenght = strlen(str);//длина анализируемой строки
- for (int i = 0; i < strlen(str); i++)//игнорирование комментариев
- {
- if (str[i] == '/' && str[i - 1] == '/')
- lenght= i - 1;
- }
- int count = 0;//результат
- char letters[] = { "!?#%$^&`~|№;:" };//символы которые не могут стоять в слове
- for (int i = 0; i < lenght; i++)
- {
- if (isalpha(str[i]))//если мы нашли букву
- {
- while (isalpha(str[i]))//читаем все слово
- {
- i++;//переход на новый символ
- for (int j = 0; j < strlen(letters); j++)//перебираем все символы
- {
- //если текущий символ есть в массив, следующее не пробел и не конец строки, и также не конец строки до комментария
- if (str[i] == letters[j] && (str[i + 1] != ' ' && str[i + 1] != '\n') && i+1 != lenght)
- count = 1;
- }
- }
- }
- }
- if (count != 0)//результат
- {
- printf("Лишний символ в слове в строке %d:\n", number + 1);
- puts(str);
- }
- }
- void alphabet()//проверка на разные языки
- {
- int count1 = 0;//латиница
- int count2 = 0;//кирилица
- int count3 = 0;//есть разные или нет
- int i;
- for (i = 1; i < strlen(str); i++)//смотрим всю строку
- {
- //игнорируем комментарии
- if ((str[i] == '/' && str[i - 1] == '*') || (str[i] == '*' && str[i - 1] == '/') || (str[i] == '/' && str[i - 1] == '/'))
- break;
- if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))//если нашл англ то записываем это
- {
- count1 = 1;
- }
- else if ((str[i] >= 'А' && str[i] <= 'п') || (str[i] >= 'р' && str[i] <= 'я'))//если нашли русский то записываем
- {
- count2 = 1;
- }
- else//если нашли не букву, то сбрасываем
- {
- count2 = 0;
- count1 = 0;
- }
- if (count1 + count2 == 2)//если нашли оба языка, записываем результат
- {
- count3 = 1;
- break;
- }
- }
- if (count3 != 0)//сообщение об разных языках
- {
- printf("Символы разных языков в слове в строке %d:\n", number + 1);
- puts(str);
- printf("Ошибка произошла на символе %d: %c\n\n", i + 1, str[i]);
- }
- }
- int main()
- {
- FILE* fi;
- char name[80];
- int qunter = 0;
- printf("Привет сейчас проверим твой код\nВведи название файла. Добавь <.txt>\n");
- while (1)//открытие файла
- {
- gets(name);
- if ((fi = fopen(name, "r+")) == NULL)
- {
- printf("Не удалось открыть файл\n");
- }
- else break;
- }
- printf("\n");
- while (fgets(str, 200, fi) != NULL)// пока можем прочитать файл, считаваем оттуда строку
- {
- staples();
- word();
- alphabet();
- qunter = curly_staples(qunter);//количество фигурных скобок
- number++;
- }
- if (qunter != 0)//сообщение о фигурных скобках
- {
- if (qunter < 0)
- printf("Ошибка постановки фигурный скобок. Их слишком много\n");
- else
- printf("Ошибка постановки фигурный скобок. Их слишком мало\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement