Консультация № 197486
23.12.2019, 17:08
0.00 руб.
0 6 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Есть программа на С
Код:

#include <stdio.h>
#include <conio.h>
#include <string.h>

main()
{
struct rec
{
char name[15], fam[15],
kl[15], god[15];
};

struct rec array[100];
FILE *f;
int i, c=0, j;

f = fopen("new1.txt","r");
while (! feof(f))
{
fscanf(f,"%s",array[c].fam);
fscanf(f,"%s",array[c].name);
fscanf(f,"%s",array[c].kl);
fscanf(f,"%s",array[c].god);
c++;
}
fclose(f);
printf("Однофамильцы:\n");
for (i=0; i<=c; i++)
for (j=i+1; j<c; j++)
if (strcmp(array[i].fam, array[j].fam) == 0)
printf("%s %s %s %s - %s %s %s %s\n",array[i].fam, array[i].name, array[i].kl, array[i].god,
array[j].fam, array[j].name, array[j].kl, array[j].god);
getch();
}

Он ищет однофамильцев из базы данных. Программа работает оптимально за исключением одного момента- при проверке базы данных счетчик срабатывает сам на себя. Прошу помочь устранить эту проблему, так чтобы при нахождении однофамильцев он не выводил сам себя. Прикрепляю базу данных однофамильцев
new1.txt (164 байт)


Приложение:
new1.txt (164 байт)

Обсуждение

давно
Старший Модератор
31795
6196
23.12.2019, 17:14
общий
23.12.2019, 17:16
Адресаты:
Код:
    for (i=0; i<=c; i++)
for (j=i+1; j<c; j++)

Пробуйте так:
i<с-1
j<c
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403591
2
23.12.2019, 17:19
общий
Адресаты:
Это цикл в цикле?
Или под второй переменной вы имели ввиду j
i<c-1
j<c ?
давно
Старший Модератор
31795
6196
23.12.2019, 17:31
общий
Адресаты:
Цитата: Rostislav Dubsky
Или под второй переменной вы имели ввиду j

Да именно это я и подразумевал.(я выше исправил раньше).
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
23.12.2019, 18:07
общий
Адресаты:
Я бы вывел всех однофамильцев в ряд.
Например, так:
Код:
#define _CRT_SECURE_NO_WARNINGS //чтоб MS не требовала функции с суффиксом _s

#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
struct rec
{
char name[15], fam[15],
kl[15], god[15];
};

struct rec array[100];
FILE *f;
int i, c = 0, j, count;
bool used[100] = { false };

f = fopen("new1.txt", "r");
while (!feof(f))
{
fscanf(f, "%s", array[c].fam);
fscanf(f, "%s", array[c].name);
fscanf(f, "%s", array[c].kl);
fscanf(f, "%s", array[c].god);
c++;
}
fclose(f);
printf("Однофамильцы:\n");
for (i = 0; i < c - 1; i++)
{
if (false == used[i]) //==true, если был найден ранее
{
count = 0;
for (j = i + 1; j < c; j++)
{
if (strcmp(array[i].fam, array[j].fam) == 0)
{
used[j] = true;
if (++count == 1)
printf("%s %s %s %s", array[i].fam, array[i].name, array[i].kl, array[i].god);
printf(", %s %s %s %s", array[j].fam, array[j].name, array[j].kl, array[j].god);
}
}
if (count)
printf("\n");
}
}
_getch();
return 0;
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403591
2
23.12.2019, 19:41
общий
Адресаты:
Спасибо за совет, работает на ура
давно
Старший Модератор
31795
6196
23.12.2019, 20:04
общий
это ответ
Здравствуйте, Rostislav Dubsk?!

Тут Вам нужно разобраться с индексами:
Код:
    for (i=0; i<=c; i++)
for (j=i+1; j<c; j++)

Пробуйте так:
i<с-1
j<c


Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа