![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 31.10.2009
Сообщений: 10
|
![]()
Здравствуйте!
У меня такая вот проблема… Пользователь вводит команду в виде: номер N T (нпр, номер Марии 274950) где T телефонный номер, а N имя удали номер N (нпр, удали номер Марии) найди номер N (нпр, найди номер Марии) Т.е. существует несколько команд, которые может ввести пользователь. Программа должна выполнить соответствующие им действия. Я думаю, что эти команды мы читаем как строки (string). Но! ведь мы не знаем, сколько символов в этой строке, как же тогда можно читать эти команды? Как написать программу? Далее, как сделать так, чтобы программа распознала эти команды? Т.е. чтобы в структуру данных сохранился номер T человека с именем N или же номер N был удален и т.п. Нужно каким-то образом сравнить введенные строки с шаблонными (с возможными), но как это сделать? В общем, мне не понятно как заставить программу понимать эти команды ![]() Надеюсь, что я понятно объяснила задачу. Спасибо заранее! |
![]() |
![]() |
![]() |
#2 |
программирователь
Пользователь
Регистрация: 15.02.2009
Сообщений: 72
|
![]()
попробуйте так: почитайте про указатели на строки. У вас будет массив переменных типа char, а указатель будет указывать на его первый элемент. Далее, просто сортируйте массив. Например, можно сделать еще один аналогичный массив и просто копировать туда переменные из первого, до тех пор пока не встретится символ пробела (' '). А после этого можно работать уже со вторым массивом. Или просто прописать в коде программы все ваши команды и сравнивать то, что вводит пользователь с тем что есть. Если это не понятно, то для начала надо почитать что такое строки в С, и какие есть приемы работы с ними.
smile
![]() |
![]() |
![]() |
![]() |
#3 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
В каком Си ты это пишешь?
I'm learning to live...
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 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); } ![]() |
![]() |
![]() |
![]() |
#5 |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
![]()
я думаю, что для хранения данных лучше было бы использовать хеш-таблицу.
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 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;
}
|
![]() |
![]() |
![]() |
#7 | |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
![]() Цитата:
можно рассматривать строку как число некоторой системы счисления, например 3. В качестве цифр числа использовать коды символов: Код:
А хеш функцию можно определить как остаток от деления ключа на константу, равную максимальному количеству элементов хеш-таблицы. Последний раз редактировалось Alex_FF; 11.01.2010 в 22:57. |
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 31.10.2009
Сообщений: 10
|
![]()
Спасибо! Я так и сделаю
![]() А по поводу printf идей нет? Почему выписавает лишние символы? Это что-то с программой не так или функция виновата? ))) |
![]() |
![]() |
![]() |
#9 | |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
![]() Цитата:
возможно, вы делали конкатенацию двух строк, одна из которых была неинициализирована. напишите весь код программы, тогда будет проще разобраться... |
|
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 31.10.2009
Сообщений: 10
|
![]()
Всё, я сама разобралась :-) Наконец-то программа нормально работает! Ура! Спасибо огромное за помощь :-)))
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Удаление элементов строки 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 |