Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
АндрейШ
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 13
1

Перенести в конец каждой строки все входящие в неё цифры

28.06.2014, 15:13. Просмотров 981. Ответов 15
Метки нет (Все метки)

Тёмный лес для меня, те кто дал задание сказали, что оно интересное, помогите пожалуйста решить её, пока интересно только то, как её решать?

Используя очередь решить следующую задачу.Содержимое текстового файла f, разделённое на строки, переписать в текстовый файл g, перенося при этом в конец каждой строки все входящие в неё цифры (с сохранением исходного порядка как среди цифр, так и среди остальных символов строки.)
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2014, 15:13
Ответы с готовыми решениями:

Удалить из строки все повторно входящие в неё символы
Дана строка S. Удалить из неё всё повторно входящие в неё символы и напечатать результат.

Перенести первое слово каждой строки в ее конец
Нужно перенести первое слово каждой строки в ее конец! Вот моя пограмма, но я не могу понять...

У каждой строки из введенного набора все цифры заменить на пробелы
Разработать функцию Change(const S:string):string, возвращающую строку, в которой все цифры строки...

Напечатать сначала все цифры, входящие в него, а затем все остальные буквы
Дан текст из 80 букв. Напечатать сначала все цифры, входящие в него, а затем все остальные буквы,...

Дан одномерный массив А. Перенести в начало массива все четные элементы, а в конец - все нечетные
Помогите пожалуйста написать программу на языке "Си": Дан одномерный массив А состоящий из N...

15
stupid_monkey
1 / 1 / 0
Регистрация: 01.03.2014
Сообщений: 19
28.06.2014, 23:46 2
Помочь или сделать?
Я бы сделал так: открываем два файла, один на чтение, другой на запись. Считываем посимвольно и записываем в выходной файл до \n, проверяем, на число каждый символ (с помощью таблицы ASCII), если число, записываем в очередь (ещё один массив) и увеличиваем счетчик, при записи в очередь, при этом сам символ в выходной файл не записываем. Когда доходим до \n, записываем числа из очереди в выходной файл, ставим \n и начинаем сначала до EOF.

Добавлено через 1 час 58 минут
В общем вот:
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
#include <stdio.h>
 
int main()
{
FILE *in, *out;
int c, n=0, i;
int queue[100];
in=fopen("f.txt","r");
out=fopen("g.txt","w");
if(in != NULL)
{   
    while(1) 
    {
        c=fgetc(in);
        if ((c!='\n')&&(c!=EOF))
        {
            if (!((c>=48)&&(c<=57)))
            {
                fputc(c,out);
             }
            else 
            {
                queue[n]=c;
                n++;
            }
        }
        else 
        {
            for (int i=0; i<n; i++)
            {
                fputc(queue[i],out);
            }
            fputc(10,out);
            n=0;
        }
        if (c==EOF)
        {
            break;
        }
               
    }
}
fclose(in);
fclose(out);
return 0;
}
Главное что работает
1
АндрейШ
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 13
30.06.2014, 06:59  [ТС] 3
Спасибо, программа работает, но к сожалению данное задание требует работы с динамическими структурами, в чём собственно и трудности, в данной программе статический массив на 100 символов, а требуется программа без ограничения количества символов.
0
stupid_monkey
1 / 1 / 0
Регистрация: 01.03.2014
Сообщений: 19
30.06.2014, 18:51 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
 
struct list 
{
    int data;
    list *next;
};
 
int main()
{
FILE *in, *out;
int c, n=0, i;
list *ptr, *ptr2, *tmpptr;
in=fopen("f.txt","r");
out=fopen("g.txt","w");
if(in != NULL)
{   
    while(1) 
    {
        c=fgetc(in);
        if ((c!='\n')&&(c!=EOF))
        {
            if (!((c>=48)&&(c<=57)))
            {
                fputc(c,out);
            }
            else 
            {
                ptr=new list;
                ptr -> data=c;
                if (n==0)
                {
                    ptr2=ptr;
                }
                if (n!=0)
                {
                    tmpptr -> next = ptr;
                }
                tmpptr=ptr;
                n++;
            }
        }
        else 
        {
            ptr=ptr2;
            for (int i=0; i<n; i++)
            {
                fputc(ptr -> data,out);
                ptr=ptr->next;
            }
            fputc(10,out);
            n=0;
        }
        if (c==EOF)
        {
            break;
        }
               
    }
}
fclose(in);
return 0;
}
0
30.06.2014, 18:51
АндрейШ
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 13
30.06.2014, 19:43  [ТС] 5
Спасибо, только выдаёт 10 ошибок, в основном на 13 строчке.
0
stupid_monkey
1 / 1 / 0
Регистрация: 01.03.2014
Сообщений: 19
30.06.2014, 20:11 6
Какие ошибки, каким компилятором?
0
АндрейШ
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 13
30.06.2014, 20:15  [ТС] 7
CodeBlocks
Ошибки:
\PRAKT_DIN\main.c|6|error: expected specifier-qualifier-list before 'list'|
\PRAKT_DIN\main.c||In function 'main':|
\PRAKT_DIN\main.c|13|error: 'list' undeclared (first use in this function)|
\PRAKT_DIN\main.c|13|error: (Each undeclared identifier is reported only once|
\PRAKT_DIN\main.c|13|error: for each function it appears in.)|
\PRAKT_DIN\main.c|13|error: 'ptr' undeclared (first use in this function)|
\PRAKT_DIN\main.c|13|error: 'ptr2' undeclared (first use in this function)|
\PRAKT_DIN\main.c|13|warning: left-hand operand of comma expression has no effect|
\PRAKT_DIN\main.c|13|error: 'tmpptr' undeclared (first use in this function)|
\PRAKT_DIN\main.c|13|warning: left-hand operand of comma expression has no effect|
\PRAKT_DIN\main.c|29|error: 'new' undeclared (first use in this function)|
\PRAKT_DIN\main.c|29|error: expected ';' before 'list'|
\PRAKT_DIN\main.c|46|error: 'for' loop initial declarations are only allowed in C99 mode|
\PRAKT_DIN\main.c|46|note: use option -std=c99 or -std=gnu99 to compile your code|
\PRAKT_DIN\main.c|12|warning: unused variable 'i'|
||=== Build finished: 10 errors, 3 warnings ===|
0
stupid_monkey
1 / 1 / 0
Регистрация: 01.03.2014
Сообщений: 19
30.06.2014, 20:28 8
Странно, у меня gcc нормально компилирует
а так?
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
#include <stdio.h>
 
struct list 
{
    int data;
    list *next;
};
list *ptr, *ptr2, *tmpptr;
int main()
{
FILE *in, *out;
int c, n=0, i;
in=fopen("f.txt","r");
out=fopen("g.txt","w");
if(in != NULL)
{   
    while(1) 
    {
        c=fgetc(in);
        if ((c!='\n')&&(c!=EOF))
        {
            if (!((c>=48)&&(c<=57)))
            {
                fputc(c,out);
            }
            else 
            {
                ptr=new list;
                ptr -> data=c;
                if (n==0)
                {
                    ptr2=ptr;
                }
                if (n!=0)
                {
                    tmpptr -> next = ptr;
                }
                tmpptr=ptr;
                n++;
            }
        }
        else 
        {
            ptr=ptr2;
            for (int i=0; i<n; i++)
            {
                fputc(ptr -> data,out);
                ptr=ptr->next;
            }
            fputc(10,out);
            n=0;
        }
        if (c==EOF)
        {
            break;
        }
               
    }
}
fclose(in);
return 0;
}
Кстати, в настройках посмотри какой компилятор и поставь gcc, если там другой
0
АндрейШ
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 13
30.06.2014, 20:42  [ТС] 9
всё также, опять 10 ошибок, компилятор выбран GNU GCC Compiler
0
stupid_monkey
1 / 1 / 0
Регистрация: 01.03.2014
Сообщений: 19
30.06.2014, 20:55 10
Могу тогда только посоветовать скомпилировать с помощью wxDev-C++, у меня в нем работает
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
27189 / 18182 / 7199
Регистрация: 22.10.2011
Сообщений: 32,040
Записей в блоге: 6
30.06.2014, 22:01 11
Цитата Сообщение от stupid_monkey Посмотреть сообщение
у меня gcc нормально компилирует
У тебя компилирует, потому что ты его компилируешь как С++, а у ТС-а задача - написать программу в Си (на название раздела внимание обрати).
0
АндрейШ
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 13
30.06.2014, 22:18  [ТС] 12
Цитата Сообщение от UI Посмотреть сообщение
У тебя компилирует, потому что ты его компилируешь как С++, а у ТС-а задача - написать программу в Си (на название раздела внимание обрати).
Может вы знаете как адаптировать под СИ?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
27189 / 18182 / 7199
Регистрация: 22.10.2011
Сообщений: 32,040
Записей в блоге: 6
30.06.2014, 22:23 13
Лучший ответ Сообщение было отмечено АндрейШ как решение

Решение

Компиляцию, про крайней мере, проходит:
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
#include <stdio.h>
#include <stdlib.h>
 
struct list
{
    int data;
    struct list *next;
};
struct list *ptr, *ptr2, *tmpptr;
int main()
{
    FILE *in, *out;
    int c, n=0;
    in=fopen("f.txt","r");
    out=fopen("g.txt","w");
    if(in != NULL)
    {
        while(1)
        {
            c=fgetc(in);
            if ((c!='\n')&&(c!=EOF))
            {
                if (!((c>=48)&&(c<=57)))
                {
                    fputc(c,out);
                }
                else
                {
                    /*ptr=new list;*/
                    ptr = (struct list*)malloc(sizeof(struct list));
                    ptr -> data=c;
                    if (n==0)
                    {
                        ptr2=ptr;
                    }
                    if (n!=0)
                    {
                        tmpptr -> next = ptr;
                    }
                    tmpptr=ptr;
                    n++;
                }
            }
            else
            {
                ptr=ptr2;
                for (int i=0; i<n; i++)
                {
                    fputc(ptr -> data,out);
                    ptr=ptr->next;
                }
                fputc(10,out);
                n=0;
            }
            if (c==EOF)
            {
                break;
            }
 
        }
    }
    fclose(in);
    return 0;
}
(удаление очереди добавить не забудь)
1
АндрейШ
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 13
01.07.2014, 07:34  [ТС] 14
Спасибо большое, только в for объявление int i перенёс в начало и всё работает.

Добавлено через 10 минут
Конечно вы уже очень помогли, пока только слова в структурах не понятны
Цитата Сообщение от UI Посмотреть сообщение
struct list *next;
};
struct list *ptr, *ptr2, *tmpptr;
int main()
прокомментируйте пожалуйста если не трудно.
0
stupid_monkey
1 / 1 / 0
Регистрация: 01.03.2014
Сообщений: 19
01.07.2014, 16:38 15
struct list *next; указатель на след элемент списка list
ptr2 указывает на начало списка
tmpptr адрес предыдущей структуры в цикле
0
Vtulhu
425 / 379 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
01.07.2014, 20:31 16
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
#include <stdbool.h>
#include <stdio.h>
 
#define QSTRING_INIT_SIZE (10)
#define QSTRING_INCREASE (str->siz / 2)
 
typedef struct qstring {
    size_t len;
    size_t siz;
    char* buf;
} *QString;
 
QString QString_Clear(QString str)
{
    str->len = 0;
    str->buf[0] = '\0';
    return str;
}
 
QString QString_New(void)
{
    QString str = (QString) malloc(sizeof(*QString));
    str->siz = QSTRING_INIT_SIZE;
    str->buf = (char*) malloc(sizeof(char) * str->siz);
    return QString_Clear(str);
}
 
QString QString_Expand(QString str, size_t inc_siz)
{
    str->siz += inc_siz;
    str->buf = (char*) realloc(str->buf, sizeof(char) * str->siz);
    return str;
}
 
QString QString_Append(QString str, char c)
{
    str->buf[str->len] = c;
    str->len++;
    if( str->len == str->siz ) {
        str = QString_Expand(str, QSTRING_INCREASE);
    }
    str->buf[str->len] = '\0';
    return str;
}
 
bool read_line(FILE* input, QString digits, QString letters)
{
    QString_Clear(digits);
    QString_Clear(letters);
    int c;
    while( (c = fgetc(input)) && c != '\n' ) {
        if( c == EOF ) return false;
        if( isdigit(c) ) {
            QString_Append(digits, c);
        } else {
            QString_Append(letters, c);
        }
    }
    return true;
}
 
void write_line(FILE* output, QString digits, QString letters)
{
    fputs(letters->buf, output);
    fputs(digits->buf, output);
    fputc('\n', output);
}
 
int main(void)
{
    FILE* input = stdin;
    FILE* output = stdout;
 
    QString digits = QString_New();
    QString letters = QString_New();
    bool not_eof;
 
    do {
        not_eof = read_line(input, digits, letters);
        write_line(output, digits, letters);
    } while( not_eof );
 
    return 0;
}
0
01.07.2014, 20:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2014, 20:31

Вывести текст подчеркивая все входящие в него цифры
Задан текст. Вывести этот текст, подчеркивая (ставя в следующей строке под этим символом минус)...

Перенести в начало массива все положительные элементы, а в конец массива - все отрицательные
Помогите, пожалуйста, написать программу на языке Си: Дан одномерный массив А, состоящий из N ...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru