#c #c #queue
#c #c #очередь
Вопрос:
как я могу разработать тестовый пример (правильно запустив все функции в main)?
ЧИТАЙТЕ: по некоторым причинам я не могу опубликовать свой код здесь, что приводит к ошибкам, поэтому я поместил изображение ниже, и код можно просмотреть по следующей ссылке.
ИЗОБРАЖЕНИЕ ССЫЛКИ
ССЫЛКА НА КОД
Я хочу увидеть использование insert
и remove
как удаление и вставка, а также тестовый пример для печати underflow
и overflow
.
Примеры;
insert("James") - inserts james
insert("Sarah") -> prints overflow
remove() - removes james
remove() - prints underflow
Спасибо.
Комментарии:
1. Вы спрашиваете, как начать работу с TDD на C , или вы спрашиваете, как бы вы структурировали тестовый пример для вашей конкретной структуры данных?
2. Я хочу использовать функции, но не могу найти способ их запуска. Например, как вставлять и удалять имена, а также получать
overflow
иunderflow
печатать.3. Связанный вами код фактически не вызывает ни одну из функций, в которые вы записали свои
printf()
вызовы, поэтому я не уверен, как вы ожидаете получить результат. Этот вопрос также не должен быть помечен C , если это вопрос C, но я отвлекся. Если вам нужен вывод из ваших функций, вызывайте их изmain()
.4. Мне нужна помощь в написании
main()
функции для вызова функций и их запуска. Просто хочу посмотреть, как написатьinsert
функцию.
Ответ №1:
В insert
, у вас есть:
if (q->rear = 5) {
Это [безоговорочно] присваивает значение 5
to q->rear
Вы хотите сравнение:
if (q->rear == 5) {
Обратите внимание, что remove
это стандартная функция, поэтому при компиляции возникает конфликт.
Я переименовал remove
в dequeue
[и insert
в enqueue
] .
Использование циклов может генерировать тестовый код (например, вы можете ставить и / или снимать с очереди произвольное число раз для генерации крайних случаев).
Кроме того, вы делаете: #define MAXQUEUE 6
но везде «жестко» 5
. Я бы заменил это на (например): (MAXQUEUE - 1)
Вот исправленный код с тестовыми примерами:
#include <stdio.h>
#include <stdlib.h>
#define MAXQUEUE 6
#define LASTQUEUE (MAXQUEUE - 1)
struct queue {
char items[MAXQUEUE];
int front, rear;
};
struct queue q;
int
empty(struct queue *q)
{
int temp;
#if 0
temp = (q->front == q->rear) ? 1 : 0;
#else
temp = (q->front == q->rear);
#endif
return temp;
}
char
dequeue(struct queue *q)
{
if (empty(q)) {
printf("undeflow");
exit(1);
}
#if 0
if (q->front == 5) {
q->front = 0;
}
else {
(q->front) ;
}
#else
if (q->front == LASTQUEUE) {
q->front = 0;
}
else {
(q->front) ;
}
#endif
return (q->items[q->front]);
}
int
enqueue(struct queue *q, char x)
{
// NOTE/BUG: "q->rear = 5" _assigns_ 5 to q->rear (need == instead)
#if 0
if (q->rear = 5) {
q->rear = 0;
}
else {
(q->rear) ;
}
#else
if (q->rear == LASTQUEUE) {
q->rear = 0;
}
else {
(q->rear) ;
}
#endif
if (q->rear == q->front) {
printf("overflow");
(q->rear)--;
if (q->rear == -1) {
#if 0
q->rear = 5;
#else
q->rear = LASTQUEUE;
#endif
}
return 0;
}
q->items[q->rear] = x;
return 0;
}
int
main()
{
q.front = q.rear = MAXQUEUE - 1;
int lim = LASTQUEUE;
for (int idx = 0; idx < lim; idx)
enqueue(amp;q,idx);
for (int idx = 0; idx < lim; idx) {
int val = dequeue(amp;q);
printf("idx=%d val=%dn",idx,val);
}
return 0;
}
Комментарии:
1. Спасибо за ответ, но 1 проблема. Я хочу поставить в очередь str, а не int.
2. Не уверен, что вы имеете в виду, когда хотите поставить str в очередь . Это потому
items
, что они индивидуальныchar
. Итак, максимум, у вас может быть одна «строка». Чтобы иметь список строк (напримерabc, def, hello, world, goodbye, galaxy
), необходимо написать немного больше кода. Если вы могли бы терпеть фиксированный максимум для длины (ов) строки, легко изменить функцииstruct
и . Если вам нужны строки переменной длины, вам нужно будет выполнитьstrdup
и [позже]free
для строк.