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

Написать программу, которая из всех цифр, встретившихся в строке и не равных нулю, формирует наименьшее число

17.04.2014, 20:45. Просмотров 1739. Ответов 27
Метки нет (Все метки)

Добрый день,дали задачу по информатике,сказали из с4.
Условие задачи:
На вход программе подается последовательность символов,состоящая из букв латинского алфавита и цифр.Ввод символов заканчивается вопросительным знаком.Требуется написать программу,которая из всех цифр,встретившихся в строке и не равных нулю,формирует наименьшее число(без повторения цифр) и выводит на экран число,равное синусу полученного числа.Если таких цифр нет,то программа выводит нуль.Пусть,например,на вход программе поданы следующие символы:a1ab1ac1ad2ae4r4.В данном случае программа должна вывести sin(124)=-0,995686.
На паре проходили указатели,пробовал с их помощью, преподаватель сказал ввести массив(0-9) и проводить сравнение,но что-то я висну,помогите пж,заранее спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
      char s[80], digit[10] = {'0','1','2','3','4','5','6','7','8','9'};
      int j,i,k,z[10];
      printf("Vvedi stroku\n");
      gets(s);
      
      for (j=0; j<10; j++)
      z[j]=0;
      
      for (i=0;i<80; i++)
      for (j=0; j<10; j++) { 
      if (s[i] == digit[j]){
      z[j]=z[j]+1;}
      }
      for (j=0;j<10;j++)
      printf("%c = %d\n",digit[j],z[j]);
      
      getch();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2014, 20:45
Ответы с готовыми решениями:

Найти в строке число, содержащее наименьшее количество цифр
Здравствйте. Есть такая задача: Составить программу, которая выделяет...

Написать программу, которая формирует файл результата путем выбрасывания повторяющихся чисел
Компонентами вводимого файла являются пары целых чисел: Num (числитель) и Den...

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

Написать программу, которая предлагает пользователю ввести число, вычисляет его разрядность и сумму всех цифр и выводить результаты в консоль
Help! Написать программу, которая предлагает пользователю ввести число,...

Написать и протестировать функцию, которая по заданной строке Str формирует новую строку, состоящую только из цифр, входящих в Str
Помогите ребят!!!!препод задачи дал для аттестации,сделал фактически все,кроме...

27
easybudda
Модератор
Эксперт CЭксперт С++
10095 / 6004 / 1505
Регистрация: 25.07.2009
Сообщений: 11,391
24.04.2014, 20:12 21
Цитата Сообщение от Catstail Посмотреть сообщение
if (Dig[0]!=0) z=(z/p)*p*10+(z%p);
Вот этого не понял, это что у Вас тут происходит?

Цитата Сообщение от Catstail Посмотреть сообщение
Чего-то перемудрили...
А мы простых путей не ищем! Вот ещё одно "интуитивно понятное" решение
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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
 
typedef struct NODE {
    int code;
    struct NODE * left;
    struct NODE * right;
} node_t;
 
void push(node_t ** pRoot, int code) {
    if ( ! *pRoot ) {
        node_t * pNode = malloc(sizeof(node_t));
        assert(pNode);
        pNode->code = code;
        pNode->left = NULL;
        pNode->right = NULL;
        *pRoot = pNode;
    }
    else {
        int diff = (*pRoot)->code - code;
        if ( diff > 0 )
            push(&((*pRoot)->left), code);
        else if ( diff < 0 )
            push(&((*pRoot)->right), code);
    }
}
 
int get_number(node_t * root) {
    if ( root ) {
        int ret = get_number(root->left) * 10 + root->code;
        int right = get_number(root->right);
        return ( right ) ? ret * (int)pow(10.0, floor(log10(right)) + 1) + right : ret;
    }
    else
        return 0;
}
 
void killtree(node_t ** pTree) {
    if ( *pTree ) {
        killtree(&((*pTree)->left));
        killtree(&((*pTree)->right));
        free(*pTree);
        *pTree = NULL;
    }
}
 
int main(void) {
    node_t * tree = NULL;
    int code;
    
    while ( ( code = getchar() ) != EOF && code != '?' )
        if ( ( code -= '0' ) > 0 && code < 10 )
            push(&tree, code);
    
    if ( ! tree )
        printf("0\n");
    else {
        code = get_number(tree);
        printf("Number: %d, Sinus: %f\n", code, sin((double)code));
    }
    
    killtree(&tree);
    
    return 0;
}
Код
[andrew@andrew numbers]$ gcc -o smallest_number smallest_number.c -lm
[andrew@andrew numbers]$ ./smallest_number
a1ab1ac1ad2ae4r4?
Number: 124, Sinus: -0.995687
Цитата Сообщение от Vtulhu Посмотреть сообщение
fflush(stdin);
ERRORS
[EBADF] The stream argument is not an open stream, or, in the
case of fflush(), not a stream open for writing.
man fflush
1
Catstail
Модератор
23603 / 11704 / 2046
Регистрация: 12.02.2012
Сообщений: 19,094
24.04.2014, 20:15 22
Цитата Сообщение от korvin_ Посмотреть сообщение
Что за проблема?
- если имеется набор цифр, то вполне очевидно, что наименьшее число, составленное из них будет иметь вид n1n2...nk при условии, что n1 < n2 < ... < nk. Если нуль не вводился, то все хорошо. А если вводился, то его придется "запихнуть" на вторую позицию слева. Ведь если поставить его на первую - он станет незначимым... Впрочем, оставим это на совести тех, кто составляет задачи ЕГЭ.

Цитата Сообщение от mad17 Посмотреть сообщение
в 4 строке char* argv[]-за что отвечает?
- аргументы командной строки. Это вставил VC++. Можно написать
C
1
int main()
Цитата Сообщение от mad17 Посмотреть сообщение
2)Dig[10]-массив,char c -строка?
- Dig - массив. char c - не строка, а символ.

Цитата Сообщение от mad17 Посмотреть сообщение
3)за что отвечают z и p
- z (как легко видеть) - это результат. А p - это степень десяти, требующаяся для отделения старшей цифры (чтобы загнать нуль на вторую позицию).

Цитата Сообщение от mad17 Посмотреть сообщение
sin((double)z)-double никак заменить нельзя?
- от компилятора зависит... Но функция sin требует на входе числа с плавающей точкой. Поэтому я и поставил преобразование в тип double.

Цитата Сообщение от mad17 Посмотреть сообщение
ни разу его не использовали.
- ну и что?


Не по теме:

Задача не лишена интереса (почему я и откликнулся), а вот вычисление синуса в этом контексте - явный идиотизм. Но что ждать от чиновников?



Добавлено через 1 минуту
Цитата Сообщение от easybudda Посмотреть сообщение
Вот этого не понял, это что у Вас тут происходит?
- если среди введенных цифр был нуль, то его нужно поставить на вторую позицию.
1
easybudda
Модератор
Эксперт CЭксперт С++
10095 / 6004 / 1505
Регистрация: 25.07.2009
Сообщений: 11,391
24.04.2014, 20:18 23
Цитата Сообщение от Catstail Посмотреть сообщение
если среди введенных цифр был нуль, то его нужно поставить на вторую позицию.
насколько я понял,
Цитата Сообщение от mad17 Посмотреть сообщение
из всех цифр,встретившихся в строке и не равных нулю,формирует наименьшее число(без повторения цифр)
нули в этом празднике вообще не участвуют...

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
а вот вычисление синуса в этом контексте - явный идиотизм.
Постов через 10 выяснится, что его нужно было разложением в ряд Тейлора получить... ;)

1
Catstail
Модератор
23603 / 11704 / 2046
Регистрация: 12.02.2012
Сообщений: 19,094
24.04.2014, 20:22 24
Цитата Сообщение от easybudda Посмотреть сообщение
Вот ещё одно "интуитивно понятное" решение
- это уже "музыка сфер"...

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
нули в этом празднике вообще не участвуют...
- ну, так я решил более сложную задачу. А без нуля вот:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <math.h>
 
int main()
{
    int i,z,Dig[10];
    char c;
    for (i=0;i<10;i++) Dig[i]=0;
        с=' ';
    while (c != '?')
    {
        c=getchar();
        if (c>'0' && c<='9') Dig[c-'0']++;
    }
    z=0;
    for (i=1; i<10; i++)
        if (Dig[i] != 0) z=z*10+i;
    printf("min=%d\n",z);
    printf("sin=%lf\n",sin((double)z));
    return 0;
}
Леди из кареты - пони легче...
2
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
24.04.2014, 22:03 25
Меня всегда поражало, когда я дам решение, а люди продолжают решать задачу, предлагая варианты хуже моего.
1
easybudda
Модератор
Эксперт CЭксперт С++
10095 / 6004 / 1505
Регистрация: 25.07.2009
Сообщений: 11,391
25.04.2014, 00:49 26
Цитата Сообщение от Vtulhu Посмотреть сообщение
я дам решение, а люди продолжают решать задачу, предлагая варианты хуже моего
Простите, а чем они хуже не считая того, что девять строчек на десять функций не раскиданы? Про своё "решение" я не говорю, я его исключительно для выпендрёжа сделал. Учитывая максимальное количество цифр в числе, образующем строго возрастающую последовательность, дерево - самое оно, и ещё хорошо, что не красно-чёрное. Готов поставить деньги на то, что с точки зрения препода лучшим будет вариант Catstail из 24 поста. И я бы с преподом в таком случае полностью согласился - чел азам программирования учится, а не к нанопрыгалке для пространственно-временных скачков софтину пишет. Да и кстати не уверен, что stdbool.h хоть в какой-то мелкостудии есть, а в Borland Turbo C++ 3.x его точно нет, то есть прийдётся объяснять преподу, что не так и как исправить. Ну или поспорить с ним на тему неактуальности компилятора, популярного в 90-ых годах прошлого века и получить замечательную возможность пересдать зачёт (или что там) где-нибудь в разгар лета...
2
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
25.04.2014, 12:51 27
Цитата Сообщение от easybudda Посмотреть сообщение
с точки зрения препода
У меня только один вопрос. Если точка зрения препода правильная, почему он не работает в какой-нибудь софтверной компании за хорошие деньги, а получает нищенскую зарплату (по сути, продуктовый паек)? И почему воспитанные этим преподом олимпиадники потом не могут устроиться на работу? А если устраиваются, то в лучшем случае в шарашки, где требуется "разбираться в чужом коде"? Читай: копаться в куче дрянного кода, написанного таким же олимпиадником прошлого года выпуска? Если олимпиадник окажется достаточно самокритичным, чтобы засунуть свое ЧСВ куда подальше, он начнет учиться сначала. Потому что изученное им "программирование" на самом деле быдлокодинг. Забавный парадокс: почти все книги, в названии которых есть слово "программирование", учат не программированию, а кодингу. А во многих книгах о программировании есть слово "код" (Совершенный код, Чистый код).

При прочих равных работодатель предпочтет нанять человека без особых знаний, но готового учиться, чем уже "выученного" олимпиадника. Аналогия: семилетний ребенок, если пойдет в школу, через пару-тройку лет получит смутное, но все же верное представление об окружающем мире. А к 10 классу будет очень даже грамотным во многих науках (физика, математика). Понятно, что не все, но мы говорим о людях с хорошим интеллектом.

Человек, который несколько лет изучал бредни какого-нибудь шамана и теперь рассказывает всем, что земля плоская и накрыта хрустальной полусферой, уже необучаем. Не потому, что не может (новые бредни он усваивает легко - олимпиадник же, интеллект зачастую действительно выше среднего), а потому что возникает психологический блок: это что же я, столько лет зря потратил? И он предпочитает продолжить "образование" у шамана, вместо того, чтобы признать: да, я шел по неправильному пути, но как бы я далеко по нему не прошел, надо свернуть на правильный.

Самомнение не пускает. У него же бусы/медаль, его шаман уважает и такие же, как он, дикари-быдлокодеры! А кем я буду, если начну всё сначала? Опять за парту? Ещё 10 лет? Да я лучше буду работать за копейки (не исключено, что новым шаманом, когда старый отправится на пенсию) и всем рассказывать, что я гений, просто тупые работодатели этого не понимают и набирают бездарностей. Наверное, они блатные. Или ещё что.

http://en.wikipedia.org/wiki/Irrational_escalation
http://en.wikipedia.org/wiki/Zero-risk_bias
http://en.wikipedia.org/wiki/Base_rate_fallacy
1
mad17
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
25.04.2014, 17:46  [ТС] 28
всем спасибо,что нафиг не послали,а помогли разобраться и ответили на вопросы,насчет преподавателя-она подходит,помогает,однако решать нужно так как она дает,нельзя принести решенную программу,если мы не проходили такой "метод" решения,все программки сданы,и вот самую последнюю дали...

c=getchar()
и
sin((double)z
такое не проходили,однако мб прокатит,насчет того ,чтобы спорить с преподавателем-это не школа)
p.s. про олимпиадников много написано,я не олимпиадник и про " Если точка зрения препода правильная, почему он не работает в какой-нибудь софтверной компании за хорошие деньги, а получает нищенскую зарплату" думаю вопрос все же риторический.
p.s.s. еще раз большое спасибо,что помогли,надеюсь когда у вас будут вопросы,вам тоже встретятся люди которые помогут с ответом!)
0
25.04.2014, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2014, 17:46

Написать программу, которая, используя заданное действительное число , формирует матрицу порядка в следующем виде

Написать программу, которая, используя заданное действительное число , формирует матрицу порядка в следующем виде

Напишите программу, которая поможет выйграть - найдет наименьшее натуральное число с произведением цифр, равным N.
Задача для Free Pascal: Любители математики Вася и Петя придумали игру с...


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

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

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