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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2017, 10:31   #1
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию Студенты из одинаковых институтов и групп

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

Код:
#include "stdafx.h"
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <windows.h> /*чтобы в консоли выводились русские символы*/
#define size 100
typedef struct
{
    char famly[20];
    char fName[20];
    char sName[20];
    char univer[20];
    char group[20];
} Student;
 
void find(FILE *fo, Student *stud, char *gr, char *inst, int n)
{
    int i;
    for ( i = 0; i < n; i++) 
    {
        if ((strcmp(stud[i].group, gr) == 0) && (strcmp(stud[i].univer, inst) == 0))
        {
            printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
            fprintf(fo, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
        }
    }
}
 
int main()
{
    SetConsoleOutputCP(1251); /*устанавливает кодировку ВЫВОДА на консоль*/
    SetConsoleCP(1251); /*устанавливает кодировку ВВОДА из консоли И ИЗ РЕДАКТОРА КОДА*/
    setlocale(LC_ALL, "Russian");
    int n = 0;
    int i = 0;
    char inst[20]; /*название института для поиска*/
    char gr[20]; /*номер группы для поиска*/
    char filename[50]; /*имя  файла*/
    
    FILE *fp; /*исходный файл*/
    FILE *fo;
    Student stud[size];
    printf("Программа предназначена для нахождения студентов, учащихся в одном институте и в одной группе\n");
    printf("Введите имя исходного файла/ путь к файлу\n");
    scanf("%s", filename);
    fp = fopen(filename, "r");  
    if (fp == NULL)
    {
        perror("Error opening file");
        return 0;
    }
    else
    {
        printf("Файл открыт для чтения\n");
        printf("Информация, считанная из файла\n\n");
        for (i = 0; !feof(fp); i++)
        {
            fscanf(fp, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
            printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
            n++;
        }
    }
    printf("\n");
    printf("Введите институт: ");
    scanf("%s", &inst);
    printf("Введите группу: ");
    scanf("%s", &gr);
    printf("\n");
    
    printf("Введите имя результирующего файла/ путь к файлу\n");
    scanf("%s", filename);
    fo = fopen(filename, "w+");
    if (fo == NULL)
    {
        perror("Error opening file");
        return 0;
    }
    else
    {
        printf("Файл открыт для записи\n");
        printf("Информация, записанная в файл\n\n");
        find(fo, stud, gr, inst, n);
    }
    system("pause");
    return 0;
}

Последний раз редактировалось KariLex; 10.06.2017 в 11:04.
KariLex вне форума Ответить с цитированием
Старый 10.06.2017, 13:52   #2
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Получается, что выводит только пару по первому совпадению, а нужно вывести всех

Код:
#include "stdafx.h"
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <windows.h> /*чтобы в консоли выводились русские символы*/
#define size 100
typedef struct
{
    char famly[20];
    char fName[20];
    char sName[20];
    char univer[20];
    char group[20];
} Student;

void find(FILE *fo, Student *stud, char *gr, char *inst, int n)
{
	int i,j;
	for (j=0; j<n;j++)
	{
	gr=stud[j].group;
	inst=stud[j].univer;
}
	for ( i = 0; i < n; i++) 
	{
		if ((strcmp(stud[i].group,gr) == 0) && (strcmp(stud[i].univer,inst) == 0))
		{
			printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
			fprintf(fo, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
		}
	}

}

int main()
{
	SetConsoleOutputCP(1251); /*устанавливает кодировку ВЫВОДА на консоль*/
    SetConsoleCP(1251); /*устанавливает кодировку ВВОДА из консоли И ИЗ РЕДАКТОРА КОДА*/
    setlocale(LC_ALL, "Russian");
    int n = 0;
    int i = 0;
    char inst[20]; /*название института для поиска*/
    char gr[20]; /*номер группы для поиска*/
    char filename[50]; /*имя  файла*/
    
    FILE *fp; /*исходный файл*/
    FILE *fo;
    Student stud[size];
    printf("Программа предназначена для нахождения студентов, учащихся в одном институте и в одной группе\n");
    printf("Введите имя исходного файла/ путь к файлу\n");
/*	scanf("%s", filename);
	fp = fopen(filename, "r");	*/
	fp=fopen("C:\\Users\\katia\\Desktop\\fin3.txt","r");
	if (fp == NULL)
	{
		perror("Error opening file");
		return 0;
	}
	else
	{
		printf("Файл открыт для чтения\n");
        printf("Информация, считанная из файла\n\n");
		for (i = 0; !feof(fp); i++)
		{
			fscanf(fp, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
			printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
			n++;
		}
	}
	printf("\n");
	
	
	printf("Введите имя результирующего файла/ путь к файлу\n");
/*	scanf("%s", filename);
	fo = fopen(filename, "w+");*/
	fo=fopen("C:\\Users\\katia\\Desktop\\fon.txt","w+");
	if (fo == NULL)
	{
		perror("Error opening file");
		return 0;
	}
	else
	{
		 printf("Файл открыт для записи\n");
        printf("Информация, записанная в файл\n\n");
		find(fo, stud, gr, inst, n);
	}
	system("pause");
	return 0;
}
Вложения
Тип файла: txt fIn3.txt (320 байт, 119 просмотров)

Последний раз редактировалось KariLex; 10.06.2017 в 13:54.
KariLex вне форума Ответить с цитированием
Старый 11.06.2017, 12:33   #3
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Практически получилось, только как избавиться от печати столько раз, сколько встречается институт и группа не пойму

Код:
#include "stdafx.h"
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <windows.h> /*чтобы в консоли выводились русские символы*/
#define size 100
typedef struct
{
	char famly[20];
	char fName[20];
	char sName[20];
	char univer[20];
	char group[20];
} Student;

void find(FILE *fo, Student *stud, char *gr, char *inst, int n)
{
	int i, j;	
	for (i = 0; i < n; i++)
	{
		j = 0;
		while (j < n)
		{
			if (i == j)
			{
				j++;
			}

			if ((strcmp(stud[i].group, stud[j].group) == 0) && (strcmp(stud[i].univer, stud[j].univer) == 0))
			{
				printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
				printf("%s %s %s %s %s\n", stud[j].famly, stud[j].fName, stud[j].sName, stud[j].univer, stud[j].group);
				j++;				
			}
			else {				
				j++;
			}
		}
	}
}

int main()
{
	SetConsoleOutputCP(1251); /*устанавливает кодировку ВЫВОДА на консоль*/
	SetConsoleCP(1251); /*устанавливает кодировку ВВОДА из консоли И ИЗ РЕДАКТОРА КОДА*/
	setlocale(LC_ALL, "Russian");
	int n = 0;
	int i,j;
	char inst[20]; /*название института для поиска*/
    char gr[20]; /*номер группы для поиска*/
	char filename[50]; /*имя  файла*/
	//char *gr, *inst;
	FILE *fp; /*исходный файл*/
	FILE *fo;
	Student stud[size];
	printf("Программа предназначена для нахождения студентов, учащихся в одном институте и в одной группе\n");
	printf("Введите имя исходного файла/ путь к файлу\n");
	
	
	/*	scanf("%s", filename);
	fp = fopen(filename, "r");	*/
	fp = fopen("C:\\Users\\Ekaterina\\Desktop\\fin3.txt", "r");
	if (fp == NULL)
	{
		perror("Error opening file");
		return 0;
	}
	else
	{
		printf("Файл открыт для чтения\n");
		printf("Информация, считанная из файла\n\n");
		for (i = 0; !feof(fp); i++)
		{
			fscanf(fp, "%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
			printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
			n++;
		}
	}
	printf("\n");


	printf("Введите имя результирующего файла/ путь к файлу\n");
	/*	scanf("%s", filename);
	fo = fopen(filename, "w+");*/
	fo = fopen("C:\\Users\\Ekaterina\\Desktop\\fon.txt", "w+");
	if (fo == NULL)
	{
		perror("Error opening file");
		return 0;
	}
	else
	{
		printf("Файл открыт для записи\n");
		printf("Информация, записанная в файл\n\n");
	    find(fo, stud, gr, inst, n);		
	}
	system("pause");
	return 0;
}
KariLex вне форума Ответить с цитированием
Старый 11.06.2017, 13:22   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Код:
void find(FILE *fo, Student *stud, char *gr, char *inst, int n)
{
	int i, j;
	for (i = 0; i < n; i++)
	{
	    /*bool b=false;*/
		j = i;
		while (++j < n)
		{
			if ((strcmp(stud[i].group, stud[j].group) == 0) && (strcmp(stud[i].univer, stud[j].univer) == 0))
			{
				/*if (!b)*/ printf("%s %s %s %s %s\n", stud[i].famly, stud[i].fName, stud[i].sName, stud[i].univer, stud[i].group);
				printf("%s %s %s %s %s\n", stud[j].famly, stud[j].fName, stud[j].sName, stud[j].univer, stud[j].group);
				/*b=true;*/
			}
		}
	}
}
Если нужны не только "пары", но ещё и "групповуха", то комментарии можно снять
eoln вне форума Ответить с цитированием
Старый 11.06.2017, 13:35   #5
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Если нужны не только "пары", но ещё и "групповуха", то комментарии можно снять
Все равно получается, что по несколько раз печатает, что с комментариями, что без

Если "пары" только, то все работает, а как только появляется одна или несколько "групп", что-то не так идет. Если группа из 3 человек, то 2ой прописывается два раза
Изображения
Тип файла: png инст.png (25.0 Кб, 101 просмотров)

Последний раз редактировалось KariLex; 11.06.2017 в 13:43.
KariLex вне форума Ответить с цитированием
Старый 11.06.2017, 14:06   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Правильно будет удалять выведенных из списка или же "неправильно испортить" сравнение, например, добавив что-то типа
Код:
*stud[j].group=char(j);
после b=true;
eoln вне форума Ответить с цитированием
Старый 11.06.2017, 14:15   #7
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
*stud[j].group=char(j);
Все работает, спасибо. А подскажите пожалуйста, что это за действие? Не встречала еще такого
KariLex вне форума Ответить с цитированием
Старый 11.06.2017, 14:37   #8
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Просто смена группы у человека (по сути портим данные), в результате сравнение
Код:
(strcmp(stud[i].group, stud[j].group) == 0)
будет ложно
eoln вне форума Ответить с цитированием
Старый 12.06.2017, 17:47   #9
KariLex
Пользователь
 
Регистрация: 01.04.2017
Сообщений: 27
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
*stud[j].group=char(j);
Скажитее, а если я компилирую в Си и пишет expected expression before 'char', как это можно исправить?
KariLex вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выяснить, верно ли, что в данном тексте больше групп букв, чем групп цифр. jthr C# (си шарп) 6 20.04.2016 06:57
Выяснить, верно ли, что в данном тексте больше групп букв, чем групп знаков Pinguin007 Паскаль, Turbo Pascal, PascalABC.NET 4 28.02.2016 12:16
Дан целочисленный массив размера N, содержащий ровно два одинаковых элемента. Найти номера одинаковых элементов и вывести эти номе Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 1 23.12.2011 22:07