Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день,дали задачу по информатике,сказали из с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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2014, 20:45
Ответы с готовыми решениями:

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

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

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

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

27
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
17.04.2014, 21:05 2
Сначала подсчитываешь, сколько разных цифр во введённой строке (сколько в массиве z ненулевых элементов), пусть то n.
Затем формируешь число: снова просматриваешь массив и каждую присутствующую цифру умножаешь на 10 в степени (n-1) и суммируешь, после чего n уменьшаешь на единицу. Потом синус.
Случай с нулём надо особо рассматривать. Например, предварительно поменять местами z[0] и ближайший ненулевой z[i].
1
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
18.04.2014, 21:37  [ТС] 3
АПНУ
0
61 / 61 / 24
Регистрация: 28.09.2012
Сообщений: 378
18.04.2014, 22:22 4
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
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<math.h>
main()
{
      char s[80];
      int j,i,k,z[10];
      printf("Vvedi stroku\n");
      gets(s);
      
      for (j=0; j<10; j++)
      z[j]=0;
      i=0;
      while(s[i]!='!')
      {
        if(isdigit(s[i])
          z[s[i]]++;
       ++i;
       }
       k=0;
       for(i=1;i<10;++i)
         if(z[i])
           k=k*10+z[i];
       if(k==0)
         printf("0");
       else
       printf("sin(%i)= %i",k,sin(k));
      
      getch();
}
1
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
19.04.2014, 12:19  [ТС] 5
в 17 строке ошибка вылезла,со скобкой исправил ,потом тут же выходит,что "isdigit" не обьявлен
0
61 / 61 / 24
Регистрация: 28.09.2012
Сообщений: 378
19.04.2014, 12:38 6
mad17, Так вы не подключили библиотеку string.h вроде бы
1
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
19.04.2014, 19:21  [ТС] 7
да подключал...
0
61 / 61 / 24
Регистрация: 28.09.2012
Сообщений: 378
19.04.2014, 19:49 8
mad17, ctype.h сорри
1
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
19.04.2014, 21:28 9
Цитата Сообщение от mad17 Посмотреть сообщение
преподаватель сказал ввести массив(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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
 
bool exist_digit(const char* str, int d)
{
    const char* digits = "0123456789";
    return strchr(str, digits[d]) != NULL;
}
 
int get_lowest_number_with_unique_digits(const char* str)
{
    int number = 0;
    for( int i = 1; i < 10; ++i ) {
        if( exist_digit(str, i) ) {
            number *= 10;
            number += i;
        }
    }
    return number;
}
 
bool truncate_before_question_mark(char* str)
{
    while( *str != '?' ) {
        if( *str++ == '\0' ) return false;
    }
    *str = '\0';
    return true;
}
 
int main(void)
{
    char buf[80];
    int number;
    while( true ) {
        fflush(stdin);
        fgets(buf, sizeof(buf), stdin);
        if( !truncate_before_question_mark(buf) ) break;
        number = get_lowest_number_with_unique_digits(buf);
        printf("number = %d\n", number);
    }
 
    return 0;
}
Если я правильно понял, вопросительный знак обязан присутствовать в строке. Если его нет, программа вылетает.
1
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
21.04.2014, 10:29  [ТС] 10
kiff20072008 ,не совсем разобрался в вашей программе,ввожу строку,просто ноль выдает.

Добавлено через 2 минуты
vtulhu,спс что помогли,но к сожалению такую не примут,вы написали более "круто",чем мы пишем)мы по полочкам,через scanf|printf и т.д)попроще сами делали,а тут взяли и дали,сказали из ЕГЭ С4.
0
61 / 61 / 24
Регистрация: 28.09.2012
Сообщений: 378
21.04.2014, 10:35 11
mad17,
Есть массив инт
Считываем строку
Массив обнуляем
Пока не встретим ! Проходим по строке
Если нашли число то увеличиваем на один соответствующий элемент
Дальше составляет число
Только там надо прибавить I а не z[i]
И выводим син числа
1
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
21.04.2014, 14:59 12
Цитата Сообщение от mad17 Посмотреть сообщение
vtulhu,спс что помогли,но к сожалению такую не примут,вы написали более "круто",чем мы пишем)мы по полочкам,через scanf|printf и т.д)попроще сами делали,а тут взяли и дали,сказали из ЕГЭ С4.
А я всегда знал, что у нас не просто плохо учат программированию, а учат плохому программированию. Особенно жаль так называемых "олимпиадников", которых натаскали на то, чтобы быстро писать много кода, который ни одному нормальному работодателю и в страшном сне не приснится. И ходят они потом со своими медалями, рассказывают всем, что они гении, просто им все завидуют, поэтому не нанимают. А нанимают каких-то дураков, которые весь код на малюсенькие функции разбивают, переменным и функциям имена по 20-30 символов дают...

Вот, постарался сделать настолько хорошо, насколько это возможно в рамках требований Ваших пердопавателей.

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
#include <stdbool.h>
#include <stdio.h>
 
// Функция выдает массив из 10 булевых значений, сигнализирующих,
// присутствует ли в строке соответствующая цифра.
 
bool* exist_digits(const char* str)
{
    static bool digits[10];
    int i;
    for( i = 0; i < 10; ++i ) {
        digits[i] = false;
    }
    while( (i = *str++) && i != (int)'?' ) {
        i -= (int)'0';
        if( i >= 0 && i <= 9 ) {
            digits[i] = true;
        }
    }
    return digits;
}
 
// Функция создает наименьшее число из цифр, которые отмечены как true.
 
int lowest_number(bool* digits)
{
    int n = 0;
    for( int i = 1; i < 10; ++i ) {
        if( digits[i] ) {
            n *= 10;
            n += i;
        }
    }
    return n;
}
 
int main(void)
{
    char buf[80];
    int n;
 
    do {
        puts("Input string");
        scanf("%79s", buf);
        n = lowest_number(exist_digits(buf));
        printf("Lowest number = %d\n", n);
    } while( n );
 
    return 0;
}
1
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
22.04.2014, 20:17  [ТС] 13
м,не могу сказать,что учат плохому или хорошему программированию,все идет со школы,в школе,конкретно по информатике нечего не требовали ,мы просто смотрели видео и играли в CS, в институте же все аукнулось,ребята говорят то проходили,это проходили,мы же тупо ЕГЭ тесты решали.
0
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
24.04.2014, 16:34  [ТС] 14
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
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<math.h>
main()
{
      char s[80];
      int j,i,k,z[10];
      printf("Vvedi stroku\n");
      gets(s);
      
      for (j=0; j<10; j++)
      z[j]=0;
      i=0;
      while(s[i]!='!')
      {
        if(isdigit(s[i])
          z[s[i]]++;
       ++i;
       }
       k=0;
       for(i=1;i<10;++i)
         if(z[i])
           k=k*10+z[i];
       if(k==0)
         printf("0");
       else
       printf("sin(%i)= %i",k,sin(k));
      
      getch();
}
что это можете сказать?неясно
C
1
2
  z[s[i]]++;
       ++i;
за что отвечает к и при любом раскладе он мне выводит ноль,как исправить
C
1
2
 if(k==0)
         printf("0");
0
61 / 61 / 24
Регистрация: 28.09.2012
Сообщений: 378
24.04.2014, 17:12 15
mad17,первое мы в массиве элемент с номером встретившегося числа увеличиваем на 1
то есть если в элементе 4 мы встретим 3 то значит что в числе было 3 четверки

к это число наименьшее составленное из чисел которые были в исходном числе
1
9 / 9 / 0
Регистрация: 27.12.2012
Сообщений: 165
24.04.2014, 17:28  [ТС] 16
м,просто в 15 строке на "?" исправил,все равно при любом раскладе "0" пишет в результате.
0
61 / 61 / 24
Регистрация: 28.09.2012
Сообщений: 378
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
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,652
Записей в блоге: 13
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
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
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
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
24.04.2014, 19:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2014, 19:57
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

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