Разбить исходный текст на строки длиной 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;
}