Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3, 4, 5  След.
 Помогите решить задачку на Си
Задана последовательность идентификаторов, разделённых одним или несколькими пробелами, оканчивающаяся запятой сразу за последним идентификатором. Каждый идентификатор содержит не более 20 символов. Длина последовательности не более 35 идентификаторов. Найти и напечатать все идентификаторы, не содержащие цифр.

 
Аватара пользователя
Ну и какого рода помощь Вам нужна?

 
Наверное помочь реализовать это на Си :D

 
Аватара пользователя
Танюшка писал(а):
Наверное помочь реализовать это на Си :D

Тогда, наверное, алгоритм уже знаете. Может расскажете? Поясните, с чем именно в реализации на С возникли трудности?

 
Аватара пользователя
Просто вот в чем дело: при такой постановке задачи единственное, чем участники форума могут Вам помочь - взять и просто написать здесь готовый текст программы. Но так у нас не принято, ибо Вы тогда ничему не научитесь. Так что конкретизируйте: понятен ли алгоритм (как в принципе делать), либо сложности с реализацией.

 
Алгоритм в принципе понятен, а вот как реализовать это всё я не знаю.
Помогите пожалуйста, очень срочно нужно :(

 
Аватара пользователя
:evil:
Ладно, не буду издеваться над принципиальным пониманием.

Разбейте задачу на части

1) отведите место под идентификаторы. Поскольку у Вас известны и размеры, и количество, память можно отвести статически, например, в виде одного массива S[35 * 21] (0..20 — первый идентификатор, 21..41 — второй, и так далее). Обратите внимание, мы отвели место и под 0 в конце строки.

2) прочитайте идентификаторы из файла. Самый простой способ — читать посимвольно.

3) напишите функцию, которая получает параметром смещение идентификатора в таблице и возвращает 0, если он содержит цифры, и 1, если не содержит

4) Ну, всё, разум победил. Идёте в цикле по таблице и вызываете предыдущую функцию. Если она вернула 1 — печатаем идентификатор, нет — пусть катится в тар-тарары.

На самом деле, нам и помнить-то их все не надо. Но программа так получается не сложнее.

 
незваный гость писал(а):
Ладно, не буду издеваться над принципиальным пониманием.

Разбейте задачу на части

1) отведите место под идентификаторы. Поскольку у Вас известны и размеры, и количество, память можно отвести статически, например, в виде одного массива S[35 * 21] (0..20 — первый идентификатор, 21..41 — второй, и так далее). Обратите внимание, мы отвели место и под 0 в конце строки.

2) прочитайте идентификаторы из файла. Самый простой способ — читать посимвольно.

3) напишите функцию, которая получает параметром смещение идентификатора в таблице и возвращает 0, если он содержит цифры, и 1, если не содержит

4) Ну, всё, разум победил. Идёте в цикле по таблице и вызываете предыдущую функцию. Если она вернула 1 — печатаем идентификатор, нет — пусть катится в тар-тарары.

На самом деле, нам и помнить-то их все не надо. Но программа так получается не сложнее.


А не подскажете как функцию написать? :)

 
Аватара пользователя
:evil:
На такой вопрос я даже не знаю, что ответить. Чтобы не впадать в сарказм и в маразм, давайте уточним, что Вам не понятно:

1) синтаксис функции в С

или

2) алгорифм работы функции, проверяющей есть ли в идентификаторе цифра

или

3) как оформить параметр такой функции

или

4) синтаксис вызова функции.

или

5) где найти введение в язык С

 
Аватара пользователя
Мне кажется, что здесь может быть проще отвести место в памяти только под один идентификатор и принимать решение сразу после его прочтения. Без дополнительных функцией, на одних только циклах. Алгоритм примерно таков:

1. Сбросить флаг того, что идентификатор содержит цифру.
2. Считывать символы в буфер до появления запятой или пробела. Одновременно проверять, цифра это или нет. При появлении цифры установить флаг.
3. Проверить флаг наличия цифры. Если он не установлен, то добавить в конец буфера завершающий нуль-символ и вывести идентификатор на печать.
4. Если пункт 2. закончился запятой, то завершение работы.
5. Считывать пробелы до появления первого не-пробела. Поместить его в начало буфера и перейти к шагу 1.

При этом условие того, что идентификаторов в списке не больше 35, не нужно.

 
незваный гость писал(а):
:evil:
На такой вопрос я даже не знаю, что ответить. Чтобы не впадать в сарказм и в маразм, давайте уточним, что Вам не понятно:

1) синтаксис функции в С

или

2) алгорифм работы функции, проверяющей есть ли в идентификаторе цифра

или

3) как оформить параметр такой функции

или

4) синтаксис вызова функции.

или

5) где найти введение в язык С


Я вообще не представляю как такую функцию написать :cry: Хотя бы примерно можете показать?

 
Аватара пользователя
А Вы хотя бы одну программу на Си писали?

 
Писала, всего лишь две программы, там были только функции main, printf и skanf, но эти программы были совсем простые

 
Аватара пользователя
Ну, например, если следовать плану незваного гостя, то функция может выглядеть так (во всяком случае, я бы написал ее так):

Код:
bool DigitExists(char *szString)
{
    while( *szString != '\0' )
    {
        if( *szString >= '0' && *szString <= '9' )
            return true;
        szString++;
    }

    return false;
}


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

Понятно? Дальше - самостоятельно, или задавайте более конкретные наводящие вопросы.

 
А можно написать как-нибудь по другому? Без типа данных bool?

 [ Сообщений: 61 ]  На страницу 1, 2, 3, 4, 5  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group