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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
tashka
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 19
#1

Посчитать, сколько гласных букв в строке - C++

26.09.2011, 19:44. Просмотров 2213. Ответов 45
Метки нет (Все метки)

привет))
ребята помогите пожалуйста немогу разобраться вот задачкинужно написать только на С а не на С# или С++) задача 1 Дана непустая строка S.Посчитать, сколько гласных букв в строке.
задача2 Выяснить все ли буквы слова Х, стоящие на нечётных местах различны
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2011, 19:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Посчитать, сколько гласных букв в строке (C++):

Посчитать сколько в фамилии гласных букв - C++
Подскажите пожалуйста,как в фамилии например Цыганова,Посчитать сколько в фамилии гласных букв?

Найти сколько гласных букв в строке - C++
1) найти сколько гласных букв в строке!! Алфавит английский! Можно просто функцию нахождения! 2) в массиве A найти элемент A такое что...

Подсчитать сколько гласных букв в строке - C++
Подсчитать сколько гласных букв в строке. #include <stdio.h> #include <conio.h> int main() { char...

Подсчитать сколько гласных букв в строке - C++
Напишите пожалуйста функцию на с++ подсчёт гласных букв. и как потом вызвать эту функцию в main()?

Определить каких букв больше в строке: гласных или согласных и на сколько. - C++
1)Ввести строку А с клавиатуры состоящую из заглавных русских букв. Определить каких букв больше: гласных или согласных и на сколько....

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

45
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2011, 08:22 #16
Цитата Сообщение от accept Посмотреть сообщение
это да
нужно переделать обе функции в (массив[256] + указатели)
Другой разговор. accept, вы прекрасно знаете насколько важна сложность алгоритма.

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
меня раздразило, что функция расчитана на короткие строки, вызывает strlen(), без которой можно обойтись, создаёт flag, которая не нужна
Как раз strlen() приводит затем к минимуму условий
if (i < len),
чтобы не проскочить конец строки при i+=2.

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
создаёт flag, которая не нужна
Это признак хорошего тона. Зато без break и return посреди цикла.

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
(типа скобки if (!(s[0]))
Единственное, на что соглашусь. Моя цель была создать быстрый алгоритм.

Добавлено через 2 минуты
Цитата Сообщение от accept Посмотреть сообщение
меня раздразило, что функция расчитана на короткие строки
Это с чего вы решили?
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.09.2011, 08:25 #17
Цитата Сообщение от Thinker
Моя цель была создать быстрый алгоритм.
strlen(), индексация

почему i равно 1 ?

Цитата Сообщение от Thinker
Это с чего вы решили?
len имеет тип int, а он может быть равен short int
указатели снимают ограничение длины, быстрее индексации
0
Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
27.09.2011, 08:26 #18
ЭЭЭ, я не понял? Тут что идет олимпиада по лучшему алгоритму и быстрому коду?
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2011, 08:30 #19
Цитата Сообщение от accept Посмотреть сообщение
почему i равно 1 ?
Потому что нужны нечетные позиции в задаче

Добавлено через 1 минуту
Цитата Сообщение от accept;2017626
len имеет тип [B
int[/B], а он может быть равен short int
Это уже банальные придирки... Тем более, строка может гигабайт занимать, ваш short тут не к месту совсем...

Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
указатели снимают ограничение длины, быстрее индексации
А вы в курсе, что при компиляции происходит замена выражений типа a[i] на *(a+i), поэтому результат всегда одинаковый

Добавлено через 50 секунд
Цитата Сообщение от Nursik77 Посмотреть сообщение
ЭЭЭ, я не понял? Тут что идет олимпиада по лучшему алгоритму и быстрому коду?
Конечно, быстрые алгоритмы очень важны!
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.09.2011, 08:32 #20
Цитата Сообщение от Thinker
Потому что нужны нечетные позиции в задаче
s[0] - нечётная позиция

Цитата Сообщение от Thinker
Это уже банальные придирки...
код непереносим

Цитата Сообщение от Thinker
А вы в курсе, что при компиляции происходит замена выражений типа a[i] на *(a+i)
в K&R2 написано, что указатели работают быстрее индексации 5.3
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2011, 08:34 #21
Цитата Сообщение от accept Посмотреть сообщение
s[0] - нечётная позиция
0 - четное число. Где в задаче сказано, что нумерация с 1? Ладно, глупостью только занимаемся.
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.09.2011, 08:43 #22
Цитата Сообщение от Thinker
0 - четное число. Где в задаче сказано, что нумерация с 1? Ладно, глупостью только занимаемся.
s[0] - 1ая позиция (так во всех задачах)
а когда речь идёт про индексы, это уточняют особым образом
задача такого вида подходит для многих языков программирования, и не во всех из них индексация сделана одинаково
0
tashka
0 / 0 / 0
Регистрация: 25.09.2011
Сообщений: 19
27.09.2011, 18:57  [ТС] #23
hodas4, сам не лучше
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
27.09.2011, 19:24 #24
Цитата Сообщение от Thinker Посмотреть сообщение
0 - четное число. Где в задаче сказано, что нумерация с 1?
При всём уважении, но в этом плане по-моему accept прав. Людям привычнее счёт с единицы начинать, а не с нуля. То есть первый символ в слове - всё-таки первый, а не нулевой... Ну а зачем морочиться избавляясь от strlen(), я тоже не понимаю, но может и есть какой-то глубинный смысл в неиспользовании стандартных библиотечных функций... Само второе задание я бы так написал:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
 
int main(void){
    char buf[256];
    
    while ( printf("Word: ") && scanf("%255s", buf) == 1 ){
        char * head = buf, * tail = buf + strlen(buf);
        int cnt[256] = { 0 };
        
        while ( head < tail ){
            if ( ++cnt[*head] > 1 ){
                break;
            }
            head += 2;
        }
        printf("%s\n", ( head < tail ) ? "Fail" : "Ok");
    }
    
    return 0;
}
Выход - Ctrl+c
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.09.2011, 19:53 #25
easybudda, хороший вариант и префиксная форма инкремента очень кстати здесь. Быть может, увеличить лучше размер строки buf, чтобы с паскалевской строкой не сочеталась, тогда хорошо получилось P.S. Закроем глаза на break
0
easybudda
27.09.2011, 20:17
  #26

Не по теме:

Цитата Сообщение от Thinker Посмотреть сообщение
P.S. Закроем глаза на break
По моему скромному... оператор break в последнее время анафиме всё чаще предают просто потому, что на goto ворчать надоело... При правильном использовании операторы break и continue как-раз могут программу значительно логичнее сделать. До фанатизма доходить не сто'ит ни в применении какого-то отдельно взятого оператора языка С где надо и не надо, ни в тотальном от него избавлении...

2
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.09.2011, 01:48 #27
Цитата Сообщение от easybudda
C
1
while ( printf("Word: ") &&
вот это неправильно
printf() может возвращать отрицательное значение
отрицательное значение - истина
http://www.cyberforum.ru/cpp-beginners/thread353132.html#post1998186

массив и указатели
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
#include <stdio.h>
 
int checkneq_oddltrs(const char *s)
{    
    char arr[256] = { '\0' };
    
    for ( ; *s != '\0'; s += 2) {
        if (arr[(unsigned) *s]++ == 1)
            return 0;
        if (*(s + 1) == '\0')
            break;
    }
    return 1;
}
 
int main(void)
{
    printf("%d\n", checkneq_oddltrs(""));
    printf("%d\n", checkneq_oddltrs("a"));
    printf("%d\n", checkneq_oddltrs("ab"));
    printf("%d\n", checkneq_oddltrs("aba"));
    printf("%d\n", checkneq_oddltrs("abb"));
    printf("%d\n", checkneq_oddltrs("abba"));
    printf("%d\n", checkneq_oddltrs("abbaa"));
    printf("%d\n", checkneq_oddltrs("abbacaab"));
    printf("%d\n", checkneq_oddltrs("abbacazb"));
    return 0;
}
Код
[guest@localhost tests]$ ./t
1
1
1
0
1
1
0
0
1
[guest@localhost tests]$
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
28.09.2011, 01:59 #28
accept, да уже много раз обсуждали. Ну может, да и ладно. В том случае, если printf() вдруг отрицательные значения возвращать начнёт, это какая-то беда с консолью. И тогда тут уж не до программирования, с системой бы разобраться. А вот scanf() действительно может вернуть не то, что программой ожидалось, и лучше бы этот случай обработать. По большому счёту printf() в условии только для краткости...
Но само собой учитываем, что всё-таки учебную програмку пишем, и потому только каждой мелочью не заморачиваемся. В настоящей программе лучше проверять всё, что проверяется - меньше сюрпризов будет...
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.09.2011, 02:08 #29
Цитата Сообщение от easybudda
В том случае, если printf() вдруг отрицательные значения возвращать начнёт, это какая-то беда с консолью.
программа в таком случае должна завершиться, а не продолжаться, делая что-то дальше

Цитата Сообщение от easybudda
А вот scanf() действительно может вернуть не то
они обе могут вернуть не то
и надо останавливать программу в таком случае

Цитата Сообщение от easybudda
По большому счёту printf() в условии только для краткости...
для краткости можно и scanf() так же записать, но от этого программа правильной не станет
читай книги, в частности K&R, в которой это объясняется
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
28.09.2011, 02:14 #30
а есть гарантия что printf выполнится раньше scanf ?
0
28.09.2011, 02:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2011, 02:14
Привет! Вот еще темы с ответами:

Определить сколько в предложении гласных букв - C++
дано предложение. определить сколько в нем гласных букв.

Подсчитать количество гласных букв в строке - C++
// Лабораторная работа №5.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; ...

Вычислить количество гласных букв в строке - C++
Изучение обработки строк при помощи указателей Задание: Для ввода всех строк использовать один и тот же символьный массив tmp. ...

Указатели. Вычислить количество гласных букв в строке - C++
В программе условие ввода строки:пока первый символ не пробел Условие обработки строки:1.Вычислить кол-во гласных букв в строке 2.Если...


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

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

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