На главную Наши проекты:
Журнал   ·   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
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
    > помогите пожалуйста написать программы на языке си.
      Ну там я комментарий не поправил. Так надо:
      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", но и продолжает работать. ;)
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (3) 1 [2] 3  все


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