Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Пояснения к задаче
В текстовом файле находится некоторый текст, состоящий из нескольких предложений, расположенных на нескольких строках. Предложением будем считать непустую последовательность символов (букв, цифр и пробелов и запятых), начинающуюся с буквы или цифры и оканчивающуюся точкой, вопросительным или восклицательным знаком, или символом конца файла. Словом будем считать непустую последовательность из букв и цифр, отделенную от других слов пробелами, знаками препинания и символами концов строк и файлов.
Пример:
!!!Пример!!! А это второе предложение. Предложение может
быть расположено
на нескольких строках! Еще?!
Конец, однако
Здесь пять предложений:
1. Пробелы и три восклицательных знака в начале – не предложения.
2. Первое предложение «Пример!»
3. Два восклицательных знака не являются предложениями.
4. На той же строке второе предложение «А это второе предложение.»
5. На трех строках расположено третье предложение «Предложение может быть расположено на нескольких строках!»
6. Четвертое предложение «Еще?»
7. Очередной восклицательный знак не являются предложением.
8. Последнее предложение «Конец, однако» ограничено концом файла.
До и после знаков препинания и между слов может находиться один или несколько пробелов и концов строк.
В языке С строки представляются в виде массива элементов типа char. Это означает, что символы строки можно представить расположенными в соседних ячейках памяти – по одному символу в ячейке. Последним элементом массива является символ '\0' - это нуль-символ: в языке C он используется для того, чтобы отмечать конец строки. Нуль-символ – не есть цифра 0; он не выводится на печать и в таблице кодов ASCII имеет номер 0. Наличие нуль-символа означает, что количество ячеек массива должно быть по крайней мере на одну больше, чем количество символов, которые необходимо размещать в памяти.
Для представления внутри строки символа "кавычка", перед ней нужно располагать символ '\'. Точно так же можно получить представление и других управляющих символов внутри строки. Например, '\n' – символ перехода на новую строку, '\t' – символ табуляции.
Создание строк:
char str1[10]; // Строка - массив из 10 символов. Начальное значение символов не определено.
char str2[10]="Hello"; // с инициализацией
/* Используется инициализация (не присваивание!). В первые 5 символов записывается “Hello”, в 6 – нуль-символ, значение трех последних не определено.*/
char str3[10]={'H', 'e', 'l', 'l', 'o', '\0'}; //Эквивалентно предыдущему.
char str4[10]="Very long line";
//Ошибка. Массив из 10 элементов нельзя инициировать более длинной последовательностью.
char str5[]="Very long line";
/*Компилятор автоматически определяет длину массива (в нашем случае 15 с \0) и инициализирует его последовательностью символов. */
char* str6;
/*Строка - указатель на символ. В большинстве случаев для ее использования
потребуется выделить память.*/
str6=(char*) malloc(10);
free(str6);
Присваивание строк
Первый и самый очевидный способ присваивания строк – присваивание отдельных символов. Например,
str1[0]=’H’;
str1[1]=’e’;
str1[2]=’l’;
str1[3]=’l’;
str1[4]=’o’;
str1[5]=’\0’;
------
Несколько примеров неправильного присваивания:
char str1[10], str2[10];
str1="Hello"; // надо str1=strcpy(str1, "Hello");
str2=str1; // надо str2=strcpy(str2, str1);
----
char str1[10]= "Hello";
char* str2;
str2=str1; // не копия, указатель на ту же строку, для копии надо str2=strcpy(str2, str1);
str2[1]='u'; //изменит строку str1
Еще один вариант присваивания указателей:
char* str;
str="Hello";
// память еще не выделена (нужна malloc или calloc) и это не инициализация(нужна strcpy)
Функции для работы со строками
char *strcat(char *dest, const char *scr); Объединяет исходную строку scr и результирующую строку dest, присоединяя первую к последней. Возвращает dest.
int strlen(const char *s); Возвращает длину строки s - количество символов, предшествующих нулевому символу.
char *strtok(char *s1, const char *s2); Делит исходную строку s1 на лексемы (подстроки), разделенные одним или несколькими символами из строки s2. Функция strtok() возвращает адрес первого компонента, отделенного от следующего заданным разделителем. Если заданные разделители не обнаружены, функция strtok() возвращает нуль. Кроме того, эта функция настраивает свой внутренний указатель на символ, следующий за концом последней сформированной подстроки, чтобы последующий вызов strtok() мог продолжить разложение строки. Для этого передайте в качестве первого аргумента значение NULL - это послужит сигналом для функции strtok() использовать ее внутренний указатель как стартовый адрес для поиска другого разделителя. Таким образом, чтобы выделить другие компоненты строки, нужно просто вызвать функцию strtok() несколько раз (в данном примере в цикле), и каждый раз первым ее аргументом должен быть NULL.
char *strchr(const char *s, int c); Ищет в строке s первое вхождение символа (char)c, начиная с начала строки s. В случае успеха возвращает указатель на найденный символ, иначе возвращает NULL. Есть аналогичный поиск последнего вхождения: strrchr.
#include <stdio. h>
#include <conio. h>
#include <string. h>
int main(void)
{
char *str1 = "CodeGear", ch = 'e', *ptr;
ptr = strchr(str1, ch);
if (ptr!=NULL) {
printf("The first occurence of the char '%c' in the string \"%s\": \"%s\"\n", ch, str1, ptr);
printf("Its positoin is: %d (0,1,2,...)\n", ptr-str1);
char* ptr2 = strrchr(str1, ch);
if (ptr2) {
printf("The last occurence of the char '%c'in the string \"%s\": \"%s\"\n", ch, str1, ptr2);
printf("Its positoin is: %d (0,1,2,...)\n", ptr2-str1);
}
}
else
printf("The char was not found\n", ptr);
getch();
return 0;
}
char *strstr(const char *s, const char *subs); Ищет в строке s первое вхождение подстроки subs, начиная с начала строки s. В случае успеха возвращает указатель на первый символ подстроки subs в строке s, иначе возвращает NULL.
#include <stdio. h>
#include <conio. h>
#include <string. h>
int main(void)
{
char *str1 = "CodeGear", *str2 = "de", *ptr;
ptr = strstr(str1, str2);
printf("The substring is: %s\n", ptr);
printf("Its positoin is: %d (0,1,2,...)\n", ptr-str1);
getch();
return 0;
}
int strcmp(const char *s1, const char *s2); Сравнивает две строки. Возвращает отрицательное значение, если s1<s2; нуль, если s1==s2; положительное значение, если s1>s2. Параметры - указатели на сравниваемые строки.
char *strcpy(char *dest, const char *src); Копирует исходную строку src и завершающий ее нулевой символ в строку результата dest. Возвращает dest.
double atof(const char *s); Преобразует строку s в число с плавающей точкой типа double. Заголовочный файл - math. h
int atoi(const char *s); Преобразует строку s в число типа int. Возвращает значение или нуль, если строку преобразовать нельзя. Заголовочный файл - stdlib. h
long atol(const char *s); Преобразует строку s в число типа long. Возвращает значение или нуль, если строку преобразовать нельзя. Заголовочный файл - stdlib. h
char *itoa(int value, char *s, int radix); Преобразует значение целого типа value в строку s. Возвращает указатель на результирующую строку. Значение radix - основание системы счисления, используемое при преобразовании (от 2 до 36). Заголовочный файл - stdlib. h
Подробнее про функции работы со строками: http://it. *****/C++/c0063.html
void *malloc(size_t size); Функция malloc() возвращает указатель на первый байт области памяти размером size, которая была выделена из динамически распределяемой области памяти. Если для удовлетворения запроса в динамически распределяемой области памяти нет достаточного объема памяти, возвращается нулевой указатель.
Функции для чтения строк и символов
int getc ( FILE * fp ); Возвращает очередной символ из потока, на который указывает fp; при ошибке или в случае конца файла возвращается EOF.
int putc ( int c, FILE * fp ); Записывает символ с в файл fp и возвращает записанный символ или EOF в случае ошибки.
char * fgets ( char * line, int maxline, FILE * fp ); Считывает очередную строку (вместе с символом ее конца) из файла fp массив символов line; в общей сложности читается не более maxline-1 символов. Получившаяся строка завершается нулевым символом ‘\0’. В конце файла или в случае ошибки она возвращает NULL.
int fputs ( const char * line, FILE * fp ); Записывает строку line в файл fp. Возвращает EOF в случае ошибки и 0 в противном случае.
int getchar(); Возвращает значение символа (если он есть), который пользователь набрал на клавиатуре. После ввода символа нужно нажать клавишу Enter. Заголовочный файл - stdio. h
int getch(); Аналогично предыдущему, только символ на экране не отображается. Используется чаще для организации задержки выполнения программы. Заголовочный файл - conio. h
int putchar(int c); Выводит символ c на экран. В случае успеха возвращает сам символ c, в противном случае - EOF. Заголовочный файл - stdio. h
Пример посимвольного выделения слов из текстового файла.
Из заданного файла выделить все слова и вывести их в другой файл в столбик, указав порядковый номер. Также вывести общее количество слов в файле.
Словом будем считать непустую последовательность любых символов в ANSI кодировке, отделенных друг от друга символами-разделителями: пробел, точка, запятая, двоеточие, точка с запятой, конец строки, перевод каретки, табуляция, конец файла. В число разделителей можно также включить все символы до 32-го по таблице символов и скобки разных видов и т. д.
#include <stdio. h>
#include <iostream. h>
#define MAXLEN 50
void main()
{
unsigned char ch; //текущий считанный символ 0..255
int num = 0; //номер текущего слова
char slovo[MAXLEN+1] = ""; //текущее слово
char* zapis; //динамич. строка для примера
int i, end=0; //индекс текущего символа в slovo
FILE* inputFile; //объявляем указатель на входной файл
inputFile=fopen("..\\input. txt", "r"); //открываем текстовый файл для чтения
//если входной файл не открыт, выводим сообщение и выходим из программы
if (inputFile == NULL) {
cout << "Can't open input. txt" << endl;
system("pause");
return;
}
FILE* outputFile; //объявляем указатель на выходной файл
outputFile = fopen("..\\output. txt","w"); //открываем ткстовый файл для записи
/*если выходной файл не открыт, выводим сообщение,
закрываем отрытый входной файл и выходим из программы*/
if (outputFile == NULL) {
cout << "Can't open output. txt" << endl;
fclose(inputFile);
system("pause");
return;
}
//пока не дойдем до конца файла, считываем очередной символ
while (!feof(inputFile) && !end) {
ch = fgetc(inputFile);
if (feof(inputFile)) { //если считан список конца файла
end=1; break;
}
//если текущий символ - не разделитель (знак или конец строки, табуляция)
if (strchr(" .,!?:;\n\r\t",ch) == 0) {
//то пока текущий символ удовлетворяет этому условию
i = 0; //обнуляем индекс текущего символа в слове
while (strchr(" .,!?:;\n\r\t",ch) == 0) {
slovo[i] = ch; //добавляем символ в конец текущего слова
i++; //смещаем индекс
//считываем новый символ
ch = fgetc(inputFile);
if (feof(inputFile)) { //если считан список конца файла
end=1; break;
}
if (i==MAXLEN) break; //если превышена длина слова - конец слова
}
num++; //инкрементируем количество считанных слов
slovo[i] = '\0'; //завершаем слово символом конца строки
/*формируем и выводим фразу, содержащую номер слова
и само слово*/
fprintf(outputFile, "%3d %s\n", num, slovo); //записываем в файл
slovo[0] = '\0'; //очищаем slovo
}
}
/*формируем и выводим запись, содержащую количество всех слов в
файле*/
zapis = (char *) malloc(30 * sizeof(char));
itoa(num, zapis, 10);
char* vsego = "Всего слов: ";
fputs(vsego, outputFile);
fputs(zapis, outputFile);
free(zapis);
// или просто fprintf(outputFile, "Всего слов: %d", num);
fclose(inputFile); //закрываем входной файл
fclose(outputFile); //закрываем выходной файл
system("pause"); //система будет ожидать нажатия любой клавиши
//нужно для того, чтобы окно консоли не закрывалось сразу после выполнения программы
}
Пример выделения слов из текстового файла с помощью функций работы со строками.
Из заданного файла выделить все слова и вывести их в другой файл в столбик, указав порядковый номер. Также вывести общее количество слов в файле.
Словом будем считать непустую последовательность любых символов в ANSI кодировке, отделенных друг от друга символами-разделителями: пробел, точка, запятая, двоеточие, точка с запятой, конец строки, перевод каретки, табуляция, конец файла. В число разделителей можно также включить все символы до 32-го по таблице символов и скобки разных видов и т. д.
Считывание строк с помощью scanf/fscanf выполняется сразу с учетом разделителей: пробел, конец строки, перевод каретки, табуляция, конец файла.
#include <stdio. h>
#include <iostream. h>
void main()
{
char* stroka; //текущая считанная строка, с дин. выделением памяти
int num = 0; //номер текущего слова
char* slovo; //текущее слово
FILE* inputFile; //объявляем указатель на входной файл
inputFile=fopen("..\\input. txt", "r"); //открываем текстовый файл для чтения
FILE* outputFile; //объявляем указатель на выходной файл
outputFile = fopen("..\\output. txt","w"); //открываем текстовый файл для записи
//если входной файл не открыт, выводим сообщение и выходим из программы
if (inputFile == NULL) {
cout << "Can't open input. txt" << endl;
system("pause");
return;
}
/*если выходной файл не открыт, выводим сообщение,
закрываем отрытый входной файл и выходим из программы*/
if (outputFile == NULL) {
cout << "Can't open output. txt" << endl;
system("pause");
fclose(inputFile);
return;
}
//выделяем память, куда будем считывать строку
stroka = (char *) malloc(256 * sizeof(char));
/*считываем строку из файла и если не достигли конца файла
то выполняем тело цикла*/
fscanf(inputFile, "%s", stroka);
fputs("Считана фраза: ",outputFile);
fputs(stroka, outputFile);
fputs("\n", outputFile);
while ( stroka[0] != '\0'){
slovo = strtok(stroka, " ,.!?:;\n\t"); //выделяем первое слово по 7-ми разделителям
/*если слово найдено, записываем его порядковый номер и
само слово в файл*/
if (slovo) {
num++;
fprintf(outputFile, "%3d %s\n", num, slovo); //записываем в файл }
}
//пока слова выделяются
while (slovo = strtok(NULL, " ,.!?:;\n\t")){
/*если слово найдено, записываем его порядковый номер и
само слово в файл*/
num++;
fprintf(outputFile, "%3d %s\n", num, slovo); //записываем в файл
}
stroka[0]='\0';
fscanf(inputFile, "%255s", stroka);
fputs("Считана фраза: ",outputFile);
fputs(stroka, outputFile);
fputs("\n", outputFile);
}
/*строки в файле закончились, но осталась выделенная память под
очередную строку, которой не оказалось в файле*/
free(stroka); //освобождаем память
/*формируем и выводим запись, содержащую количество всех слов в
файле*/
fprintf(outputFile, "Всего слов: %d", num);
fclose(inputFile); //закрываем входной файл
fclose(outputFile); //закрываем выходной файл
system("pause"); //система будет ожидать нажатия любой клавиши
//нужно для того, чтобы окно консоли не закрывалось сразу после выполнения программы
}


