Разбить исходный текст на строки длиной N символов - C (СИ)
Формулировка задачи:
Написать программу, разбить исходный текст на строки длиной N символов. N задается пользователем. Перенос на новую строку осуществлять на месте пробела (слова не переносить). В строки, содержащие меньше N символов, равномерно вставить пробелы между словами, чтобы их длина составляла ровно N символов. Если хотя бы одно слово в тексте длиннее N, то пользователю выдается сообщение о невозможности выполнения операции. Исходный текст вводится с клавиатуры или берется из файла (по выбору пользователя). Размер текста не ограничен. Результат вывести на экран или записать в текстовый файл (по выбору пользователя).
==============================================================================================
Ребят, вот такую штуку надо на Си помогите пожалуйста, ну или хотя бы объясните как это реализовать, напишу уж как то сам)
Решение задачи: «Разбить исходный текст на строки длиной N символов»
textual
Листинг программы
#include "stdafx.h" #include <windows.h> #include <string.h> #include <conio.h> #include <stdio.h> #include <iostream> #include <stdio.h> #include <conio.h> #include <io.h> const int KEY_ENTER = 13; // Клавиша Enter const int KEY_UP = 72; // Клавиша Cursor Up const int KEY_DOWN = 80; // Клавиша Cursor Down int smenu=1; // Функция меню // выводит меню и обрабатывает команды пользователя в нём int menu(); // Рисуем рамочку вокруг меню // В параметрах передаётся дескриптор консоли void DrawBorder(HANDLE); //пишем void pisat(); //выбираем файл void file(); // Рисуем пункты меню // В параметрах передаётся выбранный пункт меню void DrawMenu(HANDLE,int); using namespace std; //SetLocale (LC_ALL,"Russia"); void main() { setlocale (LC_ALL,"Russian"); int choose; system ("cls"); while (1) { // Выбор пункта меню choose = menu(); // В зависимости от выбранного пункта делаем: switch (choose) { case 1: // Пишем сами pisat(); break; case 2: // Выбираем файл /*file();*/ break; case 3: // выход exit(0); } } return ; } //============================================================ // Выбор пункта меню int menu() {setlocale (LC_ALL,"Russian"); system("cls"); HANDLE dysplay; // дескриптор консоли dysplay = GetStdHandle(STD_OUTPUT_HANDLE); DrawBorder(dysplay); // Рисуем рамочку вокруг меню // Опрос клавиш int key=0; DrawMenu(dysplay,smenu); // Рисуем пункты меню while (key!=KEY_ENTER) { key = getch(); // Нажали вверх? if (key==KEY_UP) { // Переходим к предыдущему пункту меню, // если можем и перерисовываем меню if (--smenu<1) smenu=1; DrawMenu(dysplay,smenu); } // нажали вниз? else if (key==KEY_DOWN) { // Переходим к следующему пункту меню, // если можем и перерисовываем меню if (++smenu>3) smenu=3; DrawMenu(dysplay,smenu); } } return smenu; } // Рисуем рамочку вокруг меню // В параметрах передаётся дескриптор консоли void DrawBorder(HANDLE dysplay) {setlocale (LC_ALL,"Russian"); // Определяем координаты рамки, цвет её, вид const int left = 80/2-32/2; const int top = 20/2-6/2; char ramka[3][33]; strcpy(ramka[0],"+------------------------------+"); strcpy(ramka[1],"| |"); COORD position; // Устанавливаем цвет и координаты position.X = left; position.Y = top; SetConsoleTextAttribute(dysplay,FOREGROUND_GREEN|FOREGROUND_INTENSITY); SetConsoleCursorPosition(dysplay,position); // выводим верхнюю часть рамки printf("%s",ramka[0]); // выводим середину for (int i=0; i<3; i++) { position.X = left; position.Y++; SetConsoleCursorPosition(dysplay,position); printf("%s",ramka[1]); } // выводим нижнюю часть position.X = left; position.Y++; SetConsoleCursorPosition(dysplay,position); printf("%s",ramka[0]); // Устанавливаем курсор в левый верхний угол position.X = 0; position.Y = 0; SetConsoleCursorPosition(dysplay,position); SetConsoleTextAttribute(dysplay,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED); return; } //============================================================ // Рисуем пункты меню // В параметрах передаётся выбранный пункт меню void DrawMenu(HANDLE dys,int select) {setlocale (LC_ALL,"Russian"); // Константы выбирающие место вывода на экран const int left = 80/2-32/2+1; const int top = 20/2- 6/2+1; COORD pos; char textmenu[4][31]; // Пункты меню strcpy(textmenu[0]," 1. Ввести текст с клавиатуры"); strcpy(textmenu[1]," 2. Выбрать файл "); strcpy(textmenu[2]," 3. Выход "); // Вывод пунктов меню for (int i=0; i<3; i++) { // В зависимости от выбранного пункта меню выставляем цвет if (select==i+1) SetConsoleTextAttribute(dys,BACKGROUND_GREEN); else SetConsoleTextAttribute(dys,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY); // Выводим pos.X = left; pos.Y = top+i; SetConsoleCursorPosition(dys,pos); printf("%s",textmenu[i]); } // Устанавливаем курсор в левый верхний угол pos.X = 0; pos.Y = 0; SetConsoleCursorPosition(dys,pos); SetConsoleTextAttribute(dys,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED); return; } /*void file() { char filename[100]; FILE* fout; // Вводим имя файла system("cls"); cout<<"Введите имя файла> "; cin>>filename; // Открываем файл fout = fopen(filename,"rt"); // проверяем, смогли ли мы открыть if (fout==0) {OemToAnsi(filename,filename); cout<<"Не удалось открыть файл<"<<filename<<">!"; getch(); return; } char c[100]; int k,i,z; for (i=0;c[i]!=';';i++) { fread(&c[i],100,1,fout); } getch(); int N; cout<<"Введите на какое количество символов нужно разбить текст="; cin>>N; cout<<"Что-бы вывести на экран введите 0, для сохранения в файл введите 1"; cin>>z; if(z==0) for(k=0;c[k]!=';';k++) { cout<<c[k]; system("pause"); } else for(k=0;c[k]!=';';k++) { fwrite (&c[k], sizeof(int),1, fout); }; return; }*/ void pisat() { setlocale (LC_ALL,"Russian"); system("cls"); int N,i,f,k,p,g,x,j,t,del; char z[100],c[100],filename[100]; FILE* fout; p=0; g=0; cout<<"Введите текст:\n"; gets(z); OemToAnsi(z,z); printf(z); cout<<"\n"<<"Введите на какое количество символов нужно разбить текст=\n"; cin>>N; cout<<"Что-бы вывести на экран введите(0), для сохранения в файл введите(1)"; cin>>f; if(f==0) { int i,j,nw,chars,sp1,sp2; nw=0; //кол-во слов в строке chars=0; //кол-во непробельных символов в строке i=0; //текущий индекс в строке while(z[i]!=0) //пока не закончилась строка { for(;z[i]!=0&&z[i]==' ';i++) //поиск начала слова j=i; //запомнить его начало for(;z[i]!=0&&z[i]!=' ';i++) chars++; //поиск конца слова с подсчетом символов в словах if(i>j) nw++; //если индексы различаются, увеличить кол-во слов } if(nw<2) exit(0) ; //если менее 2-х слов, то ничего не выравнивать sp1=(N-chars)/(nw-1); //кол-во вставляемых между словами пробелов sp2=(N-chars)%(nw-1); //кол-во добавляемых по одному пробелов между словами i=0; while(z[i]!=0) //пока не закончилась строка { for(;z[i]!=0&&z[i]==' ';i++); //поиск начала слова j=i; //запомнить его начало for(;z[i]!=0&&z[i]!=' ';i++); //поиск конца слова if(i>j) //если индексы различаются { memmove(&z[i+sp1-1+(sp2?1:0)],&z[i],strlen(&z[i])+1); //раздвинуть строку между словами на требуемое кол-во memset(&z[i],' ',sp1-1+(sp2?1:0)); //заполнить промежуток между словами пробелами if(sp2) sp2--; } } /*{ while(z[g]!=';') {{ for (i=0;i<=N;i++) {g++; if (z[g]=';') { break; } while (z[g]!=' '&& z[g]!=';') { g++; } if(z[g]==';'); else z[g]='\n', p++; }} } for(g=0,x=0;x<p;g++) { if (z[g]=='\n') x++; } j=g;//Номер z[j]-это последняя строка первый символ for(x=0;z[g]!=';';x++,g++)//x-после выполнения цикла посчитает кол-во символов в последней строке {} if(N-x<0)//Если истинно то подсчитываем кол-во пробелов в последней строке, делим целочисленно (кол-во пробелов в строкее/(N-x)) переписываем в другой массив добовляя пробелы... { //Если ложно просто продолжаем программу, то есть проблеы не нужно вставлять. for (g=j,t=0;z[g]!=';';g++) { if(z[g]==' ') t++; } del=t/(N-x); } } // while (z[j]='\n')//последняя строка первый символ //{ // // // } else { { cout<<"Введите имя файла> "; cin>>filename; // Открываем файл fout = fopen(filename,"wt"); // проверяем, смогли ли мы открыть if (fout==0) { cout<<"Не удалось открыть файл<"<<filename<<">!"; } else { { while(z[g]!=';') { for (i=0;i<N;i++) {g++; if (z[g]==';') { break; } } while (z[g]!=' ' && z[g]!=';') { g++; } if(z[g]==';'); else z[g]='\n', p++; } } } } } for(k=0;z[k]!=';';k++) { if(f==0) { cout<<z[k]; } else fwrite(&z[k],sizeof(z[k]),1,fout); } system ("pause");*/ } else{}; for(k=0;z[k]!=';';k++) { if(f==0) { cout<<z[k]; } else fwrite(&z[k],sizeof(z[k]),1,fout); } system ("pause"); return; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д