0 / 0 / 0
Регистрация: 10.05.2019
Сообщений: 2
1

Вычислить количество слов, которые начинаются и заканчиваются на один и тот же символ с учетом регистра

22.05.2019, 20:22. Показов 948. Ответов 9
Метки нет (Все метки)

Здравствуйте, помогите пожалуйста с решением данной задачи :3 (нужно написать на С)
Вычислить количество слов, которые начинаются и заканчиваются на один и тот же символ с учетом регистра.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2019, 20:22
Ответы с готовыми решениями:

Определить количество слов, которые начинаются и заканчиваются одной и той же буквой
Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить...

Найти количество слов, которые начинаются и заканчиваются одной и той же буквой
Дана строка, состоящая из слов, разделенных пробелами (одним или несколькими). Найти количество...

Определить количество слов, которые начинаются и заканчиваются на одну и туже букву
Дано рядок, що складається з російських слів, розділених пробілами (одним або кількома). Визначити...

Посчитать количество слов в предложении, которые начинаются и заканчиваются с одной и той же буквой
Задача: необходимо посчитать кол-во слов в предложении, которые начинаются и заканчиваются с одной...

9
...
1804 / 1268 / 935
Регистрация: 12.02.2013
Сообщений: 2,063
23.05.2019, 04:11 2
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
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <ctype.h>
 
//-----------------------------------------------------------------------------
int getWord(char* str, char** begin, char** end) {
    for (; *str && !isalpha(*str); ++str) { ; }
    *begin = str;
 
    for (; *str && isalpha(*str); ++str) { ; }
    *end = str;
 
    return (*end - *begin);
}
//-----------------------------------------------------------------------------
int cnt(char* str) {
    char* begin, * end;
    int cnt = 0;
 
    for (; getWord(str, &begin, &end); str = end) {
        cnt += (*begin == *(end - 1));
    }
 
    return cnt;
}
//-----------------------------------------------------------------------------
 
int main() {
    char str[1024];
 
    fgets(str, sizeof(str), stdin);
 
    printf("cnt = %d\n", cnt(str));
 
    return 0;
}
3
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
23.05.2019, 10:16 3
anmartex, Вроде не так должно быть
(только я пока не понял, что не так)
Миниатюры
Вычислить количество слов, которые начинаются и заканчиваются на один и тот же символ с учетом регистра  
0
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
23.05.2019, 10:59 4
А, это я затупок. все норм. Сори...

Добавлено через 37 минут
просто функция getWord трудна для понимания.. С сылками и еще с указателями на указатели..
0
...
1804 / 1268 / 935
Регистрация: 12.02.2013
Сообщений: 2,063
23.05.2019, 11:35 5
Цитата Сообщение от northcitizen Посмотреть сообщение
С сылками и
northcitizen, в языке C нет ссылок, этот тип данных относится к языку C++.
1
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
23.05.2019, 14:44 6
anmartex, да затупок я.. Взятие адреса , наверное

Добавлено через 7 минут
вот я понимаю, например(если правильно) , есть массив строк .. то указатель, то есть первая звездочка на сам массив, вторая звездочка на определенную строку.. Вы не могли бы пояснить использование указателя на указатель в Вашей функции getWord?

Добавлено через 20 минут
Ладно, вот взяли адрес, например, переменной begin. Передали данный адрес в функцию getWord. В ней принимается данная переменная типом указатель на указатель и тут я затупил ....

Добавлено через 3 минуты
Мы же адрес туда передали и разыменовали, чтоли

Добавлено через 1 час 10 минут
XperiaNov, бро, у тебя вообще вопросов не возникло?

Добавлено через 52 минуты
лучший ответ, который нашел
Есть, например, char x - это область в памяти размером один байт, у которой есть имя x. Область в памяти имеет свой адрес в памяти. И этот адрес - это такое целое число (обычно четырёхбайтовое, но может быть и восьмибайтовое).
x = 'a';
Есть, например, char *px - это область в памяти размером четыре байта, у которой есть имя px. В эту область можно сохранить адрес байта в памяти.
px = &x;
Есть, например, char **ppx - это область в памяти размером четыре байта, у которой есть имя ppx. В эту область можно сохранить адрес области в памяти, в которой хранится адрес байта в памяти.
ppx = &px;
Теперь ты можешь применить операцию разыменования указателя (или операцию ссылки по адресу) и получить значение из x через указатель ppx. Выражение **ppx даст значение 'a'.

Добавлено через 4 минуты
То есть у нас переменная char **begin хранит адрес области памяти в которой хранится адрес байта
0
...
1804 / 1268 / 935
Регистрация: 12.02.2013
Сообщений: 2,063
23.05.2019, 18:11 7
northcitizen, мне нравится ваше желание разобраться. Попробую объяснить.
1. Массив - это тот же указатель. Компилятор, при обращение к элементу массива делает следующее a[i] => *(a + i). Т.е. выполняет смещение относительно начального адреса выделенной памяти под a на i * sizeof(тип массива), ну и собственно берёт значение с полученного адреса.
2. Указатель ничем по своей сути не отличается от переменной, это и есть переменная. Правда с одной оговоркой, к нему можно применить *, т.е. перейти по указанному адресу.
3. Вы правильно написали, что такое парный/двойной указатель, это переменная которая хранит адрес переменной которая в свою очередь тоже хранит адрес на какую-то область памяти. Но это всё равно типичный указатель.

Теперь попробую объясняю почему **begin. Давайте пойдём от противного. Предположим в функцию я буду передавать не адрес указателя begin, а значение указателя. Функция получит адрес на область памяти на которую ссылается begin и начнёт работать со своей переменной (тоже begin, но своей) и по завершению работы функции значение внешнего begin-а не как не поменяется. А нам-то нужно, чтобы внешний begin получил новый адрес, поэтому необходимо в функцию передать именно адрес begin-а, а не его значение. Предполагаю, что я написал сложнопонимаемую хрень, поэтому попробую проще. Когда вам нужно заставить функцию изменить какую-либо внешнюю переменную, вы должны передать её адрес, ведь так?
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void set(int* a, int value) {
    *a = value;
}
 
int main() {
    int a = 5;
    set(&a, 10);
    printf("%d\n", a);
    return 0;
}
Какой будет вывод программы? Конечно же 10. Мне нужно было поменять значение а и я в функцию передал адрес этой переменной. Для функции это уже указатель. Такая же история и с функцией getWord. Мне нужно получить новые указатели на начало и конец слова, вот я и передаю адрес указателя begin и указателя end, чтобы в них занести новые значения.
2
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
24.05.2019, 08:56 8
anmartex, Благодарю за ответ. Очень хорошее объяснение. Надеюсь, в скором времени я буду писать код так же красиво как вы )
0
1 / 1 / 0
Регистрация: 23.07.2013
Сообщений: 72
27.05.2019, 10:52 9
anmartex, Объясните, пожалуйста, как понять две строки
C
1
 for (; *str && !isalpha(*str); ++str) { ; }
C
1
*begin = str;
вы хотите получить указатель на начало слова. Условие в цикле так получается - "указатель на начало слова И НЕ буква" ?? если истино то по адресу begin-a ставим текущий элемент? И почему в теле цикла двоеточие
0
...
1804 / 1268 / 935
Регистрация: 12.02.2013
Сообщений: 2,063
27.05.2019, 11:20 10
Цитата Сообщение от MaximRTS Посмотреть сообщение
C
for (; *str && !isalpha(*str); ++str) { ; }
Цитата Сообщение от MaximRTS Посмотреть сообщение
вы хотите получить указатель на начало слова.
Да, именно поиск начала слова. Перебираем символы строки пока не встретим её конец (в языке C строка завершается 0-ым символом, собственно для этого и нужна запись *str) и пока этот символ не является буквой [a-zA-Z].

Цитата Сообщение от MaximRTS Посмотреть сообщение
если истино то по адресу begin-a ставим текущий элемент?
В данном случае нет условного перехода (if-a), операция линейна и выполнится в любом случае. Но если достигнут конец строки то *begin будет содержать адрес 0-ого/замыкающего символа.

Цитата Сообщение от MaximRTS Посмотреть сообщение
И почему в теле цикла двоеточие
Это чисто моё оформление пустого цикла. Я так подчёркиваю, что тело отсутствует. Вообще их уберите { ; } и просто поставьте точку с запятой:
C
1
for (; *str && !isalpha(*str); ++str);
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2019, 11:20
Помогаю со студенческими работами здесь

Дана строка-предложения посчитать количество слов, которые начинаются и заканчиваются на один и тот же символ
Помогите решить вот такую задачу. Дана строка-предложения посчитать количество слов, которые...

Удалить из строки все слова, которые начинаются и заканчиваются на один и тот же символ
Подскажите пожалуйста, в чем ошибка Console.WriteLine(&quot;Введите строку&quot;); ...

Начинаются и заканчиваются ли строки на один и тот же символ
Пользователь вводит две строки и если они начинаются и заканчиваются на один и тот же символ...

Вывести на экран текст состоящий из слов которые начинаются и заканчиваются на одинаковый символ
Дан текст. Вывести на экран текст состоящий из слов которые начинаются и заканчиваются на...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru