Использование функций для вывода строк или символов. Нуб

0

У меня есть входной файл с именем animals.dat, что мне нужна моя программа для чтения и вывода файлов в блочном формате. Например, файл читает:

TIGER DOG CAT

Он должен выводить

TTTTTTTTTTTTTTTTTTTT (T будет 1x20, поскольку это первый символ в слове и 20-я буква в алфавите)

IIIIIIIII IIIIIIIII (I 2x9 как 2-й символ и 9-й в алфавите)

Я попытался настроить функции для этого, но мой вывод выглядит безумным, выводя только TONS одного символа за раз, и я уверен, что даже не делал строк. Что я делаю не так?

#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin;
ofstream fout;

void rectangle(char ch, int alphacount,int count) {
int height=1, width=0;
while(width <= alphacount && height <= count) {

    while(width <= alphacount) {
        fout << ch;
        cout << ch;
        width++;
    }
    cout << endl;

    if(height <= count) {
        fout << ch << endl;
        cout << ch << endl;
        height++;
    }
}
}

int main(void) {
 fin.open("animals.dat");
fout.open("out.dat");
 int count=0, alphacount=0;
 char ch, x='A';
 while(!fin.eof()) {
    fin >> ch;
    while(x!=ch) {
        x++;
        alphacount++;
    }
    rectangle(ch, alphacount, count);

    count++;
    if(ch =='\n') {
        alphacount = 0;
        count = 0;
        x = 0;
    }
}

system("pause");
}
  • 2
    'Что я делаю неправильно?' Пожалуйста, используйте отладчик, чтобы узнать, прежде чем спрашивать здесь. Если у вас есть конкретные вопросы о поведении, которые вы не понимаете и которые не могут быть объяснены в справочной документации по c ++, задайте их, пожалуйста!
  • 0
    Вы можете начать со сброса x до разумного значения в некоторых случаях ...
Показать ещё 2 комментария
Теги:
function

2 ответа

1
Лучший ответ

Вещи, которые я вижу:

  1. rectangle функции может быть легко упрощен. Вам просто нужно два for петель.

    void rectangle(char ch, int alphacount,int count)
    {
       for ( int height = 0; height < count; ++height )
       {
          for ( int width = 0; width < alphacount; ++width )
          {
             fout << ch;
             cout << ch;
          }
          cout << endl;
       }
    }
    
  2. Вам совсем не нужно x потому что вы можете вычислить alphacount напрямую, используя арифметику.

  3. Вы можете перемещать alphacount внутри в while цикла.

  4. Код внутри в while цикла может быть упрощен до:

    while(!fin.eof())
    {
       int alphacount = 0;
       count++;
       char ch;
       fin >> ch;
       if ( isalpha(ch) )
       {
          if ( ch > 'Z' )
          {
             // It a lower case letter.
             alphacount = ch - 'a' + 1;
          }
          else
          {
             // It an upper case letter.
             alphacount = ch - 'A' + 1;
          }
          rectangle(ch, alphacount, count);
       }
    
       if(ch =='\n')
       {
          count = 0;
       }
    }
    
  • 0
    Прежде всего, большое спасибо, это намного яснее и элегантнее. Однако вывод дает мне 5 строк я вместо 2, какие-либо причины, почему? Я отредактировал файл, где он только: TI
  • 0
    @ Skatix Я не уверен, почему. Когда я запустил программу, я получил два ряда «я».
Показать ещё 9 комментариев
1

Вы не alphacount инициализируете x и alphacount внутри внешнего цикла. Ваш код должен выглядеть так:

while(!fin.eof())
{
    int alphacount=0;
    char ch, x='A';

    fin >> ch;
    .
    .
    .

Отладчик нашел бы эту проблему для вас за гораздо меньшее время, чем потребовалось бы, чтобы написать свой вопрос.

  • 0
    Извините, я очень новичок и не знаком с отладкой, есть ли у вас какие-либо советы, как это узнать?
  • 1
    @Skathix Я уверен, что вы найдете множество всесторонних руководств «Как отлаживать» для вашей конкретной цепочки инструментов / IDE, просто прибегая к помощи.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню