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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы