2014 dxdy logo

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

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




 
 Помогите с програмками на Си (завтра здавать)
Сообщение16.12.2008, 16:08 
Здравствуйте! нужно решить 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 
Код:
#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 
e2e4 писал(а):
Улыбнуло.

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

 
 
 
 
Сообщение16.12.2008, 17:55 
Аватара пользователя
Для проверки делимости на 3 разделите число на 3 нацело, результат умножьте на 3 и сравните с исходным числом.

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

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

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

 
 
 
 
Сообщение16.12.2008, 18:40 
Ниче я промахнулся :)) в 1 задаче делимость на 10 )) надо проверить.

 
 
 
 
Сообщение16.12.2008, 19:03 
Вот какой, следуя Вашей логике, должна быть функция 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 
Все еще не верите, что это я сам сочинил?:)
1)& - ссылка на переменную а не * - указатель
2)void - сама возвращает рез-тат а не int
3)тип long - наверно 4 байта вместо 2х
4)ну d<a понятно...
5)d += 10 недоглядел:)
6)и естественно return не какой не надо)
Понимание предмета на уровне 4 с - :)

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

 
 
 
 
Сообщение16.12.2008, 20:00 
Цитата:
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 
Спасибо, просветили)

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

 
 
 
 
Сообщение16.12.2008, 20:33 
По поводу второй программы...

Ошибка у Вас в функциях 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 
благодарствую многоуважаемый! :)

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group