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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2013, 18:33   #1
marina12
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 28
По умолчанию запуск из командной строки

Здравствуйте!
Программа сортирует числа из файла "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.
Или приведите примеры, как работать с параметрами...
Заранее спасибо!
marina12 вне форума Ответить с цитированием
Старый 14.05.2013, 20:00   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
int
main(int argc, char *argv[])
{
    if (argc != 3) {
        fprintf(stderr, "ERROR: Input filename and mode\n");
        return -1;
    }
    if (!strcmp("-s", argv[2])) {
        fopen(argv[1], "rb");
        // работа
    } else if (!strcmp("-n", argv[2])) {
        fopen(argv[1], "r");
        // работа
    } else {
        fprintf(stderr, "ERROR: Wrong mode\n");
    }
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.05.2013, 22:54   #3
marina12
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 28
По умолчанию

вот попробовала, что неправильно?ошибку выдает...
Код:
#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;
}
Изображения
Тип файла: jpg Безымянный.jpg (36.6 Кб, 118 просмотров)
marina12 вне форума Ответить с цитированием
Старый 14.05.2013, 23:05   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Во-первых, не strcmp("-s", argv[2]), а !strcmp("-s", argv[2]) - восклицательный знак обязателен.
Во-вторых,
Код:
if (fin1==NULL) {
    fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n");
    return -1;
}
Если файл не открыт, то нужно завершать работу программы, а не продолжать пытаться что-то делать.
Файл не был найден в папке. Было выдано сообщение. Затем программа пытается делать seek по не открытому файлу.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.05.2013, 23:13   #5
marina12
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 28
По умолчанию

А почему файлы могут у меня не открываться? В папке они лежат...
marina12 вне форума Ответить с цитированием
Старый 14.05.2013, 23:16   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Около exe файла?
(Все равно, при возникновении ошибки нужно прекращать работу)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.05.2013, 23:24   #7
marina12
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 28
По умолчанию

да,в той же папке,где и exe файл
marina12 вне форума Ответить с цитированием
Старый 15.05.2013, 09:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от marina12 Посмотреть сообщение
да,в той же папке,где и exe файл
ну, вы программу, надеюсь запускаете из консоли? (Пуск - Все программы - Стандартные - Командная строка)
и при этом не забываете перейти в папку программы, конечно!

если с ярлычка - то там могут быть нюансы с текущей(рабочей) папкой!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.05.2013, 13:27   #9
marina12
Пользователь
 
Регистрация: 13.02.2013
Сообщений: 28
По умолчанию

Большое спасибо за ответы, все получилось, был неправильно прописан путь к txt файлам
marina12 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск командной строки Glob Общие вопросы Delphi 2 10.10.2012 10:33
Запуск из командной строки zheka1 Общие вопросы по Java, Java SE, Kotlin 1 19.05.2012 02:30
Запуск команд командной строки из VBA snake-as Microsoft Office Excel 14 21.10.2008 16:45
Запуск удаленного соединения из командной строки Jester Свободное общение 0 09.01.2007 14:59