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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 13:46   #1
maxim3535
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 14
По умолчанию Пересечение множеств.(язык C)

Плохо разбираюсь в языке C, прошу помощи в решении задачи.

Задача такая: В файле есть два множества. Найти их пересечение и вывести результат в отдельный файл.

Наработки прилагаю.

во входном файле записано:
10
11
1 2 3 4 5 6 7 8 9 10
3 2 4 6 11 32 43 56 34 23 25

первая и вторая строка - размер массивов
третья и четвёртая - сами массивы

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


Код:
#include "stdafx.h"
#include "stdio.h"

int _tmain(int argc, _TCHAR* argv[])
{
	 FILE *in;
   FILE *out; 
    in=fopen("www.in","r"); 
    out=fopen("www.out", "w"); 
    if (in==NULL) 
{ 
   printf("error open file qqq.in");
   return(1); 
	}
	int n, a[256], m, b[256],v[256];
	fscanf(in,"%d",&n);
	fscanf(in,"%d",&m);
for (int i = 0; i<=n; i++)

	fscanf (in, "%d", &a[i]);

	for (int j = 0; j<=m; j++)
		
   fscanf (in, "%d", &b[j]);
for (int i = 0; i<=n; i++)
	for (int j = 0; j<=m; j++)
	for (int k = 0; k<=n; k++)
{       if (a[i]==b[j]) 
		v[k]=a[i]; 
	     fprintf(out,"%d",v[k]);
}

fclose(in); 
fclose(out);
	return 0;
}

Последний раз редактировалось maxim3535; 31.03.2013 в 14:21.
maxim3535 вне форума Ответить с цитированием
Старый 31.03.2013, 13:59   #2
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

А как именно записаны в файл эти два множества? И что здесь понимается под их пересечением?
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.

Последний раз редактировалось Че Гевара; 31.03.2013 в 14:02.
Че Гевара вне форума Ответить с цитированием
Старый 31.03.2013, 14:10   #3
maxim3535
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 14
По умолчанию

во входном файле записано:
10
11
1 2 3 4 5 6 7 8 9 10
3 2 4 6 11 32 43 56 34 23 25

первая и вторая строка - размер массивов
третья и четвёртая - сами массивы

под пересечением понимается числа, находящиеся и в том и в другом множестве
maxim3535 вне форума Ответить с цитированием
Старый 31.03.2013, 14:46   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Вроде работает
Код:
#include <stdlib.h>
#include <stdio.h>

int
comp(const void *i, const void *j)
{
  return *(int *)i - *(int *)j;
}

int
main(int argc, char *argv[])
{
    FILE *in = fopen("www.in", "r");
    if (!in)
    {
        printf("error open file www.in");
        return(1);
    }
    int n, a[256], m, b[256], i, j;
    fscanf(in, "%d", &n);
    fscanf(in, "%d", &m);
    for (i = 0; i < n; ++i)
        fscanf (in, "%d", &a[i]);
    for (j = 0; j < m; ++j)
        fscanf (in, "%d", &b[j]);
    fclose(in);
    qsort(a, n, sizeof(a[0]), comp);
    qsort(b, m, sizeof(b[0]), comp);
    FILE *out = fopen("www.out", "w");
    i = 0;
    j = 0;
    while (i < n && j < m) {
        while (i < n && a[i] < b[j]) {
            ++i;
        }
        while (i < n && j < m && b[j] < a[i]) {
            ++j;
        }
        if (i < n && j < m && a[i] == b[j]) {
            fprintf(out, "%d ", a[i]);
            ++i;
            ++j;
        }
    }
    fclose(out);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 31.03.2013 в 15:34.
BDA вне форума Ответить с цитированием
Старый 31.03.2013, 14:57   #5
maxim3535
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 14
По умолчанию

пишет
Ошибка 8 error C3861: qsort: идентификатор не найден
maxim3535 вне форума Ответить с цитированием
Старый 31.03.2013, 15:02   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

В чем компилируете?
Попробуйте:
Код:
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 31.03.2013 в 15:35.
BDA вне форума Ответить с цитированием
Старый 31.03.2013, 15:10   #7
maxim3535
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 14
По умолчанию

Спасибо! всё заработало! нехватало #include "stdafx.h".
и ещё вопрос - что делает вот эта часть кода:
Код:
int
comp(const void *i, const void *j)
{
  return *(int *)i - *(int *)j;
}
А, всё, я понял

Последний раз редактировалось maxim3535; 31.03.2013 в 15:17.
maxim3535 вне форума Ответить с цитированием
Старый 31.03.2013, 15:35   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Пожалуйста.

Чуть изменил код - иначе возможен был выход за пределы массива.
ПС 100% гарантий работоспособности не даю - вполне мог забыть что-нибудь
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пересечение множеств Mirazhana Общие вопросы C/C++ 8 07.01.2013 21:50
Пересечение множеств iNsomNia7 Паскаль, Turbo Pascal, PascalABC.NET 1 19.11.2012 14:38
Пересечение множеств, паскаль Bellatryx Паскаль, Turbo Pascal, PascalABC.NET 2 16.04.2012 09:44
Пересечение множеств. С++ Демик Помощь студентам 4 13.03.2011 18:04
пересечение двух множеств Олежек Фриланс 7 10.03.2010 18:46