Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ivy
0 / 0 / 0
Регистрация: 22.12.2013
Сообщений: 8
#1

Строки C - C++

05.03.2010, 21:06. Просмотров 667. Ответов 9
Метки нет (Все метки)

Помогите написать программы в С.
1.Дана строка символов. Изменить строку – во всех словах, имеющих нечетное количество символов, средний символ удалить.
2.Дана строка символов. Группы символов между группами пробелов считаются словами. Определить число вхождений в последовательность слов группы букв «abc».
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2010, 21:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Строки C (C++):

Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки - C++
Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки. 1. Я дуб дубом,даже...

Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк - C++
Есть динамический массив строк. Заполняется, т.е. размер его уже известен будет. Но дальше нужно сделать задание: "Добавить строки, начиная...

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2 - C++
Сформировать динамический двумерный массив, заполнить его случайными числами и удалить строки, начиная со строки К1 и до строки К2 вот...

Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней - C++
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка...

Указать номер строки, максимально удаленной от первой строки заданной матрицы - C++
Задание: Расстояние между k-й и 1-й строками квадратной матрицы А опеределяется как r = сумма от j=1 до N от (abs(akj)*abs(a1j)). Указать...

Прибавить ко всем элементам каждой строки максимальное значение этой строки - C++
добрый вечер! Помогите пожалуйста доработать код! Изменить текущий массив, прибавив ко всем элементам каждой строки максимальное...

9
easybudda
Модератор
Эксперт CЭксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
05.03.2010, 22:48 #2
1
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*  
*   Дана строка символов. Изменить строку – во всех словах, имеющих нечетное количество символов, 
*   средний символ удалить.
*/
 
int main(void){
    char str[] = "abcde abcd abc abcdef abcdefg", *p;
    size_t len;
    
    printf("Befor: %s\nAfter: ", str);
    for ( p = strtok(str, " "); p != NULL; p = strtok(NULL, " ") ){
        if ( ( ( len = strlen(p) ) & 1 ) && ( len > 1 ) ){
            len /= 2;
            memmove(p + len, p + len + 1, len);
            *(p + 2 * len) = '\0';
        }
        printf("%s ", p);
    }
    printf("\n");
    
    exit(0);
}
Добавлено через 9 минут
2. Немного не понятно при таком условии - какая разница, чем слова разделяются, ну да ладно...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
*   Дана строка символов. Группы символов между группами пробелов считаются словами. 
*   Определить число вхождений в последовательность слов группы букв «abc».
*/
 
int main(void){
    char *str = "abcdef ghj serab cvb abc zzzrabc", *wrd = "abc", *p;
    size_t cnt = 0;
    
    for ( p = strstr(str, wrd); p != NULL; p = strstr(p + 1, wrd), ++cnt )
        ;
    
    printf("Group of \"%s\" meet in string \"%s\" %d times.\n", wrd, str, cnt);
    
    exit(0);
}
0
insideone
Модератор
Автор FAQ
3653 / 933 / 54
Регистрация: 10.01.2010
Сообщений: 2,499
05.03.2010, 22:51 #3
Цитата Сообщение от easybudda Посмотреть сообщение
Немного не понятно при таком условии - какая разница, чем слова разделяются, ну да ладно...
"abc|abc" - это одно вхождение, но два если разделитель был бы '|'
0
easybudda
Модератор
Эксперт CЭксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
05.03.2010, 23:05 #4
Цитата Сообщение от Ivy Посмотреть сообщение
Определить число вхождений в последовательность слов группы букв «abc».
Цитата Сообщение от insideone Посмотреть сообщение
"abc|abc" - это одно вхождение, но два если разделитель был бы '|'
Минуточку! Где написано, что на одно слово не больше одного вхождения? Это всё равно два вхождения, только оба в одном слове...

Добавлено через 9 минут
Впрочем вот и такой вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
*   Дана строка символов. Группы символов между группами пробелов считаются словами. 
*   Определить число вхождений в последовательность слов группы букв «abc».
*/
 
int main(void){
    char str[] = "abcdef ghj serab cvb abc zzzrabc abc|abc", *wrd = "abc", *buf, *p;
    size_t cnt = 0;
    
    if ( ( buf = strdup(str) ) == NULL )
        exit(1);
    for ( p = strtok(str, " "); p != NULL; p = strtok(NULL, " ") )
        if ( strstr(p, wrd) )
            ++cnt;
    
    printf("Group of \"%s\" meet in %d words of string\n\"%s\"\n", wrd, cnt, buf);
    
    free(buf);
    exit(0);
}
1
insideone
Модератор
Автор FAQ
3653 / 933 / 54
Регистрация: 10.01.2010
Сообщений: 2,499
05.03.2010, 23:18 #5
Цитата Сообщение от easybudda Посмотреть сообщение
Минуточку! Где написано, что на одно слово не больше одного вхождения? Это всё равно два вхождения, только оба в одном слове...
Хм, преподы сами не знают чего хотят. Хотя иногда студенты задания криво переписывают))) Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc". Да?
0
easybudda
Модератор
Эксперт CЭксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
05.03.2010, 23:22 #6
Цитата Сообщение от insideone Посмотреть сообщение
Кстати первое решение можно было не переделывать сильно, только добавить к строке в которой идет поиск пробел вначале а искать " abc".
Не понял... Какой пробел куда добавить?
0
insideone
Модератор
Автор FAQ
3653 / 933 / 54
Регистрация: 10.01.2010
Сообщений: 2,499
05.03.2010, 23:36 #7
easybudda, прошу прощения, попутал с поиском ^abc

easybudda, а пользуясь strtok() можно потом вернуть строку в исходный вид без создания копии? а то она по окончанию процессии становится обрезанной до первого токена
0
easybudda
Модератор
Эксперт CЭксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
05.03.2010, 23:52 #8
Цитата Сообщение от insideone Посмотреть сообщение
а пользуясь strtok() можно потом вернуть строку в исходный вид без создания копии? а то она по окончанию процессии становится обрезанной до первого токена
Не-а! Строка убивается - на место символов-разделителей '\0' вставляется. Потому и сдублировал, чтобы было, что вывести...
Ну либо как-то так:
C
1
2
3
4
5
6
7
8
9
10
...
char str[] = "bla bla bla";
int i, len = strlen(str);
/*...
покромсали строку функцией strtok() 
... */
for ( i = 0; i < len; ++i )
  if ( !str[i] )
    str[i] = ' ';
/*...*/
но проще по-моему скопировать

Добавлено через 12 минут
insideone, к тому же, это хорошо, когда в качестве разделителя только пробел. А если к примеру
C
1
p = strtok(str, " ,.;:!?\t\n")
попробуй, угадай, что именно во входной строке на ноль заменилось
1
insideone
Модератор
Автор FAQ
3653 / 933 / 54
Регистрация: 10.01.2010
Сообщений: 2,499
06.03.2010, 00:39 #9
Цитата Сообщение от easybudda Посмотреть сообщение
попробуй, угадай, что именно во входной строке на ноль заменилось

Не по теме:

Надо будет нанимать команду телепатов, не иначе а кромсать строку не хорошо...

И ещё вопрос... если бы я не знал что strdup выделяет память, то это было бы катострофически плохо ? Как то странно когда нужно освобождать память когда сам её не выделял
0
easybudda
Модератор
Эксперт CЭксперт С++
10003 / 5926 / 998
Регистрация: 25.07.2009
Сообщений: 11,175
06.03.2010, 00:48 #10
Цитата Сообщение от insideone Посмотреть сообщение
И ещё вопрос... если бы я не знал что strdup выделяет память, то это было бы катострофически плохо ? Как то странно когда нужно освобождать память когда сам её не выделял
На вскидку не припомню, но точно есть ещё библиотечные функции кроме strdup(), которые создают в динамической памяти объекты и возвращают на них указатели. Про это пишут в мануалах к функциям и разумеется эти моменты необходимо учитывать. Тут это, конечно, не существенно, но лучше приучить себя помнить о таких вещах, иначе рано, или поздно, но обязательно получите проблему с утечкой памяти. А по поводу "Как то странно когда нужно освобождать память когда сам её не выделял" - смотрите на это вот, с какой стороны: не принципиально, какой именно функцией выделяется память - malloc(), или к примеру strdup(). Факт в том, что выделена какая-то часть из динамической памяти, получен на неё указатель. Соответственно после использования надо эту часть памяти вернуть.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2010, 00:48
Привет! Вот еще темы с ответами:

Вычислить длину введенной строки и вывести символы строки с четными индексами - C++
Напишите программу, которая требует ввода строки с клавиатуры. Программа вычисляет длину строки и выводит на экран только те символы...

Найти среднее арифметическое каждой строки матрицы и отсортировать строки по возрастанию - C++
Дана квадратная матрица. Найти среднее арифметическое каждой строки и отсортировать строки по возрастанию этих характеристик

Функция перезаписывает символы строки заданным количеством символов другой строки - C++
Программа работает. Но не совсем правильно. В конечной строке появляются непонятные символы, которых быть там не должно. В программе нельзя...

Чтение через fscanf_s части строки с пробелом (и запись этой же строки) - C++
нужно записать в файл строку, содержащую через табуляцию int, char, char, char, float, int. Далее необходимо из такой же строки вывести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru