Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Умножение столбиком 
V
    Опции темы
Гениальный123Робот
Дата 4.11.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Напечатать столбиком пример на умножение в десятичной системе счисления двух заданных натуральных чисел K и L.
СИ
PM MAIL   Вверх
apook
Дата 4.11.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



printf("%3d\nx\n%3d\n-----\n%d\n", K, L, K*L);

Неужели это!


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Гениальный123Робот
Дата 4.11.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Цитата(apook @ 4.11.2006,  19:38)
printf("%3d\nx\n%3d\n-----\n%d\n", K, L, K*L);

Неужели это!

Нет конечно.
Работать не с числами, а с переменными (с их разрядами) при перемножении надо.
PM MAIL   Вверх
Rockie
Дата 6.11.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Цитата(Гениальный123Робот @  4.11.2006,  18:04 Найти цитируемый пост)
Напечатать столбиком пример на умножение в десятичной системе счисления двух заданных натуральных чисел K и L.СИ

Гениальный123Робот, как вариант - можно перегнать числа в строки, затем сравнивать длину этих строк. Функция PrintWithSpaces(char * buff,int spaces) сначала печатает заданное кол-во пробелов, а затем число.

Код
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void PrintWithSpaces(char * buff,int spaces){
 for(int i=0;i<spaces;i++)       // печатаем пробелы
   putchar(' ');                    
 printf("%s\n",buff);               // затем число 
}

int main(){
 int K = 150, L = 60, R = K*L;
 char K_str[25], L_str[25], R_str[25];  // заводим строковые массивы для чисел

 itoa(K, K_str, 10);              // перегоняем число K в строку K_str, десятичная система
 itoa(L, L_str, 10);
 itoa(R, R_str, 10);

 PrintWithSpaces(K_str, strlen(R_str) - strlen(K_str) );

 PrintWithSpaces(L_str, strlen(R_str) - strlen(L_str) );

 printf("%s\n",R_str);         //  и внизу результат

 return 0;
}


А можно не использовать строки и написать свою функцию вычисления разрядности числа:
Код
#include<stdio.h>

int CountNumberLength(int number){
 int length;
 for(length = 0; ;length++)
   if( (number/=10) < 10 ) break;
 return length;
}

void PrintWithSpaces(int number,int spaces){
 for(int i=0;i<spaces;i++)
   putchar(' ');
 printf("%d\n",number);
}

int main(){
 int K = 1500, L = 60, R = K*L;

 PrintWithSpaces( K, CountNumberLength(R)-CountNumberLength(K) );

 PrintWithSpaces( L, CountNumberLength(R)-CountNumberLength(L) );

 printf("%d\n",R);

 return 0;
}


Это сообщение отредактировал(а) Rockie - 6.11.2006, 23:10


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Гениальный123Робот
Дата 7.11.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Спасибо, Rockie! Но хотелось бы как - то попроще. Я изучаю Си вот на первом этапе... Я еще по графику не должен знать таких функций, которые ты предлагаешь ;) Я попроще решил. Вот как. Если есть замечания / предложения, буду рад выслушать:

Код

#include <stdio.h>
#include <math.h>

void main()

{

unsigned int a, b, c, d, e, g, q, p, t;

printf("\n Enter the first cifra of the first number! \n");
  scanf("%d", &a);
printf("\n Enter the second cifra of the first number! \n");
  scanf("%d", &b);
printf("\n Enter the third cifra of the first number! \n");
  scanf("%d", &c);
printf("\n Enter the first cifra of the second number! \n");
  scanf("%d", &d);
printf("\n Enter the second cigra of the second number! \n");
  scanf("%d", &e);
printf("\n Enter the third cifra of the second number! \n");
  scanf("%d", &g);

p=100*a+10*b+c;
q=100*d+10*e+g;

t=c*(100*d+10*e+g)+10*b*(100*d+10*e+g)+100*a*(100*d+10*e+g); // просто поразрядное перемножение

   printf("%d", t);

}



PM MAIL   Вверх
sergejzr
Дата 7.11.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Э-е-ех! Это была моя мечта в далёком бейсике - складывать столбиком... smile Если бы не эта тема, так наверное никогда бы не написал smile))

Вот, сделал на скорую руку за 15 минут. Масса возможностей оптимизации и ноль комментариев, так же, нехватает проверок ввода. Но это уже база smile

Код

#include <iostream>
#include <stdlib.h>

void printSpaces(int n)
{
for(int i=0;i<n;i++)
printf(" ");     
}
int cntPos(int n)
{
int ret=0;
for(;n>0;n/=10,ret++);
return ret;    
}
int main(){
    int z=2345;
    char number1[256];
    char number2[256];
    printf("Give me the first number:\n? ");
    scanf("%s",number1);
    printf("Give me the second number:\n? ");
    scanf("%s",number2);
    int len1=strlen(number1);
    int len2=strlen(number2);
    int left=len1>len2?len2:len1;
    int diff=len1-len2; if(diff<0)diff*=-1;
    left+=1;
    printSpaces(left);
    int start=len1+len2+1;
    int oldstart=start;
    if(len1<len2) printSpaces(diff);
    printf("%s",number1);
    printf("*\n");
    printSpaces(left);
    if(len1>len2) printSpaces(diff);
    printf("%s",number2);
     printf("\n"); 
    printSpaces(left); 
    for(z=left;z<start;z++)
    printf("_");
  
    int fnumber=atoi(number1);
    int snumber=atoi(number2);
    int answer=fnumber*snumber;
    for(int i=strlen(number2)-1;i>-1;i--)
    {
       printf("\n"); 
       int curnum=number2[i]-'0';
       int res=curnum*fnumber;
      
       printSpaces(start-cntPos(res));
       printf("%i",res);
       if(i>0)
       printf("+");
       start--; 
    }
   printf("\n");
   left=oldstart-cntPos(answer);
    printSpaces(left);
   for(z=left;z<oldstart;z++)
    printf("_");
     printf("\n");
   printSpaces(left);
   printf("%i",answer);
  scanf("%i",z);
    return 0;
    
    }




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Гениальный123Робот
Дата 7.11.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Цитата(sergejzr @ 7.11.2006,  16:01)
Э-е-ех! Это была моя мечта в далёком бейсике - складывать столбиком... smile Если бы не эта тема, так наверное никогда бы не написал smile))

Вот, сделал на скорую руку за 15 минут. Масса возможностей оптимизации и ноль комментариев, так же, нехватает проверок ввода. Но это уже база smile

Так сказать, легкий путей мы не ищем?  smile 
Спасибо, но тоже сложновато.. или мне кажется.. ;)
PM MAIL   Вверх
sergejzr
Дата 7.11.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Цитата(Гениальный123Робот @  7.11.2006,  15:09 Найти цитируемый пост)
Спасибо, но тоже сложновато.. или мне кажется.. ;) 

Наоборот, старался использовать только базовые конструкты..


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Oleg_Ci
Дата 7.11.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



Цитата(Гениальный123Робот @  7.11.2006,  19:02 Найти цитируемый пост)
Если есть замечания / предложения, буду рад выслушать:
 smile 
Код

#include <stdio.h>
#include <stdlib.h>
#define len 5

int main(int argc, char *argv[])

    unsigned int a[len], b[len], q=0, p=0, t, s=1;
    int i;
    puts("Enter 1 number:");
    for( i=0; i<len; i++ )    scanf("%1d", &a[i]);
    puts("Enter 2 number:");
    for( i=0; i<len; i++ )    scanf("%1d", &b[i]);

    for( i=len-1; i>=0; i-- ){
        p += a[i] * s;
        q += b[i] * s;
        s *= 10;
    }
    t = p * q;
    printf("\n%5d * \n%5d\n-----\n%5d", p, q, t);

    puts("\n\n");
    system("pause"); // пауза
    return 0;
}

PM MAIL   Вверх
Гениальный123Робот
Дата 7.11.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Олег4, Спасибо! 
PM MAIL   Вверх
Гениальный123Робот
Дата 7.11.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Цитата(sergejzr @ 7.11.2006,  16:01)
...так же, нехватает проверок ввода...

А Вас я попрошу остаться!  smile 
Как поставить это защиту от дурака? Если попытаюстя ввести буквы или отрицательные числа...
PM MAIL   Вверх
sergejzr
Дата 7.11.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Ну это уже сами. (Подсказка: кроме atoi есть ещё  strtol ) Хотя для начинающего подойдёт и сравниловка каждой буквы на цифру.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Гениальный123Робот
Дата 7.11.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Цитата(sergejzr @ 7.11.2006,  21:13)
Ну это уже сами. (Подсказка: кроме atoi есть ещё  strtol ) Хотя для начинающего подойдёт и сравниловка каждой буквы на цифру.

А без функций никак? 
PM MAIL   Вверх
sergejzr
Дата 7.11.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Цитата(Гениальный123Робот @  7.11.2006,  21:27 Найти цитируемый пост)
А без функций никак?  


Цитата(sergejzr @  7.11.2006,  20:13 Найти цитируемый пост)
отя для начинающего подойдёт и сравниловка каждой буквы на цифру. 




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
zhenium
Дата 7.11.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.10.2006

Репутация: 2
Всего: 2



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

1) Защита от дурака, который цифры с буквами путает.
Пусть имеется переменная x типа int. Если ты введёшь букву, то scanf() после выполнения возвратит значение <= 0. Значит

Код

...
int x;   // Переменная
int a;   // Переменная для проверки

printf("Введите число x:");
a = scanf("%d", &x);

whlie( a <= 0 )
{
          puts("\nНе держи за лоха! Вводи цифру!");

          fflush( stdin );   // Классная функция - очищает буфер, в данном случае stdin
          a = scanf("%d", &x);
}
...          


Одним словом, пока a <= 0, т.е. вводится символ, - будет идти цикл. Ввёл число - цикл закончился.
Не пугайся функции fflush(). В своё время мне тоже требовалось нечто аналогичное, препод эту функцию до сих пор не далsmile. Но он не обидился, когда я её использовал. Если работаешь не в Windows, а Unix? то функцию fflush( stdin ) вероятно придётся заменить на

Код

whlie( getchar() != \'n' ) 
           continue; 
 

Работает наподобие очистки буфера stdin. Ждёт нажатия 'Enter'.
2) Если пользоваться примером, который привёл Олег4, т.е. ввод цифр в элементы массива ( я бы так и делал - способ классный тем, что он простой и понятный ), то тут каждая цифра не должна выходить за предел [0;9]. Значит, получает следующее.

Код

puts("Enter 1 number:");
    for( i=0; i<len; i++ )    
    {
           scanf("%1d", &a[i]);
           
           while( a[i] < 0 || a[i] > 9 )
           {
                    puts("\nВы вышли за предел.");
                    scanf(""%1d", &a[i]");
           } 


Цикл while() действует, если ты вводишь числа вне диапазона [0;9]. Кстати, это сработает, если ты вводишь число целиком через один scanf(), а тут, ты сам подумай, одному scanf() соответствует 1 цифра, т.к. в функции прописано "%1d". Здесь это будет бесполезно! Но на будушее полезно знать...

3) Если совместить пункты 1 и 2, то получим такой цикл while()
Код

...
int ch;   // Переменная для проверки
...
puts("Enter 1 number:");
    for( i=0; i<len; i++ )    
    {
           ch = scanf("%1d", &a[i]);
           
           while( a[i] < 0 || a[i] > 9 || ch <= 0 )
           {
                    puts("\nВы вышли за предел или ввели букву.");
                    ch = scanf(""%1d", &a[i]");
           }  


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

P.S. Удачи! Если в чём-то ошибся - поправьте, буду рад.


M
alexeis1
Модератор: не забывайте указывать тип подсветки.


Это сообщение отредактировал(а) alexeis1 - 24.11.2006, 10:31
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1140 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.