Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Не могу избавиться от повторяющихся значений


Автор: m0zg 11.12.2007, 10:06
Уже поднимал тему по этой задаче на форуме. Но тогда вопрос был другого плана. Теперь возникла проблема избавиться от повторяющихся чисел. Пытаюсь это сделать при помощи функции findRepeat, но что-то не получается. В чём проблема?


Код

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

int findRepeat(char* numbers, size_t sz){
    int i, j;
    for (i=0; i<sz-1; i++)
        for (j=i+1; j<sz; j++){
            if (numbers[i] == numbers[j]) return j;
        }
    return -1;
}

int bfile(FILE *bfile)
{
    int i, buf[10], j, tmp, a;
    char numbers[10];
    for(i=0;i<10;i++){
        buf[i] = rand()%10;
    }

    if(!(bfile = fopen("binary.txt", "w"))){
        perror("Could't open file");
        return;
    }
    
    for(i=0;i<SIZE;i++){
    if(!(fprintf(bfile, "%d", buf[i]))){
         perror("Could't write into file");
         return;
    }
    }
    fclose(bfile);
    
    if(!(bfile = fopen("binary.txt", "r"))){
        perror("Could't open file for reading");
        return;
    }
    if(!(fgets(numbers, sizeof(buf), bfile))){
        perror("Could't read from binary.txt");
        return;
    }

    for(i=0;i<SIZE-1;i++){
        for(j = i+1;j<SIZE;j++){
            if(numbers[i] > numbers[j]){
                tmp = numbers[i];
                numbers[i] = numbers[j];
                numbers[j] = tmp;
            }
        }
    }    

    findRepeat(numbers, sizeof(numbers)/sizeof(numbers[0]));
    //puts(numbers);
    tfile(numbers);
    fclose(bfile);
    return 0;
}

int tfile(char *numbers)
{
    FILE *tfile;
    int i;
    if(!(tfile = fopen("text.txt", "w"))){
        perror("Could't open text file");
        return;
    }
    if(!(fputs(numbers, tfile))){
    perror("Could't write into file");
     return;
    }
    fclose(tfile);
}

int main()
{
    FILE *bf;
    bfile(bf);
    printf("Ok\n");
}


Автор: Rodman 11.12.2007, 10:14

M
Rodman
Модератор: Название темы должно отражать ее суть!

Автор: m0zg 11.12.2007, 10:35
А разве не отражает? В теме суть проблемы.

Автор: Silent_s 11.12.2007, 11:14
На мой взгляд не совсем отражает, не все же читали твою предыдущую тему! По этому пиши для чего хоть программа! smile 

Автор: ama_kid 11.12.2007, 11:19
m0zg, непонятно от повторяющихся значения чего ты хочешь избавиться? Если от значений, генерируемых функцией rand() - тогда в начале программы вызови randomize() - и у тебя вместо псевдо-случайных будут генериться случайные числа...

Автор: m0zg 11.12.2007, 11:27
Вот суть самой программы
Дан двоичный файл, содержащий целые числа. Сформировать текстовый файл, в котором эти числа записаны в одну строку в порядке возрастания без повторяющихся значений. Программа должна производить проверку особых ситуаций при операциях ввода/вывода.

через rand() я пишу в файл случаные числа, потом их сортирую по возрастанию, потом бы надо избываться от повторяющихся числе и оставить только уникальные значения, а потом полученный результат записать в новый файл. Всё получилось, кроме избавления от повторяющихся :(.

Вот, кстати, предыдущая тема
http://forum.vingrad.ru/forum/topic-183797.html


функция bfile записывает в файл произвольные целые цисла, сортирует их, вызывает функцию findRepeat для вырезки повторяющихся (только не вырезает smile) и потом вызывается функция tfile, которая создаёт новый файл и пишет новую отсортированную без повторяющихся значений последовательность

Автор: ama_kid 11.12.2007, 11:47
m0zg, как-то ты умудрился встроить функцию findRepeat так, что она абсолютно бесполезна... Не понял её смысл, если честно... У тебя ведь получается отсортированный массив? Ну так почему бы не вывести след. образом: вместо кода
Код
    if(!(fputs(numbers, tfile))){
    perror("Could't write into file");
     return -1;
    }
вставь код потипу такого:
Код
    for (i=0;i<SIZE;i++)
    {
     if ((i==0)||(numbers[i]!=numbers[i-1]))
      fputc(numbers[i],tfile);
    }
Ввиду того, что массив у тебя отсортированный - если текущее записываемое значение равно предыдущему - то оно просто не запишется в файл...

Автор: m0zg 11.12.2007, 11:53
Спасибо огромное!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)