Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать программу на "Си", Программа выравнивания строк 
:(
    Опции темы
Эпсилон
Дата 3.1.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Помогите пожалуйста написать программу на "Си", не на "С++". 

"Выравнивание строк: в тексте из N строк выровнить строки так, чтобы каждая строка имела длину 65 символов. Выравнивание произовится за счёт вставки дополнительных пробелов."

Ход действий я знаю: нужно открыть текстовый документ FILE *IN, его просто прочитать(rt), совершить над ним выравниваение с помощью цикла добавить пробелы, подсчитать длину строки, если нет 65 то ещё добавить пробелы, опять подсчитать длину строки, до тех пор пока не будет 65символов в строке, и сохранить уже в новый текстовый документ только в FILE *OUT. Но реализовать в Си коде не смог, помогите написать, взаранее спасибо.
PM MAIL   Вверх
Rockie
Дата 3.1.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Эпсилон @  3.1.2007,  22:13 Найти цитируемый пост)
 подсчитать длину строки, если нет 65 то ещё добавить пробелы, опять подсчитать длину строки

Не обязательно. 
Считываешь строку. Считаешь, сколько пробелов в строке. Если длина строки больше 65 или нет пробелов - каким-то образом обрабатываешь эту ситуацию. 

Если все нормально - считаешь, сколько нужно добавить к этим существующим пробелам:

x = (65 - длина_строки) / кол-во_пробелов_в_строке

Пишешь в OUT файл, добавляя x пробелов к уже существующим. 

ИМХО

Добавлено @ 22:30 
А вообще такая задача была и не раз, копайся в поиске по сайту




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Эпсилон
Дата 3.1.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Спасибо большое всё получилось, только не то, я же подсчитал сколько длина строки, а как подсчитать сколько пробелов? и если можно то как это в коде выглядит, "Си" недавно начал изучать.

Это сообщение отредактировал(а) Эпсилон - 4.1.2007, 03:14
PM MAIL   Вверх
_hunter
Дата 4.1.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



проходиш по всем элементам массива символов, если текущий символ == ' ' -- увеличиваеш счетчик на 1.
в чем тут может быть проблема -- не понимаю...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Эпсилон
Дата 4.1.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Вот написал только пишет две ошибки: 
Код

#include <stdio.h>
#include <string.h>
const int LINE_LEN = 65;
void main()
{
  char text[100];
  FILE *in = fopen("text_in.txt", "rt");
  if (!in) { printf("error open text_in.txt\n"); return; }
  FILE *out = fopen("text_out.txt", "wt");
  while (fgets(text,sizeof(text),in))
  {
    int len = strlen(text);
    if (text[len-1] == '\n') text[--len] = 0;
    while (len < LINE_LEN) text[len++] = ' ';
    text[len++] = '\n';
    text[len] = 0;
    fputs(text, fout);
  }
  fclose(out);
  fclose(in);
}


Первая ошибка когда открываю файл:
Код

 FILE *out = fopen("text_out.txt", "wt");
 ( "*" светится как ошибка):
Error C:\____\zadacha.c 9: Improper use of a typedef symbol in function main
Вторая ошибка тоже в File *out:
("out" светится как ошибка):
Error C:\____\zadacha.c 9: Undefined symbol  ' out '  in function main.

Это сообщение отредактировал(а) Эпсилон - 4.1.2007, 15:26
PM MAIL   Вверх
frenchman
Дата 4.1.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Эпсилон, 

Цитата

а как подсчитать сколько пробелов?


Код

int p = 0; // счетчик пробелов
for(int i = 0; i < SIZE; i++)
{ if(stroka[i] == " ") p++;
}


SIZE - это длина строки.

PM MAIL   Вверх
Rockie
Дата 4.1.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Эпсилон @  3.1.2007,  23:10 Найти цитируемый пост)
 а как подсчитать сколько пробелов?


Цитата(_hunter @  4.1.2007,  11:25 Найти цитируемый пост)
проходиш по всем элементам массива символов, если текущий символ == ' ' -- увеличиваеш счетчик на 1.

Код

  char* s = "Some string with some words";
  int spaces = 0, len = strlen(s);

  for(int i=0;i<len;i++)
    if(s[i]==' ') spaces++;







--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
_hunter
Дата 4.1.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



студия 7.1 компилит...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Rockie
Дата 4.1.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Эпсилон @  4.1.2007,  15:22 Найти цитируемый пост)
   if (text[len-1] == '\n') text[--len] = 0;

imho это лишнее
Цитата(Эпсилон @  4.1.2007,  15:22 Найти цитируемый пост)
 while (len < LINE_LEN) text[len++] = ' ';

тут если честно, полета мысли не понял. Тебе вроде бы алгоритм дан..
Цитата(Эпсилон @  4.1.2007,  15:22 Найти цитируемый пост)
Improper use of a typedef symbol in function main

поменяй out на myOut или что-нибудь еще




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Rockie
Дата 4.1.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Нужно еще добавить проверки
Цитата(Rockie @  3.1.2007,  22:28 Найти цитируемый пост)
 Если длина строки больше 65 или нет пробелов - каким-то образом обрабатываешь эту ситуацию. 

ну и погрешность деления при расчете кол-ва пробелов. А так - держи, с выводом на экран.
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
const int LINE_LEN = 65;

int main()
{
  char text[80];
  FILE *in = fopen("text_in.txt", "rt");
  if (!in) { printf("error open text_in.txt\n"); return 0; }

  while (fgets(text,sizeof(text),in))
  {
     int len = strlen(text);
     int spaces = 0, addSpaces = 0;

     for(int i=0;i<len;i++)       // посчитали существующие пробелы
       if(text[i]==' ') spaces++;

     if(spaces==0) return 0;       // избегаем деления на ноль ниже

     addSpaces = (LINE_LEN - len) / spaces;

     for(int i=0;i<len;i++)
      {
        if(text[i]==' ')            // встретили пробел
         { 
             for(int j=0;j<addSpaces;j++)
                putc(' ',stdout);
         }
        putc(text[i],stdout);
      }

   }

  fclose(in);
  getch();
  return 0;
}





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Эпсилон
Дата 5.1.2007, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Спасибо большоё всё работает, но нужно чтобы результат, выровненный текст, нужно записать в другой файл. А когда я добавляю FILE *out, то выходят опять те же ошибки. 
PM MAIL   Вверх
Rockie
Дата 5.1.2007, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Эпсилон @  5.1.2007,  03:21 Найти цитируемый пост)
 А когда я добавляю FILE *out, то выходят опять те же ошибки. 

Эпсилон, по форматировнию кода видно, что out это зарезервированное слово(оно жирное). поэтому я и написал двумя постами выше  smile 
Цитата(Rockie @  4.1.2007,  15:49 Найти цитируемый пост)
поменяй out на myOut или что-нибудь еще


imho потом останется заменить 
Код

   putc(' ',stdout);

на что-нибудь вроде
Код

   putc(' ',myOut);





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
apook
Дата 5.1.2007, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Код

if( spaces==0 ) return 0;         // избегаем деления на ноль ниже

Если в в какой-то строке нет пробела программа благополучно завершилась
Зачем так категорично


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Rockie
Дата 5.1.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(apook @  5.1.2007,  09:28 Найти цитируемый пост)
Если в в какой-то строке нет пробела программа благополучно завершиласьЗачем так категорично

apook, всмысле "категорично"? Это учебный пример, в нем главное не интерфейс, а функциональность. А так - хоть мигающий ShowMessage прикручивай smile

p.s.: кстати imho этот код
Код

return 0; 

не говорит об успешном завершении программы. Просто так обычно делают.




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Kuvaldis
Дата 5.1.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Граждане, в свое время другие граждане целых 4 листа по этой теме списали
смотрим тут


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.