Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 100

Раздел: C++
/ вопрос открыт /

Доброго времени суток эксперты!
Написал мелкую програмку в среде dev c++ на языке си.Программа не запускается (выдаёт ошибку в добавлении 1го и 2го контакта).Можно ли задать первые два контакта в куске кода без sprintf'a?И как можно удалить такие контакты и те,что были заданы пользователем после действий в консоли(функция delete_contacts удаляет их по номеру,но это неудобно и возможно даже неправильно реализовано)

Приложение:
  1. # include <stdio.h>
  2. # include <string.h>
  3. # include <stdlib.h>
  4.  
  5.  
  6.  
  7. {
  8. char Name[50];
  9. char Surname[50];
  10. char Phone[50];
  11.  
  12.  
  13.  
  14.  
  15. {
  16. int i=0;
  17. int OK=0;
  18. for (i=0;i<(n+1);i++)
  19. {
  20. if (Ok=0)
  21. {
  22. printf ("Name:%s; Surname:%s; Phone:%s\n",A[i].Name,A[i].Surname,A[i].Phone[i]);
  23. }
  24.  
  25. }
  26. }
  27.  
  28. {
  29. char c;
  30. int i=0;
  31. printf("Enter name");
  32. while( (i<STR_LEN-1)&&( ((c=getchar())!='n')||(i==0) ) )
  33. {
  34. man[Z].Name[i]=c;
  35. i++;
  36. }
  37. man[Z].Name[i]='n';
  38. printf("Enter surname");
  39. i=0;
  40. while( (i<STR_LEN-1)&&( ((c=getchar())!='n')||(i==0) ) )
  41. {
  42. man[Z].Surname[i]=c;
  43. i++;
  44. }
  45. man[Z].Surname[i]='n';
  46. printf("Enter phone number");
  47. i=0;
  48. while( (((c=getchar())!='n')||(i==0)) )
  49. {
  50. if((i==0)&&(c=='+'))
  51. {
  52. man[Z].Phone[i]=c;
  53. i++;
  54. }
  55. if((c>'1')&&(c<'9'))
  56. {
  57. man[Z].Phone[i]=c;
  58. i++;
  59. }
  60. }
  61. man[Z].Phone[i]='n';
  62. }
  63.  
  64. {
  65. int i=0;
  66. int a=0;
  67. scanf("%d",&a);
  68. for(i=0;i<(n+1);i++)
  69. {
  70. printf ("%d)Name:%s; Surname:%s; Phone:%s\n",(i+1),A[i].Name,A[i].Surname,A[i].Phone);
  71. sprintf(A[a-1].Name,"%s","-1");
  72. sprintf(A[a-1].Surname,"%s"," ");
  73. sprintf(A[a-1].Phone,"%s"," ");
  74. }
  75. }
  76.  
  77. {
  78. printf ("1. Some tips about using Adressbook\n2. Some tips about mobile numbers");
  79. printf ("Tip 1.1 : enter the number in the beginning of the string to take appropriate action");
  80. printf ("Tip 1.2 : you can view,add and erase contacts");
  81. printf ("Tip 1.3 : you can delete contacts by name,surnames,numbers,or they numbers in Adressbook");
  82. //* printf ("tip 2.1 : You can enter only the numbers that correspond to the form +*-***-***-**-** or *-***-***-**-**"); *//
  83. }
  84. int main ()
  85. {
  86. char a[STR_LEN];
  87. int len;
  88.  
  89.  
  90. sprintf (A[0].Surname,"%s","&#194;&#224;&#235;&#229;&#240;&#232;&#229;&#226;&#237;&#224;");
  91. sprintf (A[0].Phone=89636336934);
  92.  
  93. sprintf (A[1].Surname,"%s","&#209;&#238;&#235;&#237;&#246;&#229;&#226;");
  94. sprintf (A[1].Phone=89637840754);
  95.  
  96. printf ("Now you are using the multifunctional address book");
  97. printf ("1. view adress book\n2. add new contacts\n3. delete contacts\n4. help\n5. exit");
  98.  
  99. {
  100. scanf("%s",a);
  101. len=strlen(a);
  102. if((len=0)&&(len>1))
  103. {
  104. printf("you can type only nubmer from '1' to '5'");
  105. continue;
  106. }
  107. else OK=0;
  108. }
  109.  
  110. {
  111. case 1: view_contacts();
  112. break;
  113. case 2: new_contacts();
  114. break;
  115. case 3: delete_contacts();
  116. break;
  117. case 4: help();
  118. break;
  119. case 5: return 0;
  120. break;
  121. default: continue;
  122. }
  123. OK=1;
  124. getchar();
  125. return 0;
  126. }


Эдик Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Эдик (статус: Посетитель)
Вопрос отправлен: 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");

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

Приложение:
  1. # include <stdio.h>
  2. # include <string.h>
  3. # include <stdlib.h>
  4.  
  5. # define Z 50
  6. # define STR_LEN 50
  7.  
  8. struct AdressBook
  9. {
  10. char Name[STR_LEN];
  11. char Surname[STR_LEN];
  12. char Phone[STR_LEN];
  13. } A[Z];
  14. int n;
  15.  
  16. void view_contacts ()
  17. {
  18. if (n==0) {printf("It is empty!\n"); return;}
  19. int i=0;
  20. for (i=0;i<n;++i)
  21. {
  22. printf ("Contact %d::\nName: %s\nSurname: %s\nPhone: %s\n\n",i+1,A[i].Name,A[i].Surname,A[i].Phone);
  23. }
  24. }
  25. void new_contacts()
  26. {
  27. char str[STR_LEN];
  28. printf("Enter name: ");
  29. scanf("%s",str);
  30. memcpy(A[n].Name,str,STR_LEN);
  31.  
  32. printf("Enter surname: ");
  33. scanf("%s",str);
  34. memcpy(A[n].Surname,str,STR_LEN);
  35.  
  36. printf("Enter phone: ");
  37. scanf("%s",str);
  38. memcpy(A[n].Phone,str,STR_LEN);
  39. n++;
  40. }
  41. void delete_contacts ()
  42. {
  43. int i=0;
  44. for(i=0;i<(n+1);i++)
  45. {
  46. sprintf(A[i].Name,"%s","");
  47. sprintf(A[i].Surname,"%s","");
  48. sprintf(A[i].Phone,"%s","");
  49. }
  50. n=0;
  51. }
  52. void help ()
  53. {
  54. printf ("1. Some tips about using Adressbook\n2. Some tips about mobile numbers");
  55. printf ("Tip 1.1 : enter the number in the beginning of the string to take appropriateaction");
  56. printf ("Tip 1.2 : you can view,add and erase contacts");
  57. printf ("Tip 1.3 : you can delete contacts by name,surnames,numbers,or they numbers inAdressbook");
  58. }
  59. int main ()
  60. {
  61. n=2;
  62. sprintf (A[0].Name,"%s","NAME1");
  63. sprintf(A[0].Surname,"%s","Surname1");
  64. sprintf (A[0].Phone,"%s","123456789");
  65.  
  66. sprintf(A[1].Name,"%s","NAME2");
  67. sprintf(A[1].Surname,"%s","SURNAME2");
  68. sprintf (A[1].Phone,"%s","987654321");
  69.  
  70. printf ("Adressbook v.0.47 fixed");
  71. printf ("Now you are using the multifunctional address book\n");
  72. printf ("1. view adress book\n2. add new contacts\n3. delete contacts\n4. help\n5.exit");
  73.  
  74. int slct=0;
  75. bool OK=0;
  76. while(slct!=5){
  77. while(OK!=1)
  78. {
  79. printf("\nSelect: ");
  80. scanf("%d",&slct);
  81. if((slct<1)||(slct>5))
  82. {
  83. printf("you can type only nubmer from '1' to '5'");
  84. } else OK=1;
  85. }
  86. OK=0;
  87. switch(slct)
  88. {
  89. case 1: view_contacts();
  90. break;
  91. case 2: new_contacts();
  92. break;
  93. case 3: delete_contacts();
  94. break;
  95. case 4: help();
  96. break;
  97. case 5: return 0;
  98. break;
  99. }
  100. }
  101. getchar();
  102. return 0;
  103. }


Ответ отправил: Аксион (статус: 4-ый класс)
Время отправки: 28 апреля 2012, 01:08


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 26 апреля 2012, 08:18; участников в обсуждении: 1.
min@y™

min@y™ (статус: Доктор наук), 26 апреля 2012, 08:18 [#1]:

Сразу бросается в глаза обращение к несуществующему элементу массива:
man[Z].Name[i]='n';
В С/С++ все массивы нумеруются с нуля! У тебя массив из 50 элементов (0...49), а Z = 50.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:28
Выполнено за 0.02 сек.