Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

помогите новичку (Си).

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> помогите новичку (Си).
Имя
Сообщение << Старые топики   Новые топики >>
помогите новичку (Си). - 2005-09-04 17:15:16   
Drozt

Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
Помогите с одним дурацким вопросом. В школе не учат не чему полезному, поэтому решил выучить Си самостоятельно в книжке задания после каждого раздела даны, не могу в одном понять, как сделать. Подскажите начинающему только не пинайте[sm=3.gif].
Вообщем там надо делить два числа и если ответ получиться дробным выполнить одно действие если целое другое. Собственно как определить какое это число дробное или целое.
Post #: 1
помогите новичку (Си). - 2005-09-04 17:45:24   
Great

Сообщений: 1046
Оценки: 0
Присоединился: 2005-08-11 19:41:36
float num; //твое число

long lnum=(long)num;
float rest=num-(float)lnum;
if(rest==0)
одно_действие;
else другое;

Т.е. при преобразовании из float в long теряется дробная часть, что нам и нужно

Post #: 2
помогите новичку (Си). - 2005-09-04 18:18:39   
Drozt

Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
Огромное спасибо всё отлично робит !!!
Post #: 3
помогите новичку (Си). - 2005-09-05 12:29:34   
Drozt

Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
блин код определения целого числа отлично робит, а вот сама прога чёт не робит.

Вот задание:
Пользователь вводит натуральное число n. Программа находит и вы-водит на экран все совершенные числа на отрезке от 1 до n. Совершен-ным называется число, сумма делителей которого равна самому числу. Делителем числа считается такое натуральное число, на которое исходное число делится нацело без остатка. При поиске совершенных чисел само число не считается делителем, а единица – считается.

А вот чё я накатал ток она ни чего не выдаёт, ошибку не могу найти поможите люди добры:

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <process.h>
void main()
{
float m,n,z,a,x,g;
clrscr();
printf("\nVvedite z:");
scanf("%f",&z);
if((z<1))
{
printf("Error!");
}
for (m=0;m==z;m++)
{
for (a=0,x=0;a==m;a++)
{
n=m/a;
g=n;
long ln=(long)n;
float rest=n-(float)ln;
if (rest==0)
x=x+g;
}
if (x==m)
printf ("\n%f",m);
}
getch();
}//main
Post #: 4
помогите новичку (Си). - 2005-09-05 14:21:53   
Drozt

Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
Всё не надо сам разобрался [sm=1.gif]
Post #: 5
помогите новичку (Си). - 2005-09-05 20:45:25   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
на самом деле float здесь не к месту. Сильно.
Фраза if (rest==0) может работать а может и нет. float считает с погрешностью. В твоей ситуации оно работает потому, что числа маленькие.
Остаток от деления считается так:

int num, div;
int rest;


rest = num % div;

'%' это и есть операция остатка от деления.
я бы написал так:
int main ()
{
int num, div;
int sum = 1;
int input;
/* всякие scanf'ы я скипаю для краткости
* будем считать что input это введённое число */
num = input;
for (div = 2; div <= num && num != 1; div ++) {
if (num % div == 0) {
num = num / div;
sum += div;
}
}
if (sum == input) {
printf ("Yes\n");
} else {
printf ("No\n");
}
}
Post #: 6
помогите новичку (Си). - 2005-09-05 20:58:42   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
и кстати, внешний цикл у тебя, во-первых нафик не нужен, а во-вторых глючный. Со вторым как я понял ты разобрался, а первое потому, как z по определению будет либо 0 либо 1, либо EOF в случае ошибки чтения, когда ничего ещё не прочитано.
Post #: 7
помогите новичку (Си). - 2005-09-05 21:10:17   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
вот короче как надо делать. все числа читаются из командной строки.
#include <stdio.h>

int main (int argc, char *argv[])
{
int num, div;
int sum = 1;
int input;
int i;
for (i = 1; i < argc; i ++) {
if (sscanf (argv[и], "%d", &input) != 1)
continue;
num = input;
sum = 1;
for (div = 2; div <= num && num != 1; div ++) {
if (num % div == 0) {
num = num / div;
sum += div;
}
}
if (sum == input) {
printf ("%d: Yes\n", input);
} else {
printf ("%d: No: %d != %d\n", input, sum, input);
}
}
return 0;
}
Post #: 8
помогите новичку (Си). - 2005-09-05 22:57:36   
Drozt

Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
ругается на эту строку
if (sscanf (argv[и], "%d", &input) != 1) [sm=1.gif]
Post #: 9
помогите новичку (Си). - 2005-09-06 05:42:03   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
ага добавь в начало main: 'int и;'
Post #: 10
помогите новичку (Си). - 2005-09-06 09:39:39   
Drozt

Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
quote:

—————-<BR>Цитата: Дата:06.09.2005 5:42:03, Автор:rgo ::
ага добавь в начало main: 'int и;'
—————-


доделал только вот она почемуто определяет числа только до 10. 1 и 6 находит, а вот после 10 скажем 28 уже нет. [sm=sm128.gif]
Post #: 11
помогите новичку (Си). - 2005-09-06 23:50:54   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
а что должна?
код:
$ factor 28
28: 2 2 7

или интересуют не простые делители а вообще все?
Да, наверное так… Это я ступил :) вот патч:

@@ -12,7 +12,6 @@ int main (int argc, char *argv[])
num = input;
sum = 1;
- for (div = 2; div <= num && num != 1; div ++) {
+ for (div = 2; div < num && num != 1; div ++) {
if (num % div == 0) {
- num = num / div;
sum += div;
}
Post #: 12
помогите новичку (Си). - 2005-09-07 09:32:27   
Drozt

Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
Вот сделал своим вариантом пусть медленно, зато точно работает.[sm=9.gif]
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <process.h>
void main()
{
float m,n,z,a,x,g=0;
double value;
double int_part;
double fraction;
clrscr();
printf("\nVvedite z:");
scanf("%f",&z);
if(z<1)
{
printf("Error!");
}
for (m=1;m<=z;m++)
{
g=0;
for (a=1;a<m;a++)
{
value=m/a;
fraction = modf(value, &int_part);
if (fraction==0)
g=g+a;
}
if (g==m)
printf ("\n%0.0f",g);
}
getch();
}//main
Post #: 13
Страниц:  [1]
Все форумы >> [Веб-программинг] >> помогите новичку (Си).







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.