Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как решить такую задачу со стрингом?


Автор: Legend 22.3.2009, 16:47
Задача такова:
Вводятся данные:
 Код Ид родителей- Стрингом
Л- число детей
Код Ид детей- массив стрингов
....Выводятся на Экран:
Введённый ИД код-стринг
Число внуков - инт
Ид внуков- Массив стрингов
...................................................
Програмка сравнивает Ид детей (которые дети первых родителей) с другими ид родителей и определяет являются ли они детьми Этих детей(которые дети первых родителей). Если стринги равны то следовательно эти дети внуки первых родителей. И они выводятся на экран вместе с Ид бабушек, дедушек (первые родители)  и их Ид.
....
Объяснил как смог :( надеюсь понятно). Интересует как можно задекларировать массив стрингов...и как сравнить стринги со стрингами из массива.
........пример....
ввод
ид-родителя
98432445246
детей-2
ид-детей
42435463242=и
23498473625

ид родителя
424354632442=и
детей-3
ид-детей
23784726371
38472635162
39182748293

вывод 
ид-родителя
98432445246
внуков-3
ид-внуков
23784726371
38472635162
39182748293

Зарание спасибо :/

Автор: zim22 22.3.2009, 16:54
массив стрингов так создаётся:
Код

std::string arr[100];

может вам лучше вектор использовать? 
Код

std::vector<std::string> vs;

это тот же самый массив, но более умный. умеет менять размер и т.д. и т.п.

сравнивать так:
Код

for (std::vector<std::string>::const_iterator it = vs.begin(); it != vs.end(); ++it)
{
   if (*it == "ivanov") { // делать что-то }
   
}

Автор: Dmi3ev 22.3.2009, 17:02
Цитата

Програмка сравнивает Ид детей (которые дети первых родителей) с другими ид родителей и определяет являются ли они детьми Этих детей(которые дети первых родителей)

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

Автор: mes 22.3.2009, 17:04
Цитата(Legend @  22.3.2009,  15:47 Найти цитируемый пост)
как можно задекларировать

насколько я понял задание, вам нужно древо.. задекларировать структуру его элемента можно так :
Код

struct Node
{
    std::string  id;
    Node ** childs;
    Node * parent; // если нужно по потомку узнать родителя
};

на основе этих элементов строится список дерево.. как именно поможет гугль и книжка smile

ну а как работать со string написано здесь: http://www.cplusplus.com/reference/string/string/

Автор: Legend 22.3.2009, 17:18
Спс )    
std::string arr[100]; если мне надо массив, который стостоит из количества строчек= количеству детей=КД у родителей. В тоже время строка каждая должна состоять из 11-и елементов/ цифр. То писать std::string arr[КД]; а как задать длинну строки 11?

Автор: mes 22.3.2009, 17:22
Цитата(Legend @  22.3.2009,  16:18 Найти цитируемый пост)
 а как задать длинну строки 11? 

std:.string за длиной сама следит, просто присваиваете необходимый идентификатор и все.

Автор: Dmi3ev 22.3.2009, 17:24
mes, я думаю, что товарищ пока не очень силен в программировании, а ты ему дерево уже...
Может че попроще? 

Автор: Legend 22.3.2009, 17:33
Dmi3ev
Цитата

потому как заранее неизвестно, сколько детей, сколько у этих детей детей и тд...

У меня есть ограничения.. в том что детей может быть максимум 10. А внуков 100. Решил взять массив.. так как более с ним знаком.. а с вектором я вообсще не встречался. И теперь всё тотже вопрос как сравнить их) так как мне показали сравнения векторов.

Автор: mes 22.3.2009, 17:33
Цитата(Dmi3ev @  22.3.2009,  16:24 Найти цитируемый пост)
mes, я думаю, что товарищ пока не очень силен в программировании, а ты ему дерево уже...
Может че попроще?  

ну такую задачу он огласил smile
данные динамичиские: кол-во детей не постояно, глубина иерархии судя по всему тоже  - в линейный массив такое дерево без извращений не затолкаешь, так что проще будет изучить что такое дерево
или для начала разобраться со списком, можно даже на примере этой задачи, ограничив число детей каждого родителя  1 "штукой" smile
если глубина иерархие ограничена, то можно через многомерный динамический массив, главное в звездочках не запутаться smile

Добавлено @ 17:39
Цитата(Legend @  22.3.2009,  16:33 Найти цитируемый пост)
У меня есть ограничения.. в том что детей может быть максимум 10. А внуков 100. 

Ну с этого и надо было начинать : 
Код

std::string [10][10][10]; // 10 родителей по 10 детей по 10 внуков на одного дитя :)
// только учтите что индексы с 0


Автор: Dmi3ev 22.3.2009, 17:45
Цитата

И теперь всё тотже вопрос как сравнить их)

используя "=="
Код

string s[3];
s[0]="ccc";
s[1]="bbbb";
s[2]="ggggg";
for (int i=0; i<3; i++)
 if (s[i]=="bbbb")
  cout<<"index="<<i<<endl;

Автор: mes 22.3.2009, 17:50
Цитата(Legend @  22.3.2009,  16:33 Найти цитируемый пост)
И теперь всё тотже вопрос как сравнить их)

их это std::string ? также каk и обычные значения, посредством оператора ==
Вам в самом начале ссылку на все ее функции дали, а Вы даже не подумали заглянуть.. 
с таким подходом далеко не уедете.. 

Автор: Legend 22.3.2009, 18:03
Заглянул я )) и нашёл if (LK.compare(ID) = 0) .. попробую через это .. А вопрос задал .. что вдруг посоветуют чегонить получше ) ну во всяком случае спасибо и за критикуsmile))

Автор: Dmi3ev 22.3.2009, 18:17
Legend, я же тебе сюда даже положил сравнение...

Добавлено через 1 минуту и 18 секунд
Цитата

if (LK.compare(ID) = 0)

тебе это даже не нужно... пользуйся старым добрым "=="

Автор: Legend 22.3.2009, 18:19
sps ))

Автор: Legend 22.4.2009, 14:59
Так значет написал я програмку )) всё работает.. только в конце пошол я лёгким путём.. и прежде в6вода резульата я вставил ;;ввод ИД;; .. шоб его сравнить и вывести только те результаты которые пренадлежат к этому определённому родителю. Собственно преподу это не понравилось.. хотела она шоб я не вводил определённого ИД , а шоб програмка сравнивала всех и в6водила всевожможнyе решения этой задачи ( тобиш всех родителей у кого есть внуки)  ... тут я даже растерялся как? как это сделать? Может ктото подскажет?  БУду ооочень благодарин. И ещо немогу разобраьтся почему лонг инт не совсем корpектно работает. Сперва хотел сделать Ид как целочисленное, но увы это только 8-значное число...а нужно мне 11.. Поэтому при вводе использую тока 3 -4 цифри)) собственно это не имеет значения

Код
#include<stdio.h>
#include<string.h>

int main()
{
   int n[10],i=1,t=1,d,k=1,b;
   long int Idrod[14];
   long int  a[10][9];
   char proverka[4];

   do {
      printf("Vvedite Id-roditelei(%d) = ",k);
      scanf("%ld",&Idrod[k]);
      do {
          printf("Vvedite 4islo detei = ");
          scanf("%d", &n[k]);
      } while ( (n[k] < 1) || (n[k] > 13) );

      for(i = 1; i <= n[k]; i++) {
         printf("Id-rebenka %d  = ", i);
         scanf("%ld", &a[k][i]);
      }
 
      printf("Zelaete dobavit e6e odnogo roditelja?(Y/N)- ");
      scanf("%s",proverka);
 
      ++k;
   } while(i<=10 &&  strcmp(proverka, "Y") != 1 && strcmp(proverka, "N") != 0 );

   i=0;
   do {
      printf("\n  Vvedite id roditelja dlja proverki na vnu4atost!- ");
      scanf("%ld", &d);
      t = 1;
      while (t <= k) {
          if (Idrod[t] == d) {
              i = t;
          }
     
          t++;
       }
   } while(i<=0);
   t = 1;
   d = 1;
   printf("U dedu6ki id=%ld  %d detej:\n", Idrod[i], n[i]);
   for(d=1;d<=n[i];d++) {
       printf("          %ld \n",a[i][d]);
   }
   t = 1;
   d = 1;
   while (t <= k) {
      d=1;
      while (d <= n[i]) {
         if (Idrod[t] == a[i][d]) {
            printf("   \n  Vnuki ot %ld", Idrod[t]);
            for(b=1; b <= n[t]; b++) {
               printf("\n          %ld ", a[t][b]);
            }

         }
         d++;
      }
      t++;

   }
   getchar();
   getchar();
}


Модератор: Пользуйся кнопкой "Код"
Модератор: Не забывай форматировать код

Автор: bsa 23.4.2009, 00:29
Legend, long int работает корректно. Возможно, ты просто от него иного ожидаешь. напиши простенькую программку, которая выведет sizeof(long) на экран. Затем возведи 256 в указанное число, раздели на 2 и вычти 1 и ты получишь максимальное положительное число, которое может быть в нем (если не вычитать 1, то у тебя будет модуль минимального отрицательного числа).

Дальше, типичная ошибка новичков: ++i работает в общем случае быстрее i++:
Код
int preInc(int &x) { //++x
   x = x + 1;
   return x;
}
int postInc(int &x) { //x++
   int tmp = x;
   x = x + 1;
   return tmp;
}
Как видно из примера, в случае x++ создается временная переменная. Поэтому: если тебе не нужна именно постфиксная форма, используй префиксную. Да, это выглядит менее логично по началу, но потом привыкаешь.

Автор: Legend 23.4.2009, 11:25
 спс Буду иметь ввиду нащот ++i

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)