Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 15:07   #1
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию Контрольная работа (Си)

Помогите пожалуйста с решением контрольной работы.

1. Определить функцию с именем NumSymbol для подсчета количества вхождений заданного в текст, который хранится в строке, заканчивавшейся '\0'.

2. Определить функцию с именем Palindrom для проверки, является ли слово из строки заканчивающейся '\0', палиндромом. Если слово полиндром, то функция возвращает - 1, в противном случае - 0.

3. Определить собственный вариант с именем WordCmp стандартной функции с именем strcmp.

4. Определить функцию с именем main, создать в ней необходимые для вызова NumSymbol(), Palindrom(), WordCmp() объекты, и выполнить вызовы.

Помогите пожалуйста, очень нужно в этом разобраться)
Nekit9401 вне форума Ответить с цитированием
Старый 11.12.2012, 15:11   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Хорошо.
Цитата:
1. Определить функцию с именем NumSymbol для подсчета количества вхождений заданного в текст, который хранится в строке, заканчивавшейся '\0'.
Ваши наработки? Идеи? Прототип функции?
Abstraction вне форума Ответить с цитированием
Старый 11.12.2012, 15:18   #3
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Хорошо.Ваши наработки? Идеи? Прототип функции?
Извините, но ничего нету, потому что я вообще не представляю как это делать)
Nekit9401 вне форума Ответить с цитированием
Старый 11.12.2012, 15:54   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

"Строка, заканчивающаяся '\0'" также называется C-строкой. Обычный её "тип" - const char* (в действительности это адрес первого символа в строке, который передаётся вместо строки целиком). Количество вхождений, если не усложнять - int, целое. Напишите прототип функции, которая в качестве аргумента принимает строку, заканчивающуюся '\0' и возвращает целое число.
Abstraction вне форума Ответить с цитированием
Старый 11.12.2012, 16:28   #5
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Так? Сомневаюся конечно, что это правильно)

Код:
#include <stdio.h>
int NumSymbol (const char* A){
	int n=5; // число вхождений
return n;
}
Nekit9401 вне форума Ответить с цитированием
Старый 11.12.2012, 17:08   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Так? Сомневаюся конечно, что это правильно)
Прототип - это заголовок. В Вашем случае:
Код:
int NumSymbol (const char* A);
Теперь подумаем: нам требуется "подсчет количества вхождений заданного символа в текст". Это значит, что данная функция должна принимать второй аргумент: символ. Символ имеет тип char. Заголовок, соответственно:
Код:
//Возвращает количество вхождений символа sym в строку A
int NumSymbol (const char* A, char sym);
Так. Теперь тело функции. Представьте, что у Вас есть длинная лента с символами. Вы хотите посчитать, сколько на этой ленте символов Х до первого символа 0. Попробуйте описать словами, как Вы (человек) это бы делали?
Abstraction вне форума Ответить с цитированием
Старый 11.12.2012, 17:30   #7
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Ну как сказать, даже не представляю, ну может быть для начала бы нашел первый символ 0, и удалил бы все, что идет после него, чтоб искать было легче), но так как у нас строка оканчивается на 0, видимо убирать ничего не придется. Ну а потом бы просто посчитал кол-во символов X, вот только вопрос в том, как это сделать наиболее эффективней, вот до этого я додуматься не могу)
Nekit9401 вне форума Ответить с цитированием
Старый 11.12.2012, 18:05   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Ну как сказать, даже не представляю, ну может быть для начала бы нашел первый символ 0, и удалил бы все, что идет после него, чтоб искать было легче)
Удалять нельзя. Вас же попросили посчитать, а не удалить.
К примеру, можно постепенно передвигать палец по ленте от первого элемента и всякий раз, видя Х, считать: "раз", "два", "три"... А как только увидим 0 - значит, всё, последнее названное число и есть ответ.
Код:
//Возвращает количество вхождений символа sym в строку A
int NumSymbol (const char* A, char sym){
  //Вначале "посчитанных символов" - ноль
  //Ставим палец на начало строки.
  //Пока элемент под пальцем - не '\0',
    //Если элемент под пальцем - sym, то
      //Прибавляем 1 к числу "посчитанных символов"
    //Сдвигаем палец на 1 позицию вперёд
  
  //Раз мы закончили с "пока" - текущее число "посчитанных символов" и есть требуемый результат
}
Каждая строка комментария соответствует некоторой строке кода на языке C++. Попробуйте написать те, которые Вам понятны.
Abstraction вне форума Ответить с цитированием
Старый 11.12.2012, 18:44   #9
Nekit9401
Пользователь
 
Аватар для Nekit9401
 
Регистрация: 11.12.2012
Сообщений: 56
По умолчанию

Мои шансы небезнадежны?))

Код:
int NumSymbol (const char* A, char sym){
  int n;
  int i=0;
  while(A[i]!='\0'){
        if(A[i]==sym)
            n++;
	else(i++);
  }
  return n;
}

Последний раз редактировалось Nekit9401; 11.12.2012 в 20:47.
Nekit9401 вне форума Ответить с цитированием
Старый 11.12.2012, 23:08   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Не убирайте комментарии. По крайней мере, до тех пор, пока код не станет столь же понятен Вам, как и они.
Я возвращаю их на место:
Код:
//Возвращает количество вхождений символа sym в строку A
int NumSymbol (const char* A, char sym){
  //Вначале "посчитанных символов" - ноль
  int n;
  //Ставим палец на начало строки.
  int i=0;
  //Пока элемент под пальцем - не '\0',
  while(A[i]!='\0'){
        //Если элемент под пальцем - sym, то
        if(A[i]==sym)
            //Прибавляем 1 к числу "посчитанных символов"
            n++;
        //Сдвигаем палец на 1 позицию вперёд
	else(i++);
  }
  //Раз мы закончили с "пока" - текущее число "посчитанных символов" и есть требуемый результат
  return n;
}
В двух случаях комментарий и строка под ним расходятся по смыслу. Найдите эти две пары.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контрольная работа Supernatural Помощь студентам 6 25.03.2017 17:54
Контрольная работа Vart Microsoft Office Excel 1 20.06.2011 10:13
Контрольная работа KostyaS Помощь студентам 3 21.04.2011 23:44
контрольная работа ГалинаБ Помощь студентам 17 19.01.2011 01:30
контрольная работа Rustem5 Паскаль, Turbo Pascal, PascalABC.NET 10 28.06.2010 16:55