Вопрос № 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.
Отвечает Гусятинер Леонид Борисович 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 (Россия) |
Еще номера »
Отвечает 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 (Россия) |
Еще номера »
Вопрос № 183620:
Здравствуйте! У меня возникли сложности с таким вопросом:
1. Написать аналог функции IsDelimiter. Не использовать функцию Pos. 2. (больших или маленьких). Посчитать количество букв a в последнем слове данной последовательности. т.е. как я понимаю две строки Abcdaa aAbcaaefa получается во второй строке 5 букв "а" регистр не важен
/* Посчитать количество букв 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 (Россия) |
Еще номера »
Вопрос № 183621:
Уважаемые эксперты! Пожалуйста, помогите с решением задач:
1. Даны прямоугольные матрицы А размером m x n и B размером k x l. Найти произведение матрицы A на матрицу B,где n=k. 2. Вводится массив. Найти в нем подпоследовательность из подряд идущих элементов с наибольшей суммой.
Отправлен: 14.06.2011, 15:36
Вопрос задал: robos (Посетитель)
Всего ответов: 2 Страница вопроса »
/* Вводится массив. Найти в нем подпоследовательность из подряд идущих
элементов с наибольшей суммой. */
/* 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 (Россия) |
Еще номера »
Вопрос № 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.
Отвечает 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 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.