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

Тема в разделе "C/C++/C#", создана пользователем Winplexy, 14 дек 2014.

  1. Winplexy

    Winplexy New Member

    Регистрация:
    14 дек 2014
    Сообщения:
    1
    Симпатии:
    0
    Есть два задания.
    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);
     
Загрузка...

Поделиться этой страницей