На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела
1. Не создавайте несколько одинаковых тем, ибо модератор может расценить их, как спам и удалить все.
2. Для решения задач по GPSS есть отдельная тема. Все задачи по GPSS опубликовывать в этой теме! Перед опубликовыванием вашей задачи просмотрите всю тему, возможно вы сразу найдете решение.
3. Давайте вашим темам ОСМЫСЛЕННЫЕ названия, а также указывайте язык программирования. Пример: [Pascal]:Работа с файлами и записями.
4. Использования тега CODE обязательно при публикации текста программы.

Темы, оформленные с явным игнорированием правил и отсутствием смысла, будут закрыты/удалены!
Вам помогли? Напишите об этом здесь (в портфолио фрилансера)

Фрилансерам:
5. Демпинг цен запрещен (даже если Вы готовы работать бесплатно). Цены обсуждаются в приватном общении. Если вы готовы рещить задачу бесплатно, просто решите ее быстрее, чем возникнет предложение сделать это за деньги.
6. Пользователям, входящим в группу Newbie, запрещается предлагать свои услуги (завуалированно в т.ч.)
7. В посте с предложением выполнить работу, обязательно указывать ссылку на свое портфолио в Отзывы, Благодарности, Портфолио Это правило работает и в том случае, если вы выполняете работу бесплатно.
8. Реклама (даже завуалированная) своих фриланских сайтов запрещена

Нарушение данных пунктов влечет до RO или БАНА (при неоднократом)
Модераторы: ttiger, mikefreelance, Rust
  
    > помогите пожалуйста написать программы на языке си.
      я просто проболел и все лекции с обьяснениями пропустил. а программы надо как то сдавать. можете помочь?
      1)Дано натуральное число, в котором все цифры различны. Определить:
      а) порядковые номера двух его максимальных цифр, считая номера: от конца числа; от начала числа;
      2)Среди чисел 1,1+1/2,1+1/2+1/3, ... найти первое, большее числа n. :wub:
        Для второго: можно в лоб, а можно, используя: Сумма = ln(k) + 0,577215665... Вам как?
          Цитата Славян @


          я не то скопировал. просто. я сам его сделал ещё давно. но все равно спасибо
            Первое осталось? Оно то хоть то? :)
              [quote=Славян,1524767668,3767979][/q
              да первое то) это все в код блок надо сделать но он у меня везде просто ошибки выдает

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

              вот такое задание
                Что-то со вторым я опять последовательность не распознал. Так:
                (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) ?
                  Цитата Славян @
                  1/sin1+1/sin1+sin2+...+1/sin1+...+ sin n

                  ну она вот такая
                  1/(sin(1)) + 1/(sin(1)+sin(2)) + ... + 1/(sin1(+)...+ sin(n))
                  там сборник заданий по програмированию златопольский. 5.93а если так легче будет
                  Сообщение отредактировано: alex____666 -
                    Первое можно через строки провернуть. Схема такая:
                    ExpandedWrap disabled
                      #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);
                      }
                      Цитата Славян @
                      if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i;


                      ну да. принцип я понял. но вот эта строка что в ней? потому чо тут выдает ошибку
                      if( bufer[i]-'0' > myMax ) myMax = bufer[i]-'0', posI = i;
                        Цитата alex____666 @
                        ну она вот такая
                        1/(sin(1)) + 1/(sin(1)+sin(2)) + ... + 1/(sin1(+)...+ sin(n))
                        А-а! Понятно! Кстати, неизвестно же, что ни на каком шаге знаменатель в ноль не обернётся!? Это так, к слову.
                        Можно так(кусок):
                        ExpandedWrap disabled
                          #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;
                        А напишите, что за ошибка? Мож так сканает:
                        ExpandedWrap disabled
                          if( (int)(bufer[i]-'0') > myMax ) { myMax = (int)(bufer[i]-'0'), posI = i; }


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

                          Process terminated with status 1 (0 minute(s), 0 second(s))
                          1 error(s), 5 warning(s) (0 minute(s), 0 second(s))
                          вот ошибка
                          соре не то скопировал опять саму ошибку он не дает скопировать
                          Сообщение отредактировано: alex____666 -
                            Хм-м... возможно он беспокоится, что захода в if не будет и posI останется непроинициализированной. Тогда надо изменить там так:
                            ExpandedWrap disabled
                              int myMax1=-1, i, len, posI=0;


                            Добавлено
                            Ну а вообще, надо ж stdlib!
                            ExpandedWrap disabled
                              #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);
                              }
                              Цитата Славян @

                              да именно так. он бееспокоится что myMax является не обьявленной и пишет "сначала используйте эту функцию"
                              Сообщение отредактировано: alex____666 -
                                А! Косяк мой, единицу забыл!
                                ExpandedWrap disabled
                                  #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);
                                  }
                                  Цитата Славян @

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

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

                                  так, а зачем мы в конце 2 раза обьявяем положение старшей цифры?
                                    Ну там я комментарий не поправил. Так надо:
                                    ExpandedWrap disabled
                                      #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);
                                      }
                                    Сообщение отредактировано: Славян -
                                      Цитата Славян @
                                      пишем положение почти старшей цифры

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

                                          Со строковым буфером, как у Славяна:
                                          ExpandedWrap disabled
                                            #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);
                                            }



                                          Без строк, чистая математика:
                                          ExpandedWrap disabled
                                                #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);
                                                }


                                          Лень всё перепроверять, но, должно всё работать. Шестёрка в журнале вам обеспечена...
                                          Сообщение отредактировано: VisualProg -
                                            Надо бы в get_digit поправить первый аргумент с int на long, а то в 16-битных ОС/компиляторах будет ошибка перевода 32-битного в 16 бит. :blush: (ну и степень pow тоже в long переводить, а вот результат=остаток можно и в int).
                                              Спасибо, поправил ;)

                                              Добавлено
                                              Да, и цикла надо будет, скорее всего, два. Я же не два числа ищу, а одно, двумя способами...
                                                Прошу не считать за придирки, а просто как шлифовка к идеалу:
                                                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:
                                                  Исправил все замечания. Замечу, приведения типов 2 и 4 пункта в чистом Си не обязательно. Про int - в данной задаче я на 147% уверен что не будет чисел со 127+ цифрами, пойдёт и char. И вес цифры меняется от 0 до 9, тоже, сойдёт и char.

                                                  Про кучу - тут она необходима, чтобы ТС обьяснил преподу что такое *(ptr+offset), и некоторые фишки, которые связаны с memset/malloc/free Мы же стремимся мотивировать ТС на новые знания :D
                                                  Сообщение отредактировано: VisualProg -
                                                    Вот у меня в BC3.1 ошибку пишет, что нельзя char i после вызова функции. Надо бы выше поднять, где все переменные заводятся. :)
                                                      Цитата Славян @
                                                      BC3.1 ошибку пишет, что нельзя char i после вызова функции

                                                      :o

                                                      Никогда с таким не встречался, спасибо за подсказку)
                                                        На числе 836075291 прога соврала: 8 не нашла. :yes-sad:
                                                          Быть может, это связанно с особенностями компилятора... Борланд для меня - тёмный лес, ориентируюсь всегда по mingw
                                                          https://onlinegdb.com/SyQRfwgTz
                                                            Потому что labs надо, а не abs, кой сказал, что длина = 5 цифр. :jokingly:

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

                                                              хм, с вами узнал две новые вещи. Надо отвыкать от x32 :blush:
                                                                Совсем уж нано-, когда число малое=4(например). Надо не писать max2=0, а как-то так что ли:
                                                                ExpandedWrap disabled
                                                                  max->max2=-1;
                                                                  ...
                                                                  if( max->max2>=0 ) printf("\nmax2=%d", max->max2); /* пишем максимальную цифру */
                                                                  else printf("\nmax2 отсутствует");


                                                                Добавлено
                                                                Ну и да, при n=0 пишет в консоль: "log10: SING error", но и продолжает работать. ;)
                                                                  Цитата VisualProg @
                                                                  Вот вам ещё пара примеров, от которых препод будет в восторге:

                                                                  Со строковым буфером, как у Славяна:
                                                                  ExpandedWrap disabled
                                                                    #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);
                                                                    }



                                                                  Без строк, чистая математика:
                                                                  ExpandedWrap disabled
                                                                        #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);
                                                                        }


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

                                                                  спасибо большое. мне просто принцип работы понять нужно было))
                                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                  0 пользователей:


                                                                  Рейтинг@Mail.ru
                                                                  [ Script execution time: 0,0739 ]   [ 16 queries used ]   [ Generated: 29.03.24, 08:43 GMT ]