1 Востаннє редагувалося snikers.mc (26.05.2016 09:18:27)

Тема: Допоможіть з чергою

Задача стоїть така. Потрібно вивести спочатку назву продукту який є хлібним виробом (буква h), потім молочним (буква m), а потім всі що є. Не можу зрозуміти чому не хоче порівнювати тип продукту з "h", все що введено з клавіатури перекидає в чергу, а з черги незрозуміло куди воно дівається і нічого не друкується :с
Код ось

Прихований текст
#include "stdafx.h"
#include "windows.h"
#include "locale.h"
#include "string.h"

typedef struct info
{
    char name[10];
    char tup[1];        //m- молочний, f- фрукти, o- овочі, h-хлібний виріб
    char slovo[15];
    struct info *next;
}    INFO;

typedef INFO *ptr;

void StvrStruct(INFO *p);
void StvrFILE(FILE *p);
void DrucFILE(FILE *p);
void InsertCherga(ptr *phead, ptr *ptail, char *z);
ptr DelElemV(ptr head);

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "RUS");
    int k;
    char filename[128];
    puts("Введiть назву файлу");
    //printf("%d", 'h');            // 104
    gets(filename);
    FILE *fp;
    fp=fopen(filename, "w");
    if (fp == NULL)
    {
        puts("Файл не вiдкритий!");
        system("pause");
    }
    StvrFILE(fp);
    fp=fopen(filename, "r");
    if (fp == NULL)
    {
        puts("Файл не вiдкритий!");
        system("pause");
    }
    printf("Друк файлу\n");
    DrucFILE(fp);
    rewind(fp);
    ptr head=NULL;
    ptr tail=NULL;
    INFO z;
    puts("Назви хлiбних виробiв");
    fread(&z, sizeof(INFO), 1, fp);
    while(!feof(fp))
    {
        if(z.tup == "\104")
            printf("%s", z.name);
        else
            InsertCherga(&head, &tail, z.name);
        fread(&z, sizeof(INFO), 1, fp);
    }
    printf("\n");
    puts("Наззви всих iнших виробiв");
    while(head != NULL)
    {
        printf("%s", z.name);
        head = DelElemV(head);
    }
    printf("\n");
    fclose(fp);
    system("pause");
    return 0;
}
//============ СТВОРЕННЯ СТРУКТУРИ ============
void StvrStruct(INFO *p)
{
    printf("Введiть назву продукту: ");
    gets_s(p->name);
    printf("Введiть тип продукту: ");
    scanf_s("%c", &(p->tup));
    fflush(stdin);
}
//============ СТВОРЕННЯ ФАЙЛУ ============
void StvrFILE(FILE *p)
{
    printf("Введiть записи в файл. Остання назва проукту - ENTER\n");
    INFO z;
    StvrStruct(&z);
    while(strcmp(z.name, "\0") != 0)
    {
        fwrite(&z, sizeof(INFO), 1, p);
        StvrStruct(&z);
    }
    fclose(p);
}
//============ ДРУК ФАЙЛУ ============
void DrucFILE(FILE *p)
{
    INFO z;
    fread(&z, sizeof(INFO), 1, p);
    printf("Назва продукту\tТип продукту\n");
    while(!feof(p))
    {
        printf("%10s%15c\n", z.name, *(z.tup));
        fread(&z, sizeof(INFO), 1, p);
    }
}
//============ ВСТАВЛЕННЯ В ЧЕРГУ ============
void InsertCherga(ptr *phead, ptr *ptail, char *z)
{
    ptr x;
    x=(ptr) malloc(sizeof(INFO));
    strcpy(x->slovo, z);
    x->next= NULL;
    if(phead == NULL)
    {
        *phead = x;
        *ptail = x;
    }
    else
        *(ptail)=x;
}
//============ ВИЛУЧЕННЯ З ВЕРШИНИ ============
ptr DelElemV(ptr head)
{
    ptr x;
    x = head; 
    head= head->next;
    free(x);
    return head;
}

2 Востаннє редагувалося ReAl (26.05.2016 10:38:57)

Re: Допоможіть з чергою

        if(z.tup == "\104")

Тут Ви порівнюєте вказівник z.tup з вказівником на рядок. Тобто порівнюєте дві адреси комірок пам'яті, а не їхній вміст.
Треба if(z.tup[0] == 'h') або взагалі z.tup заводити як одиночний символ, а не як масив.
Що там з чергою — не дивився, забіг на хвилинку і біжу далі.

Подякували: snikers.mc1

3

Re: Допоможіть з чергою

Тут Ви порівнюєте вказівник z.tup з вказівником на рядок. Тобто порівнюєте дві адреси комірок пам'яті, а не їхній вміст.
Треба if(z.tup[0] == 'h') або взагалі z.tup заводити як одиночний символ, а не як масив.
Що там з чергою — не дивився, забіг на хвилинку і біжу далі.

Так, з цим я вже розібрався. Але з чергою все ж таки проблеми лишились