Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > ПОМОЩЬ СТУДЕНТАМ > помогите пожалуйста написать программы на языке си.


Автор: alex____666 26.04.18, 16:22
я просто проболел и все лекции с обьяснениями пропустил. а программы надо как то сдавать. можете помочь?
1)Дано натуральное число, в котором все цифры различны. Определить:
а) порядковые номера двух его максимальных цифр, считая номера: от конца числа; от начала числа;
2)Среди чисел 1,1+1/2,1+1/2+1/3, ... найти первое, большее числа n. :wub:

Автор: Славян 26.04.18, 16:37
Для второго: можно в лоб, а можно, используя: Сумма = ln(k) + 0,577215665... Вам как?

Автор: alex____666 26.04.18, 17:57
Цитата Славян @


я не то скопировал. просто. я сам его сделал ещё давно. но все равно спасибо

Автор: Славян 26.04.18, 18:34
Первое осталось? Оно то хоть то? :)

Автор: alex____666 26.04.18, 18:47
[quote=Славян,1524767668,3767979][/q
да первое то) это все в код блок надо сделать но он у меня везде просто ошибки выдает

Добавлено
[quote=Славян,1524760642,3767971][/quote]
Дано натуральное число n. Вычислить:
а)
1/sin1+1/sin1+sin2+...+1/sin1+...+ sin n

вот такое задание

Автор: Славян 26.04.18, 18:58
Что-то со вторым я опять последовательность не распознал. Так:
(sin1 + 1/sin1) + (sin2 + 1/sin1) + (sin3 + 1/sin1) + ...
или иное?

Добавлено
Хм-м... Или там k раз идёт 1/sin1 ? Так:
(1/sin1 + 1/sin1 + sin2) + (1/sin1 + 1/sin1 + 1/sin1 + sin3) + ... + (1/sin1 + ...(N раз)... + 1/sin1 + sinN) ?

Автор: alex____666 26.04.18, 19:07
Цитата Славян @
1/sin1+1/sin1+sin2+...+1/sin1+...+ sin n

ну она вот такая
1/(sin(1)) + 1/(sin(1)+sin(2)) + ... + 1/(sin1(+)...+ sin(n))
там сборник заданий по програмированию златопольский. 5.93а если так легче будет

Автор: Славян 26.04.18, 19:12
Первое можно через строки провернуть. Схема такая:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <stdio.h>
    int main()
    {
     long n=360521;     /* число (надо бы вводить?) */
     char bufer[12];    /* буфер для числа */
     int myMax1=-1, i, len, posI;
     itoa( n, bufer, 10);   /* переводим число в строку, 10-ичная система счисления) */
     len = strlen( bufer );
     for( i=0; i<len; i++)
        if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i;
     printf("pos=%d", posI); /* пишем положение старшей цифры */
     return(0);
    }

Автор: alex____666 26.04.18, 19:20
Цитата Славян @
if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i;


ну да. принцип я понял. но вот эта строка что в ней? потому чо тут выдает ошибку
if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i;

Автор: Славян 26.04.18, 19:21
Цитата alex____666 @
ну она вот такая
1/(sin(1)) + 1/(sin(1)+sin(2)) + ... + 1/(sin1(+)...+ sin(n))
А-а! Понятно! Кстати, неизвестно же, что ни на каком шаге знаменатель в ноль не обернётся!? Это так, к слову.
Можно так(кусок):
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <math.h>
    int main()
    {
     int i, n=6; /* какова длина цепи */
     double sum=0, sinS=0; /* sinS = сумма синусов */
     for( i=1; i<=n; i++)
        sinS += sin(i), sum += 1/sinS;
     return printf("%f", sum);
    }


Добавлено
Цитата alex____666 @
вот эта строка что в ней? потому чо тут выдает ошибку
if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i;
А напишите, что за ошибка? Мож так сканает:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if( (int)(bufer[i]-'0') > myMax ) { myMax = (int)(bufer[i]-'0'), posI = i; }


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

Автор: alex____666 26.04.18, 19:32
Цитата Славян @

Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 5 warning(s) (0 minute(s), 0 second(s))
вот ошибка
соре не то скопировал опять саму ошибку он не дает скопировать

Автор: Славян 26.04.18, 19:40
Хм-м... возможно он беспокоится, что захода в if не будет и posI останется непроинициализированной. Тогда надо изменить там так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    int myMax1=-1, i, len, posI=0;


Добавлено
Ну а вообще, надо ж stdlib!
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
     long n=360521;     /* число (надо бы вводить?) */
     char bufer[12];    /* буфер для числа */
     int myMax1=-1, i, len, posI=0;
     itoa( n, bufer, 10);   /* переводим число в строку, 10-ичная система счисления) */
     len = strlen( bufer );
     for( i=0; i<len; i++)
        if( (int)(bufer[i]-'0') > myMax ) { myMax = (int)(bufer[i]-'0'), posI = i; }
     printf("pos=%d", posI); /* пишем положение старшей цифры */
     return(0);
    }

Автор: alex____666 26.04.18, 19:45
Цитата Славян @

да именно так. он бееспокоится что myMax является не обьявленной и пишет "сначала используйте эту функцию"

Автор: Славян 26.04.18, 19:48
А! Косяк мой, единицу забыл!
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
     long n=360521;     /* число (надо бы вводить?) */
     char bufer[12];    /* буфер для числа */
     int myMax1=-1,myMax2=-1, i, len, posI=0, posI2=0;
     itoa( n, bufer, 10);   /* переводим число в строку, 10-ичная система счисления) */
     len = strlen( bufer );
     for( i=0; i<len; i++)
        if( (int)(bufer[i]-'0') > myMax1 ) { myMax1 = (int)(bufer[i]-'0'), posI = i; }
     for( i=0; i<len; i++)
        if( (int)(bufer[i]-'0') > myMax2 && (int)(bufer[i]-'0')!=myMax1 ) { myMax2 = (int)(bufer[i]-'0'), posI2 = i; }
     printf("pos=%d", posI); /* пишем положение старшей цифры */
     printf("pos2=%d", posI2); /* пишем положение старшей цифры */
     return(0);
    }

Автор: alex____666 26.04.18, 19:51
Цитата Славян @

так, а зачем мы в конце 2 раза обявляем положение старшей цифры7

Добавлено
Цитата Славян @

так, а зачем мы в конце 2 раза обьявяем положение старшей цифры?

Автор: Славян 26.04.18, 19:53
Ну там я комментарий не поправил. Так надо:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
     long n=360521;     /* число (надо бы вводить?) */
     char bufer[12];    /* буфер для числа */
     int myMax1=-1,myMax2=-1, i, len, posI=0, posI2=-1;
     itoa( n, bufer, 10);   /* переводим число в строку, 10-ичная система счисления) */
     len = strlen( bufer );
     for( i=0; i<len; i++)
        if( (int)(bufer[i]-'0') > myMax1 ) { myMax1 = (int)(bufer[i]-'0'), posI = i; }
     for( i=0; i<len; i++)
        if( (int)(bufer[i]-'0') > myMax2 && (int)(bufer[i]-'0')!=myMax1 ) { myMax2 = (int)(bufer[i]-'0'), posI2 = i; }
     printf("\npos=%d", posI); /* пишем положение старшей цифры */
     printf("\npos2=%d", posI2); /* пишем положение почти старшей цифры */
     return(0);
    }

Автор: alex____666 26.04.18, 19:54
Цитата Славян @
пишем положение почти старшей цифры

спасибо большое. даже не знаю что бы без тебя делал)))))))))))))

Автор: Славян 26.04.18, 20:01
Не за что. Как бы сие прискорбно ни звучало, я всё же надеюсь, что препод будет умнее и влепит вам двояк или около того за незнание мат.части. :'(
Но думаю, что если вы повгрызаетесь в тему, то тоже будете опытнее. Не забивайте, изучайте!! ;)

Автор: VisualProg 27.04.18, 07:03
Вот вам ещё пара примеров, от которых препод будет в восторге:

Со строковым буфером, как у Славяна:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
    typedef struct max {
        char max1;
        char max2;
        char pos1;
        char pos2;
    } Max;
     
    int main() {
     
        long n = 360521;     /* число (надо бы вводить?) */
        
        char i;
     
        int   len   = floor(log10(abs(n)))+1;    /* вычисляем число цифр */
        char* bufer = (char*)malloc(len*sizeof(char)); /* буфер для числа */
        Max*  max   = (Max*)malloc(sizeof(Max));      /* буфер для результата */
        memset(max,0,sizeof(Max));
        
        snprintf(bufer,len,"%d",n); /* переводим число в строку, 10-ичная система счисления) */
        
        for(i=0;i<len;i++){
            if((char)(*(bufer+i)-'0') > max->max1) {
                max->max1 = (char)(*(bufer+i)-'0');
                max->pos1 = i;
            }
        }
        for(i=len-1;i>=0;i--){
            if((char)(*(bufer+i)-'0') > max->max2 && (char)(*(bufer+i)-'0')!=max->max1) {
                max->max2 = (char)(*(bufer+i)-'0');
                max->pos2 = i;
            }
        }
        
        printf("\npos1=%d", max->pos1); /* пишем положение старшей цифры */
        printf("\npos2=%d", max->pos2); /* пишем положение почти старшей цифры */
        printf("\nmax1=%d", max->max1); /* пишем максимальную цифру */
        printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */
        
        free(bufer);
        free(max);
        
        return(0);
    }



Без строк, чистая математика:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <math.h>
        
        typedef struct max {
            char max1;
            char max2;
            char pos1;
            char pos2;
        } Max;
        
        char get_digit(long n, int i) {
            long pos;
            pos = n % (long)pow(10, i+1);
            if (i > 0) {
              pos /= (long)pow(10, i);
            }
            return (char)pos;
        }
        
        int main() {
        
            long n = 360521; /* число (надо бы вводить?) */
     
            char i;    
     
            int   len = (int)floor(log10(abs(n)))+1; /* вычисляем число цифр */
            Max*  max = (Max*)malloc(sizeof(Max)); /* буфер для результата */
            memset(max,0,sizeof(Max));
        
            for(i=0;i<len;i++){
              if(get_digit(n,i)>max->max1 ) {
                  max->pos1 = i;
                  max->max1 = get_digit(n,max->pos1);
              }
            }
            for(i=len-1;i>=0;i--){
                if(get_digit(n,i)>max->max2 && get_digit(n,i)!=max->max1) {
                  max->pos2 = i;
                  max->max2 = get_digit(n,max->pos2);
              }
            }
        
            printf("\npos1=%d", max->pos1); /* пишем положение старшей цифры */
            printf("\npos2=%d", max->pos2); /* пишем положение почти старшей цифры */
            printf("\nmax1=%d", max->max1); /* пишем максимальную цифру */
            printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */
        
            free(max);
        
            return(0);
        }


Лень всё перепроверять, но, должно всё работать. Шестёрка в журнале вам обеспечена...

Автор: Славян 27.04.18, 07:58
Надо бы в get_digit поправить первый аргумент с int на long, а то в 16-битных ОС/компиляторах будет ошибка перевода 32-битного в 16 бит. :blush: (ну и степень pow тоже в long переводить, а вот результат=остаток можно и в int).

Автор: VisualProg 27.04.18, 08:03
Спасибо, поправил ;)

Добавлено
Да, и цикла надо будет, скорее всего, два. Я же не два числа ищу, а одно, двумя способами...

Автор: Славян 27.04.18, 08:23
Прошу не считать за придирки, а просто как шлифовка к идеалу:
1. В BorlandC++ 3.1 вроде ошибку писали, что число большое без обозначения присваиваем. Т.е. надо 360521L.
2. malloc вертухает void *, поэтому тоже где-то ругань была и надо бы приводить: *max = (Max*)malloc(...); А вообще лучше просто один раз массив завести: Max max; и не мучаться с памятью(malloc/free).
3. Сравнение в if идёт int c char. Надо всё в int перевести или поля max2/max1 сделать int'овскими.
4. результат floor лучше привести прямо в int: len = (int)floor(... .
5. Незачем инициализировать i в отдельной строке. Она ж в цикле тоже обнулится. Где-то можно бы и убрать.
6. max2 нигде не инициализируется. Ну станет она вдруг 127, и не изменится (if не пройдёт!), и на выдаче будет хлам. :yes-sad:

Автор: VisualProg 27.04.18, 08:29
Исправил все замечания. Замечу, приведения типов 2 и 4 пункта в чистом Си не обязательно. Про int - в данной задаче я на 147% уверен что не будет чисел со 127+ цифрами, пойдёт и char. И вес цифры меняется от 0 до 9, тоже, сойдёт и char.

Про кучу - тут она необходима, чтобы ТС обьяснил преподу что такое *(ptr+offset), и некоторые фишки, которые связаны с memset/malloc/free Мы же стремимся мотивировать ТС на новые знания :D

Автор: Славян 27.04.18, 08:39
Вот у меня в BC3.1 ошибку пишет, что нельзя char i после вызова функции. Надо бы выше поднять, где все переменные заводятся. :)

Автор: VisualProg 27.04.18, 08:40
Цитата Славян @
BC3.1 ошибку пишет, что нельзя char i после вызова функции

:o

Никогда с таким не встречался, спасибо за подсказку)

Автор: Славян 27.04.18, 08:41
На числе 836075291 прога соврала: 8 не нашла. :yes-sad:

Автор: VisualProg 27.04.18, 08:44
Быть может, это связанно с особенностями компилятора... Борланд для меня - тёмный лес, ориентируюсь всегда по mingw
https://onlinegdb.com/SyQRfwgTz

Автор: Славян 27.04.18, 08:45
Потому что labs надо, а не abs, кой сказал, что длина = 5 цифр. :jokingly:

Добавлено
Тьфу, имелось ввиду, что abs обработал число как int16 и len сказала, что длина 5 цифр.

Автор: VisualProg 27.04.18, 08:50
Цитата Славян @
labs надо, а не abs

хм, с вами узнал две новые вещи. Надо отвыкать от x32 :blush:

Автор: Славян 27.04.18, 09:00
Совсем уж нано-, когда число малое=4(например). Надо не писать max2=0, а как-то так что ли:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    max->max2=-1;
    ...
    if( max->max2>=0 ) printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */
    else printf("\nmax2 отсутствует");


Добавлено
Ну и да, при n=0 пишет в консоль: "log10: SING error", но и продолжает работать. ;)

Автор: alex____666 05.05.18, 05:27
Цитата VisualProg @
Вот вам ещё пара примеров, от которых препод будет в восторге:

Со строковым буфером, как у Славяна:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
    typedef struct max {
        char max1;
        char max2;
        char pos1;
        char pos2;
    } Max;
     
    int main() {
     
        long n = 360521;     /* число (надо бы вводить?) */
        
        char i;
     
        int   len   = floor(log10(abs(n)))+1;    /* вычисляем число цифр */
        char* bufer = (char*)malloc(len*sizeof(char)); /* буфер для числа */
        Max*  max   = (Max*)malloc(sizeof(Max));      /* буфер для результата */
        memset(max,0,sizeof(Max));
        
        snprintf(bufer,len,"%d",n); /* переводим число в строку, 10-ичная система счисления) */
        
        for(i=0;i<len;i++){
            if((char)(*(bufer+i)-'0') > max->max1) {
                max->max1 = (char)(*(bufer+i)-'0');
                max->pos1 = i;
            }
        }
        for(i=len-1;i>=0;i--){
            if((char)(*(bufer+i)-'0') > max->max2 && (char)(*(bufer+i)-'0')!=max->max1) {
                max->max2 = (char)(*(bufer+i)-'0');
                max->pos2 = i;
            }
        }
        
        printf("\npos1=%d", max->pos1); /* пишем положение старшей цифры */
        printf("\npos2=%d", max->pos2); /* пишем положение почти старшей цифры */
        printf("\nmax1=%d", max->max1); /* пишем максимальную цифру */
        printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */
        
        free(bufer);
        free(max);
        
        return(0);
    }



Без строк, чистая математика:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <math.h>
        
        typedef struct max {
            char max1;
            char max2;
            char pos1;
            char pos2;
        } Max;
        
        char get_digit(long n, int i) {
            long pos;
            pos = n % (long)pow(10, i+1);
            if (i > 0) {
              pos /= (long)pow(10, i);
            }
            return (char)pos;
        }
        
        int main() {
        
            long n = 360521; /* число (надо бы вводить?) */
     
            char i;    
     
            int   len = (int)floor(log10(abs(n)))+1; /* вычисляем число цифр */
            Max*  max = (Max*)malloc(sizeof(Max)); /* буфер для результата */
            memset(max,0,sizeof(Max));
        
            for(i=0;i<len;i++){
              if(get_digit(n,i)>max->max1 ) {
                  max->pos1 = i;
                  max->max1 = get_digit(n,max->pos1);
              }
            }
            for(i=len-1;i>=0;i--){
                if(get_digit(n,i)>max->max2 && get_digit(n,i)!=max->max1) {
                  max->pos2 = i;
                  max->max2 = get_digit(n,max->pos2);
              }
            }
        
            printf("\npos1=%d", max->pos1); /* пишем положение старшей цифры */
            printf("\npos2=%d", max->pos2); /* пишем положение почти старшей цифры */
            printf("\nmax1=%d", max->max1); /* пишем максимальную цифру */
            printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */
        
            free(max);
        
            return(0);
        }


Лень всё перепроверять, но, должно всё работать. Шестёрка в журнале вам обеспечена...

спасибо большое. мне просто принцип работы понять нужно было))

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)