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

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

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

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

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

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

запустил программу и возник вопрос:при набирании элементов - символьные надо вводить в строчку,а вещественные и целочисленные в столбик - чтобы работали,также и в файле, а можно сделать так,чтобы и те и те типы данных вводились в строчку и через пробел ?
Например :
1 2 3 4 5 3 2
s a d a w
1.11 1.22 1.33
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 15:25   #12
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

Цитата:
зачем же передавать размер типа char, если вы это потом не используете? и зачем использовать strcmp для сравнения двух символов? ни то ни другое не нужно.
Код:
for (i=0;i<argc;i++)//сортировка по возрастанию с прим опции -а
        
            if (strcmp(argv[i],"-a")==0)
            {

void sort_array(void* array, int array_type, int n)
{
	switch(array_type) {
		case ALPHA:
			sort(array, n, sizeof(char), &sort_rule_cha)
{
 for( i=0; i < n; i++) {            // i - номер прохода
		           for( j = n-1; j > i; j-- ) {     // внутренний цикл прохода
			           if (array[j-1]>array[j]){
				         x=array[j-1];
				            array[j-1]=array[j];
				              array[j]=x;
			}
		}
	}
            }
     }
        }
}
т.е. вот так использовать?
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 15:55   #13
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Serjuk Посмотреть сообщение
запустил программу и возник вопрос:при набирании элементов - символьные надо вводить в строчку,а вещественные и целочисленные в столбик - чтобы работали,также и в файле, а можно сделать так,чтобы и те и те типы данных вводились в строчку и через пробел ?
Например :
1 2 3 4 5 3 2
s a d a w
1.11 1.22 1.33
Вещественные и целочисленные тоже можно через пробел, но в конце должно быть нечто, что заставит scanf вернуть ошибку(например EOF(символ конца файла)). То есть в файлах всё будет нормально работать, а в консоли нужно вводить символ конца файла самостоятельно(Ctrl+Z). Иное дело, раз теперь известно, что первым элементом идёт длина, то можно без этого, а просто в обычном цикле от 0 до этого значения прочитать данные из входного потока(из консоли или файла)


Нет, не так.
Код:
void sort_chars(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_array(void* array, int array_type, int n)
{
	switch(array_type) {
		case INTEGER:
			sort_chars((char*)array, n);
...
примерно так
netrino вне форума Ответить с цитированием
Старый 04.01.2010, 16:01   #14
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

спасибо большое,сейчас пойду попробую доделать,если не получится сегодня напишу))
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 17:38   #15
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

сортировка работает,но есть одно но с символьными:
при наборе sad - сортировка отсортирует как ad,т.е. она последнюю букву везде убирает..тоесть чтобы отсортировать sad надо набрать sadd)
И второй момент не получается никак сделать аргументом командной строки имя файла.
Код:
int main(int argc,char *argv[])
{
	FILE* input; // пытаемся открыть файл
	void* array = 0;
	char* filename;
	int   array_type;
	int   array_len = 0;
    int i;
	for (i=0;i<argc;i++)


		input = fopen(argc.filename, "r");

	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);//получение уникальных значений
            }
	print_array(array, array_type, array_len); // выводим на консоль

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

	getchar();
	return 0;
}
Остальные опции работают отлично.
Компилятор выдает ошибку в строке:
Код:
input = fopen(argc.filename, "r");
Вот такую:
Цитата:
In function 'main':
error:request for member 'filename' in something not a structure or union
и на то что я объявляю char* filename , компилятор выдает:
Цитата:
warning:unused variable 'filename'
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 18:06   #16
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

По первому, раз уж оставляете как есть, то добавьте в считывании символьного массива после while { } инструкцию i++
Код:
		case ALPHA:
			while( fin_input > 0 ) {
				fin_input = fscanf(input_stream, "%c", &((char*)memory)[i]);
				if(fin_input > 0)
					fin_input = !( ((char*)memory)[i] == 13 || ((char*)memory)[i] == 10 );
				if( isalpha( ((unsigned char*)memory)[i] ) )
					i++;
			}
			i++;
а вообще, раз длина задана в файле, то вам не нужно её искать самостоятельно в процедуре считывания массива.

По второму
Цитата:
Код:
	for (i=0;i<argc;i++)


		input = fopen(argc.filename, "r");
Вы неправильно читаете, argc - переменная, которая содержит кол-ство параметров командной строки, у неё нет поля filename, к которому можно было бы обратиться.
Если имя файла задаётся первым параметром, то:
Код:
input = fopen(argv[1], "r");
Но желательно делать отдельную проверку на то, задан ли файл или опция, например так
Код:
for(i = 0; i < argc; i++)
    if( argv[i][0] != '-' ) {     // если первый символ строки не "-"
        input = fopen(argv[i], "r");  // то считаем что этот параметр - имя файла и пытаемся открыть его
        break;
    }
netrino вне форума Ответить с цитированием
Старый 04.01.2010, 18:43   #17
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

но ведь при вызове программы из командной строки первый аргумент - название программы.Соответсвенно изменяя код
Код:
int main(int argc,char *argv[])
{
	FILE* input; 
	void* array = 0;
	char* filename;
	int   array_type;
	int   array_len = 0;
    int i;
	for(i = 0; i < argc; i++)
    if( argv[i][0] != '-' ) {     // если первый символ строки не "-"
        input = fopen(argv[i], "r");  // то считаем что этот параметр - имя файла и пытаемся открыть его
        break;
    }

	if(input == 0)                // если не получилось
printf("Vvedute massiv dlya sorturovku\n");
		input = stdin;    // то будем брать массив из консоли

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

//	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);//получение уникальных значений
            }
	print_array(array, array_type, array_len); // выводим на консоль

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

	getchar();
	return 0;
}
и запуская в командной строке C:\main filename -a - должен отсортировать файл по опции,а он выдает как будто файла нету..
и чтобы сделать вид C:\main filename -a filename2,где filename2 - выходной файл,т.е. тот куда передаются отсортированные данные.
filename2 будет соответсвенно последним аргументом,так?
тогда он будет задаваться таким образом:
Код:
for(i = 0; i < argc; i++)
    if( argv[i][argc???] != '-' ) {     
        output = fopen(argv[i], "wr");
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 18:54   #18
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
но ведь при вызове программы из командной строки первый аргумент - название программы
Да, точно, цикл с 1 начинать надо.
Код:
for(i = 1; i < argc; i++)
    if( argv[i][0] != '-' ) {     // если первый символ строки не "-"
        input = fopen(argv[i], "r");  // то считаем что этот параметр - имя файла и пытаемся открыть его
        break;
    }
ну если последним, то
Код:
if(argv[argc-1][0] != '-')
     output = fopen(argv[argc-1], "w");
else
     output = stdout; // если файл не задан - пишем в консоль
netrino вне форума Ответить с цитированием
Старый 04.01.2010, 19:35   #19
Serjuk
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 136
По умолчанию

блин попытался что-то сделать,а получилось еще хуже
Вот что намудрил:
Код:
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");  // то считаем что этот параметр - имя файла и пытаемся открыть его


	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 {

     output = stdout;

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

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

	getchar();
	return 0;
}
Теперь появились ошибки - причем сразу 5.Вот они:
Цитата:
undefined reference to '_check_type'
undefined reference to '_get_array'
undefined reference to '_sort_array_inc'
undefined reference to '_sort_array_dec'
undefined reference to '_print_array'
Serjuk вне форума Ответить с цитированием
Старый 04.01.2010, 19:50   #20
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну что же вы делаете
компилятор говорит, что не может найти ф-ции check_type и остальные. Я кстати их тоже найти не могу в вашем коде. Да и вообще ошибок много
Цитата:
for(i = 1; i < argc; i++)
if( argv[i][0] != '-' ) // если первый символ строки не "-"
input = fopen(argv[i], "r"); // то считаем что этот параметр - имя файла и пытаемся открыть его
тут break нужен обязательно
Код:
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; // то будем брать массив из консоли
Тут фигурные скобки
Код:
if(input == 0) {
    printf("Vvedite..");
    input = stdin;
}
ну и остальные в таком же духе
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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