Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] помогите найти ошибки, файлы, массивы и сортировка 
V
    Опции темы
LeShin
  Дата 25.12.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 11.12.2009

Репутация: -1
Всего: -1



Народ, возникла такая проблема: программу нужную я написал(прогр сортировки чисел\строк запускается из командной строки и должна поддерживать следующие опции или их комбинации: -a (прямая сортировка по возрастанию, выполняется по умолчанию), -d (сортировка по убыванию), -u (уникальные значения),  -o(вывод в файл, адрес файла после этой опции) и адрес_файла_с_исходными_данными. (если файл не указан, то считывание с экрана) )причем первое число на экране\в файле- количество элементов.


помогите пожалуйста выловить баги. одна из ошибок происходит предположительно в районе 70-80 строки

Это сообщение отредактировал(а) LeShin - 26.12.2009, 23:11
PM MAIL   Вверх
zim22
Дата 25.12.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(LeShin @  25.12.2009,  10:01 Найти цитируемый пост)
помогите пожалуйста выловить баги

отладчиком пользоваться уже не модно?


--------------------
PM MAIL   Вверх
LeShin
Дата 25.12.2009, 11:27 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 11.12.2009

Репутация: -1
Всего: -1



ну если бы он мне смог помочь, то меня бы здесь не было, ннэ?
просто, если уж я пошел просить помощи у знающих людей, то это значит, что мои резервы уже исчерпаны и помочь мне можете только вы. а ты тут сразу грубить начинаешь...

Это сообщение отредактировал(а) LeShin - 25.12.2009, 11:36
PM MAIL   Вверх
xvr
Дата 25.12.2009, 11:46 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Конструкция if(fopen(argv[flgo], "r")!=NULL){ открывает на чтение неизвестно что (в flgo лежит именно флаг - 1 или 0)

Строки так if  (inDataC[i]!=inDataC[i+1]) не сравнивают (используйте strcmp)

Далее - зачем в main'е отдублированны 2 раза куски чтения из файла и записи в файл? (Hint: для стандартного ввода вывода есть стандартные файлы - stdinstdout называются. И fscanf/fprintf с ними замечательно работают)

PM MAIL   Вверх
LeShin
Дата 25.12.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 11.12.2009

Репутация: -1
Всего: -1



stdin, stdout использовать я не могу по условию. остальное учел, но проблемы остались. может еще что?
PM MAIL   Вверх
zim22
Дата 25.12.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(LeShin @  25.12.2009,  11:55 Найти цитируемый пост)
остальное учел, но проблемы остались. может еще что?

сделай корректную(работающую) программу с минимальной функциональностью. (без чтения из файла, с одной единственной сортировкой, и т.д.)
и только потом, когда мини-прога начнёт работать -  начинай в неё добавлять оставшиеся фичи.


--------------------
PM MAIL   Вверх
LeShin
Дата 4.1.2010, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 11.12.2009

Репутация: -1
Всего: -1



Программу я отладил. Некорректна лишь под дебианом. Пользуйтесь кому надо на здоровье) можете выпить за меня)))
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
#define MAX_LEN 100

void numSort (float *numbPtr[], int kolvo);
void sSort (char *strPtr[], int kolvo);

void sSort (char *strPtr[], int kolvo){//подпрограмма реализует сортировку строк методом пузырька
int i,j;// переменные для итераций
char *tmp;//ссылка на переменную временного хранения значения
    for (i = 0; i < kolvo-1; i++)
        for (j = i + 1; j < kolvo; j++)
            if (strcmp(strPtr[i], strPtr[j]) > 0){
                tmp = strPtr[i];
                strPtr[i] = strPtr[j];
                strPtr[j] = tmp;
            }
    }

void numSort(float *numbPtr[], int kolvo){//подпрограмма реализует сортировку чисел методом пузырька
int i,j;//переменные для итераций
float tmp = 0;//переменная временного хранения значения
    for (i = 0; i < kolvo-1; i++)
        for (j = i + 1; j < kolvo; j++)
            if (*numbPtr[i] > *numbPtr[j]){
                tmp = *numbPtr[i];
                *numbPtr[i] = *numbPtr[j];
                *numbPtr[j] = tmp;
            }
}


int main(int argc, char *argv[]) {
int i,cas, c, kolvo, argcTemp;//переменные для итераций, и хранения значений
int inTypeC, mra = 1,mrd = 0, mru = 0, mro = 0;// переменные-маркеры(типа и опций)
char **inDataC;//м. для строк
float **inDataN;//м. для чисел
char *inStr;// строки
char *argvTemp[MAX_LEN];
FILE *infile, *outfile;
argcTemp = argc;
if (argcTemp==1){
    printf ("Please,enter correct options\n ");
     exit (0) ;
    }
else {
for (i = 0; i < argc; i++)
        argvTemp[i] = (char *)calloc(100, sizeof(char));
    for (i = 0; i < argc; i++){
        argvTemp[i] = argv[i];
        printf("Used options and addresses %d\t%s\n", i, argv[i]);
    }
    while (--argc > 0 && (*++argv)[0] == '-')//блок проверки опций и адресов из командной строки
    while (cas = *++argv[0])
        switch (cas){
            case 'A': case 'a':
                mra = 1;
              break;
            case 'D': case 'd':
                mrd = 1;
                mra = 0;
              break;
            case 'O': case 'o':
                mro = 1;
                printf("File for writing \t%s\n", argv[0]+3);
                outfile = fopen (argv[0]+3, "w");
              break;
            case 'u': case 'U':
                mru = 1;
              break;
            default:
                printf("Please, enter correct options %c\n", cas);// случай неверной опции
                argc = 0;
                exit (0) ;
              break;
            }
        inStr=(char*)calloc(MAX_LEN,sizeof(char));
        printf("Reading file name\t%s\n", argv[mro]);
        if(fopen(argv[mro], "r")!=0){//проверка открытия  файла
            infile = fopen(argv[mro], "r");
            printf("File opened\n");
            fscanf(infile, "%s", inStr);
            kolvo = atoi(inStr);//определене количества элементов в файле
        for (i = 0; i < kolvo; i++){
            c=0;
        while (c<1){
            fscanf(infile, "%s",inStr);
            c=strlen(inStr);}//определение длинны
        if (i==0){
            inTypeC = isalpha(*inStr);//определение типа содержимого
        if (inTypeC)
            inDataC=calloc(kolvo,sizeof(char*));//случай строчного содержимого
        else
            inDataN=calloc(kolvo,sizeof(float*));// случай числового содерж
                }
        if (inTypeC){
            *(inDataC+i)=(char*)calloc(c,sizeof(char));
            strncpy(*(inDataC+i),inStr,c+1);// занесение данных в массив(строка)
                }
        else{
            *(inDataN+i)=(float*)malloc(sizeof(float));
            *inDataN[i]=atof(inStr);// занесение данных в массив (цифр)
        }
    }
}
        else{// считывание с экрана
            printf ("Incorrect file name or 2nd regime\n ");
            printf ("Please, enter quantity of elements\n");
            scanf ("%d", &kolvo);// считывание количества элем
            printf ("Please, enter the elements\n");
        for (i = 0; i < kolvo; i++){
            c=0;
        while (c<1){
            scanf("%s",inStr);
            c=strlen(inStr);// определение длинны
                }
        if (i==0){
            inTypeC = isalpha(*inStr);// опред типа
        if (inTypeC)
            inDataC=calloc(kolvo,sizeof(char*));// инициация массива строк
        else
            inDataN=calloc(kolvo,sizeof(float*));//иниц массива чисел
                }
        if (inTypeC){//заполнение массива строк
            *(inDataC+i)=(char*)calloc(c,sizeof(char));
            strncpy(*(inDataC+i),inStr,c+1);
        }
        else{//заполнение массива числового
            *(inDataN+i)=(float*)malloc(sizeof(float));
            *inDataN[i]=atof(inStr);
        }
    }
}
}
        if ( inTypeC ){//текстовое содержимое. блок вызова сортировки и выполнения опций
            sSort (inDataC,  kolvo);// вызов подпрогр сортировки
        if (mra==1){//прямая сортировка
            printf ("Mode: normal string's sorting");
        if (mru==1){//уник значения
        printf (" + Unique values\n");
        if (mro==1){//в файл
            fprintf(outfile,"%s\n" , inDataC[0]);
        for (i = 0; i < kolvo-1; i++){
        if  ((strcmp(inDataC[i], inDataC[i+1]))!=0){
            fprintf(outfile, "%s\n",  inDataC[i+1]);
        }
    }
            printf ("\nFile recording is executed\n");
}
        else{//на экран
            printf ("Result of sorting\n");
            printf("%s\n" , inDataC[0]);
        for(i = 0; i < kolvo-1; i++){
        if  ((strcmp(inDataC[i],inDataC[i+1]))!=0){
                printf("%s\n", inDataC[i+1]);
            }

        }
    }
}
        else{//не уник (общий случай)
            printf("\n");
            if (mro==1){// в файл
        for (i = 0; i < kolvo; i++){
            fprintf(outfile, "%s\n",  inDataC[i]);}
            printf ("\nFile recording is executed\n");}
        else{//на экран
            printf ("Result of sorting\n");
        for (i = 0; i < kolvo; i++){
                printf("%s\n", inDataC[i]);
            }
        }
    }
}
        else{//обратная сортировка (d)
            printf ("Mode: return string's sorting");
        if (mru==1){// уники
        printf (" + Unique values\n");
        if (mro==1){// в файл
            fprintf(outfile, "%s\n", inDataC[kolvo-1]);
        for (i = kolvo-1; i > 0; i--){
        if  ((strcmp(inDataC[i],inDataC[i-1]))!=0)
            fprintf(outfile, "%s\n",  inDataC[i-1]);
}
            printf ("\nFile recording is executed\n");}
        else{//на экран
            printf ("Result of sorting\n");
            printf("%s\n", inDataC[kolvo-1]);
        for(i = kolvo-1; i > 0; i--){
        if  ((strcmp(inDataC[i],inDataC[i-1]))!=0)
                printf("%s\n", inDataC[i-1]);
            }
        }
    }
        else{//не уники(общ, обратная)
            printf("\n");
            if (mro==1){
        for (i = kolvo-1; i>= 0; i--){
            fprintf(outfile, "%s\n",  inDataC[i]);}
            printf ("\nFile recording is executed\n");
            }
        else{//экран(общ, обратная)
            printf ("Result of sorting\n");
        for (i = kolvo-1; i>= 0; i--){
                printf("%s\n", inDataC[i]);
                }
            }
        }
    }
}
        else{//num содержимое. блок вызова сортировки и выполнения опций
           numSort (inDataN,  kolvo);
        if (mra==1){//прямая сортировка
            printf ("Mode: normal num's sorting");
        if (mru==1){// уники
            printf (" + Unique values\n");
        if (mro==1){//в файл
            fprintf(outfile,"%.3f\n" , *inDataN[0]);
        for (i = 0; i < kolvo-1; i++){
        if  ((*inDataN[i])!=(*inDataN[i+1]))
            fprintf(outfile, "%.3f\n",  *inDataN[i+1]);
    }
            printf ("\nFile recording is executed\n");
}
        else{//экран
            printf ("Result of sorting\n");
            printf("%.3f\n", *inDataN[0]);
        for(i = 0; i < kolvo-1; i++){
        if  ((*inDataN[i])!=(*inDataN[i+1])){
                printf("%.3f\n", *inDataN[i+1]);
            }
        }
    }
}
        else{//нет уников(общ)
            printf("\n");
            if (mro==1){// файл
        for (i = 0; i < kolvo; i++){
            fprintf(outfile, "%.3f\n",  *inDataN[i]);}
            printf ("\nFile recording is executed\n");}
        else{//экран
            printf ("Result of sorting\n");
        for (i = 0; i < kolvo; i++){
                printf("%.3f\n", *inDataN[i]);
            }
        }
    }
}
        else{//обратная сортировка (d)
            printf ("Mode: return num's sorting");
        if (mru==1){// уники
        printf (" + Unique values\n");
        if (mro==1){// файл
            fprintf(outfile, "%.3f\n", *inDataN[kolvo-1]);
        for (i = kolvo-1; i > 0; i--){
        if  ((*inDataN[i])!=(*inDataN[i-1])){
            fprintf(outfile, "%.3f\n",  *inDataN[i-1]);
            }
        }
            printf ("\nFile recording is executed\n");}
        else{//экран
            printf ("Result of sorting\n");
            printf("%.3f\n", *inDataN[kolvo-1]);
        for(i = kolvo-1; i >0; i--){
        if  ((*inDataN[i])!=(*inDataN[i-1])){
                printf("%.3f\n", *inDataN[i-1]);
                }
            }
        }
    }
        else{//нет уников
            printf("\n");
            if (mro==1){
        for (i = kolvo-1; i >= 0; i--){
            fprintf(outfile, "%.3f\n",  *inDataN[i]);}
            printf ("\nFile recording is executed\n");
            }
        else{//экран
            printf ("Result of sorting\n");
        for (i = kolvo-1; i >=0; i--) {
                printf("%.3f\n", *inDataN[i]);
                }
            }
        }
    }
}
int fcloseall();//закрытие потоков
free (*inDataC);//очищение  соотв области памяти
free (*inDataN);//очищение  соотв области памяти
free (*inStr);//очищение  соотв области памяти
free (*argvTemp);//очищение  соотв области памяти
return 0;
}




программа громоздкая и страшная, но кому-нибудь  может и пригодиться.
тема закрыта


ну я забыл уточнить, что она запускается по определенной форме (адрес_программы -опции (файл для вывода если есть) адрес_файла_с_исходными_данными  ) таковым было требование тех задания. (не веришь-могу кинуть задание) можно конечно запускать через жопу, но зачем?
to xvr: не разобравшись кидаться тяжелыми предметами не стоит, кем-то уважаемый xvr, ибо не правильно это... 
для народа будет хотя бы какой-то конкретный пример... да и  истекать ядом и сарказмом по постам - это такой признак профессионализма теперь?! я конечно благодарен тебе за ту помощь, но сарказм как-то не конструктивен, я то пока еще только учусь программировать.
  в конце концов:"не стреляйте в пианиста, он играет как умеет". ты-то тоже пожалуй начинал с "привет мир", да и С я учил пока лишь один семестр...
PS выпьешь за меня яду- буду благодарен smile 

Это сообщение отредактировал(а) LeShin - 7.1.2010, 18:43
PM MAIL   Вверх
xvr
Дата 4.1.2010, 11:38 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(LeShin @ 4.1.2010,  00:05)
Программу я отладил. Некорректна лишь под дебианом. 

Она не корректна нигде  smile Попробуйте ее запустить так: <proga> <input file> -o <output file>
Цитата

Пользуйтесь кому надо на здоровье) 
Если только в качестве диверсии
Цитата

можете выпить за меня)))
Яду?  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1320 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.