Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Quawetim
0 / 0 / 0
Регистрация: 15.12.2012
Сообщений: 4
1

Подпрограммы: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз

16.12.2012, 12:41. Просмотров 1872. Ответов 3
Метки нет (Все метки)

Доброго времени суток, господа. Часто посещаю ваш форум, но прямое общение понадобилось только сейчас. Итак, к делу.
Задача: Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз, в том порядке, как они встречаются в тексте. Использовать как минимум три подпрограммы(ввод, основная, вывод).

Задачка элементарная и решается за 5 минут, да и у вас решалась неоднократно поэтому:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <conio.h>
#include <stdio.h>
#include <string.h>
const int N=11;
void main()
{
    int i,j,k,l=0,n=0,m=0;
    char s,tx[N],fin[N];
 
    for (i=0;(s=getchar())!='.';i++) {tx[i]=s;n++;}
 
    for(i=0;i<n;i++) 
    {
        k=0;
        for (j=0;j<n;j++) if (tx[j]==tx[i]) k++;
        if (k==1) {fin[l]=tx[i];l++;}
    }
    m=l;
    for (l=0;l<m;l++) printf_s("%c ",fin[l]);
    _getch();
}
Значение N(11) взято "от балды" и может быть иным. Так как в задаче не сказано сколько именно символов в тексте, считаю до точки. Именно из-за отсутствия размера у меня и возникают трудности.

Приведу некоторые мысли:
1. Подпрограмма input:
1.1. Формирует исходный массив tx, элементы которого - отдельные символы текста.
1.2. Находит n - индекс последнего символа, т.е. символа перед точкой.
1.3. Передает массив tx и целое число n в подпрограмму sravn.
2. Подпрограмма sravn:
2.1. Получает от подпрограммы input массив tx и целое число n.
2.2. Заполняет массив fin символами, которые повторяются ровно один раз, и находит целое число m - индекс последнего символа в массиве fin.
2.3. Передает массив fin и целое число m подпрограмме output.
3. Подпрограмма output:
3.1. Получает от подпрограммы sravn массив fin и целое число m.
3.2. Выводит массив fin.

Вся загвоздка заключается в передаче m и n между подпрограммами. Именно здесь мне необходима ваша помощь.
Под спойлером неработающий вариант.
Кликните здесь для просмотра всего текста
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
#include <conio.h>
#include <stdio.h>
#include <string.h>
const int N=11;
void input(char a[N])
{
    int i,n=0;
    char s;
    for (i=0;(s=getchar())!='0';i++) {a[i]=s;n++;}
}
void sravn(char a[N],char b[N])
{   
    int i,j,k,l=0,n,m;
    for(i=0;i<n;i++) 
    {
        k=0;
        for (j=0;j<n;j++) if (a[j]==a[i]) k++;
        if (k==1) {b[l]=a[i];l++;}
    }
    m=l;
}
void output(char b[N])
{
    int l,m;
    for (l=0;l<m;l++) printf_s("%c ",b[l]);
}
void main()
{
    char tx[N],fin[N];
 
    input(tx);
    sravn(tx,fin);
    output(fin);
    _getch();
}


Добавлено через 13 часов 44 минуты
Почти готовый вариант, осталось только перевести ввод и вывод в отдельные подпрограммы.
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
#include <conio.h>
#include <stdio.h>
#include <string.h>
const int N=11;
 
void sravn(char a[N],char b[N], int n)
{   
    int i,j,k,l=0;
    for(i=0;i<n;i++) 
    {
        k=0;
        for (j=0;j<n;j++) if (a[j]==a[i]) k++;
        if (k==1) {b[l]=a[i];l++;}
    }
    b[l]='\0';
}
void main()
{
    char s,tx[N],fin[N];
    int i,n=0;
    
    for (i=0;(s=getchar())!='.';i++) {tx[i]=s;n++;}
    tx[i]='\0';
    
    sravn(tx,fin,n);
 
    for (i=0;fin[i]!='\0';i++) printf_s("%c ",fin[i]);
    _getch();
}
Добавлено через 25 минут
Готовая программа. Может стоит что-то улучшить? Я решил избавиться от m и n, из-за которых и возникали трудности, используя функцию strlen для вычисления длины строки.
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
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
const int N=100;
void input(char a[N])
{
    int i;
    char s;
    printf_s("Введите текст, оканчивающийся точкой.\n");
    for (i=0;(s=getchar())!='.';i++) a[i]=s;
    a[i]='\0';
}
void sravn(char a[N],char b[N])
{   
    int k,l=0;
    unsigned int i,j;
    for(i=0;i<(strlen(a));i++) 
    {
        k=0;
        for (j=0;j<strlen(a);j++) if (a[j]==a[i]) k++;
        if (k==1) {b[l]=a[i];l++;}
    }
    b[l]='\0';
}
void output(char b[N])
{
    unsigned int i;
    printf_s("\nСимволы, встречающиеся в тексте ровно один раз через пробел:\n");
    for (i=0;i<strlen(b);i++) printf_s("%c ",b[i]);
}
void main()
{
    char tx[N],fin[N];
 
    setlocale(LC_CTYPE, "Russian"); 
    input(tx);
    sravn(tx,fin);
    output(fin);
    _getch();
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 12:41
Ответы с готовыми решениями:

Напечатать все слова, которые встречаются в нем ровно один раз
Здравствуйте. Помогите, пожалуйста, с задачей. Условие: Дано предложение, состоящее из слов,...

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

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

Удалить из заданного текста те слова, которые встречаются в нем заданное количество раз
Удалить из заданного текста те слова, которые встречаются в нем заданное количество раз. Вычислить...

Для заданной символьной строки вывести на экран те символы, которые встречаются в ней только один раз
Для заданной символьной строки вывести на экран те символы, которые встречаются в ней только один...

3
vua72
418 / 417 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
17.12.2012, 08:55 2
Может лучше так?
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
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int input(char *buf)
{
    // возвращаем число элементов для выделения памяти
    int i;
    char s;
    printf ("vvedite stroku:\n");
    for (i=0; (s=getchar())!='.'; i++) {
        buf[i]=s;
    }
    buf[i]='\0';
    // printf("\n n=%d \n", *n);
    // for (i=0; i<*n; i++)  printf("%c", buf[i]);
    // printf ("\n");
           return i;
}
void sravn(char *a, char *b)
{
    printf("\n------------------------");
    int i,j,k,l=0;
    for(i=0; i<strlen(a); i++) {
        k=0;
        for (j=0; j<strlen(a); j++)
            if (a[j]==a[i]) k++;
        if (k==1) {
            b[l]=a[i];
            printf ("\n%c", b[l]);
            l++;
        }
    }
    b[l]='\0';
    printf("\n------------------------");
}
void output(char *b)
{
    int l;
    for (l=0; l<strlen(b); l++) printf("%c ",b[l]);
}
int  main()
{
    int n=0;
    char *buf=(char*)malloc (256*sizeof(char)); 
    //выделяем буфер для ввода, можно не динамический
    // char buf[256];
    n=input(buf);
    //char *tx=(char*)malloc(n*sizeof(char)); скопировать сюда
    char *fin=(char*)malloc((n)*sizeof(char));
    char *tx=buf; 
    sravn(tx, fin);
    output(fin);
    free(fin);
    //free (tx);
    free(buf);
    _getch();
    return 0;
}
1
Quawetim
0 / 0 / 0
Регистрация: 15.12.2012
Сообщений: 4
17.12.2012, 13:13  [ТС] 3
Цитата Сообщение от vua72 Посмотреть сообщение
Может лучше так?
Честно сказать, не люблю указатели, поэтому стараюсь их всячески избегать. Спасибо за вариант, буду иметь ввиду.
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10511 / 6216 / 1562
Регистрация: 25.07.2009
Сообщений: 11,835
17.12.2012, 14:43 4
Цитата Сообщение от Quawetim Посмотреть сообщение
Честно сказать, не люблю указатели, поэтому стараюсь их всячески избегать.
В языке С на указателях добрых две трети конструкций держатся, если не больше. При аккуратном подходе указатели в С - черезвычайно мощный инструмент, при отсутствии понимания того, что делаешь - ад кромешный.


Цитата Сообщение от Quawetim Посмотреть сообщение
Использовать как минимум три подпрограммы(ввод, основная, вывод).
Вот с этим не задалось как-то
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>
 
int main(void) {
    char buf[BUFSIZ], * ptr;
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        for ( ptr = buf; *ptr; ++ptr )
            if ( strchr(buf, *ptr) == ptr && ! strchr(ptr + 1, *ptr) )
                printf("%c", *ptr);
    
    return 0;
}
1
17.12.2012, 14:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2012, 14:43

Напечатать только те буквы слов, которые встречаются в обоих словах только один раз
2) Даны два слова. Напечатать только те буквы слов, которые встречаются в обоих словах только один...

Напечатать только те буквы слов, которые встречаются в обоих словах только один раз
даны два слова. напечатать только те буквы слов, которые встречаются в обоих словах только один...

Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз
Не могу научиться мыслить на c++. Но старательно пытаюсь.... Если бы не традиционное &quot;Завтра...


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

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

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