Как сделать базу данных на c
Перейти к содержимому

Как сделать базу данных на c

  • автор:

Программное создание базы данных SQL Server с помощью ADO.NET и Visual C# .NET

В этой статье описывается, как программно создать базу данных SQL Server с помощью ADO.NET и Visual C# .NET.

Исходная версия продукта: Visual C#
Исходный номер базы знаний: 307283

Сводка

В этой пошаговой статье показано, как создать базу данных Microsoft SQL Server с помощью ADO.NET и Visual C# .NET, так как программистам часто требуется программное создание баз данных.

  • Сведения о версии Microsoft Visual Basic .NET см. в статье Создание базы данных SQL Server программными средствами с помощью ADO.NET и Visual Basic .NET.
  • Microsoft Visual C++ версии этой статьи см. в статье Создание базы данных SQL Server программным способом с помощью ADO.NET и Visual C++ .NET.

В этой статье описывается следующее пространство имен Библиотеки классов Microsoft платформа .NET Framework: System.Data.SqlClient .

Действия по созданию базы данных SQL Server

Чтобы создать базу данных, выполните следующие действия.

  1. Создайте новое приложение .NET для .NET для Visual C# для Windows.
  2. Поместите кнопку на Form1. Измените свойство Name кнопки на btnCreateDatabase, а затем измените свойство на Text Create Database.
  3. Используйте инструкцию using в пространствах имен System и System.Data , чтобы позже в коде не нужно было квалифицировать объявления в этих пространствах имен. Добавьте следующий код в раздел Общие объявления Формы 1:

using System; using System.Data.SqlClient; 
 String str; SqlConnection myConn = new SqlConnection ("Server=localhost;Integrated security=SSPI;database=master"); str = "CREATE DATABASE MyDatabase ON PRIMARY " + "(NAME = MyDatabase_Data, " + "FILENAME = 'C:\\MyDatabaseData.mdf', " + "SIZE = 2MB, MAXSIZE = 10MB, FILEGROWTH = 10%)" + "LOG ON (NAME = MyDatabase_Log, " + "FILENAME = 'C:\\MyDatabaseLog.ldf', " + "SIZE = 1MB, " + "MAXSIZE = 5MB, " + "FILEGROWTH = 10%)"; SqlCommand myCommand = new SqlCommand(str, myConn); try < myConn.Open(); myCommand.ExecuteNonQuery(); MessageBox.Show("DataBase is Created Successfully", "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information); >catch (System.Exception ex) < MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information); >finally < if (myConn.State == ConnectionState.Open) < myConn.Close(); >> 
  • Этот код создает пользовательскую базу данных с определенными свойствами.
  • Папка, в которую будут храниться созданные .mdf и LDF-файлы, должна уже существовать перед выполнением кода, иначе будет создано исключение.
  • Если вы хотите создать базу данных, аналогичную базе данных модели SQL Server, и хотите, чтобы база данных была в расположении по умолчанию, измените переменную str в коде, как показано в следующем примере кода: str = «CREATE DATABASE MyDatabase»

Ссылки

  • Создание базы данных
  • Новые возможности ADO.NET

Создание базы данных и добавление таблиц в приложениях платформа .NET Framework с помощью Visual Studio

Наборы данных и связанные классы являются устаревшими технологиями платформа .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти во время отключения приложений от базы данных. Они особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных оказались очень успешными, мы рекомендуем новым приложениям .NET использовать Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей, и он имеет более простой интерфейс программирования.

Visual Studio можно использовать для создания и обновления локального файла базы данных в SQL Server Express LocalDB. Вы также можете создать базу данных, выполнив инструкции Transact-SQL в окне инструментов SQL Server обозреватель объектов в Visual Studio. В этом разделе описано, как создать .mdf файл и добавить таблицы и ключи с помощью конструктора таблиц.

Необходимые компоненты

Чтобы выполнить это пошаговое руководство, вам потребуется разработка классических приложений .NET и хранение и обработка рабочих нагрузок, установленных в Visual Studio. Чтобы установить их, откройте Visual Studio Installer и нажмите кнопку «Изменить» (или «Изменить >«) рядом с версией Visual Studio, которую вы хотите изменить. См. раздел Изменение Visual Studio.

Процедуры, описанные в этой статье, применяются только к платформа .NET Framework проектам Windows Forms, а не к проектам Windows Forms .NET Core.

Создание проекта и файла локальной базы данных

  1. Создайте проект приложения Windows Forms (платформа .NET Framework) и назовите его SampleDatabaseWalkthrough.
  2. В строке меню выберите «Добавить новый элемент проекта>«. Если появится небольшое диалоговое окно с полем для имени файла, выберите «Показать все шаблоны«.
  3. В списке шаблонов элементов прокрутите вниз и выберите базу данных на основе служб.

Добавление базы данных на основе службы новых элементов ></p>
<p>» /></p><div class='code-block code-block-1' style='margin: 8px 0; clear: both;'>
<!-- 1article -->
<script src=

Добавление базы данных на основе службы новых элементов ></p>
<p>» /></p>
<h4>Добавление источника данных</h4>
<ol>
<li><strong>Если окно «Источники</strong> данных» не открыто, откройте его, нажав <strong>клавиши SHIFT+</strong><strong>ALT</strong><strong>+D</strong> или выбрав <strong>«Просмотреть</strong><strong>>другие источники <strong>данных Windows</strong>></strong>» в строке меню.</li>
<li><strong>В окне «Источники данных»</strong> выберите <strong>«Добавить новый источник</strong> данных».</li>
</ol>
<p><img decoding=

Добавление нового источника данных в Visual Studio

Просмотр свойств подключения к данным

Чтобы просмотреть некоторые свойства файла SampleDatabase.mdf , откройте окно «Свойства » подключения к данным:

  • Чтобы открыть окно обозреватель объектов SQL Server, выберите View>SQL Server обозреватель объектов (или CTRL\+, CTRL +S), чтобы открыть окно SQL Server обозреватель объектов. Разверните (localdb)\MSSQLLocalDB>Database, а затем щелкните правой кнопкой мыши SampleDatabase.mdf (он может быть указан как полный путь) и выберите «Свойства».
  • Кроме того, можно выбрать Обозреватель представления>сервера, если это окно еще не открыто. Откройте окно свойств, разверните узел «Данные Подключение ions«, щелкните правой кнопкой мыши SampleDatabase.mdf и выберите пункт «Свойства«.

Совет Если вы не можете развернуть узел «Данные Подключение ions» или подключение SampleDatabase.mdf не указано, нажмите кнопку Подключение в базу данных на панели инструментов сервера Обозреватель. В диалоговом окне «Добавление Подключение» убедитесь, что в источнике данных выбран файл базы данных Microsoft SQL Server, а затем перейдите к файлу SampleDatabase.mdf. Завершите добавление подключения, нажав кнопку «ОК«.

Чтобы просмотреть строка подключения, можно открыть файл app.config в Обозреватель решений. В элементе должна появиться запись connectionStrings , похожая на следующий код:

Создание таблиц и ключей с помощью конструктора таблиц

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

Создание таблицы Customers

  1. В обозревателе объектов сервера Обозреватель или SQL Server разверните узел «Данные Подключение ions«, а затем развернитеузел SampleDatabase.mdf.
  2. Щелкните правой кнопкой мыши таблицы и выберите «Добавить новую таблицу«. Будет открыт Конструктор таблиц, отобразится сетка с одной строкой по умолчанию, которая представляет один столбец в создаваемой таблице. Добавляя строки в сетку, вы добавляете столбцы в таблицу.
  3. В сетке добавьте строку для каждой из следующих записей.
Имя столбца Тип данных Разрешить значения null
CustomerID nchar(5) False (не установлен)
CompanyName nvarchar(50) False (не установлен)
ContactName nvarchar (50) True (установлен)
Phone nvarchar (24) True (установлен)
CREATE TABLE [dbo].[Customers] 
CONSTRAINT [PK_Customers] PRIMARY KEY ([CustomerID]) 

Отобразятся примерно следующие сведения:

Конструктор таблиц с таблицей Customers

Конструктор таблиц с таблицей Customers

Создание таблицы «Заказы»

  1. Создайте еще одну таблицу, а затем добавьте строку для каждой записи следующей таблицы.
Имя столбца Тип данных Разрешить значения null
OrderID int False (не установлен)
CustomerID nchar(5) False (не установлен)
OrderDate datetime True (установлен)
OrderQuantity int True (установлен)
CREATE TABLE [dbo].[Orders] 
CONSTRAINT [PK_Orders] PRIMARY KEY ([OrderId]) 

Узел таблиц, развернутый в сервере Обозреватель

Узел таблиц, развернутый в сервере Обозреватель

Создание внешнего ключа

  1. В области контекста справа от сетки конструктора таблиц для таблицы «Заказы» щелкните правой кнопкой мыши внешние ключи и выберите «Добавить новый внешний ключ«.

Добавление внешнего ключа в конструкторе таблиц в Visual Studio

Добавление внешнего ключа в конструкторе таблиц в Visual Studio

CONSTRAINT [FK_Orders_Customers] FOREIGN KEY ([CustomerID]) REFERENCES [Customers]([CustomerID]) 

Заполнение таблиц данными

  1. В обозреватель объектов Server Обозреватель или SQL Server разверните узел для примера базы данных.
  2. Откройте контекстное меню узла «Таблицы», выберите «Обновить» и разверните узел «Таблицы«.
  3. Откройте контекстное меню таблицы «Клиенты», а затем выберите «Показать данные таблицы» или «Просмотреть данные«.
  4. Добавьте все нужные данные для некоторых клиентов. Можно указать любые пять символов как ИД клиентов, но хотя бы один нужно выбрать и запомнить для дальнейшего использования в этой процедуре.
  5. Откройте контекстное меню таблицы «Заказы», а затем выберите «Показать данные таблицы» или «Просмотреть данные«.
  6. Добавьте данные для некоторых заказов. При вводе каждой строки она сохраняется в базе данных.

Внимание Убедитесь, что все идентификаторы заказов и количества заказов — целые числа, и каждый идентификатор клиента соответствует значению, указанному в столбце CustomerID таблицы клиентов.

Поздравляем! Теперь вы знаете, как создавать таблицы, связывать их с внешним ключом и добавлять данные.

Связанный контент

Как создать чистую базу данных

Независимо от того, какой вы разработчик, время от времени мы сталкиваемся с API, который возвращает данные таким образом, что нам не нужно тратить много времени на их понимание. Но получение такого чистого и последовательного результата требует времени, усилий и опыта. Поговорим говорить коротко и по существу.

Терминология

Таблица: это набор данных

Первичный ключ: Это уникальный идентификатор таблицы

Атрибут: означает свойство ваших данных. Например, name . user

Тип данных: Типы данных представляют различные типы ваших данных. Например-string, int, timestamp и т. Д.

1. Слова должны быть разделены подчеркиванием

Если ваше имя атрибута содержит более 1 слова, отделите его snake_case . Не используйте camelCase или любой другой случай для согласованности.

wordcount или WordCount
word_count

Причина

  • Улучшает читабельность
  • Имена могут стать более независимыми от платформы

2. Типы данных не должны быть именами

Никогда не используйте типы данных в качестве имени столбца. Это происходит в основном для параметров метки времени. Дайте ему осмысленное имя.

Плохо

timestamp or text

Хорошо

created_at or description

Причина

  • Использование типов данных может создать путаницу в конце приложения.
  • Предоставление собственного имени дает больше контекста для использования параметра.

3. Имена атрибутов должны быть строчными

Не используйте имена в верхнем регистре для своих атрибутов.

Плохо

Description

Хорошо

description

Причина

  • Позволяет избежать путаницы с ключевыми словами SQL в верхнем регистре
  • Это может улучшить скорость набора текста

4. Напишите полные слова

Не пытайтесь сократить имена столбцов ради пространства или любой другой логики. Старайтесь быть как можно более понятными.

Плохо

mid_name

Хорошо

middle_name

Причина

Это правило способствует самодокументированному дизайну

5. Но используйте общие сокращения

Исключение из правила-4-это когда у вас есть широко распространенная аббревиатура. В таких ситуациях выбирайте короткий.

Хорошо

i18n

Но если вы окажетесь в замешательстве, перейдите к полному имени. Это инвестиции, которые вы делаете на будущее.

6. Избегайте наличия чисел в имени столбца

Верьте или нет, я видел это достаточно. Никогда не используйте числа в имени столбца.

Плохо

address1 , address2

Хорошо

primary_address, secondary_address

Причина

Это признак очень плохой нормализации. Старайтесь избегать этого.

7. Используйте короткие имена таблиц

Будьте очень осторожны при именовании таблиц, потому что длинные имена таблиц могут оказать плохое влияние в будущем.

Плохо

site_detail

Хорошо

site

Причина

Короткие имена таблиц помогут вам при создании реляционных столбцов и связывающих таблиц.

8. Ищите зарезервированные слова

В каждой базе данных есть несколько зарезервированных слов. Определите их и избегайте.

Плохо

user lock table etc

Список зарезервированных слов для некоторых популярных баз данных

9. Сингулярные имена для таблиц

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

Плохо

users and orders

Хорошо

user and order

Причина

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

10. Таблицы ссылок должны иметь алфавитный порядок

При создании таблицы соединений объедините имена двух таблиц в алфавитном порядке.

Плохо

book_author

Хорошо

author_book

11. Имена столбцов в единственном числе

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

Плохо

books

Хорошо

book

12. Имя первичного ключа

Если это один столбец, то он должен быть назван как id

CREATE TABLE order ( id bigint PRIMARY KEY, order_date date NOT NULL );

13. Имя внешнего ключа

Это должно быть имя другой таблицы и упомянутого поля. Например, если вы ссылаетесь на person внутри вашего team_member таблица, то вы можете сделать это так.

CREATE TABLE team_member ( person_id bigint NOT NULL REFERENCES person(id), );

14. Не указывайте в конце имен столбцов типы хранимых в них данных

Нет смысла суффиксировать имена столбцов типами данных. Избегайте этого.

Плохо

name_tx

Хорошо

name

15. Индексы должны иметь как имя таблицы, так и столбца

Если вы создаете индекс, за именем таблицы следуют имена столбцов, на которые вы ссылаетесь

CREATE TABLE person ( id bigserial PRIMARY KEY, first_name text NOT NULL, last_name text NOT NULL, ); CREATE INDEX person_ix_first_name_last_name ON person (first_name, last_name);

16. Имена столбцов типа даты

Суффикс ваших имен столбцов типа даты с _on или _date .

Например, если у вас есть столбец для хранения обновленной даты, делайте так,

Хорошо

updated_on или updated_date

17. Имена столбцов типа даты и времени

Если у вашего имени столбца есть время, то суффикс их с _at или _time .

Например, если вы хотите сохранить время заказа, то

Плохо

ordered

Хорошо

ordered_at or order_time

18. Имена столбцов логического типа

Если у вас есть имена столбцов логического типа, то префикс их is_ или has_ .

Хорошо

is_admin или has_membership

Заключение

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

Единственное, что хуже плохого соглашения, — это несколько соглашений

Разрабатывая базу данных с нуля, имея в виду эти правила, вы заложите крепкий фундамент на будущее.

Каковы ваши мысли? Есть ли правило, с которым вы не согласны? Я более чем рад продуктивному разговору в комментариях!

  • api
  • базы данных
  • нормализация данных

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

[COLOR=red]
Помогите кто-нибудь пожалуйста с созданием базы данных на Си под такую задачу:

База данных деканата содержит информацию о студентах: номер зачетной книжки, ФИО студента (строки 20 символов), группа (строка 5 символов), курс (целое число), средний балл за прошлый семестр (целое число), средний балл за все семестры (целое число). Все баллы – по 10-и бальной системе.
Если можно пришлите помощь на ящик [email]Farior@yandex.ru[/email]
Заранее спасибо

  • есть ли у кого нибудь исходник данной программы от dimon_9922, 25 декабря 2013 года

48 ответов / показаны 1 — 39

03 мая 2006 года
2.2K / / 04.02.2006

А в чем проблемы? И что ты подрузумеваешь под БД В С?
Если бы я делала это упражнение, то сделала бы struct, и сохраняла бы инфо в файле. А что ты хочешь непонятно. Самое главное попытайся решить сам, а сюда вопросы пости.
[COLOR=deeppink]Просьбы выслать на e-mail решения не приветствуються админестрацией.
Надеюсь вижу это у вас в последний раз.
[/COLOR]

03 мая 2006 года
2.2K / / 04.02.2006
04 мая 2006 года
19 / / 01.05.2006

[QUOTE]Originally posted by OlgaKr
А в чем проблемы? И что ты подрузумеваешь под БД В С?
Если бы я делала это упражнение, то сделала бы struct, и сохраняла бы инфо в файле. А что ты хочешь непонятно. Самое главное попытайся решить сам, а сюда вопросы пости

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

04 мая 2006 года
19 / / 01.05.2006

Originally posted by OlgaKr
Пример:
http://forum.codenet.ru/showthread.php?s=&threadid=31131
использования struct в Си
использования struct и фаилов в С++

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

04 мая 2006 года
2.2K / / 04.02.2006

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

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

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

04 мая 2006 года
2.2K / / 04.02.2006

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

A popodrobnei gospodin Farior mozno, chto ty hochesh’?

05 мая 2006 года
2.2K / / 04.02.2006

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

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

#include
#include
#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]; /* Все баллы */
>;

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;

>
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);
>

05 мая 2006 года
19 / / 01.05.2006

br /> #include
#include
#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»

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

06 мая 2006 года
2.2K / / 04.02.2006
Originally posted by Farior
[QUOTE]
#include
#include
#define N 4
#define AmountGrades 3
void myprint(struct student []);

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

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

06 мая 2006 года
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

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

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

06 мая 2006 года
19 / / 01.05.2006

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

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

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

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

06 мая 2006 года
2.2K / / 04.02.2006

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

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

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

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

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

06 мая 2006 года
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 безразница там ставиться на Си или на Си++ или даже на «билдер»

06 мая 2006 года
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 — ты заметил что я тебе написала(выше) предполагаемую ошибку в коде? ты пробавал его изменить?

06 мая 2006 года
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]; /* Все баллы */
>;
походу вызов функции с использованием объявляется после объявления структуры.

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

06 мая 2006 года
2.2K / / 04.02.2006

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

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

06 мая 2006 года
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.

06 мая 2006 года
2.2K / / 04.02.2006
Да и код я тебя просила полный, что бы не писать, а поправить если надо :).
06 мая 2006 года
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
Проверю и смогу сказать конкретней, спасибо за совет

06 мая 2006 года
19 / / 01.05.2006

Вот это обьявление:
[COLOR=blue]
typedef struct _ELEMENT
int Val;
struct _ELEMENT *Next, *Prev;
> ELEMENT;
Хорошо а как записать в первый элемент потом во второй и т.д. в этом списке, т.е. как проходит пополнение структуры?

06 мая 2006 года
2.2K / / 04.02.2006

Originally posted by Farior
Вот это обьявление:
[COLOR=blue]
typedef struct _ELEMENT
int Val;
struct _ELEMENT *Next, *Prev;
> ELEMENT;
Хорошо а как записать в первый элемент потом во второй и т.д. в этом списке, т.е. как проходит пополнение структуры?

07 мая 2006 года
19 / / 01.05.2006

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

07 мая 2006 года
19 / / 01.05.2006

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

//СТРУКТУРА ОДНОГО ЭЛЕМЕНТА СПИСКА
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» что ли (походу в него), а с него пишется в список или даже и не знаю совсем запутался с этими структурами.

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

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

07 мая 2006 года
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 разберись хотя с этим

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

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

08 мая 2006 года
19 / / 01.05.2006

Originally posted by pacific_7
Говорю тебе как аффтар того кода 😉 — там всё на Си, без плюсов, т.к. в плюсах я шарю весьма слабо.

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

08 мая 2006 года
2.2K / / 04.02.2006

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 ) ;

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 ) ;
>

>
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)выход из программы

08 мая 2006 года
19 / / 01.05.2006

Огромное спасибо за программу буду пробовать разбираться главное что она у меня работает.
Как попробую сообщу о результатах.
Еще раз огромное спасибо тебе Оля за прогу.

09 мая 2006 года
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;».
Вообще если не сильно трудно напиши пожалуйста пояснения что где происходит.

09 мая 2006 года
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)

после преобразования:

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

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