Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание базы данных на Си

16K
03 мая 2006 года
Farior
19 / / 01.05.2006
[COLOR=red]
Помогите кто-нибудь пожалуйста с созданием базы данных на Си под такую задачу:

База данных деканата содержит информацию о студентах: номер зачетной книжки, ФИО студента (строки 20 символов), группа (строка 5 символов), курс (целое число), средний балл за прошлый семестр (целое число), средний балл за все семестры (целое число). Все баллы – по 10-и бальной системе.
Если можно пришлите помощь на ящик [email]Farior@yandex.ru[/email]
Заранее спасибо
  • есть ли у кого нибудь исходник данной программы от dimon_9922, 25 декабря 2013 года
Страницы:
242
03 мая 2006 года
Оlga
2.2K / / 04.02.2006
А в чем проблемы? И что ты подрузумеваешь под БД В С?
Если бы я делала это упражнение, то сделала бы struct, и сохраняла бы инфо в файле. А что ты хочешь непонятно. Самое главное попытайся решить сам, а сюда вопросы пости.
[COLOR=deeppink]Просьбы выслать на e-mail решения не приветствуються админестрацией.
Надеюсь вижу это у вас в последний раз.
[/COLOR]
242
03 мая 2006 года
Оlga
2.2K / / 04.02.2006
Пример:
http://forum.codenet.ru/showthread.php?s=&threadid=31131
использования struct в Си
использования struct и фаилов в С++
16K
04 мая 2006 года
Farior
19 / / 01.05.2006
[QUOTE]Originally posted by OlgaKr
А в чем проблемы? И что ты подрузумеваешь под БД В С?
Если бы я делала это упражнение, то сделала бы struct, и сохраняла бы инфо в файле. А что ты хочешь непонятно. Самое главное попытайся решить сам, а сюда вопросы пости

Спасибо за совет...
Структура я так понимаю это то же что и списки.
Вот со списками второй день разбираюсь...
Дай бог дойдет до мозгов...
16K
04 мая 2006 года
Farior
19 / / 01.05.2006
Цитата:
Originally posted by OlgaKr
Пример:
http://forum.codenet.ru/showthread.php?s=&threadid=31131
использования struct в Си
использования struct и фаилов в С++



Товарищ Ольга, у тебя нет случайно конкретных примеров работы с структурами...

242
04 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
[QUOTE]Originally posted by OlgaKr
А в чем проблемы? И что ты подрузумеваешь под БД В С?
Если бы я делала это упражнение, то сделала бы struct, и сохраняла бы инфо в файле. А что ты хочешь непонятно. Самое главное попытайся решить сам, а сюда вопросы пости

Спасибо за совет...
Структура я так понимаю это то же что и списки.
Вот со списками второй день разбираюсь...
Дай бог дойдет до мозгов...


Связанные списки? Есть вопросы пости сюда.
В принцепе есть разница между списками и struct: при помощи списков организуют динамические массивы данных, при помощи struct объединяем логически связанные данные.

242
04 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
Товарищ Ольга, у тебя нет случайно конкретных примеров работы с структурами...



A popodrobnei gospodin Farior mozno, chto ty hochesh'?

242
05 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
Товарищ Ольга, у тебя нет случайно конкретных примеров работы с структурами...


К сожалению все мои лабароторки видно форматнула в свое время, написала тебе простой пример:

Код:
#include <stdio.h>
#include <string.h>
#define N 4
#define AmountGrades 3
void myprint(struct student []);
float calcCommonAverage(struct student []);
void printStudentsOfGroup(struct student [], char []);
struct student{
    char id[6]; /* номер зачетной книжки */
    char lastname[20];
    char firstname[20];
    char otechestvo[20];
    char group[5];/* группа */
    short course; /* курс */
    int average; /* средний балл за прошлый семестр */
    int grades[AmountGrades]; /*  Все баллы */ 
};

int main(void)
{
  struct student tblStudent[N] = {{"01234", "Familiya1", "Name1", "Otchestvo1", "GRP1", 1,9, {8,9,10}},
     {"15224", "Familiya2", "Name2", "Otchestvo2", "GRP2", 1,8, {8,7,9}},
{"91834", "Familiya3", "Name3", "Otchestvo3", "GRP1", 1,7, {6,9,7}},
{"91934", "Familiya4", "Name4", "Otchestvo4", "GRP2", 1,9, {8,10,10}}};
   
   myprint(tblStudent);
   printf("\nCommon average is %f\n", calcCommonAverage(tblStudent));
   putchar('\n');
   printStudentsOfGroup(tblStudent, "GRP2");
   putchar('\n');
   
   return 0;
}
void printStudentsOfGroup(struct student tbl[], char g[])
{
  int i;
  for( i = 0; i < N; i++)
     if(strcmp(g, tbl.group) == 0)
        printf("%15s%15s%15s%10d\n", tbl.firstname,tbl.lastname,tbl.group, tbl.average);
}
float calcCommonAverage(struct student tbl[])
{
  int i, j, sum = 0, amount = 0;
   
  for(i = 0; i < N; i++)
      for(j = 0; j < AmountGrades; j++)
    sum += tbl.grades[j];
       
  return ((float)sum/(N*AmountGrades));
       

}
void myprint(struct student tbl[])
{
   int i;
   
   for(i = 0; i < N; i++)
      printf("%s%15s%15s%15s%10d\n",tbl.id,tbl.lastname,tbl.firstname,tbl.otechestvo,tbl.average);
}
16K
05 мая 2006 года
Farior
19 / / 01.05.2006
br /> #include <stdio.h>
#include <string.h>
#define N 4
#define AmountGrades 3
void myprint(struct student []);

Вот у меня после этой стро в компиляторе выскакивает "Undefined structure "student" " - что это за ерунда.
Возможно это из-зи того что мне нужно было написать эту прогу чисто на Си а не на Си++.

И вот так часто найдеш в литературе пример а он выкинет что-то подобное.

У меня есть методичка в которой тоже описана работа с списками но тоже засада.

Там написано создание списка :
"
typedef struct _ELEMENT{
int Val; _ELEMENT *Next, *Prev;
} ELEMENT;
ELEMENT *Head=NULL, *Curr=NULL;

"
и после
"
typedef struct _ELEMENT{
int Val; _ELEMENT

"
выкидывает "Declaration missing"

Что за ерунда не подскажешь случайно.
242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
[QUOTE]
 
Код:
#include <stdio.h>
#include <string.h>
#define N 4
#define AmountGrades 3
void myprint(struct student []);

Вот у меня после этой стро в компиляторе выскакивает "Undefined structure "student" " - что это за ерунда.
Возможно это из-зи того что мне нужно было написать эту прогу чисто на Си а не на Си++.


Выкладываю рабочий исходник. У меня работает без проблем. Скачай и проверь как у тебя. ( у меня Microsoft Visual Studio 6.0)

242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior

И вот так часто найдеш в литературе пример а он выкинет что-то подобное.

У меня есть методичка в которой тоже описана работа с списками но тоже засада.

Там написано создание списка :
"
typedef struct _ELEMENT{
int Val; _ELEMENT *Next, *Prev;
} ELEMENT;
ELEMENT *Head=NULL, *Curr=NULL;

"
и после
"
typedef struct _ELEMENT{
int Val; _ELEMENT

"
выкидывает "Declaration missing"

Что за ерунда не подскажешь случайно.


Самое лучшее прикрепи фаил программы как я сделала в предыдущем посте, я хочу посмотреть весь код, запущу у себя если что.

 
Код:
typedef struct _ELEMENT{
 int Val; _ELEMENT *Next, *Prev;
} ELEMENT;
ELEMENT *Head=NULL, *Curr=NULL;

typedef struct _ELEMENT{
 int Val;[COLOR=red] _ELEMENT
[/COLOR]

Внутри структуры объявляем указатели на структуру, попробуй вместо
_ELEMENT сделать ELEMENT
Ведь при помощи typedef мы создаем тип структуры ELEMENT,а не _ELEMENT
Цитата:
Originally posted by Farior

Возможно это из-зи того что мне нужно было написать эту прогу чисто на Си а не на Си++.


То что ты откомпилировал файл как С++ это не важно, по крайней мере я обычно так делаю и ничего. Лишь бы не наоборот.

16K
06 мая 2006 года
Farior
19 / / 01.05.2006
Цитата:
Originally posted by OlgaKr
Выкладываю рабочий исходник. У меня работает без проблем. Скачай и проверь как у тебя. ( у меня Microsoft Visual Studio 6.0)



Видиш ли я пишу просто на Си, а твой пример работает на Си++.
Видно для Си что-то пишется по другому.
У меня "С++ Bilder 6" но когда я открываю новый файл указываю что этот файл будет написан на Си у меня (такое задание, написать на Си а не на Си++).

У меня твой исходник не работает на Си, а на Си++ вроде ошибок не выкидывает.

Как мне разобраться с моей проблемой...

242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
Видиш ли я пишу просто на Си, а твой пример работает на Си++.
Видно для Си что-то пишется по другому.
У меня "С++ Bilder 6" но когда я открываю новый файл указываю что этот файл будет написан на Си у меня (такое задание, написать на Си а не на Си++).

У меня твой исходник не работает на Си, а на Си++ вроде ошибок не выкидывает.

Как мне разобраться с моей проблемой...



Bilder не учила, код думаю нормальный (у меня синтаксис С 6.0), разница скорее всего в библиотеках.
Кто может хелп пожалуйста :)

p.s. расширение фаила обычно меняеться без проблем : просто переименовываешь как тебе надо и все, или copy/paste

16K
06 мая 2006 года
Farior
19 / / 01.05.2006
[QUOTE]Originally posted by OlgaKr
Самое лучшее прикрепи фаил программы как я сделала в предыдущем посте, я хочу посмотреть весь код, запущу у себя если что.
 
Код:
typedef struct _ELEMENT{
 int Val; _ELEMENT *Next, *Prev;
} ELEMENT;
ELEMENT *Head=NULL, *Curr=NULL;

typedef struct _ELEMENT{
 int Val;[COLOR=red] _ELEMENT
[/COLOR]


Вот методичка по Си там с 12 страницы описывается работа с списками.

А bilder безразница там ставиться на Си или на Си++ или даже на "билдер"
242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
[QUOTE]Originally posted by OlgaKr
Самое лучшее прикрепи фаил программы как я сделала в предыдущем посте, я хочу посмотреть весь код, запущу у себя если что.
 
Код:
typedef struct _ELEMENT{
 int Val; _ELEMENT *Next, *Prev;
} ELEMENT;
ELEMENT *Head=NULL, *Curr=NULL;

typedef struct _ELEMENT{
 int Val;[COLOR=red] _ELEMENT
[/COLOR]


Вот методичка по Си там с 12 страницы описывается работа с списками.

А bilder безразница там ставиться на Си или на Си++ или даже на "билдер"



Спасибо за методички, только я вроде код просила, со списками, который ты откомпилировать не можешь :).

1 - поменяла фаил(см. выше, сохранила его как С - файл)
2 - ты заметил что я тебе написала(выше) предполагаемую ошибку в коде? ты пробавал его изменить?

16K
06 мая 2006 года
Farior
19 / / 01.05.2006
Цитата:
Originally posted by OlgaKr
Спасибо за методички, только я вроде код просила, со списками, который ты откомпилировать не можешь :).

1 - поменяла фаил(см. выше, сохранила его как С - файл)
2 - ты заметил что я тебе написала(выше) предполагаемую ошибку в коде? ты пробавал его изменить?



Я пробовал убрать черту как ты советовала но ничего
code:
typedef struct _ELEMENT{
int Val; _ELEMENT (вот здесь курсор)*Next, *Prev;
а в ошибках написано
"Declaration missing"

А втвоем примере я вроде прошол в перед там нужно было переставить строки местами

void myprint(struct student []);
float calcCommonAverage(struct student []);
void printStudentsOfGroup(struct student [], char []);
и
struct student{
char id[6]; /* номер зачетной книжки */
char lastname[20];
char firstname[20];
char otechestvo[20];
char group[5];/* группа */
short course; /* курс */
int average; /* средний балл за прошлый семестр */
int grades[AmountGrades]; /* Все баллы */
};
походу вызов функции с использованием объявляется после объявления структуры.

Пожалуйста если можешь напиши мне програмку где в структуру вводится даные склавиатуры, а потом выводятся на экран что бы до меня дошло как работать с структурой.

242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
Пожалуйста если можешь напиши мне програмку где в структуру вводится даные склавиатуры, а потом выводятся на экран что бы до меня дошло как работать с структурой.



А можно конкретно выражать мысль, что надо: структура или связанные списки(ясно что на структуре основаны, но методы работы отличаются)

9.5K
06 мая 2006 года
Damarus
101 / / 08.04.2006
Люди, вы C то знаете?!! Вот это:
 
Код:
typedef struct _ELEMENT
{
   int Val;
   _ELEMENT *Next, *Prev;
} ELEMENT;

обьявление для С++. На C оно выглядит так:
 
Код:
typedef struct _ELEMENT
{
   int Val;
   struct _ELEMENT *Next, *Prev;
} ELEMENT;


OlgaKr это:
 
Код:
typedef struct _ELEMENT
{
   int Val;
   ELEMENT *Next, *Prev;
} ELEMENT;

ничего не даст.

Цитата:
Originally posted by OlgaKr
Ведь при помощи typedef мы создаем тип структуры ELEMENT,а не _ELEMENT


Это не верно, помощи typedef мы создаем тип ELEMENT, равный типу _ELEMENT.

242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Да и код я тебя просила полный, что бы не писать, а поправить если надо :).
242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Damarus
Люди, вы C то знаете?!! Вот это:
 
Код:
typedef struct _ELEMENT
{
   int Val;
   _ELEMENT *Next, *Prev;
} ELEMENT;

обьявление для С++. На C оно выглядит так:
 
Код:
typedef struct _ELEMENT
{
   int Val;
   struct _ELEMENT *Next, *Prev;
} ELEMENT;


OlgaKr это:
 
Код:
typedef struct _ELEMENT
{
   int Val;
   ELEMENT *Next, *Prev;
} ELEMENT;

ничего не даст.


Это не верно, помощи typedef мы создаем тип ELEMENT, равный типу _ELEMENT.



да вроде знаю но typedef обычно никогда не пользовалась.
Про помощи typedef создаем новый тип переменной, в struct это как раз выгодно тем что бы не писать всю эту красоту: struct _ELEMENT
Проверю и смогу сказать конкретней, спасибо за совет

16K
06 мая 2006 года
Farior
19 / / 01.05.2006
Вот это обьявление:
[COLOR=blue]
typedef struct _ELEMENT
{
int Val;
struct _ELEMENT *Next, *Prev;
} ELEMENT;
Хорошо а как записать в первый элемент потом во второй и т.д. в этом списке, т.е. как проходит пополнение структуры?
242
06 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
Вот это обьявление:
[COLOR=blue]
typedef struct _ELEMENT
{
int Val;
struct _ELEMENT *Next, *Prev;
} ELEMENT;
Хорошо а как записать в первый элемент потом во второй и т.д. в этом списке, т.е. как проходит пополнение структуры?



Posmotri zdes', esli ne podoidet napishu
http://forum.codenet.ru/showthread.php?s=&threadid=27596&highlight=%D1%F2%F3%E4%E5%ED%F2%E0%EC

16K
07 мая 2006 года
Farior
19 / / 01.05.2006
Цитата:
Originally posted by OlgaKr
Posmotri zdes', esli ne podoidet napishu
http://forum.codenet.ru/showthread.php?s=&threadid=27596&highlight=%D1%F2%F3%E4%E5%ED%F2%E0%EC



Спасибо за совет сейчас попробую ....

16K
07 мая 2006 года
Farior
19 / / 01.05.2006
Цитата:
Originally posted by OlgaKr
Posmotri zdes', esli ne podoidet napishu
http://forum.codenet.ru/showthread.php?s=&threadid=27596&highlight=%D1%F2%F3%E4%E5%ED%F2%E0%EC



Вот посмотрел. Написано тоже походу под Си++
Дописал там чуть чуть, но толку никакого.

[COLOR=blue]

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

//СТРУКТУРА ОДНОГО ЭЛЕМЕНТА СПИСКА
struct list_item
{
int val;
struct list_item *next;
};


//ФУНКЦИЯ ВЫВОДЯЩАЯ РУССКИЕ БУКВЫ В КОНСОЛЬ ДЕЙСТВИТЕЛЬНО РУССКИМИ
void rus_out(char *str)
{
char out_str[255];
CharToOem(str,out_str);
printf("%s",out_str);
return;
}

int main(void)
{ int E;
unsigned int numb;
struct list_item *start, *curr;
rus_out("Введите число элементов в списке: ");
scanf("%d",&numb);
if(numb<1)
{
rus_out("Введено недопустимое число!\nНажмите любую кнопку для завершения программы\n");
getch();
return 1;
}
rus_out("Введите элементы списка.\n");
start=(struct list_item*)malloc(sizeof( struct list_item));
scanf("%d",&(start->val));
start->next=0;
numb--;
//ЕСЛИ ЭЛЕМЕНТОВ БОЛЬШЕ ЧЕМ ОДИН, ТО НАЧИНАЕМ СЧИТЫВАНИЕ СПИСКА
if(numb)
{
// curr = new list_item;
curr=start;
for(;numb;numb--)
{
curr->next=(struct list_item*)malloc(sizeof(struct list_item));
curr=curr->next;
scanf("%d",&(curr->val));
curr->next=0;
}
}

//ВЫВОДИМ СПИСОК ДЛЯ КОНТРОЛЯ
rus_out("Введен список: |");
curr=start;
do
{
printf(" %d |",curr->val);
curr=curr->next;
}while(curr);
printf("\n");




//ОСВОБОЖДАЕМ ДИНАМИЧЕСКУЮ ПАМЯТЬ ВЫДЕЛЕННУЮ ПОД СПИСОК
curr=start;
do
{
start=curr;
curr=curr->next;
free(start);
}while(curr);

rus_out("Нажмите любую клавишу для завершения программы...\n");
getch();
return 0;
}


вотчто таккое "struct list_item *start, *curr;" что здесь объявляется.
Что это "scanf("%d",&(start->val));
start->next=0;" особенно "->"

Как вообще в структуру просто ввести данные
Допустим есть структура:

typedef struct _ELEMENT
{
int Val;
struct _ELEMENT *Next, *Prev;
} ELEMENT;

я понимаю это "struct _ELEMENT *Next, *Prev;" указатели на предыдущий и следующий элемент.

Как записать в структуру данные, куда их нужно записывать в "val" что ли (походу в него), а с него пишется в список или даже и не знаю совсем запутался с этими структурами.

Мне бы простой пример где объявления структуры, запись в нее и вывод на экран.

Как объявит я походу понял а вот остальное...
Помоги пожалуйста разобраться !!!

242
07 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
Вот посмотрел. Написано тоже походу под Си++
Дописал там чуть чуть, но толку никакого.


честно, в данном отрывке что ты выбросил, от С++ не вижу ничего :), вроде родной С

Цитата:

вот что таккое "struct list_item *start, *curr;"



объявляются указатели на структуру при помощи которых будем передвигаться по списку. а бегать будем по спискам при помощи адресса сохранненого в next(данный пример на линйную структуру в которой сохранили только адрес следущий структуры, без предыдущей.

Цитата:

Что это "scanf("%d",&(start->val));


val - поле для сохранения каких то значений, и в данном коде ны инициализируем его зна чением с клавиатуры
start - указатель на структуру
start -> val - получаем доступ к переменной val, структуры на которую ыказывает start

Цитата:

start->next=0;" особенно "->"


аналогично start->val, только в данном случае получаем доступ к указателю структуры, на которую указывает start, и сохраняем в next 0 (ноль - т.е. не указывает не на что - конец списка, как [color=blue]null[/color]
В данном примере реализованы списки с одним указателем next(можем передвигаться только вперед по списку) поэтому 0 - это конец списка, если добавляем новую структуру в список значит вместо 0 пишем ее адрес, а в next новой структуры пишем 0 etc.

надеюсь хоть что то понял, тяжело мне писаниной заниматься :)
попробую написать простой пример (хотя разабраться со структурами немного трудно, помню себя), напишу только с одним указателем next разберись хотя с этим

243
07 мая 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Farior
Вот посмотрел. Написано тоже походу под Си++


Говорю тебе как аффтар того кода ;) - там всё на Си, без плюсов, т.к. в плюсах я шарю весьма слабо.

16K
08 мая 2006 года
Farior
19 / / 01.05.2006
Цитата:
Originally posted by pacific_7
Говорю тебе как аффтар того кода ;) - там всё на Си, без плюсов, т.к. в плюсах я шарю весьма слабо.



Может ты мне сможешь сборосить кратенький пример работы с структурой (создание, запись и вывод на экран) сбрось пожалуйста если не трудно...

242
08 мая 2006 года
Оlga
2.2K / / 04.02.2006
Код:
#include <stdio.h>
#include <stdlib.h>

struct node
{
    int val;
    struct node *next;
};

struct node *buildnode(int );
struct node *buildlist(void);
void addnode(int, struct node * );
void printlist(struct node *);
struct node *deletedlist(struct node *);
int main(void)
{
    struct node *list = buildlist();
    printlist(list);
    putchar('\n');
    addnode(50,list);
    printlist(list);
    putchar('\n');
    list = deletedlist(list);

    return 0;
}

struct node* buildlist(void)
{
    struct node* first = NULL, *last;
    int n;
    printf("Enter number: ");
    scanf("%d", &n);
    if(n)
    {
        first = last = buildnode(n);
        printf("Enter a number: ");
        scanf("%d", &n);
        while(last != NULL && n != 0)
        {
            last->next = buildnode(n);
            last = last->next;
            printf("Enter a number:");
            scanf("%d",&n);
        }
       
    }
    return first;

}
struct node* buildnode(int value)
{
    struct node* temp = (struct node *)malloc(sizeof(struct node));

    if(temp == NULL)
    {
        printf("No memory available\n\n");
        return NULL;
    }
    temp->val = value;
    temp->next = NULL;
    return temp;
}

void printlist(struct node *ptr)
{
    while(ptr != NULL)
    {
        printf("%d  ", ptr->val);
        ptr = ptr->next;
    }
}

struct node *deletedlist(struct node *ptr)
{
    struct node* temp;
    while(ptr != NULL)
    {
        temp = ptr->next;
        free(ptr);
        ptr = temp;

    }
    return ptr; /*ptr == NULL*/
   
}

void addnode(int val, struct node *first )
{
    while(first ->next != NULL)
        first = first->next;
    first->next = buildnode(val);
}



простеькая программа которая:
1) принимает от пользователя целые числа, ввод заканчивается на нуле
2)расспечатывает список
3)добавляет к концу списка еще один элемент(структуру)
4)расспечатывает обновленный список
5)удалет список
6)выход из программы
16K
08 мая 2006 года
Farior
19 / / 01.05.2006
hp]

Огромное спасибо за программу буду пробовать разбираться главное что она у меня работает.
Как попробую сообщу о результатах.
Еще раз огромное спасибо тебе Оля за прогу.
16K
09 мая 2006 года
Farior
19 / / 01.05.2006
Попробовал разобраться и у меня несколько вопросов.
Что объявляется этой строкой «struct node* first = NULL, *last;» в функции «struct node *buildnode(int )» Структура уже объявлена, тогда что объявляется здесь ?
Что записывается в указатель на следующий элемент (next).
Что такое «struct node* temp = (struct node *)malloc(sizeof(struct node));» я так понимаю это выделение памяти под переменную «temp».
Что такое «temp->val = value;».
Вообще если не сильно трудно напиши пожалуйста пояснения что где происходит.
242
09 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:

я конечно попытаюсь объяснить, но если ты не понимаешь работу с указателями то надо брать книгу и начинать с простых упражнений :).
кстати обрати внимание что в моей подписи есть ссылка на книги foruma, также посмотри на lib.ru , рекомендую преобрести книгу Х.М Дейтел, П.Дж. Дейтел "Как программировать на С", в ней весьма доступно изложен матерьял.

1 - при помощи struct есть возможность объединить логически связанные между собой переменные, например надо построить таблицу содержащию личную информацию о рабочих: имя, д/р, адрес. имеются сотни рабочих, как программе обработать инфо о таком кол-ве людей?
существуют массивы, при помощи которых объединяем однотипные данные, но в данном случае нам нужен массив структур содержащий поля чтобы описать(обработать) нужное инфо (составное, содержащие больше одного поля).
2 - есть у нас структура, при помощи которой можем описать данные для одного рабочего. чтобы описать 1000 рабочих нужен массив структур типа стракт:

но проблема в том что завтра кол-во может увеличиться или умрньшиться тогда что делать? особенно если увеличиться. вывод - нужен диномеческий массив (т.е. массив размер которого можно изменять), в С он реализуется при помощи связанных списков.
в чем логика списков: добавляем в структуру данных еще поле/поля при помощи которых эти списки связываем, это поле/поля указатель/и содержащие адрес следующеи(next )/ предыдущей(previous) структуры, при помощи этих указателей можем передвигаться списку(в принцепе достаточно и одного, хотя бы next).
значение этих указателей нельзя изменять т.к. потерятся связь между структурами, поэтому нужен как минимум один ( или больше) вспомогательных переменных указателей чтобы передвигаться по спискам. обязанность программиста сохранить адрес первого элемента списка(если связь только по одному указателю next) если связь двухстороняя тогда достаточно иметь хоть один реальный адрес что бы бегать по структуре(честно говоря с такими не работала -> незнакома с принятой логикой работы, только личное понимание :))



1 - function main

 
Код:
[color=green]/*объявляем вспомогательные указатель list в котором сохраняем указатель на первую структуру в списке*/[/color]
struct node *list = buildlist();

можно записать как:
 
Код:
struct node *list;
list = buildlist();[color=green]/*функ. buildlist строит список и возращает адрес первой структуры списка в main, который сохраняем в указателе list*/[/color]


Цитата:
Что объявляется этой строкой «struct node* first = NULL, *last;» в функции «struct node *buildnode(int )» Структура уже объявлена, тогда что объявляется здесь ?


вспомагательные указатели при помощи которых будем работать со списком

Цитата:
Что такое «struct node* temp = [color=blue](struct node *)[/color]malloc(sizeof(struct node));» я так понимаю это выделение памяти под переменную «temp».


правильно, каждый раз когда надо добавить структуру мы запрашиваем необходимое кол-во памяти, malloc функция типа [color=blue]void *[/color], при помощи кастинга [color=blue](struct node *)[/color] преобразовываем ее в тип в тип указателя на переменную, для которой запрашиваем память(в данном случае для структуры node).
более простой пример преобразования:
float t = [color=blue](float)[/color]5/2;

изначально функ. malloc ~выглядит:

 
Код:
void *malloc(byte N)


после преобразования:
 
Код:
struct node *malloc(byte N)


Цитата:
Что записывается в указатель на следующий элемент (next).


адрес следующей структуры(смотри рисунок)

Цитата:
Что такое «temp->val = value;».



temp = ptr->next;
сохраняем в указателе temp адрес на следущую структуру(ptr naprimer ukazyvaet na strukturu s adresom 1FFh, togda v temp zapisyvaem znachenie next == 15h)
при помощи [color=blue]namepointer->namevariableOfstruct[/color] получаем доступ к значениям переменных сохранненым в структуре, на которую указывает pointer

242
09 мая 2006 года
Оlga
2.2K / / 04.02.2006
указатель first содержит в себе адрес A12h

[COLOR=blue]NULL[/COLOR] - конец списка(последний стракт в списке)

[attach]802[/attach]
242
09 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Что такое «struct node* temp = [color=blue](struct node *)[/color]malloc(sizeof(struct node));» я так понимаю это выделение памяти под переменную «temp».



только хочу заметить что temp это указатель на структуру, и он принимает адрес памяти запрашиваемый у ОС через функцию malloc для очередного узла(структуры node) который хотим добавить в список, если память(RAM) есть значит malloc возращает адрес зарезирвированной области RAM для данного стракта, если нет(закончилась) тогда malloc возращает NULL -> нет памяти, и не можем создать новый node.

 
Код:
malloc([color=red]sizeof(struct node)[/color])

обрати внимание что функ. malloc принимает как параметр размер памяти который нужно выделить, а точнее посылаем размер структуры node(оператор sizeof вычесляет этот размер)
16K
12 мая 2006 года
Farior
19 / / 01.05.2006
Вот почитал книги и опять появился вопрос.

typedef struct _ELEMENT
{
int Val;
struct _ELEMENT *Next, *Prev;
} ELEMENT;
ELEMENT *Head=NULL, *Curr=NULL;

В этом объявлении структуры Head и Curr.
Head это указатель на первый элемент, а его можно обозвать другим словом?

Я к тому что не обязательно такие названия (Head и Curr) указателей на первый и последний элемент а можно их обозвать по другому.

И еще переход на следующий элемент

void MoveNextD()
{if(Curr) Curr=Curr->Next;}

функция. а вот как понять
{if(Curr) Curr=Curr->Next;
если последний элемент то последний элемент равен следующему? но ведь если он последний элемент следующего нет.
И получается if выполняется в любом случае если условие (Curr)?
242
12 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
Вот почитал книги и опять появился вопрос.

typedef struct _ELEMENT
{
int Val;
struct _ELEMENT *Next, *Prev;
} ELEMENT;
ELEMENT *Head=NULL, *Curr=NULL;

В этом объявлении структуры Head и Curr.
Head это указатель на первый элемент, а его
можно обозвать другим словом?
Я к тому что не обязательно такие названия (Head и Curr) указателей на первый и последний элемент а можно их обозвать по другому.


неважно имя переменной, но значение которое в
нем сохраняем, естественно что желательно
значения давать смысловые, чтобы легче читались программы.
Хочу заметить что изначально этим переменным задается значение NULL(0) и пока не задаем действительные адресса структур они не
указывают не на что.

Цитата:

И еще переход на следующий элемент

void MoveNextD()
{if(Curr) Curr=Curr->Next;}

функция. а вот как понять
{if(Curr) Curr=Curr->Next;
если последний элемент то последний элемент равен следующему? но ведь если он последний элемент следующего нет.
И получается if выполняется в любом случае если условие (Curr)?



если значение Curr отлично от нуля(NULL,0) тогда это означает что Curr указывает на какую то структуру(не содержит в себе пустого нулевого значения) заходим в if и Curr принимает адресс следущей структуры сохранненой в next или NULL если Curr указывает на последнию структуру в списке.
а если Curr равен нулю то естественно в if не заходим. без этой проверки при Curr == NULL программа на этом коде вылетела бы в дебаг.
В С правило такое если в условии ноль стоит if не срабатывает, а если любое другое значение положительное или отрицательное тогда работает
[color=blue]if(условиe)[/color]

p.s. будет время постараюсь нассписать примечания к проге, если кто то другой может напишите плиз

242
14 мая 2006 года
Оlga
2.2K / / 04.02.2006
ты хоть скажи разобрался или как?
ты понял логику построения списков хотя бы по рисунку
что я прикрепила, или запутался?
а то начинаю думать что это я для себя
мемуары пишу :)), на тему программирования
16K
24 мая 2006 года
Farior
19 / / 01.05.2006
созданием списка я разобрался, а вот как сделать несколько списков (базу), если использовать масив элементов то вроде получается но переход по записям (спискам) получается тежелое.

вот создаем структуру с двумя указателями

typedef struct _zap{
char nomer[7];
char fio[21];
int kours;
char group[6];
int avv_ls;
int avv_a;

struct _zap * next, * prev;} zap;
Получается zap - это вид структуры, а вот как сделать что бы zap был не один, а в нем находилось несколько записей вида структуры ?
242
24 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior
созданием списка я разобрался, а вот как сделать несколько списков (базу), если использовать масив элементов то вроде получается но переход по записям (спискам) получается тежелое.

вот создаем структуру с двумя указателями

typedef struct _zap{
char nomer[7];
char fio[21];
int kours;
char group[6];
int avv_ls;
int avv_a;

struct _zap * next, * prev;} zap;
Получается zap - это вид структуры, а вот как сделать что бы zap был не один, а в нем находилось несколько записей вида структуры ?


помоему об этом уже говорили:
1 способ: объявить массив, размер массива не изменяется

 
Код:
zap arrZap[10];

2 способ: списки, списки то и состоят из структур
по ходу программы ты можеш добавлять, убирать структуры из списка
преимущество списка в том что его размер динамический(можно изменять его размеры)
пример со списком вроде есть.
242
25 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Farior

Получается zap - это вид структуры, а вот как сделать что бы zap был не один,
[color=blue]а в нем[/color] находилось несколько записей вида структуры ?


может я неправильно поняла, как именно ты хочешь сохранить структуры? в чем "в нем" :)?

16K
25 мая 2006 года
Farior
19 / / 01.05.2006
Вот я создал вид структуры, это вид одной записи, а как создать несколько записей такого вида, ну например три, и чтобы после можно было добавить к ней еще записи.
242
25 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by OlgaKr
может я неправильно поняла, как именно ты хочешь сохранить структуры? в чем "в нем" :)?



а списки тебя чем не устарювают?
вроде с этого начинали
прогу которую я тебе бросила она допустим простая
можно написать с меню что бы пользователь выбирал опции:
добавить структуру
удалить структуру
расспечатать все списки
и вообще все что душе угодно, и возможно сделать
в принцепе такой пример я тебе изначально написала, просто не вылажала т.к. села в лужу с НЛО
(забыла о летающих enters, чуть голова не взорвалась пока поняла в чем дело, но к тому времени я уже не хотела ничего :))

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог