Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 8321
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2669
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2510
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1678
Дата выхода:20.06.2011, 14:00
Администратор рассылки:Гусятинер Леонид Борисович aka lamed (Академик)
Подписчиков / экспертов:301 / 177
Вопросов / ответов:4 / 6

Вопрос № 183619: Уважаемые эксперты! помогите пожалуйста с решением данных задач: 1. Заменить в строке последовательности одинаковых символов (не пробелов) на десятичное число, состоящее из двух десятичных цифр и соответствующее их количеству (т.е. “ abcda...


Вопрос № 183620: Здравствуйте! У меня возникли сложности с таким вопросом: 1. Написать аналог функции IsDelimiter. Не использовать функцию Pos. 2. (больших или маленьких). Посчитать количество букв a в последнем слове данной последовательности. т.е. как я п...
Вопрос № 183621: Уважаемые эксперты! Пожалуйста, помогите с решением задач: 1. Даны прямоугольные матрицы А размером m x n и B размером k x l. Найти произведение матрицы A на матрицу B,где n=k. 2. Вводится массив. Найти в нем подпоследовательность из...
Вопрос № 183623: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: 1. Написать аналог процедуры Insert. Процедурой Delete и функцией Copy не пользоваться. сама функция есть а вот как ее прикрутить к программе вопрос. самый прост...

Вопрос № 183619:

Уважаемые эксперты! помогите пожалуйста с решением данных задач:

1. Заменить в строке последовательности одинаковых символов (не пробелов) на десятичное число, состоящее из двух десятичных цифр и соответствующее их количеству (т.е. “ abcdaaaaa xyznnnnnnn ” на “abcd5a xyz7n ”).
2. Разработать функцию MakeStr(const S:string):string, возвращающую строку, состоящую из всех гласных латинских букв строки S без повторений. С помощью данной функции для каждой строки из введенного набора вывести все ее гласные латинские буквы без повторений. Гласными считаются следующие буквы: aeiouyAEIOUY.

желательно на языке С:

Отправлен: 14.06.2011, 14:48
Вопрос задал: Polotenchikko (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Гусятинер Леонид Борисович aka lamed (Академик) :
Здравствуйте, Polotenchikko!
Ответ на первое задание. Описывается частный случай, число подряд идущих символов не более 99,
как и указано в задании.
Код :
/* Заменить в строке последовательности одинаковых символов (не пробелов)
на десятичное число, состоящее из двух десятичных цифр и соответствующее
их количеству (т.е. “ abcdaaaaa xyznnnnnnn ” на “abcd5a xyz7n ” */
/* G++/Code::Blocks */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    enum {n=80};
    char s[n];
    int i, j, k;
    char c;
    int done=0;

    gets(s);
    j=0;
    k=1;
    c=s[0];
    for (i=1; !done; i++)
    {
        if (s[i]==c)
            if (s[i]==' ')
                s[j++]=s[i];
            else
                k++;
        else
        {
            if (k>9) /* две цифры */
                s[j++]='0'+k/10;
            if (k>1) /* одна цифра */
                s[j++]='0'+k%10;
            s[j++]=c;
            c=s[i];
            k=1;
            if (s[i]=='\0')
                done=1;
        }
    }
    s[j]='\0';

    puts(s);
    system("pause");
    return 0;
}

Удачи!

Ответ отправил: Гусятинер Леонид Борисович aka lamed (Академик)
Ответ отправлен: 14.06.2011, 15:56
Номер ответа: 267728
Россия, Ковров
Тел.: +79107793141

Оценка ответа: 5
Комментарий к оценке:
Спасибо!

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267728 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Micren (Профессор) :
    Здравствуйте, Polotenchikko!
    Задача 1:
    Код :
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    // Ф-я преобразования числа в строку
    // Т.к. заведомо в задаче отрицательных чисел быть не может игнорируем это
    
    char* itoa(int val)
    {
    #define BUF_LEN  32
        static char buf[BUF_LEN] = {0};
        int i = BUF_LEN - 1;
        while (val && i)
        {
            buf[--i] = "0123456789"[val % 10];
            val /= 10;
        }
        return buf + i;
    }
    
    // Решение задачи
    
    void process(char* dest)
    {
        char* src = dest;
        int count = 0;
        // Перемещаемся по строке
        while (*src)
        {
            // Если два подряд одинаковые и не пробел
            if (*src == *(src + 1) && !isspace(*src))
            {
                // Увеличим счетчик
                ++count;
                ++src;
            }
            else
            {
                // Если не одинаковые и счетчик одинаковых не 0
                if (count)
                {
                    // Переводим в число
                    char* tmp = itoa(count + 1);
                    // Заменяем в строке
                    while (*tmp)
                    {
                        *dest++ = *tmp++;
                    }
                    // Обнулим счетчик
                    count = 0;
                }
                
                *dest++ = *src++;
            }
        }
        *dest = 0;
    }
    
    int main()
    {
        // Буфер
        char buf[BUFSIZ];
    
        printf("string:");
        // Ввод строки
        if (!fgets(buf, BUFSIZ, stdin))
        {
            printf("I/O Error\n");
            exit(EXIT_FAILURE);
        };
    
        // Удалим '\n' если есть
        int len = strlen(buf);
        if (len && buf[--len] == '\n')
        {
            buf[len] = 0;
        }
    
        process(buf);
    
        printf("result:\"%s\"\n", buf);
    
        return 0;
    }
    

    Пример работы:
    Код :
    string:abcdaaaaa xyznnnnnnn
    result:"abcd5a xyz7n"


    Задача 2:
    Код :
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    // Гласные
    #define VOWELS  "AEIOUY"
    
    // Копирует гласные из строки src в dst
    // Возвращает количество гласных символов(требуемый размер буфера без учета '\0'
    // Если src==NULL - возвращает -1
    // Если dst==NULL - ничего не копирует, просто возвращает необходимый размер буфера
    
    int makeStr(char* dst, const char* src)
    {
        if (!src)
        {
            return -1;
        }
    
        // Множество допустимых символов
        char vowels[] = VOWELS;
        int count = 0;
    
        // Перемещаемся по строке
        while (*src)
        {
            // Позиция в множестве допустимых
            char* pos;
            // Приведение к верхнему регистру и проверка на наличие в множестве
            if (pos = strchr(vowels, toupper(*src)))
            {
                ++count;
                // Копируем в строку
                if (dst)
                {
                    *dst++ = *src;
                }
                // Удалим из множества встретившийся символ
                while (*pos++)
                {
                    *(pos - 1) = *pos;
                };
            }
            ++src;
        }
    
        if (dst)
        {
            *dst = 0;
        }
    
        return count;
    }
    
    int main()
    {
        // Буфер
        char buf[BUFSIZ];
    
        printf("string:");
        // Ввод строки
        if (!fgets(buf, BUFSIZ, stdin))
        {
            printf("I/O Error\n");
            exit(EXIT_FAILURE);
        };
    
        // Удалим '\n' если есть
        int len = strlen(buf);
        if (len && buf[--len] == '\n')
        {
            buf[len] = 0;
        }
    
        // Выделим память под буфер
        char* result = malloc(makeStr(0, buf) + 1);
        // Копируем гласные
        makeStr(result, buf);
    
        printf("result:\"%s\"\n", result);
    
        // Освобождаем память
        free(result);
    
        return 0;
    }
    

    Пример работы:
    Код :
    string:Aeeeaarhhjii
    result:"Aei"
    

    Ответ отправил: Micren (Профессор)
    Ответ отправлен: 14.06.2011, 17:02
    Номер ответа: 267731
    Украина, Краматорск

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо!

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267731 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183620:

    Здравствуйте! У меня возникли сложности с таким вопросом:

    1. Написать аналог функции IsDelimiter. Не использовать функцию Pos.
    2. (больших или маленьких). Посчитать количество букв a в последнем слове данной последовательности. т.е. как я понимаю две строки Abcdaa aAbcaaefa получается во второй строке 5 букв "а" регистр не важен

    желательно на C:

    Заранее спасибо!

    Отправлен: 14.06.2011, 15:09
    Вопрос задал: Polotenchikko (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Гусятинер Леонид Борисович aka lamed (Академик) :
    Здравствуйте, Polotenchikko!
    Код :
    /* Посчитать количество букв a в последнем слове данной последовательности.
    строка Abcdaa aAbcaaefa во втором стлове 5 букв "а" регистр не важен */
    /* G++/Code::Blocks */
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        enum {n=80};
        char s[n];
        int i;
        int cnt=0;
        int in_word=0;
    
        gets(s);
    
        for (i=0; s[i]!='\0'; i++)
        {
            if (s[i]==' ')
                in_word = 0;
            else
            {
                if (!in_word)
                {
                    in_word = 1;
                    cnt=0;
                }
                if (s[i]=='A' || s[i]=='a')
                    cnt++;
            }
        }
    
        printf("%d\n", cnt);
        system("pause");
        return 0;
    }

    Удачи!

    Ответ отправил: Гусятинер Леонид Борисович aka lamed (Академик)
    Ответ отправлен: 14.06.2011, 20:23
    Номер ответа: 267738
    Россия, Ковров
    Тел.: +79107793141

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267738 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183621:

    Уважаемые эксперты! Пожалуйста, помогите с решением задач:

    1. Даны прямоугольные матрицы А размером m x n и B размером k x l. Найти произведение матрицы A на матрицу B,где n=k.
    2. Вводится массив. Найти в нем подпоследовательность из подряд идущих элементов с наибольшей суммой.

    Отправлен: 14.06.2011, 15:36
    Вопрос задал: robos (Посетитель)
    Всего ответов: 2
    Страница вопроса »


    Отвечает Alex_S (8-й класс) :
    Здравствуйте, robos!

    ссылка на zip архив в приложении

    Приложение:

    Ответ отправил: Alex_S (8-й класс)
    Ответ отправлен: 14.06.2011, 18:52
    Номер ответа: 267734
    Украина, Чернигов
    Тел.: +380505879446
    ICQ # 375209407

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267734 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Гусятинер Леонид Борисович aka lamed (Академик) :
    Здравствуйте, robos!
    Код :
    /* Вводится массив. Найти в нем подпоследовательность из подряд идущих
    элементов с наибольшей суммой. */
    /* http://forum.vingrad.ru/topic-39011.html, Dov */
    
    #include <stdio.h>
    #include <stdlib.h>
    #define SIZE 10
    
    int main(void)
    {
        int ar[]   = {5, 5, 8, -2, -9, 14, -8, 3, 3, 3};
        int sum    = 0;
        int max    = 0;
        int iBeg   = 0;
        int iEnd   = 0;
        int iFirst = 0;
        int i;
    
        for(i = 0; i < SIZE; i++)
        {
            sum += ar[i];
            if(sum <= 0)
            {
                sum    = 0;
                iFirst = i + 1;
            }
            else if(sum > max)
            {
                max  = sum;
                iBeg = iFirst;
                iEnd = i;
            }
        }
    
        printf("Index :");
        for(i = 0; i < SIZE; i++)
            printf("%4d", i);
    
        printf("\nArray :");
        for(i = 0; i < SIZE; i++)
            printf("%4d", ar[i]);
    
        printf("\nMySeq :");
        for(i = 0; i <= iEnd; i++)
            i < iBeg ? printf("%4d") : printf("%4d", ar[i]);
    
        printf("\n\nMaxSum: %d\nIndBeg: %d\nIndEnd: %d\n", max, iBeg, iEnd);
    
        system("pause");
        return 0;
    }

    Удачи!

    Ответ отправил: Гусятинер Леонид Борисович aka lamed (Академик)
    Ответ отправлен: 14.06.2011, 20:01
    Номер ответа: 267737
    Россия, Ковров
    Тел.: +79107793141

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267737 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 183623:

    Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

    1. Написать аналог процедуры Insert. Процедурой Delete и функцией Copy не пользоваться.

    сама функция есть а вот как ее прикрутить к программе вопрос. самый простой пример работы этой функции в программе нужен )

    Код :
    
    void Insert (const char *what, char *&str, int whr) 
    {
     char* buf; 
     int l1 = strlen (what);
     int l2 = strlen (str);
     buf = new char [l1+l2+2];
     for (int i=0; i<whr; i++) buf [i]= str[i]; 
     for (int i=0; i<l1; i++)
      buf [i+whr] = what [i]; 
     for (int i=whr+l1; i<l1+l2; i++) buf [i]= str[i-l1];
     //buf [l1+l2] =  delete [] str;
     str = NULL;
     str = new char [l1+l2+2];  
     strcpy (str, buf);
    }
    
    


    2. Разработать функцию Add(const S1,S2:string):string, дописывающую все гласные латинские буквы из строки S1 в конец S2 и выдающей получившуюся строку в качестве результата. С помощью данной функции в каждую строку из введенного набора дописать все гласные латинские буквы из предыдущей строки. Гласными считаются следующие буквы: aeiouyAEIOUY.

    желательно на C:

    Отправлен: 14.06.2011, 16:12
    Вопрос задал: Polotenchikko (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Micren (Профессор) :
    Здравствуйте, Polotenchikko!
    Задача 1:
    Код :
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    // Вставка строки what в строку dst с позиции where
    // Строка dst должна иметь необходимый размер для размещения результата
    
    void insert(char* dst, const char* what, size_t where)
    {
        size_t lenStr = strlen(dst), lenWhat = strlen(what),      // Длины строк
                cnt = lenStr - where + 1;                                   // К-во символов для переноса
        
        char* from = dst + lenStr, *to = from + lenWhat;         // Откуда и куда переносить
        
        // Переносим часть строки. Освобождаем место для вставки
        while (cnt--)
        {
            *to-- = *from--;
        }
    
        // Куда вставлять
        to = dst + where;
        // Вставка
        while (*what)
        {
            *to++ = *what++;
        }
    }
    
    int main()
    {
        //создаем строку и заполняем ее
        char *str = malloc(100);
        strcpy(str, "name Polotenchikko");
    
        //вставляем строку
        insert(str, " is", 4);
    
        printf("\"%s\"\n", str);
    
        free(str);
    
        return 0;
    }
    

    Результат работы:
    Код :
    "name is Polotenchikko"
    


    Задача 2:
    Код :
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    // Гласные
    #define VOWELS "AEIOUY"
    
    // Присоединяет гласные из строки src к dst
    // dst должна иметь возможность вместить результирующую строку
    // Возвращает количество гласных символов(требуемый размер буфера без учета '\0'
    // Если src==NULL - возвращает -1
    // Если dst==NULL - ничего не копирует, просто возвращает необходимый размер буфера
    
    int addVowels(char* dst, const char* src)
    {
        if (!src)
        {
            return -1;
        }
        int count = strlen(dst);
        if (dst)
        {
            dst += count;
        }
        // Перемещаемся по строке
        while (*src)
        {
            // Приведение к верхнему регистру и проверка на наличие в множестве
            if (strchr(VOWELS, toupper(*src)))
            {
                ++count;
                // Копируем в строку
                if (dst)
                {
                    *dst++ = *src;
                }
            }
            ++src;
        }
        if (dst)
        {
            *dst = 0;
        }
        return count;
    }
    
    int main()
    {
        char *str1 = "aggtwsbEtratrUut", str2[100] = "1234556";
        addVowels(str2, str1);
        printf("result:\"%s\"\n", str2);
        return 0;
    }
    

    Результат работы:
    Код :
    result:"1234556aEaUu"

    Ответ отправил: Micren (Профессор)
    Ответ отправлен: 14.06.2011, 18:45
    Номер ответа: 267733
    Украина, Краматорск

    Оценка ответа: 5
    Комментарий к оценке:
    Вот это здорово! Polotenchikko в программе! )) спасибо!!!

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267733 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное