Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Базы данных


Ответ
 
Опции темы Опции просмотра
Старый 12.04.2009, 23:45   #1 (permalink)
Юлькин
Новичок
 
Регистрация: 12.04.2009
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите с Базой Данных

Добрый вечер! Помогите, пожалуйста, найти и исправить ошибку!Моя программа добавляет в БД, выводит БД на экран, но не может найти однофамильцев! Ошибка в функции viewConfig(file)
Код:
#include <stdio.h>
#include <string.h>

struct computers
{
    int id;
	char surname_owner[6];
	int number_of_processors; //число процессоров
	char type_of_processors[100]; //тип процессоров
	int size_memory; //объем памяти
	char type_of_video_controller[100]; //тип видеоконтроллера
	int size_of_video_buffer; //объем видеопамяти
	char type_of_hard_disk[100]; //тип винчестера
	int number_of_hard_disk; //число винчестера
	char capacity_of_hard_disk[100]; //емкость винчестера
	int number_of_integrated_controller; //кол-во интегрированных контроллеров
	int number_of_outside_device; //колво внешних устройств
	char operational_system[100]; //операционная система
}row[100];

    /*int compareStrings( char surname_owner1[], char surname_owner2[])
{
            int k=0, answer;
            while( surname_owner1[k]==surname_owner2[k] && surname_owner1[k] !='\0' && surname_owner2[k] !='\0' )
                ++k;
                if (surname_owner1[k]==surname_owner1[k])
                answer = 0;
                //printf("Y\n");
                return i;
}
*/

void viewConfig(FILE* file)
{
	struct computers one, two;
	file = fopen("KRII.txt", "rb");
	rewind(file);
	fread (&one, sizeof(struct computers), 1, file);
	fread (&two, sizeof(struct computers), 2, file);
	if(strcmp(one.surname_owner, two.surname_owner)!=0)
	{
		printf("1\n");
		printf("%s %s\n", one.surname_owner, two.surname_owner);

}

}
int main()
{
    int n;
    char number=0;
    FILE *file;
    printf("\t\tMENU\n");
    printf(" \tPrint 1 for adding row\n");
    printf(" \tPrint 2 for showing\n");
    printf(" \tPrint 3 for searching \n");
    printf(" \tPrintf 4 for exit\n");
    scanf("\t\t%c", &number);


	if(number=='1')
	{
	    int k;
	    printf("How much much lines do you want to add?\n");
	    scanf("%i", &k);
        file = fopen("KRII.txt","ab+");
        for (int i=0; i<k; i++)
        {
            printf ("Enter id\n");
            scanf ("%d", &row[i].id);
            printf ("Enter surname_owner\n");
            scanf ("%s", &row[i].surname_owner);
            printf ("Enter number_of_processors\n");
            scanf ("%d", &row[i].number_of_processors);
            printf ("Enter type_of_processors\n");
            scanf ("%s", &row[i].type_of_processors);
            printf ("Enter size_memory\n");
            scanf ("%d", &row[i].size_memory);
            printf ("Enter type_of_video_controller\n");
            scanf ("%s", &row[i].type_of_video_controller);
            printf ("Enter size_of_video_buffer\n");
            scanf ("%d", &row[i].size_of_video_buffer);
            printf ("Enter type_of_hard_disk\n");
            scanf ("%s", &row[i].type_of_hard_disk);
            printf ("Enter number_of_hard_disk\n");
            scanf ("%d", &row[i].number_of_hard_disk);
            printf ("Enter capacity_of_hard_disk\n");
            scanf ("%s", &row[i].capacity_of_hard_disk);
            printf ("Enter  number_of_integrated_controller\n");
            scanf ("%d", &row[i].number_of_integrated_controller);
            printf ("Enter number_of_outside_device\n");
            scanf ("%d", &row[i].number_of_outside_device);
            printf ("Enter operational_system\n");
            scanf ("%s\n", &row[i].operational_system);
            fprintf(file,"%i %s %i %s %i %s %i %s %i %s %i %i %s\n", row[i].id, row[i].surname_owner, row[i].number_of_processors, row[i].type_of_processors, row[i].size_memory, row[i].type_of_video_controller, row[i].size_of_video_buffer, row[i].type_of_hard_disk, row[i].number_of_hard_disk, row[i].capacity_of_hard_disk, row[i].number_of_integrated_controller, row[i].number_of_outside_device, row[i].operational_system);
        }
        fclose(file);
        char number;
        scanf("%c", &number);
    }

    if (number=='2')
    {
        printf("i surname\tn t_p\tsmem\ttvc\tsvb\tthd\th chd c d oper_system\n");
        file = fopen("KRII.txt", "rb");
        for(int i = 0; !feof(file); i++)
        {
            fscanf(file, "%i %s %i %s %i %s %i %s %i %s %i %i %s\n", &row[i].id, &row[i].surname_owner, &row[i].number_of_processors, &row[i].type_of_processors, &row[i].size_memory, &row[i].type_of_video_controller, &row[i].size_of_video_buffer, &row[i].type_of_hard_disk, &row[i].number_of_hard_disk, &row[i].capacity_of_hard_disk, &row[i].number_of_integrated_controller, &row[i].number_of_outside_device, &row[i].operational_system);
            printf("%i %s\t%i %s\t%i\t%s\t%i\t%s\t%i %s %i %i %s\n", row[i].id, row[i].surname_owner, row[i].number_of_processors, row[i].type_of_processors, row[i].size_memory, row[i].type_of_video_controller, row[i].size_of_video_buffer, row[i].type_of_hard_disk, row[i].number_of_hard_disk, row[i].capacity_of_hard_disk, row[i].number_of_integrated_controller, row[i].number_of_outside_device, row[i].operational_system);
        }
        fclose(file);
        char number;
        scanf("%c\n", &number);
    }
    if (number=='3')//определение однофамильцев
    {

        viewConfig(file);


    }
    return 0;
    }
Юлькин вне форума   Ответить с цитированием

Старый 12.04.2009, 23:45
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Помогу вам списком тем, которых похожи на вашу

Задача на бейсике. Работа с базой даных
Помогите сделать базу данных в Access для зачета, пожалуйста

Старый 14.04.2009, 12:23   #2 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Проблемы, которые не дают работать проге:
1. Когда производится запись и чтение ты работаешь с БД как с простой строкой параметров, а при поиске однофамильцев - как с записанными в бинарном виде структурами
2. Считываются и сравниваются между собой только первые две записи

Думаю, что мог бы помочь - но нужно точнее знать - какая информация должна выводится при запуске этой функции (однофамильцев), например - должны выводится вообще все записи у которых есть однофамильцы или же должны выводится однофамильцы для какой-то конкретной записи, или вообще как-то ещё?
csbwalker вне форума   Ответить с цитированием
Старый 14.04.2009, 15:19   #3 (permalink)
Юлькин
Новичок
 
Регистрация: 12.04.2009
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

НА самом деле задача состоит в том, чтобы напечатать список однофамильцев, имеющих однотипные компьютеры. Для этого мне нужно вывести все строки с однофамильцами)
Юлькин вне форума   Ответить с цитированием
Старый 14.04.2009, 18:14   #4 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Излишки в остальном коде не стал править, а то так можно далеко зайти
Переписал функцию по который собственно был вопрос:
Код:
void viewConfig(FILE *file)
{
int count, i, markers[100];

	// Открываем файл
	file = fopen("KRII.txt", "rb");


	// Считываем содержимое файла в массив row
	for(i = 0; i < 100; i++)
	{
		// Считываем строчку
        	count = fscanf(file, "%i %s %i %s %i %s %i %s %i %s %i %i %s\n", &row[i].id, &row[i].surname_owner, &row[i].number_of_processors, &row[i].type_of_processors, &row[i].size_memory, &row[i].type_of_video_controller, &row[i].size_of_video_buffer, &row[i].type_of_hard_disk, &row[i].number_of_hard_disk, &row[i].capacity_of_hard_disk, &row[i].number_of_integrated_controller, &row[i].number_of_outside_device, &row[i].operational_system);

		// Если количество считанных элементов не совпадает с нужным для одной записи - прекращаем чтение
		if(count != 13)
			break;

		// Устанавливаем маркер обработанности в нуль
		markers[i] = 0;
	}

	// Закрываем файл - он нам больше не понадобится
	fclose(file);

	// Проверяем записи на совпадение фамилий
	for(int j = 0; j < i; j++) // Для каждой записи
		if(markers[j] == 0) // Если запись не обработана
		{
			// Устанавливаем маркер наличия однофамильцев для текущей записи в нуль
			count = 0;

			for(int k = j + 1; k < i; k++) // Для всех записей после текущей обрабатываемой
				if((markers[k] == 0) && (strcmp(row[j].surname_owner, row[k].surname_owner) == 0))
				// Если запись ещё не обработана и фамилия совпадает с фамилией в текущей обрабатываемой записи
				{
					// Устанавливаем маркер обработанности для этой записи
					markers[k] = 1;

					// Устанавливаем маркер наличия однофамильцев
					count = 1; 

					// Выводим информацию о найденной записи на экран
					printf("Id: %i, surname: %s\n", row[k].id, row[k].surname_owner); 
				}

			// Если для текущей записи найдены однофамильцы - выводим эту запись на экран
			if(count == 1)
				printf("Id: %i, surname: %s\n", row[j].id, row[j].surname_owner);
		}
}
Вот вроде как-то так на мой взгляд, запустил - работает
Результат выводится примерно так:
(Случай когда в базе есть два Ивановых и три Петровых)
Цитата:
Id: 3, surname: Иванов
Id: 1, surname: Иванов
Id: 9, surname: Петров
Id: 7, surname: Петров
Id: 2, surname: Петров
Т.е. производит группировку по фамилиям, при этом отбрасывая уникальные фамилии. Надеюсь помог
csbwalker вне форума   Ответить с цитированием
Старый 15.04.2009, 18:24   #5 (permalink)
Юлькин
Новичок
 
Регистрация: 12.04.2009
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо!
Юлькин вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 13:58.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.