Помогите Оптимизировать Программы(си)

Winplexy

New member
14.12.2014
1
0
#1
Есть два задания.
1. Пусть во входном потоке находится последовательность символов, заканчивающаяся точкой (кодировка ASCII). Вывести в выходной поток последовательность символов, измененную следующим образом: оставить только те группы цифр, которые составлены из подряд идущих цифр с возрастающими значениями; все остальные цифры и группы цифр удалить ( другие символы копировать в выходной поток без изменения).
2. Пусть во входном потоке находится последовательность символов, заканчивающаяся маркером конца $ (кодировка ASCII). Вывести в выходной поток последовательность символов, измененную следующим образом: удалить из каждой группы цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка либо в этой группе нет других цифр, кроме нулей ; например, a-000123+bc+0000.0008-0000+0001.07 преобразуется в a-123+bc+0.0008-0+1.07).
Мне нужно решить их двумя способами:
1) с помощью функций getchar и putchar;
2) с помощью строк.
Я их уже решил, но программы довольно запутаны и, вероятнее всего, неэффективны, имеют лишние участки. Я прошу вас подсказать мне, каким образом можно было бы внести ясность в эти программы, сделать их более логичными. вот они:
1.
C++:
char c = 0, c_ = 0;
char flag = 0;
while ((c = getchar()) != '.')
{
if (isdigit(c))
{
if (!isdigit(c_))
{
flag = 0;
c_ = c;
while (true)
{
c = getchar();
if (!isdigit(c))
{
if (flag)(putchar(c_));
putchar(c);
break;
}

if (c - c_ == 1)
{
flag = 1;
putchar(c_);
}
c_ = c;
}
}
}
else putchar(c); 

c_ = c;
}
C++:
char s[100] = { 0 }, s1[100] = { 0 };
char f = 0;
inti = 1, j = 0;
gets(s);

while (true)
{
if (isdigit(s[i]))
{
if (isdigit(s[i - 1]))
{
if (s[i] - s[i - 1] == 1)
{
s1[j++] = s[i - 1];
f = 1;
}
else
{
if (f)
s1[j++] = s[i - 1];
f = 0;
}

}
}
else
{
if (f)
{
S1[j++] = s[i - 1];
f = 0;
}


if (s[i] == '.')break;

s1[j++] = s[i];
}

i++;
}

puts(s1);

2.
char c = 0, c_ = 0,flag=0;
while ((c = getchar()) != '&')
{

if (isdigit© && !(isdigit(c_)))
flag = 1;
if (flag)
{
while (true)
{
if (c=='0'); else break;
c = getchar();
}

if (c == '.')putchar('0');

while (true)
{
if (isdigit©)putchar©; else break;
c = getchar();
}

if (c == '.')
{
putchar('.');
while (isdigit(c = getchar()))putchar©;
}
flag = 0;
}
else putchar©;
c_ = c;
}

char s[100] = { 0 }, s1[100] = { 0 };
inti = 0, j = 0;

gets(s);

while (s != '&')
{
if(isdigit(s))
{
while (s == '0')i++;

if (s != '.'&& !isdigit(s))
{
s1[j++] = '0';
continue;
}

if (s == '.')s1[j++] = '0';

while (isdigit(s))
{
s1[j++] = s[i++];
}

if (s == '.')
{
s1[j++] = s[i++];
while (isdigit(s))
{
s1[j++] = s[i++];
}
}

continue;
}

s1[j++] = s;

i++;
}

puts(s1);