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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2012, 18:50   #1
Aero93
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 11
По умолчанию Рекурсивная функция

Здравствуйте форумчане! пытаюсь писать на с++. Суть задачи: Используя рекурсивную функцию, составить программу которая будет определять заданную строку символов , как "литер индетификатор"

Литер индетификатор : Строка может иметь в себе все латинские буквы(заклавные и строчные) ,цифры, и пробел.


Не понимаю , как задать рекурсивную функцию. Помогите!


Наработки:

PHP код:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <conio.h>
int main() 
{
    
char s;
    
cin >> s;
    if ( ((
0x61<=s)&&(s<=0x7A))||((0x41<=s)&&(s<=0x5A))||((0x30<=s)&&(s<=0x39))||(s==0x20)) cout << "Da"; else cout << "Net";
    
getch();

Тут только проверка одного символа... в цикл пихать мне не хочется, так как программа на выводе мне выдаст по каждому символу отчет.
Aero93 вне форума Ответить с цитированием
Старый 05.01.2012, 20:42   #2
Aero93
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 11
По умолчанию

Помогите пожалуйста запихнуть в рекурсивную функцию вот этот код
Код:
    int i,n,k;
    cin >> n;
    char s[n];
    for (i=0;i<n;i++) cin >> s[i];
    i=0;
    for (i=0;i<n;i++) {
         if (((0x61<=s[i])&&(s[i]<=0x7A))||((0x41<=s[i])&&(s[i]<=0x5A))||((0x30<=s[i])&&(s[i]<=0x39))||(s[i]==0x20))
         {if (((0x61<=s[0])&&(s[0]<=0x7A))||((0x41<=s[0])&&(s[0]<=0x5A)))
         k=1; else {cout << "Net";k=0; break;}}}
         if( k==1) cout << "Da";
Aero93 вне форума Ответить с цитированием
Старый 05.01.2012, 22:37   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,381
По умолчанию

Напиши функцию, которая возвращает лог. значение
bool tststr(char* str)
{
1. Проверим, что str[0] !=0.
Код:
 If str[0] == 0 /*конец строки*/
       retutn true;
2. Получи значение для лог. переменной:
Код:
bl = ((0x61<=s)&&(s<=0x7A))||((0x41<=s)&&(s<=0x5A))||((0x30<=s)&&(s<=0x39))||(s==0x20);
   if ! bl   /* нет соответсвия*/
      return false
   else { /* есть соответсвие */
// Внимание! Копируем часть строки - со следующего элемента до конца
      while (*tmpstr++ = *str[1]++); /* копируем строку во временную*/
      return tststr(tmpstr) /* РЕКУРСИВНЫЙ вызов*/
   };
Т.о.
1. Проверяем первый символ.
Если ноль (конец строки), то завершаем работу функции.
2. Проверяем первый символ на соответствие требованиям.
Если соответствия нет, то завершаем, возвращая False
Иначе копируем строку со второго символа во временную строку
и вызываем функцию (рекурсия).

Тут далеко не всё гладко. Писал на С++ очень давно и под руками нет компилятора для проверки.
Ну и переменные надо правильно описывать ...

Как то так получается ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.01.2012, 23:34   #4
Aero93
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 11
По умолчанию

Спасибо . Сейчас попробую. Но я почти уже сделал эту программу, только проблема не большая есть: вылетает после ввода строки. Но если результат получается "No" , то все работает. А если все правильно, то вырубается прога.


Код:
#include <iostream>
#include <conio.h>
using namespace std;
int faq(char* m,int c,int n) {
    if (c<=n) {
     if (((0x61<=m[c])&&(m[c]<=0x7A))
     ||((0x41<=m[c])&&(m[c]<=0x5A))
     ||((0x30<=m[c])&&(m[c]<=0x39))
     ||(m[c]==0x20)) return faq(m++,c++,n); else return 1;} else return 2;
}
int main (){
    int c=1,i,n,k;
    cin >> n;
    char s[n],*m;
    for (i=0; i<n;i++) cin >> s[i];
    k=faq(s,c,n);
    if (k ==1) cout << "No"; else cout << "yes";
    getch();
}

Последний раз редактировалось Aero93; 05.01.2012 в 23:36.
Aero93 вне форума Ответить с цитированием
Старый 06.01.2012, 00:24   #5
Aero93
Пользователь
 
Регистрация: 05.01.2012
Сообщений: 11
По умолчанию

Тему закрывайте. Все сделал. вот итоговый код :
Код:
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
int F(char* M, int j,int n){ 
if (j>=n-1) return 2; else {
          if(((0x30<=M[0])&&(M[0]<=0x39))||
          ((0x41<=M[0])&&(M[0]<=0x5A))||
          (0x61<=M[0])&&(M[0]<=0x7A)||(M[0]==0x20)) return (F(M+1,j+1,n));else
 return 1;}
}
main()
{
 int n,i,b,j=1;
 printf("Input kol-vo symbol's=");
 cin >> n;
 char M[n];
 printf("Input text\n");
 for (i=0;i<n;i++) cin >> M[i];
 b=F(M,j,n);
 if (b == 1) cout << "No!!!"; else cout << "YeS!!!!!!!!!";
 
 getch();     

}
Aero93 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная функция в С++ Ahellen Помощь студентам 7 20.09.2010 20:58
рекурсивная функция)) vedro-compota Общие вопросы Delphi 8 16.04.2010 14:39
Рекурсивная функция Bernuar Помощь студентам 2 06.04.2010 10:07
Си++. Рекурсивная функция. Diamond2107 Помощь студентам 6 02.12.2009 19:48