Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
1

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

01.03.2012, 10:21. Показов 4129. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Файл содержит символы, слова, целые числа и числа с плавающей запятой.
Определить все данные, тип которых вводится из командной строки.

для определения типы делаю так:
C++
1
2
3
4
if (strcmp(argv[1],"int"))
               int a;
        if (strcmp(argv[1],"char"))
               char a;
Но оно не сравнивает и не определяет....
мыслей, как организовать в самой строке слова с числами находить нет вовсе...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2012, 10:21
Ответы с готовыми решениями:

Определить все данные, тип которых вводится из командной строки.
помогите, пожалуйста, реализовать на java. Вот условие: Файл содержит символы, слова, целые...

Вводится число N. Определить количевство одинаковых и неодинак Вводится число N . Определить, все ли цыфры разные; естли нет, тоговых цыфр в числе.
Задача №15 Вводится число N . Определить, все ли цыфры разные; естли нет, тогда сколько...

Вывести все переменные среды, названия которых начинаются на букву, которая задана дополнительным аргументом параметра командной строки "х".
Здрасте форумчане, возникла проблемма. Вот условие задачи: Написать программу которая выводит...

Создать классы, спецификации которых приведены ниже. Определить конструктор и методы get Тип(), get Тип(), show Информ()
Реализовать класс в консольном приложении. Определить дополнительно методы в классе, создающем...

23
Заблокирован
Автор FAQ
01.03.2012, 11:10 2
Цитата Сообщение от Liv-pooL Посмотреть сообщение
мыслей, как организовать в самой строке слова с числами находить нет вовсе...
С int-ом правда не вышло, т.к. int воспринимается sscanf как double
Ну да ладно вам главное же сам принцип
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <conio.h>
 
int main(int argc, char * argv[])
{
    double d_arg;
    int  i,i_arg;
    char   s_arg[256];
    printf("Num of program arguments : %d\n",argc);
    FILE * f = fopen("cmd_params.txt","w");
    if(!f)
        printf("Error creating cmd_params.txt\n");
    else
    {
        printf("Parameters of command line\n");
        fprintf(f,"%s\n","Parameters of command line");
        for(i = 1; i < argc; i++)
        {
            if(sscanf(argv[i],"%lf",&d_arg))
            {
                printf("double : %lf\n",d_arg);
                fprintf(f, "double : %lf\n",d_arg);
            }
            else
            if(sscanf(argv[i],"%d", &i_arg))
            {
                printf("int    : %d\n",i_arg);
                fprintf(f, "int    : %d\n",i_arg);
            }
            else
            if(sscanf(argv[i],"%s", &s_arg))
            {
                printf("string  : %s\n",s_arg);
                fprintf(f,"string  : %s\n",s_arg);
            }
            else
            {
                printf("Update params error\n");
                fprintf(f,"%s\n","Update params error");
            }
        }
        fclose(f);
    }
    printf("Press any key to continue\n");
    _getch();
    return 0;
}
Вывод в файл cmd_params.txt
Parameters of command line
int : 2
int : 2
int : -11
string : test
Миниатюры
Определить все данные, тип которых вводится из командной строки   Определить все данные, тип которых вводится из командной строки  
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
01.03.2012, 11:24 3
Определить все данные, тип которых вводится из командной строки.
Приведите примеры входных данных и что должно быть получено на выходе
А то из описания в посте #1 ничего не понятно

Добавлено через 2 минуты
С int-ом правда не вышло, т.к. int воспринимается sscanf как double
Автор пишет что тип данных тоже вводится
0
Заблокирован
Автор FAQ
01.03.2012, 11:32 4
Немного пораскинув мозгами написал универсальный код - в командную строку передаём параметры(их тип указывать не надо - алгоритм сам всё сделает и распознает)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
int main(int argc, char * argv[])
{
    double d_arg;
    int  i,i_arg;
    int iFlag = 0;
    printf("Num of program arguments : %d\n",argc);
    FILE * f = fopen("cmd_params.txt","w");
    if(!f)
        printf("Error creating cmd_params.txt\n");
    else
    {
        printf("Parameters of command line\n");
        fprintf(f,"%s\n","Parameters of command line");
        for(i = 1; i < argc; i++)
        {
            iFlag = (strchr(argv[i],'.') || strchr(argv[i],','));
            if(sscanf(argv[i],"%lf",&d_arg) && iFlag)
            {
                printf("double : %lf\n",d_arg);
                fprintf(f, "double : %lf\n",d_arg);
            }
            else
            if(sscanf(argv[i],"%d", &i_arg))
            {
                printf("int    : %d\n",i_arg);
                fprintf(f, "int    : %d\n",i_arg);
            }
            else
            {
                printf("string  : %s\n",argv[i]);
                fprintf(f,"string  : %s\n",argv[i]);
            }
        }
        fclose(f);
    }
    printf("Press any key to continue\n");
    _getch();
    return 0;
}
Миниатюры
Определить все данные, тип которых вводится из командной строки  
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
01.03.2012, 12:39  [ТС] 5
Спасибо огромное, но задание другое..
В файле есть строка "вава в 45 45.4 45.67 валдвдал в"
Далее я в командной строке задаю int например, а программа считывает строку из файла и находит в ней int. и так для всех типов.
Буду пытаться пробовать...
0
Заблокирован
Автор FAQ
01.03.2012, 13:01 6
Цитата Сообщение от Liv-pooL Посмотреть сообщение
Спасибо огромное, но задание другое..
В файле есть строка "вава в 45 45.4 45.67 валдвдал в"
Далее я в командной строке задаю int например, а программа считывает строку из файла и находит в ней int. и так для всех типов.
Буду пытаться пробовать...
- ну так с этого и следовало начинать - точно сформулированное задание уже половина дела...
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
01.03.2012, 19:35  [ТС] 7
Все равно ничего не выходит, все перепробовал для определения типа, не сравнивает...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
01.03.2012, 21:04 8
Тебе нужно считать файл пословно в массив элементов типа char*. а затем каждый из элементов прогнать через эту функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
 
#define kolichestvo_el 11
 
 
using namespace std;
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
void f (char* p) {
 
  if (atoi(p)&&!strchr(p, '.'))
   printf ("%s öåëîå ÷èñëî\n", p);
  else if ((strlen(p)==1)&& p[0]=='0')
    printf ("%s öåëîå ÷èñëî\n", p);
  else if (atof(p))
   printf ("%s äðîáíîå ÷èñëî\n", p);
  else if (strlen(p)== 1)
   printf ("%s ñèìâîë\n", p);
  else 
   printf ("%s ñòðîêà\n", p);
}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
int main(void) {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 char* proba [kolichestvo_el]= {(char*)"stroka", (char*)"c", (char*)"-234", (char*)"-456.77",\
                                (char*)"-121", (char*)"-3.45.7", (char*)"3.45.7", (char*)"0",\
                                (char*)"0.0", (char*)"-0", (char*)"-0.04"};
 
 for (int i= 0; i< kolichestvo_el; i++) {
  f (proba[i]);
 }    
 
 getchar ();
 return 0;
}
И я даже знаю, что ты щас напишешь- что ты всё перепробовал, но у тебя ничё не получилось. Поэтому сразу дай файл.
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
01.03.2012, 21:05  [ТС] 9
я просил всего алгоритм...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
01.03.2012, 21:15 10
Алгоритм такой:
1) Считываешь файл пословно в мссив элементов типа char; рассматриваешь каждый элемент (в дальнейшем temp)
2) Смотришь, если (atoi (temp) возвращает не ноль и в temp отсутствует точка), то это целое число
3) Иначе: если (длина temp равна 1 и этот единственный символ '0'), о это целое число (какое- догадайся сам!)
4) Иначе: если atof (temp) возвращает не ноль, то temp дробное число
5) Иначе: если длина temp равна 1, то temp символ
6) иначе temp строка, всё!

Добавлено через 1 минуту
0
-=ЮрА=-
01.03.2012, 21:18
  #11

Не по теме:

kravam, сожги свой код - ужасный до ужаса!!!Да и ещё не по заданию - где командная строка argv и argc?:-|!Liv-pooL, чуть позже отпишисуь нормальным кодом, подождите до часа мне пока не до писанины на форуме...

1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
01.03.2012, 21:27 12
Код как код. Он делает то, что делает и не более. Кроме командной сроки надо прикручивать ещё считывание с файла- ну пусть Liv-pooL, сам этим и занимается. Я так решил.
0
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
01.03.2012, 21:57  [ТС] 13
Спасибо за помощь. Считать я бы смог, вот как проверить аргумент командной строки, что в нем написанно, не получается.. я сравнивал разными ф-ями, что находил в инете, ничего....
Если не трудно, простой вопрос: что такое буферизированный ввод-вывод. Где-то в нете пишут что доступ к файлу уже буферизированный ввод-вывод, где-то, что это использование библиотеки fstriam и ее функция по работе с файлами... меня это бонально запутало..
0
Заблокирован
Автор FAQ
01.03.2012, 22:07 14
Liv-pooL, вот код решающий задачу парсинга из файла.
Данные в файле baba v 45 45.4 45.67 dgskjkh 4 8
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>
 
int ParseDouble(FILE * f)
{
    int count    = 0;
    double d_arg = 0;
    long pos  = ftell(f);
    fseek(f,0,SEEK_END);
    long fLen = ftell(f);
    fseek(f,0,SEEK_SET);
    printf("Parsing of double arguments\n");
    while(!feof(f))
    {
        if(fscanf(f,"%lf",&d_arg))
        {
            printf("%lf\n",d_arg);
            fseek(f,(pos = pos + sizeof(double)),SEEK_SET);
            count = count + 1;
        }
        fseek(f,(pos = pos + 1),SEEK_SET);
        if(fLen <= pos)
            break;
    }
    return count;
}
 
int ParseInt(FILE * f)
{
    int count = 0;
    int i_arg = 0;
    long pos  = ftell(f);
    fseek(f,0,SEEK_END);
    long fLen = ftell(f);
    fseek(f,0,SEEK_SET);
    printf("Parsing of int arguments\n");
    while(!feof(f))
    {
        if(fscanf(f,"%d",&i_arg))
        {
            printf("%d\n",i_arg);
            fseek(f,(pos = pos + sizeof(int)),SEEK_SET);
            count = count + 1;
        }
        fseek(f,(pos = pos + 1),SEEK_SET);
        if(fLen <= pos)
            break;
    }
    return count;
}
 
int isString(char * text)
{
    int ret = 1;
    for(int i = 0; text[i] != '\0' && ret; i++)
    {
        if(isdigit(text[i]))
            ret = 0;
    }
    return ret;
}
 
int ParseString(FILE * f)
{
    int  count     = 0;
    char s_arg[32] = {0};//Полагаем что слов длинней 32 символов не будет
    long pos  = ftell(f);
    fseek(f,0,SEEK_END);
    long fLen = ftell(f);
    fseek(f,0,SEEK_SET);
    printf("Parsing of (char *) - string arguments\n");
    while(!feof(f))
    {
        pos = ftell(f);
        if(fscanf(f,"%s",s_arg))
        if(isString(s_arg))
        {
            printf("%s\n",s_arg);
            count = count + 1;
            fseek(f,(pos = pos + strlen(s_arg)*sizeof(char)),SEEK_SET);
            pos = ftell(f);
        }
        fseek(f,(pos = pos + 1),SEEK_SET);
        if(fLen <= pos)
            break;
    }
    return count;
}
 
int main(int argc, char * argv[])
{
    FILE * f = fopen("data.txt","r");
    if(!f)
        printf("Error open data.txt\n");
    else
    {
        if(argc < 2)
            printf("To less of arguments\n");
        else
        {
            if(strcmp(argv[1],"double") == 0)
                printf("Total Number of double arguments in file :%d\n",ParseDouble(f));
            else
            if(strcmp(argv[1],"int") == 0)
                printf("Total Number of int arguments in file :%d\n",ParseInt(f));
            else
                printf("Total Number of string arguments in file :%d\n",ParseString(f));
        }
        fclose(f);
    }
    printf("Press any key to continue\n");
    _getch();
    return 0;
}
Одно но дела с int обстоят хуже чем со стрингами и double, если ложить руку на сердце fscanf в определённых ситуациях может спокойно принять за double скажем число 4 ведь по сути 4.0 это уже double. Так что лучше уж ограничится в файле двумя разнородными типами char * и double
Миниатюры
Определить все данные, тип которых вводится из командной строки   Определить все данные, тип которых вводится из командной строки   Определить все данные, тип которых вводится из командной строки  

1
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
01.03.2012, 22:10  [ТС] 15
Постараюсь сам добить) принцип ясен, додумаем как нить

Добавлено через 59 секунд
Юрий, могу у вас по теории иногда консультироваться?
0
Заблокирован
Автор FAQ
01.03.2012, 22:13 16
Liv-pooL, Код не идеален, возможно отдохнув несколько позже вернусь чтобы его доработать, пока задачу решаю так как на скринах - т.е. для строк 100% точно для double 75% (иногда захватываются int) и для int если уж быть честным плоховато алгоритм работает, верней кроме ин воспринивмает за данный тип и 4 c 5 в числе 45.4 отсюда не совсем корректная работа. Возможно лучше считывать файл в текстовый буфер, разбить на токены посредством strtok и затем уж анализировать полученные куски информации. Если никто не доведёт по свободе реализую именно данную логику...

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Liv-pooL Посмотреть сообщение
Юрий, могу у вас по теории иногда консультироваться?
- да не вопрос, спрашивай, чем смогу всегда помогу:)

1
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
01.03.2012, 22:15  [ТС] 17
Тошгда позже, если нге сложно помогите с вопросом то такое буферизированный ввод-вывод. Где-то в нете пишут что доступ к файлу уже буферизированный ввод-вывод, где-то, что это использование библиотеки fstriam и ее функция по работе с файлами... меня это бонально запутало..
0
Заблокирован
Автор FAQ
01.03.2012, 22:22 18
Цитата Сообщение от Liv-pooL Посмотреть сообщение
Где-то в нете пишут что доступ к файлу уже буферизированный ввод-вывод, где-то, что это использование библиотеки fstriam и ее функция по работе с файлами... меня это бонально запутало..
Думаю это лаконичный и простой для понимания ответ
Потоковый I/O -- буферизированный: Это означает, что блок данных фиксировнного размера читаентся/пишется в файл не непосредственно, а через временную область хранения (буфер).

http://mech.math.msu.su/~zubr/node18ru.html
1
1 / 1 / 0
Регистрация: 17.04.2011
Сообщений: 142
01.03.2012, 22:24  [ТС] 19
спасибо)
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
01.03.2012, 23:07 20
Командная строка значит командная строка. Переделал прошлый свой код. Запускать из консоли:
main.exe имя_типа

Считает корректными именами типов следующие имена: int, float, double, char, char*; на всё остальное ругается. В принципе ты можешь сделать так, чтобы программа реагировала на любой тип- хоть на авторский, без разницы. Просто поправь исходник и всё.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
 
#define kolichestvo_el 12
 
 
using namespace std;
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
int f (char* p, char* tip) {
 
 //проверка- int не int;
 if (!(strcmp(tip, "int"))) 
   if (atoi(p)&&!strchr(p, '.')) {
    printf ("%s целое число\n", p);
    return 0;
   } 
   else if ((strlen(p)==1)&& p[0]=='0') {
    printf ("%s целое число\n", p);
    return 0;
   }     
 
 
 
 //проверка- double не double;
 if (!(strcmp(tip, "float"))|| !(strcmp(tip, "double")))
  if (!(atoi(p)&&!strchr(p, '.'))) 
   if (!((strlen(p)==1)&& p[0]=='0')) 
    if (atof(p)) {
     printf ("%s дробное число\n", p);
     return 0;
    } 
 
 
 
 //проверка- char не char;
 if (!(strcmp(tip, "char")))
  if (!(atoi(p)&&!strchr(p, '.')))
   if (!((strlen(p)==1)&& p[0]=='0'))
    if (!atof(p))
     if (strlen(p)== 1) {
      printf ("%s символ\n", p);
      return 0;
     }
 
 
 //проверка- char* не char*;
 if (!(strcmp(tip, "char*")))
  if (!(atoi(p)&&!strchr(p, '.')))
   if (!((strlen(p)==1)&& p[0]=='0'))
    if (!atof(p))
     if (!(strlen(p)== 1)) {
      printf ("%s строка\n", p);
      return 0;
     }
 
 return 1;
}
 
 
 
 
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
int main(int argc, char* argv[]) {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 char* proba [kolichestvo_el]= {(char*)"stroka", (char*)"c", (char*)"-234", (char*)"-456.77",\
                                (char*)"-121", (char*)"-3.45.7", (char*)"3.45.7", (char*)"0",\
                                (char*)"0.0", (char*)"-0", (char*)"-0.04", (char*)"qwe.erer"};
 
 
 //Вот ты запустил программу из консоли, допустим так:
 //main.exe int
 //И вот щас, в момент выполнения твоей программе доступны 
 //argv [0] и argv [1], причём argv [0] суть "main.exe",
 //argv [1] суть int
 //Воспользуемся этим 
 
 for (int i= 0; i< kolichestvo_el; i++) {
  if (f (proba[i], argv[1])) {
   printf ("Что-то ты не то ввёл\n");
   break;
  }
 }    
 
 return 0;
}
По поводу аргументов командной троки. сложного нет ничё, простно надо быть последовательным, и если используешь командную строку, так уж изучи теорию, а потом используй. Здесь разжёвано
Объясните значение argc и argv
0
01.03.2012, 23:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2012, 23:07
Помогаю со студенческими работами здесь

Определить и вывести на экран построчно только те строки, все элементы которых положительны
Вообще не понимаю как сделать это(( ( с клавиатуры вводятся два целых числа – М и К. 1&lt;M&lt;10,...

Как с помощью командной строки в Windows 7 в разделе на диске установить тип раздела 0х12
Всем добрый день. Извините за вторжение. Вопрос вот какой. Как с помощью командной строки в...

Определить, есть ли в матрице строки, все элементы которых равны нулю, за исключением последнего
Добрый вечер! Помогите пожалуйста решить данную задачу. Задана матрица Am×m . Определить,...

Определить, есть ли в матрице строки, все элементы которых равны нулю, за исключением последнего
Помогите решить задачу. Задана матрица Am*n. Определить, есть ли в ней строки, все элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru