Как вывести структуру на экран c
Перейти к содержимому

Как вывести структуру на экран c

  • автор:

Как вывести структуру на экран c

Не получается ввести и вывести на экран элементы структуры после второго.

#include #include #include struct form < char surname[20]; int phone; char address[20]; >; void Create (form*p) < printf ("Enter surname: "); scanf ("%s", p->surname); printf ("Enter phone number: "); scanf ("%d", &p->phone); printf ("Enter address: "); scanf ("%s", p->address); > void Print (form*p) < printf ("%s\n", p->surname); printf ("%d\n", p->phone); printf ("%s\n", p->address); > int main (void)

Что в коде не так ? Первый элемент спокойно записывается и выводится на экран, после второго выводит на экран сразу две подсказки, а потом числа случайные. В чем проблема ? Помогите пожалуйста. Заранее благодарен.

Форумчанин
Регистрация: 25.09.2012
Сообщений: 182

Скомпилировал ваш код, всё нормально работает. Компилировал в wxDev-C++ c компилятором gcc.
Безымянный.jpg

Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.

Последний раз редактировалось Че Гевара; 08.04.2013 в 23:04 .

Как вывести структуру на экран c

Сообщений: 15

надо только вывести структуру

#include "stdafx.h" #include #include #include #include #include #include "locale.h" #define QUEUE struct queue QUEUE < char name[100]; int plsh; int etzh; float gdsr; int stm; QUEUE *next; >; extern void insert(QUEUE **q, QUEUE **new_node); extern char* take_out(QUEUE **q, int *error); void insert(QUEUE **q, QUEUE **new_node) < QUEUE *current = *q; QUEUE *previous = 0; while ( current) < previous = current; current = current ->next; > (*new_node) = ( QUEUE * ) malloc( sizeof( QUEUE) ); if (previous ) < (*new_node) ->next = previous -> next; previous -> next = (*new_node); > else < *q = *new_node; (*q) ->next = 0; > > char* take_out(QUEUE**q, int *error ) < char text[100]; memchr(text,0,100); QUEUE *old_header = *q; if (*q) < if((*q)->next) < while(old_header->next->next) old_header=old_header->next; // value = old_header->next->; memcpy(text,old_header->next->name,100); free( old_header->next ); old_header->next=0; > else < // value = old_header ->info; memcpy(text,old_header->name,100); *q = (*q) -> next; free( old_header ); > *error = 0; > else *error = 1; return text; > void main() < int error; QUEUE *q1, *q2=0; float temp; insert(&q1, &q2); printf("Naimenovanie: "); scanf("%s",q2->name); printf("Ploshad': "); scanf("%d",&q2->plsh); printf("Etazhnost': "); scanf("%d",&q2->etzh); printf("God sooruzhenia: "); scanf("%f",&temp); q2->gdsr=temp; printf("Stoimost' mln.rub.: "); scanf("%d",&q2->stm); insert(&q1, &q2); printf("\nNaimenovanie: "); scanf("%s",q2->name); printf("Ploshad': "); scanf("%d",&q2->plsh); printf("Etazhnost': "); scanf("%d",&q2->etzh); printf("God sooruzhenia: "); scanf("%f",&temp); q2->gdsr=temp; printf("Stoimost' mln.rub.: "); scanf("%d",&q2->stm); insert(&q1, &q2); printf("\nNaimenovanie: "); scanf("%s",q2->name); printf("Ploshad': "); scanf("%d",&q2->plsh); printf("Etazhnost': "); scanf("%d",&q2->etzh); printf("God sooruzhenia: "); scanf("%f",&temp); q2->gdsr=temp; printf("Stoimost' mln.rub.: "); scanf("%d",&q2->stm); printf("\nremove( &q2 ) = %s", take_out(&q1, &error)); //printf("\nremove( &q2 ) = %s", take_out(&q1, &error)); // printf("\nremove( &q2 ) = %s", take_out(&q1, &error)); getch(); >

нада вывести на экран то что заполнено в структуре.
в инете нашёл пример, но не знаю как это реализовать

для просмотра содержимого очереди: void VYVOD (node **no, node **ko) // Вывод содержимого очереди. // *no - указатель на начало очереди, // *ko - указатель на конец очереди. < node *r; coutcout

Вывести структуру на экран

Подскажите как вывести на экран структуру? Попробовал вот так:

std::copy( records.begin(), records.end(), std::ostream_iterator( std::cout, " ") ); 

Серьезность Код Описание Проект Файл Строка Ошибка C2679 бинарный "=": не найден оператор, принимающий правый операнд типа "CRecord" (или приемлемое преобразование отсутствует) AdmHyTech c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 2148

Структурный тип данных в языке Си

Примером структуры может послужить любой объект, для которого описывается ряд его характеристик, имеющих значение в данной программе. Например, для книг это может быть название, автор, количество страниц; для окружности — координаты центра, диаметр, цвет. На языке программирования C объявление вышеупомянутых структурных типов данных может выглядеть так:

struct book  char title[50]; char author[30]; int pages; >; struct circle  int x, y; float dia; char color[10]; >;

В данном случае мы как бы создаем новый тип данных, но еще не объявляем переменных этих типов. Обратите внимание на точку с запятой в конце объявлений.

Чаще переменные структур объявляются так:

struct circle a, b, c; struct book mybook;

Здесь объявляются три структуры типа circle и одна структура типа book . Можно объявлять типы структур и их переменные по-иному, но мы для избежания путаницы рассматривать другие способы не будем.

Каждая переменная типа circle содержит четыре элемента (или поля) — x , y , dia , color . Можно сказать, что они представляют собой вложенные переменные. Причем эти переменные разных типов. Таким образом переменная-структура позволяет объединить под одним именем ряд разнородных данных. Обычно это нужно для удобства обработки данных. Если нельзя было бы создавать структуры, то пришлось бы создавать множество независимых переменных или ряд массивов, явной взаимосвязи между которыми не было бы. Структуры же позволяют объединять взаимосвязанные данные. Это конечно еще не объектно-ориентированное программирование, но уже взгляд в его сторону.

Объявив переменную структурного типа, мы можем получить доступ к каждому ее элементу для присваивания, изменения или получения значения:

a.x = 10; a.dia = 2.35; printf("%.2f ", a.dia);

Значение элементов структуры можно сразу определять при объявлении переменной, что похоже на инициализацию массивов:

struct book lang_c = {"Language C", "Ritchi", 99};

Значение переменной-структуры можно присвоить переменной того же типа:

struct book { char *title, *author; int pages; }; struct book old, new; old.title = "GNU/Linux"; old.author = "people"; old.pages = 20213; new = old; new.pages += 2000; printf("%d, %d\n", old.pages, new.pages);

В примере данные переменной old присваиваются new . В итоге вторая структура содержит копию данных первой. То, что можно выполнять присваивание по отдельным полям должно быть понятно.

Структуры и функции

Структуры-переменные можно передавать в функции в качестве аргументов. Также функция может возвращать структуру. Структуры передаются по значению, как обычные переменные, а не по ссылке, как массивы.

Рассмотрим программу, в которой одна функция возвращает структуру, а другая — принимает структуру в качестве параметра:

#include #include struct circle { int x, y; float dia; char color[10]; }; struct circle new_circle(); void cross (struct circle); int main () { struct circle a; a = new_circle(); cross(a); } struct circle new_circle() { struct circle new; printf("Координаты: "); scanf("%d%d", &new.x, &new.y); printf("Диаметр: "); scanf("%f", &new.dia); printf("Цвет: "); scanf("%s", new.color); return new; } void cross (struct circle c) { double hyp; hyp = sqrt((double) c.x * c.x + (double) c.y * c.y); printf("Расстояние: %.2lf\n", hyp); if (hyp  c.dia / 2) puts("Пересекает"); else puts("Не пересекает"); }

Примечание. При компиляции программы в GNU/Linux команда выглядит так: gcc program.c -lm . Это связано с использованием библиотеки с математическими функциями.

  • Объявляется структура circle как глобальный тип данных. Таким образом любая, а не только main , функция может создавать переменные этого типа.
  • Функция new_circle() возвращает структуру, а функция cross() принимает структуру по значению. Следует отметить, что можно создавать функции, которые как принимают (возможно, несколько структур) так и возвращают структуру.
  • В функции new_circle создается переменная new типа struct circle , поля которой заполняются пользователем. Функция возвращает значение переменной new в функцию main , где это значение присваивается переменной a , которая также принадлежит типу sctruct circle .
  • Функция cross определяет, пересекает ли круг начало координат. В ее теле вычисляется расстояние от центра круга до начала координат. Это расстояние является гипотенузой прямоугольного треугольника, длина катетов которого равна значениям x и у . Далее, если гипотенуза меньше радиуса, то круг пересекает начало координат, т.е. точку (0, 0).
  • В функции main при вызове cross() данные, содержащиеся в переменной a , копируются и присваиваются переменной c .

Указатели и структуры

В отличие от массивов, структуры передаются в функции по значению. Это не всегда рационально, т.к. структуры могут быть достаточно большого размера, и копирование таких участков памяти может замедлять работу программы. Поэтому часто структуры в функцию передают по ссылке, при этом можно использовать как указатель, так и операцию получения адреса.

// переменная-структура struct book new; // указатель на структуру struct book *pnew; // передаем адрес reader(&new); pnew = &new; // передаем указатель reader(pnew); 

Тогда функция reader должна иметь примерно такое объявление:

void reader(struct book *pb); 

Возникает вопрос, как при использовании указателей обращаться к элементам структур? Во первых надо получить саму структуру, т.е. если pnew указатель, то сама структура будет *pnew . Далее можно уже обращаться к полям через точку: *pnew.title . Однако это выражение не верно, т.к. приоритет операции "точка" (обращение к полю) выше операции "звездочка" (получить значение по адресу). Таким образом приведенная запись сначала пытается получить значение поля title у указателя pnew , но у pnew нет такого поля. Проблема решается с помощью скобок, которые изменяют порядок выполнения операций: (*pnew).title . В таком случае сначала извлекается значение по адресу pnew , это значение является структурой. Затем происходит обращение к полю структуры.

В языке программирования C записи типа (*pnew).title часто заменяют на такие: pnew->title , что позволяет синтаксис языка. Когда в программе вы видите стрелку (тире и скобка) всегда помните, то, что написано до стрелки, — это указатель на структуру, а не переменная-структура.

Пример кода с использованием указателей:

#include struct circle { int x, y; float dia; }; void inversion (struct circle *); int main () { struct circle cir, *pc = &cir; pc->x = 10; pc->y = 7; pc->dia = 6; inversion(pc); printf("x = %d, y = %d\n", cir.x, cir.y); } void inversion(struct circle *p) { p->x = -p->x; p->y = -p->y; }

Массивы структур

Обычно создание в программе одной переменной структурного типа не имеет особого смысла. Чаще структурами пользуются, когда необходимо описать множество похожих объектов, имеющих разные значения признаков. Значения каждого объекта следует объединить вместе (в структуру) и тем самым отделить от значений других объектов. Например, описание ряда книг или множества людей. Таким образом мы можем организовать массив, где каждый элемент представляет собой отдельную структуру, а все элементы принадлежат одному и тому же структурному типу.

Напишем программу для учета персональных компьютеров в организации. Каждая структура будет описывать определенные модели и содержать поле, в котором будет указано количество таких объектов. Поэтому при объявлении структурного типа данных следует описать такие поля как тип компьютера, модель процессора, количество.

Программа будет предоставлять возможность получать информацию о всех моделях и изменять количество компьютеров указанной пользователем модели. В программе будут определены две функции (помимо main ): для вывода всей информации и для изменения количества компьютеров.

#include #define N 4 struct computer { char *type; char *proc; int qty; }; void viewer (struct computer *); void changer (struct computer *); int main () { struct computer comps[N]= { "Desktop", "Core", 20, "Notebook", "Core", 5, "Desktop", "AMD", 10, "Notebook", "AMD", 2, }; viewer(comps); changer(comps); viewer(comps); } void viewer (struct computer *comp) { for (int i = 0; i  N; i++, comp++) printf("%2d) %-8s - %-15s: %3d\n", i+1, comp->type, comp->proc, comp->qty); } void changer (struct computer *comp) { int i, differ; printf("Введите номер модели: "); scanf("%d", &i); i--; printf("На сколько уменьшить или увеличить: "); scanf("%d", &differ); (comp+i)->qty += differ; }
  • Массив структур инициализируется при его объявлении.
  • Функции viewer() и changer() принимают указатели на структуру computer .
  • В теле viewer указатель инкрементируется в заголовке цикла; таким образом указывая на следующий элемент массива, т.е. на следующую структуру.
  • В выражении (comp+i)->qty скобки необходимы, т.к оператор -> имеет более высокий приоритет. Скобки позволяют сначала получить указатель на i-ый элемент массива, а потом обратиться к его полю.
  • Декрементирование i в функции changer связано с тем, что индексация начинается с нуля, а номера элементов массива, которые пользователь видит на экране, с единицы.
  • Для того, чтобы уменьшить количество компьютеров, при запросе надо ввести отрицательное число.

Пример результата работы программы:

1) Desktop - Core : 20 2) Notebook - Core : 5 3) Desktop - AMD : 10 4) Notebook - AMD : 2 Введите номер модели: 3 На сколько уменьшить или увеличить: -2 1) Desktop - Core : 20 2) Notebook - Core : 5 3) Desktop - AMD : 8 4) Notebook - AMD : 2

Перепишите приведенную выше программу и дополните ее функцией, которая позволяет добавлять в массив новый элемент-структуру.

Курс с решением задач:
pdf-версия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *