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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2010, 20:01   #21
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Поставил скобки но теперь ему не нравится
Вот полный код
Код:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#define UNDEFINED (-1)
#define ALPHA      0
#define REAL       1
#define INTEGER    2

int   check_type(FILE* input_stream);
void* get_array(FILE* input_stream, int array_type, int* n);
void  sort_array_inc(void* array, int array_type, int n);
void  sort_array_dec(void* array, int array_type, int n);
void  sort_array_uni(void* array, int array_type, int n);
void  print_array(void* array, int array_type, int n);


int main(int argc,char *argv[])
{
	FILE* input;
	FILE* output;
	void* array = 0;

	int   array_type;
	int   array_len = 0;
    int i;
	for(i = 1; i < argc; i++)
    if( argv[i][0] != '-' ) {     // если первый символ строки не "-"
        input = fopen(argv[i], "r");  // то считаем что этот параметр - имя файла и пытаемся открыть его
    break;
    }

	if(input == 0) {               // если не получилось
	printf("Vvedute massiv dlya sorturovku\n");
		input = stdin;    // то будем брать массив из консоли
	}
	array_type = check_type(input);  // узнаём тип массива(символьный, вещественный или целочисленный)
	if( array_type == UNDEFINED ) {   // если неопределён
		printf("Error: undefined type of array\n");  // то сообщение об ошибке
		exit(-1);   // и выход
	}

	array = get_array(input, array_type, &array_len); // получаем массив и его длину
	if( array == 0 ) {
		printf("Error: have no memory\n");
		exit(-1);
	}
  for (i=0;i<argc;i++)

            if (strcmp(argv[i],"-a")==0)//сортировка по возрастанию с применением опции -а
                {
	sort_array_inc(array, array_type, array_len); // сортируем
                }
	for (i=0;i<argc;i++)
	        if (strcmp(argv[i],"-d")==0)//сортировка по убыванию с применением опции -d
	        {
	sort_array_dec(array,array_type,array_len);
	        }
    for (i=0;i<argc;i++)
            if(strcmp(argv[i],"-u")==0)//получение уникальных значений с применением опции -u
            {
   // sort_array_uni(array,array_type,array_len);//получение уникальных значений
            }

    for(i = 0; i < argc; i++)
    if(argv[argc-1][0] != '-'){
     output = fopen(argv[argc-1], "w");
    }
switch(array_type) {
    		case ALPHA:
               fprintf(output, "%s",array);
                  break;
            case REAL:
               fprintf(output,"%.2f",array);
                  break;
            case INTEGER:
               fprintf(output,"%d",array);
                  break;}
  else { //     Вот тут выдает эту ошибку "Error: syntax error before "else"" 

     output = stdout;


	print_array(array, array_type, array_len); // выводим на консоль

	free(array); // освобождаем память

	getchar();
	return 0;
}
выдает ошибку
Цитата:
Error: syntax error before "else"
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 20:04   #22
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Полный код не вмещается,но я там особо ничего не изменял - только по убыванию сортировку добавил
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 20:19   #23
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
for(i = 0; i < argc; i++)
if(argv[argc-1][0] != '-'){
output = fopen(argv[argc-1], "w");
}
switch(array_type) {
case ALPHA:
fprintf(output, "%s",array);
break;
case REAL:
fprintf(output,"%.2f",array);
break;
case INTEGER:
fprintf(output,"%d",array);
break;}
else { // Вот тут выдает эту ошибку "Error: syntax error before "else""

output = stdout;


print_array(array, array_type, array_len); // выводим на консоль
Код:
if(argv[argc-1][0] != '-')
    output = fopen(argv[argc-1], "w");
if(output == 0)
    output = stdout;

print_array(output, array, array_type, array_len); // выводим куда надо
ф-цию print_array перепишите так:
Код:
print_array(FILE* output_stream, void* array, int array_type, int array_len)
{
	int i;

	switch(array_type) {
		case ALPHA:
			for( i = 0; i < n; i++ )
				fprintf(output_stream, "%c ", ((char*)array)[i]);
			break;
		case REAL:
			for( i = 0; i < n; i++ )
				fprintf(output_stream, "%.2f ", ((float*)array)[i]);
			break;
		case INTEGER:
			for( i = 0; i < n; i++ )
				fprintf(output_stream, "%d ", ((int*)array)[i]);
			break;
		default:
			printf("Not recognized type of array\n");
	}

	return;
}
должно работать. не забудьте поменять прототип функции над main
netrino вне форума Ответить с цитированием
Старый 04.01.2010, 20:43   #24
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

поменял - компилируется идеально,но запускаться не хочет - ошибка:
Цитата:
sort.exe - Ошибка приложения
Инструкция по адресу "0x7c91b1fa" обратилась к памяти по адресу "0x7c901010".Память не может быть "written".
"OK" -- завершение приложения
Выложу полный код:
Код:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

#define UNDEFINED (-1)
#define ALPHA      0
#define REAL       1
#define INTEGER    2

int   check_type(FILE* input_stream);
void* get_array(FILE* input_stream, int array_type, int* n);
void  sort_array_inc(void* array, int array_type, int n);
void  sort_array_dec(void* array, int array_type, int n);
void  sort_array_uni(void* array, int array_type, int n);
void  print_array(FILE* output_stream,void* array, int array_type, int array_len);


int main(int argc,char *argv[])
{
	FILE* input;
	FILE* output;
	void* array = 0;

	int   array_type;
	int   array_len = 0;
    int i;
	for(i = 1; i < argc; i++)
    if( argv[i][0] != '-' ) {     // если первый символ строки не "-"
        input = fopen(argv[i], "r");  // то считаем что этот параметр - имя файла и пытаемся открыть его
    break;
    }

	if(input == 0) {               // если не получилось
	printf("Vvedute massiv dlya sorturovku\n");
		input = stdin;    // то будем брать массив из консоли
	}
	array_type = check_type(input);  // узнаём тип массива(символьный, вещественный или целочисленный)
	if( array_type == UNDEFINED ) {   // если неопределён
		printf("Error: undefined type of array\n");  // то сообщение об ошибке
		exit(-1);   // и выход
	}

	array = get_array(input, array_type, &array_len); // получаем массив и его длину
	if( array == 0 ) {
		printf("Error: have no memory\n");
		exit(-1);
	}
  for (i=0;i<argc;i++)

            if (strcmp(argv[i],"-a")==0)//сортировка по возрастанию с применением опции -а
                {
	sort_array_inc(array, array_type, array_len); // сортируем
                }
	for (i=0;i<argc;i++)
	        if (strcmp(argv[i],"-d")==0)//сортировка по убыванию с применением опции -d
	        {
	sort_array_dec(array,array_type,array_len);
	        }
    for (i=0;i<argc;i++)
            if(strcmp(argv[i],"-u")==0)//получение уникальных значений с применением опции -u
            {
   // sort_array_uni(array,array_type,array_len);//получение уникальных значений
            }

    for(i = 0; i < argc; i++)
    if(argv[argc-1][0] != '-')
     output = fopen(argv[argc-1], "w");
    if(output==0)
    output=stdout;

	print_array(output,array, array_type, array_len); // выводим на консоль

	free(array); // освобождаем память

	getchar();
	return 0;
}
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 20:43   #25
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Код:
int check_type(FILE* input_stream) // Ф-ция определения типа массива(целочисленный, вещественный, символьный)
{
	char c[80];
	int  i = 0;
	int  type = UNDEFINED; // по умолчанию тип неопределён

	fscanf(input_stream, "%s", c); // читаем первый элемент массива в строку
	if( isalpha(c[i]) )                   // если встречаем в нём букву, то это символьный массив
		type = ALPHA;
	else if( isdigit(c[i]) ) {             // если же цифру, то это либо целочисленный, либо вещественный тип
		type = INTEGER;         // предполагаем, что целочисленный
		for(; c[i] != 0; i++ ) {
			if( c[i] == '.' ) {         // но если находим точку, то это вещественный
				type = REAL;
				break;
			}
		}
	}

	for(i = strlen(c)-1; i >= 0; i--)          // возвращаем считанный элемент обратно в поток(в файл либо в консоль)
		ungetc(c[i], input_stream);

	return type;
}

void* get_array(FILE* input_stream, int array_type, int* n) // ф-ция выделения и заполнения памяти массивом
{
	int   i = 0;
	int   fin_input = 1;
	void* memory = malloc(1000); // выделяем 1000 байт

	switch(array_type) {
		case ALPHA:
			while( fin_input > 0 ) { // fscanf в случае удачного чтения возвращает значение больше нуля
				fin_input = fscanf(input_stream, "%c", &((char*)memory)[i]); // читаем 1 элемент в память
				if(fin_input > 0)
					fin_input = !( ((char*)memory)[i] == 13 || ((char*)memory)[i] == 10 ); // завершить также, если встречен перевод строки
				if( isalpha( ((unsigned char*)memory)[i] ) ) // если считанный символ буква, то оставляем в массиве
					i++;
			}
			i++;
			break;
		case REAL:
			while( fin_input > 0 ) {
				fin_input = fscanf(input_stream, "%f", &((float*)memory)[i]); // то же самое если вещественный
				i++;
			}
			break;
		case INTEGER:
			while( fin_input > 0 ) {
				fin_input = fscanf(input_stream, "%d", &((int*)memory)[i]); // и целочисл.
				i++;
			}
			break;
		default:
			free(memory); // если тип неопределён, то освобождаем выделенную память
			memory = 0;
	}

	*n = i-1; // возвращаем через указатель кол-ство элементов в массиве
	return memory; // и сам массив
}



void sort_chars_inc(char* array, int n)
{
    char temp;
    int i, j;

    for( i = 0; i < n-1; i++ )
        for( j = i+1 ; j < n; j++ )
            if( array[i] > array[j] ) {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
}
void sort_integers_inc(int*array,int n)
{
    int temp;
    int i,j;
      for ( i=0;i<n-1;i++)
        for (j=i+1;j<n;j++)
           if(array[i]>array[j]){
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
           }
}
void sort_floats_inc(float*array,int n)
{
    float temp;
    int i,j;
    for (i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(array[i]>array[j]){
                temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
}


void sort_array_inc(void* array, int array_type, int n)
{
	switch(array_type) {
		case ALPHA:
			sort_chars_inc((char*)array, n);// сортировки символьного массива
			break;
		case REAL:
			sort_floats_inc((float*)array,n); // вещественного массива
			break;
		case INTEGER:
			sort_integers_inc((int*)array,n);  // целочисленного массива
			break;
	}

	return;
}
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 20:44   #26
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Код:
void sort_chars_dec(char* array, int n)
{
    char temp;
    int i, j;

    for( i = 0; i < n-1; i++ )
        for( j = i+1 ; j < n; j++ )
            if( array[i] < array[j] ) {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
}
void sort_integers_dec(int*array,int n)
{
    int temp;
    int i,j;
      for ( i=0;i<n-1;i++)
        for (j=i+1;j<n;j++)
           if(array[i]<array[j]){
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
           }
}
void sort_floats_dec(float*array,int n)
{
    float temp;
    int i,j;
    for (i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(array[i]<array[j]){
                temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
}
void sort_array_dec(void* array, int array_type, int n)
{
	switch(array_type) {
		case ALPHA:
			sort_chars_dec((char*)array, n);// сортировки символьного массива
			break;
		case REAL:
			sort_floats_dec((float*)array,n); // вещественного массива
			break;
		case INTEGER:
			sort_integers_dec((int*)array,n);  // целочисленного массива
			break;
	}

	return;
}


void  print_array(FILE* output_stream,void* array, int array_type, int array_len) // ф-ция для вывода массива на консоль
{
	int i;
    int n;
	switch(array_type) {
		case ALPHA:
			for( i = 0; i < n; i++ )
				fprintf(output_stream,"%c", ((char*)array)[i]); // вывод, если массив символьный
			break;
		case REAL:
			for( i = 0; i < n; i++ )
				fprintf(output_stream,"%.2f ", ((float*)array)[i]); // вещественный
			break;
		case INTEGER:
			for( i = 0; i < n; i++ )
				fprintf(output_stream,"%d ", ((int*)array)[i]); // целочисленный
			break;
		default:
			printf("Not recognized type of array\n"); // если тип неопределён, то вывод соответствующего сообщения
	}

	return;
}
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 21:12   #27
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну, во-первых инициализируйте input и output перед использованием нулём
Код:
FILE* input = 0;
FILE* output = 0;
Цитата:
for(i = 0; i < argc; i++)
if(argv[argc-1][0] != '-')
output = fopen(argv[argc-1], "w");
if(output==0)
output=stdout;
не нужен здесь цикл!)) И можете добавить ещё одну проверку на всякий случай
Код:
if(argc > 1 && argv[argc-1][0] != '-')
    output = fopen(argv[argc-1], "w");
if(output==0)
    output=stdout;
вот это, кстати:
Цитата:
}
for (i=0;i<argc;i++)

if (strcmp(argv[i],"-a")==0)//сортировка по возрастанию с применением опции -а
{
sort_array_inc(array, array_type, array_len); // сортируем
}
for (i=0;i<argc;i++)
if (strcmp(argv[i],"-d")==0)//сортировка по убыванию с применением опции -d
{
sort_array_dec(array,array_type,arr ay_len);
}
for (i=0;i<argc;i++)
if(strcmp(argv[i],"-u")==0)//получение уникальных значений с применением опции -u
{
// sort_array_uni(array,array_type,arr ay_len);//получение уникальных значений
}
можно одним циклом )
Код:
	for(i=0;i<argc;i++) {
		if(strcmp(argv[i],"-a")==0)
			sort_array_inc(array, array_type, array_len);
		else if (strcmp(argv[i],"-d")==0)//сортировка по убыванию с применением опции -d
			sort_array_dec(array,array_type,array_len);
		else if(strcmp(argv[i],"-u")==0)
			sort_array_uni(array,array_type,array_len);//получение уникальных значений
	}
ну а не сортирует вот почему, в print_array уберите
int n
и переименуйте переменную в параметрах с array_len на n
Код:

void  print_array(FILE* output_stream,void* array, int array_type, int n) // ф-ция для вывода массива на консоль
{
	int i;

	switch(array_type) {
		case ALPHA:
			for( i = 0; i < n; i++ )
				fprintf(output_stream,"%c", ((char*)array)[i]); // вывод, если массив символьный
			break;
		case REAL:
			for( i = 0; i < n; i++ )
				fprintf(output_stream,"%.2f ", ((float*)array)[i]); // вещественный
			break;
		case INTEGER:
			for( i = 0; i < n; i++ )
				fprintf(output_stream,"%d ", ((int*)array)[i]); // целочисленный
			break;
		default:
			printf("Not recognized type of array\n"); // если тип неопределён, то вывод соответствующего сообщения
	}

	return;
}
netrino вне форума Ответить с цитированием
Старый 04.01.2010, 21:34   #28
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Ошибки пропали,консольная работа отлично работает с применением опций -а,-d..А вот с файлами еще есть проблема - из всего файла с применением опции -а она берет последний элемент в массиве и выводит его,а если еще и указать файл вывода, то и туда она его скопирует, т.е. из всего массива "adadddfsdfw" она возьмет w выведет его на экран если файл не задан и если он задан то она запихнет его в файл
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 22:05   #29
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

измените в ф-ции check_type
Код:
fscanf(input_stream, "%s", c);

на

fscanf(input_stream, "%5s", c);
netrino вне форума Ответить с цитированием
Старый 04.01.2010, 22:24   #30
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

спасибо большое, заработало!!
а можешь объяснить,чем отличается %s и %5s?
и я так и не понял - ((char*)memory)[i] == 13 || ((char*)memory)[i] == 10 почему 13 и 10)))
Serjuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать массив от переменной длины без mAlloc? TwiX Общие вопросы C/C++ 5 27.10.2009 16:50
функция для подсчета количества символов в строке типа std::string a Артэс Общие вопросы C/C++ 3 06.07.2009 17:43
считать данные из переменной типа String 1o1man Помощь студентам 13 17.04.2009 22:34
Выравнивание высоты таблицы для разного разрешения Svetix HTML и CSS 10 03.04.2009 17:00
Определение типа переменной Игорь007 Общие вопросы C/C++ 7 10.01.2009 13:01