Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2009, 22:33   #1
Юлькин
 
Регистрация: 12.04.2009
Сообщений: 8
По умолчанию Помогите с Базой Данных

Добрый вечер! Помогите, пожалуйста, найти и исправить ошибку!Моя программа добавляет в БД, выводит БД на экран, но не может найти однофамильцев!
Код:
#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];
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;
    }
Юлькин вне форума Ответить с цитированием
Старый 13.04.2009, 12:24   #2
seshcher
 
Регистрация: 13.04.2009
Сообщений: 4
По умолчанию

Если что не так - поправлю.
Код:
#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];
// Прототипы 
char menu (void);
void add_row (void);
void view_row (bool);

int main()
{
    bool f_do = true;
	while (f_do)
	{
		char number = menu();
		switch (number)
		{
			case '1': add_row(); break;
			case '2': view_row (false); break;
			case '3': view_row (true); break;
			default: f_do = false; break;
		}
	}
	return 0;
}

// Функция меню - возвращает пукт меню
char menu (void)
{
	char number;
    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);
	return number;
}

// Функция для добавления записей
void add_row (void)
{
	FILE *file;
	int k;
	computers new_row;
	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", &new_row.id);
        printf ("Enter surname_owner\n");
        scanf ("%s", &new_row.surname_owner);
        printf ("Enter number_of_processors\n");
        scanf ("%d", &new_row.number_of_processors);
        printf ("Enter type_of_processors\n");
        scanf ("%s", &new_row.type_of_processors);
        printf ("Enter size_memory\n");
        scanf ("%d", &new_row.size_memory);
        printf ("Enter type_of_video_controller\n");
        scanf ("%s", &new_row.type_of_video_controller);
        printf ("Enter size_of_video_buffer\n");
        scanf ("%d", &new_row.size_of_video_buffer);
        printf ("Enter type_of_hard_disk\n");
        scanf ("%s", &new_row.type_of_hard_disk);
        printf ("Enter number_of_hard_disk\n");
        scanf ("%d", &new_row.number_of_hard_disk);
        printf ("Enter capacity_of_hard_disk\n");
        scanf ("%s", &new_row.capacity_of_hard_disk);
        printf ("Enter  number_of_integrated_controller\n");
        scanf ("%d", &new_row.number_of_integrated_controller);
        printf ("Enter number_of_outside_device\n");
        scanf ("%d", &new_row.number_of_outside_device);
        printf ("Enter operational_system\n");
        scanf ("%s\n", &new_row.operational_system);
        fprintf(file,"%i %s %i %s %i %s %i %s %i %s %i %i %s\n", new_row.id, new_row.surname_owner, new_row.number_of_processors, new_row.type_of_processors, new_row.size_memory, new_row.type_of_video_controller, new_row.size_of_video_buffer, new_row.type_of_hard_disk, new_row.number_of_hard_disk, new_row.capacity_of_hard_disk, new_row.number_of_integrated_controller, new_row.number_of_outside_device, new_row.operational_system);
    }
    fclose(file);
}
// Функция для просмотра и поиска однофамилцев (если входно true - то поис, иначе просмотр)
void view_row (bool searching)
{	
	FILE *file;
	computers view_row;
	bool too_surname = false;
	char surname[10][6];
	int n = 0, count = 0;
	if (!searching) printf("i\tsurname\tn\tt_p\tsmem\ttvc\tsvb\tthd\th\tchd\tc\td\toper_system\n");
	else printf("Odnofalinci:\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", &view_row.id, &view_row.surname_owner, &view_row.number_of_processors, &view_row.type_of_processors, &view_row.size_memory, &view_row.type_of_video_controller, &view_row.size_of_video_buffer, &view_row.type_of_hard_disk, &view_row.number_of_hard_disk, &view_row.capacity_of_hard_disk, &view_row.number_of_integrated_controller, &view_row.number_of_outside_device, &view_row.operational_system);
		if (searching)
		{
			for (int j = 0 ; j<n; j++)
				if (strcmp(surname[j], view_row.surname_owner)==0) too_surname = true;
			if (too_surname) {printf ("%d) %s\n", ++count, view_row.surname_owner);}
			else
			{
				sprintf (surname[n],"%s",view_row.surname_owner);
				n++;
			}
			too_surname = false;
		}
		else
		{
			printf("%i\t%s\t%i\t%s\t%i\t%s\t%i\t%s\t%i\t%s\t%i\t%i\t%s\n", view_row.id, view_row.surname_owner, view_row.number_of_processors, view_row.type_of_processors, view_row.size_memory, view_row.type_of_video_controller, view_row.size_of_video_buffer, view_row.type_of_hard_disk, view_row.number_of_hard_disk, view_row.capacity_of_hard_disk, view_row.number_of_integrated_controller, view_row.number_of_outside_device, view_row.operational_system);
		}
    }
	if ((count ==0)&&(searching)) printf ("Odnofamincev net!\n");
    fclose(file);
}
seshcher вне форума Ответить с цитированием
Старый 13.04.2009, 15:03   #3
Юлькин
 
Регистрация: 12.04.2009
Сообщений: 8
По умолчанию

К сожалению, однофамильцев программа все равно не ищет(
Юлькин вне форума Ответить с цитированием
Старый 13.04.2009, 15:10   #4
seshcher
 
Регистрация: 13.04.2009
Сообщений: 4
По умолчанию

А входной файлик в котором косяк можно увидеть?
seshcher вне форума Ответить с цитированием
Старый 13.04.2009, 15:31   #5
Юлькин
 
Регистрация: 12.04.2009
Сообщений: 8
По умолчанию

конечно, вот он!
http://stream.ifolder.ru/11582294
но там косяков вроде нет.
Юлькин вне форума Ответить с цитированием
Старый 13.04.2009, 21:00   #6
Юлькин
 
Регистрация: 12.04.2009
Сообщений: 8
По умолчанию

Прошу прощения, все работает! Спасибо!! а не подскажите как вывести все строки или номера строк с однофамильцами?
Юлькин вне форума Ответить с цитированием
Старый 14.04.2009, 02:28   #7
seshcher
 
Регистрация: 13.04.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Юлькин Посмотреть сообщение
а не подскажите как вывести все строки или номера строк с однофамильцами?
Есть 2 варианта:
1) Массив char surname[10][6](кстати его нужно больше сделать или динамическим) заменить на массив структур типа computers и в условии if (strcmp(surname[j], view_row.surname_owner)==0) too_surname = true; добавить вывод элемента массива структуры, но тогда если будет больше 2 человек с одинаковой фамилией, то будут повторяться записи. Это можно будет исправить путем ввода дополнительного флага типа bool.
2) Переписать функцию void view_row (bool searching), т.к. она составлена не для этого случая, если изменять согласно 1 пункту, то будет не совсем логично (относительно здравого смысла) и код будет выглядеть корявым.
3) Можно создать класс в котором будут реализованы методы: добавления элемента (пункт 1 в меню), вывод всех данных на экран (пункт 2 в меню), поиск однофамильцев (пункт 3), чтение в структуру класса из файла (служебный метод для работы программы), и самое главное - сортировка данных по фамилии в алфавитном порядке используя, к примеру, qsort из <stdlib.h> and <search.h> (если использовать Visual Studio, то там могут быть глюки с сортировкой используя qsort) и затем сравнивать фамилии попарно и выводить совпадения.
4) Реализовать пункт 3, но без использования классов, а с помощью функций. Но с классами нагляднее, гибче и код более читабельный и логичнее.
seshcher вне форума Ответить с цитированием
Старый 14.04.2009, 08:19   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Можно просто отсортировать по фамилиям и соответственно однофамильцы все будут рядом. Никакие дополнительные динамические массивы не будут нужны
pu4koff вне форума Ответить с цитированием
Старый 14.04.2009, 08:29   #9
seshcher
 
Регистрация: 13.04.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Можно просто отсортировать по фамилиям и соответственно однофамильцы все будут рядом.
А можно пример? Так чтобы без массивов и файл читать только 1 раз.
seshcher вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с базой данных Роман-33 БД в Delphi 3 06.09.2008 18:37
Помогите, пожалуйста, новичку с базой данных Oracle10g (в т.ч. миграция с Oracle8i) lexluther БД в Delphi 0 27.03.2007 12:03
Помогите с базой данных Илья Microsoft Office Excel 3 20.12.2006 09:49