Официальный сайт студ.городка НГТУ
Программирование и БД » Нужна помощь с задачкой на С++ 

#1  07.03.10 22:07

Нужна помощь с задачкой на С++

Замены во вводимой строке всех повторяющихся символов их восьмеричными представлениями и вывод результата.

Код::

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define StringSize 100

int main(void)
{
	char cString[StringSize];
	int iIndex1,iIndex2;

	gets(cString);

	for (iIndex1 = 0; iIndex1 < StringSize; iIndex1++)
	{
		if (cString[iIndex1] == 0)
			break;

		for(iIndex2 = iIndex1++; iIndex2 < StringSize; iIndex2++)
		{
			if (cString[iIndex2] == 0)
				break;

			if (cString[iIndex1] == cString[iIndex2])
			{
				cString[iIndex1] = 'z';
				cString[iIndex2] = 'z';
			}
		}
	}
	puts(cString);
	_getch();
	return 0;
}

Сначала я решил написать программу которая просто заменяет все повторяющиеся символы буквой z, но при выполнении второго цикла for меняются значения iIndex1 и iIndex2 из-за этого программа выводит полную ерунду, шожеделать?!

Offline

#2  07.03.10 22:30

Re: Нужна помощь с задачкой на С++

а зачем ты сразу же заменяешь cString[iIndex1] во втором цикле ? У тебя потом сравнивать не с чем становится потому что после первого совпадения символов  у тебя затирается символ с которым ты сравниваешь все остальные.
Есть конечно более приятные алгоритмы, но если ты решил проработать этот, то заполняй переменную cString[iIndex1] после того как второй цикл полностью отработает.

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

Исправлено trooly (07.03.10 22:32)

Offline

#3  08.03.10 00:24

$up
Профиль

Re: Нужна помощь с задачкой на С++

trooly написал(а):

и проверял бы строку не на введенный 0, а на символ возврата каретки, ентера то есть.

посмеялся, спасибо за отжиг.

Offline

#4  08.03.10 00:43

$up
Профиль

Re: Нужна помощь с задачкой на С++

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

P.S.

iIndex2 = iIndex1++
замени на
iIndex2 = iIndex1+1

Исправлено $up (08.03.10 00:46)

Offline

#5  08.03.10 01:34

Re: Нужна помощь с задачкой на С++

Спасибо я уже разобрался что не правильно, но теперь я не могу понять, как заменить символ его восьмеричным представлением а не буквой 'z'

$up написал(а):

восьмеричное представление символа это код символа в восьмеричной системе?

Да ты правильно понял, да я знаю что он будет длиннее символа, но это не суть важно.

вот как теперь выглядит код что нужно изменить чтобы заменить повторяющиеся символы?

Код::

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define StringSize 100

int main(void)
{
	char cString[StringSize];
	int iIndex1,iIndex2;
	bool flag;

	gets(cString);

	for (iIndex1 = 0; iIndex1 < StringSize; iIndex1++)
	{
		if (cString[iIndex1] == 0)
			break;
		flag = false;
		for(iIndex2 = iIndex1 + 1; iIndex2 < StringSize; iIndex2++)
		{
			if (cString[iIndex2] == 0)
				break;

			if (cString[iIndex1] == cString[iIndex2])
			{
				flag = true;
				cString[iIndex2] = 'z';
			}
		}
		if(flag)
			cString[iIndex1] = 'z';
	}
	puts(cString);
	_getch();
	return 0;
}

Offline

#6  08.03.10 02:22

$up
Профиль

Re: Нужна помощь с задачкой на С++

Код: c:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define StringSize 100
 
int main(void)
{
	char cString[StringSize];
        bool flag[StringSize];
	int iIndex1,iIndex2;
 
	gets(cString);
	for (iIndex1 = 0; iIndex1 < StringSize; iIndex1++)
	{
             flag[iIndex1] = false;
        }
 
	for (iIndex1 = 0; iIndex1 < StringSize; iIndex1++)
	{
		if (cString[iIndex1] == 0)
			break;
                if (flag[iIndex1]) continue;
 
		for(iIndex2 = iIndex1 + 1; iIndex2 < StringSize; iIndex2++)
		{
			if (cString[iIndex2] == 0)
				break;
 
			if (cString[iIndex1] == cString[iIndex2])
			{
				flag[iIndex1] = flag[iIndex2] = true;
			}
		}
	}
 
	for (iIndex1 = 0; iIndex1 < StringSize; iIndex1++)
	{
             if (cString[iIndex1] == 0)
		break;
             if (flag[iIndex1])
             {
                printf("%o",cString[iIndex1]);
             }
             else
             {
                printf("%c",cString[iIndex1]);
             }
        }
 
	_getch();
	return 0;

Исправлено $up (08.03.10 02:28)

Offline

#7  08.03.10 09:43

Re: Нужна помощь с задачкой на С++

для конвертации в 8-чную СС можно воспользоваться функцией itoa

itoa

function
<stdlib.h>
char *  itoa ( int value, char * str, int base );

Convert integer to string (non-standard function)
Converts an integer value to a null-terminated string using the specified base and stores the result in the array given by str parameter.

If base is 10 and value is negative, the resulting string is preceded with a minus sign (-). With any other base, value is always considered unsigned.

str should be an array long enough to contain any possible value: (sizeof(int)*8+1) for radix=2, i.e. 17 bytes in 16-bits platforms and 33 in 32-bits platforms.

Parameters

value
Value to be converted to a string.

str
Array in memory where to store the resulting null-terminated string.

base
Numerical base used to represent the value as a string, between 2 and 36, where 10 means decimal base, 16 hexadecimal, 8 octal, and 2 binary.


Return Value
A pointer to the resulting null-terminated string, same as parameter str.

Код: cpp:

char c = ...;
char buf[80];
itoa( (int)c,  buf, 8);
printf("%s", buf);


Но вариант с printf("%o") тоже подходит в данном случае :)

Исправлено Fatboy (08.03.10 09:44)

Offline

#8  08.03.10 12:21

Re: Нужна помощь с задачкой на С++

Ребята спасибо,

Теперь ещё вопрос как добавить чтобы он перед каждым восьмеричным представлением ставил /0
например заместо
qwee - qw14545
было
qwee - qw/0145/0145

Исправлено DaZzle (08.03.10 12:29)

Offline

#9  08.03.10 12:27

$up
Профиль

Re: Нужна помощь с задачкой на С++

printf("/0%o",cString[iIndex1]);

Offline

#10  08.03.10 12:30

Re: Нужна помощь с задачкой на С++

Спасибо! Я уже сам разобрался, но всё равно спасибо :)

Offline

#11  14.03.10 13:53

Re: Нужна помощь с задачкой на С++

DaZzle написал(а):

Спасибо я уже разобрался что не правильно, но теперь я не могу понять, как заменить символ его восьмеричным представлением а не буквой 'z'

DaZzle написал(а):

Спасибо! Я уже сам разобрался, но всё равно спасибо :)

Offline

Программирование и БД » Нужна помощь с задачкой на С++ 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.139 сек.
Выполнено 14 запросов.