|
Вопрос # 6 100/ вопрос открыт / |
|
Доброго времени суток эксперты!
Написал мелкую програмку в среде dev c++ на языке си.Программа не запускается (выдаёт ошибку в добавлении 1го и 2го контакта).Можно ли задать первые два контакта в куске кода без sprintf'a?И как можно удалить такие контакты и те,что были заданы пользователем после действий в консоли(функция delete_contacts удаляет их по номеру,но это неудобно и возможно даже неправильно реализовано)
Приложение: Переключить в обычный режим- # include <stdio.h>
- # include <string.h>
- # include <stdlib.h>
-
-
-
- {
- char Name[50];
- char Surname[50];
- char Phone[50];
-
-
-
-
- {
- int i=0;
- int OK=0;
- for (i=0;i<(n+1);i++)
- {
- if (Ok=0)
- {
- printf ("Name:%s; Surname:%s;
Phone:%s\n",A[i].Name,A[i].Surname,A[i].Phone[i]);
- }
-
- }
- }
-
- {
- char c;
- int i=0;
- printf("Enter name");
- while( (i<STR_LEN-1)&&( ((c=getchar())!='n')||(i==0) ) )
- {
- man[Z].Name[i]=c;
- i++;
- }
- man[Z].Name[i]='n';
- printf("Enter surname");
- i=0;
- while( (i<STR_LEN-1)&&( ((c=getchar())!='n')||(i==0) ) )
- {
- man[Z].Surname[i]=c;
- i++;
- }
- man[Z].Surname[i]='n';
- printf("Enter phone number");
- i=0;
- while( (((c=getchar())!='n')||(i==0)) )
- {
- if((i==0)&&(c=='+'))
- {
- man[Z].Phone[i]=c;
- i++;
- }
- if((c>'1')&&(c<'9'))
- {
- man[Z].Phone[i]=c;
- i++;
- }
- }
- man[Z].Phone[i]='n';
- }
-
- {
- int i=0;
- int a=0;
- scanf("%d",&a);
- for(i=0;i<(n+1);i++)
- {
- printf ("%d)Name:%s; Surname:%s;
Phone:%s\n",(i+1),A[i].Name,A[i].Surname,A[i].Phone);
- sprintf(A[a-1].Name,"%s","-1");
- sprintf(A[a-1].Surname,"%s"," ");
- sprintf(A[a-1].Phone,"%s"," ");
- }
- }
-
- {
- printf ("1. Some tips about using Adressbook\n2. Some tips about mobile numbers");
- printf ("Tip 1.1 : enter the number in the beginning of the string to take appropriate
action");
- printf ("Tip 1.2 : you can view,add and erase contacts");
- printf ("Tip 1.3 : you can delete contacts by name,surnames,numbers,or they numbers in
Adressbook");
- //* printf ("tip 2.1 : You can enter only the numbers that correspond to the form
+*-***-***-**-** or *-***-***-**-**"); *//
- }
- int main ()
- {
- char a[STR_LEN];
- int len;
-
-
- sprintf
(A[0].Surname,"%s","Âàëåðèåâíà");
- sprintf (A[0].Phone=89636336934);
-
- sprintf
(A[1].Surname,"%s","Ñîëíöåâ");
- sprintf (A[1].Phone=89637840754);
-
- printf ("Now you are using the multifunctional address book");
- printf ("1. view adress book\n2. add new contacts\n3. delete contacts\n4. help\n5.
exit");
-
- {
- scanf("%s",a);
- len=strlen(a);
- if((len=0)&&(len>1))
- {
- printf("you can type only nubmer from '1' to '5'");
- continue;
- }
- else OK=0;
- }
-
- {
- case 1: view_contacts();
- break;
- case 2: new_contacts();
- break;
- case 3: delete_contacts();
- break;
- case 4: help();
- break;
- case 5: return 0;
- break;
- default: continue;
- }
- OK=1;
- getchar();
- return 0;
- }
 |
Вопрос задал: Эдик (статус: Посетитель)
Вопрос отправлен: 25 апреля 2012, 22:51
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Аксион
Здравствуйте, Эдик!
Разбор полетов:
0) Почему в структуре AdressBook все поля ограничены 50 символами, когда определена константа STR_LEN = 256?
1) Зачем создаются две копии структуры AdressBook: A и man?
2) Для чего в view_contacts введен флаг OK (да ещё и во второй раз называется "Ok")?
3) В функции new_contacts не инкрементируется переменная n, отвечающая за кол-во контактов
4) Не совсем понятно, что делает delete_contacts, то ли удаляет 1 контакт, то ли все.
Самое главное в main:
5) Флажок OK=1 изначально, т.е. while(OK!=1) в конце тела main не выполниться ни разу
6) Ошибка в строчке if((len=0)&&(len>1)), должно быть if((len==0)&&(len>1))
7) Почему число вы вводите как строку и работаете потом только с первым символом, причем не верно: case 1 необходимо заменить на case '1' и так далее, так как надо сравнивать символы, а не введенный символ с символом с кодом 1.
8) sprintf(A[1].Phone=89637840754) правильно было бы sprintf(A[1].Phone,"%s","89637840754");
Переделал ваш код на коленке (хотя правильнее было бы написать его полностью с нуля), вроде работает, дальше сами допиливайте.
Приложение: Переключить в обычный режим- # include <stdio.h>
- # include <string.h>
- # include <stdlib.h>
-
- # define Z 50
- # define STR_LEN 50
-
- struct AdressBook
- {
- char Name[STR_LEN];
- char Surname[STR_LEN];
- char Phone[STR_LEN];
- } A[Z];
- int n;
-
- void view_contacts ()
- {
- if (n==0) {printf("It is empty!\n"); return;}
- int i=0;
- for (i=0;i<n;++i)
- {
- printf ("Contact %d::\nName: %s\nSurname: %s\nPhone:
%s\n\n",i+1,A[i].Name,A[i].Surname,A[i].Phone);
- }
- }
- void new_contacts()
- {
- char str[STR_LEN];
- printf("Enter name: ");
- scanf("%s",str);
- memcpy(A[n].Name,str,STR_LEN);
-
- printf("Enter surname: ");
- scanf("%s",str);
- memcpy(A[n].Surname,str,STR_LEN);
-
- printf("Enter phone: ");
- scanf("%s",str);
- memcpy(A[n].Phone,str,STR_LEN);
- n++;
- }
- void delete_contacts ()
- {
- int i=0;
- for(i=0;i<(n+1);i++)
- {
- sprintf(A[i].Name,"%s","");
- sprintf(A[i].Surname,"%s","");
- sprintf(A[i].Phone,"%s","");
- }
- n=0;
- }
- void help ()
- {
- printf ("1. Some tips about using Adressbook\n2. Some tips about mobile numbers");
- printf ("Tip 1.1 : enter the number in the beginning of the string to take
appropriateaction");
- printf ("Tip 1.2 : you can view,add and erase contacts");
- printf ("Tip 1.3 : you can delete contacts by name,surnames,numbers,or they numbers
inAdressbook");
- }
- int main ()
- {
- n=2;
- sprintf (A[0].Name,"%s","NAME1");
- sprintf(A[0].Surname,"%s","Surname1");
- sprintf (A[0].Phone,"%s","123456789");
-
- sprintf(A[1].Name,"%s","NAME2");
- sprintf(A[1].Surname,"%s","SURNAME2");
- sprintf (A[1].Phone,"%s","987654321");
-
- printf ("Adressbook v.0.47 fixed");
- printf ("Now you are using the multifunctional address book\n");
- printf ("1. view adress book\n2. add new contacts\n3. delete contacts\n4.
help\n5.exit");
-
- int slct=0;
- bool OK=0;
- while(slct!=5){
- while(OK!=1)
- {
- printf("\nSelect: ");
- scanf("%d",&slct);
- if((slct<1)||(slct>5))
- {
- printf("you can type only nubmer from '1' to '5'");
- } else OK=1;
- }
- OK=0;
- switch(slct)
- {
- case 1: view_contacts();
- break;
- case 2: new_contacts();
- break;
- case 3: delete_contacts();
- break;
- case 4: help();
- break;
- case 5: return 0;
- break;
- }
- }
- getchar();
- return 0;
- }
 |
Ответ отправил: Аксион (статус: 4-ый класс)
Время отправки: 28 апреля 2012, 01:08
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 26 апреля 2012, 08:18; участников в обсуждении: 1.
|
min@y™ (статус: Доктор наук), 26 апреля 2012, 08:18 [#1]:
Сразу бросается в глаза обращение к несуществующему элементу массива:
man[Z].Name[i]='n';
В С/С++ все массивы нумеруются с нуля! У тебя массив из 50 элементов (0...49), а Z = 50.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|