#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
#4 08.03.10 00:43
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
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

