Привет, я просто ищу помощь с этим, я написал быстрый фрагмент кода, чтобы взять массив символов, который затем будет запущен через функцию, которая удалит любые повторяющиеся символы. У меня небольшая ошибка, так как она не удаляет последнюю повторяющуюся букву здесь это код, который я также выведет на выходе после кода.
#include <iostream>
#include <fstream>
#include <ostream>
using namespace std;
const int max_num_chars=10;
void deleteRepeats(char c[], int& size);
int main()
{
char c[]={'a','b','b','b'};
int c_size=4;
cout<<"This Program reads characters into a partially filled array and then delete repeats! \n";
cout<<"Here is the original array \n";
for (int i=0;i<c_size;i++)
{
cout<<c[i]<<"\n";
}
deleteRepeats(c, c_size);
cout<<"Here is the array after the deleteRepeats function! \n";
for (int i=0;i<c_size;i++)
{
cout<<c[i]<<"\n";
}
system("pause");
return 0;
}
void deleteRepeats(char c[],int& size)
{
int num = size;
int start = 0;
while(start != num)
{
char test = c[start];
for(int i = start+1; i <= num;i++)
{
if(test==c[i])
{
for(int j = i;j<num;j++)
{
c[j] = c[j+1];
}
num-=1;
}
}
start +=1;
}
size = num;
}
Вот результат... Эта программа читает символы в частично заполненный массив, а затем удаляет повторные торты! Вот исходный массив a b b b Вот массив после функции deleteRepeats! a b b Нажмите любую клавишу, чтобы продолжить. , ,
Извините, я просто понял это, добавив этот бит кода, который он исправил
for(int j = i;j<num;j++)
{
c[j] = c[j+1];
}
num-=1;
start-=1;
Хотя для этого есть лучший алгоритм. В твоем случае:
Внутри функции "deleteRepeats" внутри цикла "for (int я = start + 1; я <= num; i++)"
когда вы удаляете следующий один и тот же элемент, вы вызываете "i", не учитывая, что теперь при одном и том же "i" также может быть повторяющийся элемент после удаления.
Решение. После удаления элемента уменьшите значение я также. Итак, теперь ваша петля выглядит так
for(int i = start+1; i <= num;i++)
{
if(test==c[i])
{
for(int j = i;j<num;j++)
{
c[j] = c[j+1];
}
num-=1;
// correction
i--;
// correction
}
}
Если у вас возникли проблемы с пониманием, ответьте...
Почему у вас две вложенные циклы, когда вам нужен только один?
void deleteRepeats(char c[], int& size) {
// Trivial case of empty array: do nothing.
if(size <= 0) // Why is 'size' a signed 'int' and not 'size_t'?
return;
// First character is automatically not a repetition.
// So for each character from the second onward,
// move it if it is different from the previous character,
// otherwise skip over it.
char* read = c + 1;
char* write = read;
char* end = c + size;
char prev = *c;
while(read != end) {
if(*read != prev) {
prev = *read;
*write++ = prev;
}
++read;
}
// Finish up.
size = write - c;
}