Страница 1 из 1

Помогите найти ошибку

Добавлено: 29 ноя 2009, 09:24
akafanta
Что надо было:
Создать текстовую функцию main(), которая реализует след. алгоритм:
1. Объявить и ввести переменные.
2. Ввести строку tmp.
3. Выделить блок памяти через указатель.
4. Скопировать строку в выделенный блок
5. Обработать блок по условию.
6. Вывести результаты обработки
7. Освободить блок
Вводить и обрабатывать строки в цикле, пока не введена пустая строка.
Условие обработки строки (п.5):
Перемешивать по k букв. Например:
Было: abcd efgh i
При k = 4 должно получится:
dcba hgfe i

Что получилось:

Код: Выделить всё

#include <iostream>
#include <cstring>
using namespace std;

int main ()
{
	char tmp [80];
	char* p;
	int z(0);
	do
	{
		cout << "Enter the sentence: " << endl;
		cin >> tmp;
		z = strlen(tmp);
		p= new char[z+1];
		strcpy(p, tmp);
		char a;
  		char* pT = p;
		char* pE =pT+3;
		char* pN = (pT+z)-1;
		for (pT=p; pT < (pN-3);pT += 4, pE = pT + 3)
		{
			while(pT<pE)
			{
				
				a = *pT;
				*pT = *pE;
				pT++;
				*pE = a;
				pE--;
			}
		}
		cout << p << endl;
		delete [] p;

Re: Помогите найти ошибку

Добавлено: 29 ноя 2009, 22:23
Romeo
Во-первых, в чём вопрос?

Во-вторых, ты привела не весь код - сразу бросается в глаза отсутствие баланса фигурных скобок.

Re: Помогите найти ошибку

Добавлено: 29 ноя 2009, 22:38
akafanta
Я девушка :)
Перемешиваются только первые четыре буквы. Почему?
Последнюю скобку забыла.

Re: Помогите найти ошибку

Добавлено: 30 ноя 2009, 02:22
IceFlame
А оператор [] запрещен чтоли? Проблема в том, что pT увеличивается как в цикле for, так и в цикле while. Ну а вот мой вариант:

Код: Выделить всё

#include <iostream>
#include <cstring>
using namespace std;

int main ()
{
    char tmp [80];
    int k=4;
    char* p;
    int z=0;
    do
    {
        cout << "Enter the sentence: " << endl;
        cin >> tmp;
        z = strlen(tmp);
        if(z<=1) break;
        p= new char[z+1];
        strcpy(p, tmp);
        for(int i=0;i<z;i+=k)
        {
            int m;
            if((z-i)<k) m=z-i;
            else m=k;
            for(int j=0;j<m/2;j++)
            {
                char a=p[i+j];
                p[i+j]=p[i+m-j-1];
                p[i+m-j-1]=a;
            }
        }
        cout << p << endl;
        delete [] p;
    }
    while(1);
}

Re: Помогите найти ошибку

Добавлено: 30 ноя 2009, 17:49
akafanta
Ух ты! Спасибо!