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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запуск программы из командной строки 
:(
    Опции темы
marina12
Дата 14.5.2013, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Программа сортирует числа из файла "chisla.txt" и строки из файла "stroki.txt" методом пузырька.
 
Код

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
void BubbleSortchisel(double *arr, int n) //функция сортировки вещественных чисел
{
    double temp; //работаем с переменной в цикле
    while(--n) //сортировка пузырьком (уменьшаем количество проверяемых чисел)
    for (int i=0; i<n ;i++) //i - номер элемента массива
    {
            if ( *(arr+i) > *(arr+i+1) ) 
        {
             temp = *(arr+i);
         *(arr+i) = *(arr+i+1);
         *(arr+i+1) = temp;
         }
        }
}
void bubble_sort(char *array[], int size) 

    char *temp; int i,j; 
    for(i=0;i<size;i++) 
        for(j=0;j<size;j++) 
            if(strcmp(array[i],array[j]) < 0) 
                temp=array[i],
                array[i]=array[j],
                array[j]=temp; 

int _tmain(int argc, _TCHAR* argv[])
{
    FILE  *fin1;
    fin1=fopen("chisla.txt","r"); // открываем файл для чтения
int amount = 0;
    double *darr; // массив чисел
    fseek(fin1,0,SEEK_END);
    int fsize1 = ftell(fin1);
    fseek(fin1,0,SEEK_SET);
   if ( !(darr = (double *)calloc(fsize1,sizeof(double)) ) )
    {
         fprintf(stderr,"osibka raspredeleniya pamyati!\n");
    }
    if (fin1==NULL)
    {
        fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
    } 
    for ( ; fscanf (fin1, "%lf", darr+amount) != EOF ; ++amount );  //сканируем файл до тех пор пока он не кончится 
    
    printf("After sorting:\n");
    BubbleSortchisel(darr , amount);
    for (int i=0; i<amount; i++)
    {
        printf("%4.4lf\n", *(darr+i));
    }
    free(darr);
    fclose(fin1);
    char *m,**v,t=0,c; 
    int j,i,k=0,l; 
    FILE* fin2; 
    fin2=fopen("stroki.txt","rb");
    if(fin2==NULL) 
        {
            fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
        }
    fseek(fin2,0,SEEK_END);
int fsize2=ftell(fin2); // кол-во симв. в файле
    fseek(fin2,0,SEEK_SET);
    if (!(m=(char*)malloc(fsize2+1))) // под терминирующий ноль 1
        {
        fprintf(stderr,"osibka raspredeleniya pamyati!\n");
        }
     for(j = 0, i = 0; j < fsize2 + 1;j++,i++) //массив символов
     {
         c=fgetc(fin2);
         if (c=='\n' || c==EOF)
         {
             k++;
             m[i]='\0';
             continue;
         }
         if(c == EOF)
             break;
         m[i] = c;
     }
     v=(char**)malloc(sizeof(*v)*k); //массив строк
     for(v[0]=&m[0],l=j=1;l<k;j++)
     {
         if(m[j]=='\0')
         {
             v[l++]=&m[j+1];
         }
     }
     printf("After sorting:\n");
     bubble_sort(v, k);
     for(j=0;j<k;j++)
{
         printf("%s\n",v[j]);
     }
     free(m);
     free(v);
     fclose(fin2);
     return 0;
}

Помогите пожалуйста,как сделать так,чтобы программа запускалась из командной строки, при этом имя файла передавалось бы в виде первого параметра командной строки,а второй параметр командной строки определял бы тип файла:
•    -n – числовые значения 
•    -s – строковые значения
То есть команда prog.exe chisla.txt –n должна запустить сортировку числовых значений, считываемых из файла chisla.txt. Команда prog.exe stroki.txt –s должна запустить сортировку строковых значений, считываемых из файла stroki.txt.
Или приведите примеры, как работать с параметрами...
Заранее спасибо!
PM MAIL   Вверх
fish9370
Дата 14.5.2013, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(marina12 @  14.5.2013,  18:33 Найти цитируемый пост)
Или приведите примеры, как работать с параметрами


количество переданных аргументов хранится в argc
Код

printf("number of arguments: %d", argc);


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

prrinf("program name: %s", argv[0]);


обработать можно как-то так:
Код

for (i = 1; i < argc; i++) {
      check_param(argv[i]);
}



по принципу конечного автомата

в линуксе конечно, можно сделать поинтереснее

Это сообщение отредактировал(а) fish9370 - 14.5.2013, 19:34


--------------------
undefined
PM MAIL WWW ICQ   Вверх
marina12
Дата 14.5.2013, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот попробовала, что неправильно?
Код

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
void BubbleSortchisel(double *arr, int n) //функция сортировки вещественных чисел
{
    double temp; //работаем с переменной в цикле
    while(--n) //сортировка пузырьком (уменьшаем количество проверяемых чисел)
    for (int i=0; i<n ;i++) //i - номер элемента массива
    {
            if ( *(arr+i) > *(arr+i+1) ) 
        {
             temp = *(arr+i);
         *(arr+i) = *(arr+i+1);
         *(arr+i+1) = temp;
         }
        }
}
void bubble_sort(char *array[], int size) 

    char *temp; int i,j; 
    for(i=0;i<size;i++) 
        for(j=0;j<size;j++) 
            if(strcmp(array[i],array[j]) < 0) 
                temp=array[i],
                array[i]=array[j],
                array[j]=temp; 

char *m,**v,t=0,c; 
    int j,i,k=0,l; 
    FILE* fin2;
    FILE  *fin1;
     int amount = 0;
    double *darr; // массив чисел
int main(int argc, char* argv[])
{
    if (argc != 3) 
    {
        fprintf(stderr, "ERROR: Input filename and mode\n");
        return -1;
    }
    if (!strcmp("-s", argv[2])) 
    {
        fin2=fopen(argv[1], "rb");
        if(fin2==NULL) 
        {
            fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
        }
        fseek(fin2,0,SEEK_END);
        int fsize2=ftell(fin2); // кол-во симв. в файле
        fseek(fin2,0,SEEK_SET);
        if (!(m=(char*)malloc(fsize2+1))) // под терминирующий ноль 1
        {
            fprintf(stderr,"osibka raspredeleniya pamyati!\n");
        }
        for(j = 0, i = 0; j < fsize2 + 1;j++,i++) //массив символов
        {
            c=fgetc(fin2);
            if (c=='\n' || c==EOF)
            {
                k++;
                m[i]='\0';
                continue;
            }
            if(c == EOF)
                break;
            m[i] = c;
        }
        v=(char**)malloc(sizeof(*v)*k); //массив строк
        for(v[0]=&m[0],l=j=1;l<k;j++)
        {
            if(m[j]=='\0')
            {
                v[l++]=&m[j+1];
            }
        }
        printf("After sorting:\n");
        bubble_sort(v, k);
        for(j=0;j<k;j++)
        {
            printf("%s\n",v[j]);
        }
        free(m);
        free(v);
        fclose(fin2);
    } 
    else 
        if (!strcmp("-n", argv[2])) 
        {
            fin1=fopen(argv[1], "r");
            fseek(fin1,0,SEEK_END);
            int fsize1 = ftell(fin1);
            fseek(fin1,0,SEEK_SET);
            if ( !(darr = (double *)calloc(fsize1,sizeof(double))))
            {
                fprintf(stderr,"osibka raspredeleniya pamyati!\n");
            }
            if (fin1==NULL)
            {
                fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
            } 
            for ( ; fscanf (fin1, "%lf", darr+amount) != EOF ; ++amount );    //сканируем файл до тех пор пока он не кончится
            printf("After sorting:\n");
            BubbleSortchisel(darr , amount);
            for (int i=0; i<amount; i++)
            {
                printf("%4.4lf\n", *(darr+i));
            }
            free(darr);
            fclose(fin1);
        } 
        else 
        {
            fprintf(stderr, "ERROR: Wrong mode\n");
        }
        return 0;
}

Ошибку выдаёт...

Это сообщение отредактировал(а) marina12 - 14.5.2013, 21:52

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Безымянный.png 124,30 Kb
PM MAIL   Вверх
feodorv
Дата 15.5.2013, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(marina12 @  14.5.2013,  22:40 Найти цитируемый пост)
что неправильно?

Если файл не открыт, то смысла в последующем коде нет. Поэтому:
Цитата(marina12 @  14.5.2013,  22:40 Найти цитируемый пост)
       if(fin2==NULL) 
        {
            fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
            return -1;
        }

Почему произошла ошибка открытия файла - другой вопрос. Можно, например, так поступить:
Код

...
#include <errno.h>
...
         if( fin2 == NULL ) 
        {
            fprintf( stderr, "Oshibka otkrutiya faila %s dlya chteniya: %s\n", argv[1], strerror(errno));
            return -1;
        }


Добавлено через 5 минут и 51 секунду
Цитата(marina12 @  14.5.2013,  22:40 Найти цитируемый пост)
            fin1=fopen(argv[1], "r");
            fseek(fin1,0,SEEK_END);
            int fsize1 = ftell(fin1);
            fseek(fin1,0,SEEK_SET);
            if ( !(darr = (double *)calloc(fsize1,sizeof(double))))
            {
                fprintf(stderr,"osibka raspredeleniya pamyati!\n");
            }
            if (fin1==NULL)
            {
                fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
            } 

А здесь некоторый бардак наблюдается))) По крайней мере, проверку fin1 на NULL нужно делать сразу после fopen, а не спустя 10 строчек. Да и ретурны нужны в случаях возникновения ошибки...
А зачем вам массив double-чисел размером с число байт файла? Чтобы наверняка?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
fish9370
Дата 15.5.2013, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Марина, давай приведем твой код в порядок?

поделим программу на отдельные логические блоки (функции), например:

- сортировка пузырьком
- чтение данных из файла
- анализ параметров командной строки
- исполнение программы (main)

оформим код красиво, и тогда, поверь, все станет легко и приятно

Добавлено через 13 минут и 55 секунд
еще пара замечаний,

текстовый файл лучше всего читать построчно (это спрячет один внутренний цикл, программа станет меньше):

Код

char line[4096];
while (fgets(line, sizeof(line), f)) {
     printf("%s\n", line);
}


параметры должны быть примерно так (так принято)

Код

progname -s <sortfile>


т.е. имя файла указывается как дополнительный параметр к параметру -s

и займись английским, он не такой сложный, а в жизни пригодится


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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