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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2010, 02:24   #1
Anastasia.K
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию строки в С

Здравствуйте!
У меня такая вот проблема…
Пользователь вводит команду в виде:
номер N T (нпр, номер Марии 274950) где T телефонный номер, а N имя
удали номер N (нпр, удали номер Марии)
найди номер N (нпр, найди номер Марии)
Т.е. существует несколько команд, которые может ввести пользователь. Программа должна выполнить соответствующие им действия.
Я думаю, что эти команды мы читаем как строки (string). Но! ведь мы не знаем, сколько символов в этой строке, как же тогда можно читать эти команды? Как написать программу? Далее, как сделать так, чтобы программа распознала эти команды? Т.е. чтобы в структуру данных сохранился номер T человека с именем N или же номер N был удален и т.п. Нужно каким-то образом сравнить введенные строки с шаблонными (с возможными), но как это сделать?
В общем, мне не понятно как заставить программу понимать эти команды
Надеюсь, что я понятно объяснила задачу.
Спасибо заранее!
Anastasia.K вне форума Ответить с цитированием
Старый 09.01.2010, 09:15   #2
sinj
программирователь
Пользователь
 
Аватар для sinj
 
Регистрация: 15.02.2009
Сообщений: 72
По умолчанию

попробуйте так: почитайте про указатели на строки. У вас будет массив переменных типа char, а указатель будет указывать на его первый элемент. Далее, просто сортируйте массив. Например, можно сделать еще один аналогичный массив и просто копировать туда переменные из первого, до тех пор пока не встретится символ пробела (' '). А после этого можно работать уже со вторым массивом. Или просто прописать в коде программы все ваши команды и сравнивать то, что вводит пользователь с тем что есть. Если это не понятно, то для начала надо почитать что такое строки в С, и какие есть приемы работы с ними.
smile
sinj вне форума Ответить с цитированием
Старый 09.01.2010, 12:28   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В каком Си ты это пишешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.01.2010, 17:46   #4
Anastasia.K
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

Спасибо большое за совет! Я так и сделала... все работает
Вот только у меня теперь другая проблема. Когда я хочу вывести на экран имя с помощью printf, то выводится имя и ещё какая-нибудь закорючка )) как с эти бороться?

пример:


Код HTML:
    if(!strncmp(string, "Nomer", 5)){       
                        i=7; a=0;
                        while(string[i]!=' '){
                        ime[a]=string[i];
                        i++;
                        a++; 
                      }
             length=strlen(string);
             j=i+1; b=0;
             while(j<length){
                      num[b]=string[j];
                      b++;
                      j++;
                      }  
            t=atoi(num);
            printf("Nomer %s - %i ", ime, t); 
}
Anastasia.K вне форума Ответить с цитированием
Старый 11.01.2010, 11:51   #5
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

я думаю, что для хранения данных лучше было бы использовать хеш-таблицу.
Alex_FF вне форума Ответить с цитированием
Старый 11.01.2010, 22:12   #6
Anastasia.K
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

Именно туда я и сохраняю данные... но проблема не в таблице
Когда я хочу вывести строку на экран, вместе с именем появляются ещё какие-нибудь случайные символы. Программа работает, проблема только в printf

Вот часть моей программы (без вывода чего-либо на экран):

Код HTML:
#define B 10

typedef char my[20];
typedef my domain;
typedef int range;

typedef struct cell{
        domain domainelement;
        range rangeelement;
        struct cell *next;
}celltype;

typedef celltype *MAPPING[B];


int h(domain d){
///////
}


    
void MAKE_NULL(MAPPING *M){
     int i;
     for (i=0;i<B;i++) (*M)[i]=NULL;
}

void ASSIGN (MAPPING *M, domain d, range r){
     int bucket;                  
     celltype *current;
     bucket=h(d);
   
     current=(*M)[bucket]; 
     while(current!=NULL){
        if(strcmp(current->domainelement,d)==0){
                    current->rangeelement=r;
                    return;  
        }
        else current=current->next;}
     current=(*M)[bucket]; 

      (*M)[bucket]=(celltype*)malloc(sizeof(celltype));
    
      strcpy((*M)[bucket]->domainelement ,d);   
      (*M)[bucket]->rangeelement=r;
      (*M)[bucket]->next=current;  
}

int COMPUTE(MAPPING M, domain d, range *r){
   celltype *current;
   current=M[h(d)];
   while(current!=NULL){
                     if(strcmp(current->domainelement,d)==0) { 
                                *r=current->rangeelement; 
                                return 1; 
                                }
                     else {
                          current=current->next;
                          }
   }
   return 0;
}                                                                                   
 
                 
void DEASSIGN(MAPPING *M, domain d){
     celltype *current, *temp;
     current=(*M)[h(d)];
     if(current!=NULL){   
           if(strcmp(current->domainelement,d)==0){
                      temp = current; 
                      current=current->next;
                      free(temp);                                      
            }
            else {

                   while(current->next!=NULL)
                    if(strcmp(current->next->domainelement,d)==0) {
                          temp= current->next;
                          current->next=current->next->next;                                                                
                          free(temp);
                          return;
                          }
                    else current=current->next;
            }             
     }
}    
        
                      
                      
int main(){
    MAPPING M; 
    MAKE_NULL(&M); 
    char string[40]; 
    char *name, *nomer;     
    
    int a, b, i, j, length, t; 
    

 while(1){
    
    gets(string);
    
    if(strcmp(string, "0")==0) return 0;
        
    
    if(strncmp(string, "Nomer", 5)==0){       //nomer ... ...
                        i=6; a=0;
                        name=(char*)malloc(20);
                        nomer=(char*)malloc(20);
                        while(string[i]!=' '){
                        name[a]=string[i];
                        i++;
                        a++; 
                      }
             length=strlen(string);
             j=i+3; b=0;
             while(j<length){
                      nomer[b]=string[j];
                      b++;
                      j++;
                      }  
             t=atoi(nomer);              
                     
             ASSIGN(&M,name,t);
             

             
             free(name);
             free(nomer);
             
      }
    
  return 0;
}
И ещё, посоветуйте как написать хеш-функцию? Я думаю, может взять порядковый номер первой буквы имени и пусть функция возвращает остаток от деления номера на В. Или не пойдет?
Anastasia.K вне форума Ответить с цитированием
Старый 11.01.2010, 22:48   #7
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

Цитата:
И ещё, посоветуйте как написать хеш-функцию? Я думаю, может взять порядковый номер первой буквы имени и пусть функция возвращает остаток от деления номера на В. Или не пойдет?
это не годится, т. к. тогда у вас, например, имена Инна и Иван будут иметь одинаковые хеш-значения...

можно рассматривать строку как число некоторой системы счисления, например 3. В качестве цифр числа использовать коды символов:
Код:
const int BASE = 3;
int Key = 0;
for (int i = 0; i < strlen(str); i++)
      Key := Key * BASE + str[i];
Это будет ключ.
А хеш функцию можно определить как остаток от деления ключа на константу, равную максимальному количеству элементов хеш-таблицы.

Последний раз редактировалось Alex_FF; 11.01.2010 в 22:57.
Alex_FF вне форума Ответить с цитированием
Старый 12.01.2010, 23:41   #8
Anastasia.K
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

Спасибо! Я так и сделаю
А по поводу printf идей нет? Почему выписавает лишние символы? Это что-то с программой не так или функция виновата? )))
Anastasia.K вне форума Ответить с цитированием
Старый 12.01.2010, 23:57   #9
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

Цитата:
Сообщение от Anastasia.K Посмотреть сообщение
Спасибо! Я так и сделаю
А по поводу printf идей нет? Почему выписавает лишние символы? Это что-то с программой не так или функция виновата? )))
скорее это из-за не верного расположения нуль-символа в строке.
возможно, вы делали конкатенацию двух строк, одна из которых была неинициализирована.

напишите весь код программы, тогда будет проще разобраться...
Alex_FF вне форума Ответить с цитированием
Старый 15.01.2010, 11:12   #10
Anastasia.K
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 10
По умолчанию

Всё, я сама разобралась :-) Наконец-то программа нормально работает! Ура! Спасибо огромное за помощь :-)))
Anastasia.K вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элементов строки s2 из строки s1 Ueshua Общие вопросы C/C++ 4 20.12.2009 13:06
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
Строки. Как вывести часть строки? Anfall Общие вопросы Delphi 7 26.02.2009 09:10
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45