Форум программистов, компьютерный форум, киберфорум
Наши страницы

C для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
mad17
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
#1

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

17.04.2014, 20:45. Просмотров 1518. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать программу, которая из всех цифр, встретившихся в строке и не равных нулю, формирует наименьшее число (C (СИ)):

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

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

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

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

Написать программу, которая предложит схему прохождения всех людей через мост за наименьшее время - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using namespace std; int main() { int n, i, min, m; cin &gt;&gt; n; ...

Составить программу, которая по заданным натуральным числам N и S найдет наименьшее число, большее N, сумма цифр которого равна S - Pascal
паскаль знаю на уровне школьника, вот такая задача: Составить программу, которая по заданным натуральным числам N и S найдет...

27
mad17
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
24.04.2014, 17:28  [ТС] #16
м,просто в 15 строке на "?" исправил,все равно при любом раскладе "0" пишет в результате.
0
kiff20072008
57 / 57 / 13
Регистрация: 28.09.2012
Сообщений: 358
24.04.2014, 17:51 #17
mad17,
вот теперь правильно
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
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
 
 
int main()
{
    int ch;
    int j, i, k, z[10];
    printf("Vvedi stroku\n");
    
    for (j = 0; j<10; j++)
        z[j] = 0;
 
    while ((ch = getc(stdin)) != '?')
    {
        if (ch>48 || ch<58)
            z[ch-48]++;
 
    }
 
 
    k = 0;
    for (i = 1; i<10; ++i)
        if (z[i])
            k = k * 10 + i;
    if (k == 0)
        printf("0");
    else
        printf("sin(%i)= %i", k, sin(k));
 
    return 0;
}
1
Catstail
Модератор
22989 / 11355 / 1849
Регистрация: 12.02.2012
Сообщений: 18,592
24.04.2014, 18:21 #18
Чего-то перемудрили... Единственная проблема - нуль. А так - вот:

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 <math.h>
 
int main(int argc, char* argv[])
{
    int i,z,p,Dig[10];
    char c;
    for (i=0;i<10;i++) Dig[i]=0;
        c=' ';
    while (c != '?')
    {
        c=getchar();
        if (c>='0' && c<='9') Dig[c-'0']++;
    }
    z=0;
    p=1;
    for (i=1; i<10; i++)
        if (Dig[i] != 0) {z=z*10+i; if (i>1) p*=10;}
    if (Dig[0]!=0) z=(z/p)*p*10+(z%p);
    printf("min=%d\n",z);
    printf("sin=%lf\n",sin((double)z));
    return 0;
}
1
korvin_
1967 / 1452 / 228
Регистрация: 28.04.2012
Сообщений: 5,207
24.04.2014, 19:12 #19
Цитата Сообщение от 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
#include <u.h>
#include <libc.h>
 
#define DIGITS 10
 
int
minnum(char *s)
{
    int digits[DIGITS] = {0};
    int e, i, result;
    for (; *s != 0; s++)
        if (*s > '0' && *s <= '9')
            digits[*s - '0'] = 1;
    result = 0;
    e = 1;
    for (i = DIGITS - 1; i > 0; i--)
        if (digits[i]) {
            result += i * e;
            e *= 10;
        }
    return result;
}
 
void
main(int argc, char* argv[])
{
    int i, n;
    for (i = 1; i < argc; i++) {
        n = minnum(argv[i]);
        print("sin(%d) = %f\n", n, sin(n));
    }
    exits(0);
}
Bash
1
2
~/prog/c $ ./minsin a1ab1ac1ad2ae4r4
sin(124) = -0.995687
1
mad17
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
24.04.2014, 19:57  [ТС] #20
Catstail,можно спросить:1)в 4 строке char* argv[]-за что отвечает?
2)Dig[10]-массив,char c -строка?
3)за что отвечают z и p
4)sin((double)z)-double никак заменить нельзя?ни разу его не использовали.
Всем спасибо,кто отписал в этой теме!)
0
easybudda
Модератор
Эксперт CЭксперт С++
9715 / 5666 / 971
Регистрация: 25.07.2009
Сообщений: 10,910
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
Модератор
22989 / 11355 / 1849
Регистрация: 12.02.2012
Сообщений: 18,592
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Эксперт С++
9715 / 5666 / 971
Регистрация: 25.07.2009
Сообщений: 10,910
24.04.2014, 20:18 #23
Цитата Сообщение от Catstail Посмотреть сообщение
если среди введенных цифр был нуль, то его нужно поставить на вторую позицию.
насколько я понял,
Цитата Сообщение от mad17 Посмотреть сообщение
из всех цифр,встретившихся в строке и не равных нулю,формирует наименьшее число(без повторения цифр)
нули в этом празднике вообще не участвуют...

Не по теме:

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

1
Catstail
Модератор
22989 / 11355 / 1849
Регистрация: 12.02.2012
Сообщений: 18,592
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
371 / 377 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
24.04.2014, 22:03 #25
Меня всегда поражало, когда я дам решение, а люди продолжают решать задачу, предлагая варианты хуже моего.
1
easybudda
Модератор
Эксперт CЭксперт С++
9715 / 5666 / 971
Регистрация: 25.07.2009
Сообщений: 10,910
25.04.2014, 00:49 #26
Цитата Сообщение от Vtulhu Посмотреть сообщение
я дам решение, а люди продолжают решать задачу, предлагая варианты хуже моего
Простите, а чем они хуже не считая того, что девять строчек на десять функций не раскиданы? Про своё "решение" я не говорю, я его исключительно для выпендрёжа сделал. Учитывая максимальное количество цифр в числе, образующем строго возрастающую последовательность, дерево - самое оно, и ещё хорошо, что не красно-чёрное. Готов поставить деньги на то, что с точки зрения препода лучшим будет вариант Catstail из 24 поста. И я бы с преподом в таком случае полностью согласился - чел азам программирования учится, а не к нанопрыгалке для пространственно-временных скачков софтину пишет. Да и кстати не уверен, что stdbool.h хоть в какой-то мелкостудии есть, а в Borland Turbo C++ 3.x его точно нет, то есть прийдётся объяснять преподу, что не так и как исправить. Ну или поспорить с ним на тему неактуальности компилятора, популярного в 90-ых годах прошлого века и получить замечательную возможность пересдать зачёт (или что там) где-нибудь в разгар лета...
2
Vtulhu
371 / 377 / 96
Регистрация: 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 и S найдет наименьшее число, большее N, сумма цифр которого равна S - Pascal
Решите пожалуйста!!!!!! хотя бы одну!!! Задача 1. &quot;Число&quot; (20 баллов) Имя входного файла: a.in Имя выходного файла: a.out ...

Написать программу которая находит наименьшее число последовательности состоящей из 20 действительных чисел - VBA
Задание: Написать программу которая находит наименьшее число вводимой с клавиатуры последовательности, состоящей из 20 действительных...

Написать программу, которая вводит число из пяти цифр, разделяет число на отдельные цифры - C++
Привет народ скажите как написать программу, которая вводит число из пяти цифр, разделяет число на отдельные цифры и печатает их...

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


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

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

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