2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите с програмками на Си (завтра здавать)
Сообщение16.12.2008, 16:08 


28/10/08
33
Здравствуйте! нужно решить 2 задачи на Си, НО невыходит((
Вот :
Даны три натуральных трехзначных числа. Определить, сколько из них делятся нацело на 10. Проверку делимости числа на 10 оформить в виде подпрограммы, пользоваться операцией mod нельзя.
мой код:
Код:
#include<iostream.h>
#include<math.h>
#include<conio.h>

int A(int a,int d,int i)
{ d=0;
  while (d<=a){d=+10;}
  if (d==a) {i++;}
  return i;
}
void main()
{ clrscr();
  int a,d,i;
  i=0;
  cout<<"\nvvedite a " ;
  cin>>a;
  A(a,d,i);
  cout<<"\nvvedite b ";
  cin>>a;
  A(a,d,i);
  cout<<"\nvvedite c ";
  cin>>a;
  A(a,d,i);
  cout<<"del na 10 = "<<i;
  getch();
}


Вот :
Дан массив A(N). Сформировать массивы В(N) и C(N), включив в массив В все четные элементы, а в массив С – все нечетные элементы исходного массива.
Мой код:
Код:
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
const n=10;

void formarray(float *a,int n)
{ int i;
  randomize();
  for (i=0;i<n;i++)
  a[i]=random(20);
}

void printarray(float *a,int n)
{ int i;
  for (i=0;i<n;i++)
  cout <<a[i]<<" ";
  cout <<"\n";
}

void printarrayB(float *b,int n)
{ int i;
  for (i=0;i<n;i++)
  cout <<b[i]<<" ";
  cout <<"\n";
}
void printarrayC(float *c,int n)
{ int i;
  for (i=0;i<n;i++)
  cout <<c[i]<<" ";
  cout <<"\n";
}
void B(float *a,int n, float *b)
{ int i,j;
  for (i=0;i<n;i++)
  if (i%2==0){j=a[i];
              i=i/2;
              b[i]=j;
              }
}
void C(float *a,int n, float *c)
{ int i,j;
  for (i=0;i<n;i++)
  if (i%2!=0){j=a[i];
              c[i]=j;
              }
}

void main()
{ clrscr();
  float a[n],b[n],c[n];
  formarray(a,n);
  printarray(a,n);
  B(a,n,b);
  printarrayB(b,n);
  C(a,n,c);
  printarrayC(c,n);
  getch();

}


Они не работают. Подправте пож-ста.

 Профиль  
                  
 
 
Сообщение16.12.2008, 16:18 


21/03/06
1545
Москва
Код:
#include<iostream.h>
#include<math.h>
#include<conio.h>

int A(int a,int d,int i)
{ d=0;
  while (d<=a){d=+10;}
  if (d==a) {i++;}
  return i;
}
void main()
{ clrscr();
  int a,d,i;
  i=0;
  cout<<"\nvvedite a " ;
  cin>>a;
  A(a,d,i);
  cout<<"\nvvedite b ";
  cin>>a;
  A(a,d,i);
  cout<<"\nvvedite c ";
  cin>>a;
  A(a,d,i);
  cout<<"del na 10 = "<<i;
  getch();
}

Улыбнуло. Кто найдет больше ошибок? :). pointXY, Вы не огорчайтесь - Ваш код в принципе не в состоянии найти делимость ни на что, после некоторой правки он сможет определять делимость чисел на 10, но... сознайтесь, где Вы такое чудо взяли? Рукописная копия с рукописной копии программы троечника предыдущего курса, да еще и с не той формулировкой задачи?

Вторую даже смотреть не стал после этого.

 Профиль  
                  
 
 
Сообщение16.12.2008, 16:30 


28/10/08
33
e2e4 писал(а):
Улыбнуло.

Всегда приятно дарить людям радость :)
Но может у когонибудь есть варианты по информативней? :roll:

 Профиль  
                  
 
 
Сообщение16.12.2008, 17:55 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Для проверки делимости на 3 разделите число на 3 нацело, результат умножьте на 3 и сравните с исходным числом.

Совершенно непонятно зачем в функцию A передаются три аргумента, причем второй (d) - не инициализирован. Аргумент должен быть один (в крайнем случае два, если хочется оформить проверку на делимость для произвольного числа). Функция должна возвращать 1, если число делится на 3, и 0 - если не делится. Результат, возвращаемой функцией, прибавьте к счетчику i.

Добавлено спустя 2 минуты 38 секунд:

Поскольку третий аргумент i передается по значению, а не по ссылке, то в основной функции main он не поменяется. Переменная i в main и в функции A - это две разные переменные. Так что в текущей версии программа в конце не может выдать ничего, отличного от 0.

 Профиль  
                  
 
 
Сообщение16.12.2008, 18:40 


28/10/08
33
Ниче я промахнулся :)) в 1 задаче делимость на 10 )) надо проверить.

 Профиль  
                  
 
 
Сообщение16.12.2008, 19:03 


21/03/06
1545
Москва
Вот какой, следуя Вашей логике, должна быть функция A:
Код:
void A(int a, int &i)
{
  long d=0;
  while (d < a) {d += 10;}
  if (d==a) {i++;}
}

Не передавайте параметр d в main(), и все заработает.

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

 Профиль  
                  
 
 
Сообщение16.12.2008, 19:41 


28/10/08
33
Все еще не верите, что это я сам сочинил?:)
1)& - ссылка на переменную а не * - указатель
2)void - сама возвращает рез-тат а не int
3)тип long - наверно 4 байта вместо 2х
4)ну d<a понятно...
5)d += 10 недоглядел:)
6)и естественно return не какой не надо)
Понимание предмета на уровне 4 с - :)

Зы:Спасибо за код, работает))

 Профиль  
                  
 
 
Сообщение16.12.2008, 20:00 


21/03/06
1545
Москва
Цитата:
1)& - ссылка на переменную а не * - указатель

Ссылка нужна для того, чтобы изменялось значение перменной i из функции main, а не локальной переменной, автоматически создаваемой компилятором в случае простого вызова функции A, объявленнойк как A(int i). Это называется передачей параметра по ссылке, как Вам справедливо указал PAV.
Цитата:
2)void - сама возвращает рез-тат а не int

void A(int b) означает, что функция не возвращает ничего, что и требуется по логике работы Вашей функции.
Цитата:
3)тип long - наверно 4 байта вместо 2х

Если быть до конца точным, то размеры переменных в байтах не определены на уровне стандарта Си, а определяются конкретной реализацией и используемой платформой). Строго определен только sizeof(char), который всегда равен 1, причем эта единица - вовсе не размер в байтах, а некоторый условный размер (впрочем, довольно часто размер char все-таки один байт). Стандартом определено sizeof(char)<=sizeof(short int)<=sizeof(int)<=sizeof(long int). В случае 16-битных платформ, например процессора 80286 Вы правы.
А еще это способ не войти в бесконечный цикл while (d < a) {d += 10;} при a > MAXINT - MAXINT%10. Другими словами, может произойти переполнение переменной d, а условие d<a всегда будет истинно.

 Профиль  
                  
 
 
Сообщение16.12.2008, 20:06 


28/10/08
33
Спасибо, просветили)

 Профиль  
                  
 
 
Сообщение16.12.2008, 20:22 
Экс-модератор


17/06/06
5004
Кстати, эти ваши "програмки" совсем не "на Си". В "Сях" нету потоков и переопределенных операторов, которыми вы пользуетесь для ввода-вывода. :roll: Но это так, чтобы вы были шибко образованные. 8-)

 Профиль  
                  
 
 
Сообщение16.12.2008, 20:33 


21/03/06
1545
Москва
По поводу второй программы...

Ошибка у Вас в функциях B и C: должно быть примерно так:
Код:
void B(float *a, int n, float *b)
{
  int i;
  for (i=0;i<n;i++)
    if (i%2==0)
      b[i/2]=a[i];
}

Никаких промежуточных j, а главное - Вы необратимо меняли переменную цикла выражением i = i/2.

И еще - функции void printarray(float *a,int n), void printarrayB(float *b,int n), void printarrayC(float *c,int n) естественно можно заменить одной функцией типа printarray(float *array, int n), и передавать ей в качестве первого параметра - Ваши массивы типа
Код:
void main()
{
  clrscr();
  float a[n],b[n],c[n];
  formarray(a,n);
  printarray(a,n);
  B(a,n,b);
  printarray(b,n);
  C(a,n,c);
  printarray(c,n);
  getch();

}


Добавлено спустя 5 минут 14 секунд:

И еще - неоднозначное условие
Цитата:
Сформировать массивы В(N) и C(N), включив в массив В все четные элементы, а в массив С – все нечетные элементы исходного массива.

Под четными и нечетными элементами подразумеваются элементы с четными и нечетными индексами в массиве (так задумано у Вас), или четные/нечетный сами элементы массива (тогда функции B и C будут выглядеть иначе - надо проверять на четность не i, а a[i]).

Добавлено спустя 2 минуты 36 секунд:

Тогда уже условие b[i/2]=a[i]; не подойдет - для индексации b надо будет вводить отдельную переменную.

 Профиль  
                  
 
 
Сообщение16.12.2008, 22:07 


28/10/08
33
благодарствую многоуважаемый! :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group