помогите новичку (Си).
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
помогите новичку (Си). - 2005-09-04 17:15:16
|
|
|
Drozt
Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
|
Помогите с одним дурацким вопросом. В школе не учат не чему полезному, поэтому решил выучить Си самостоятельно в книжке задания после каждого раздела даны, не могу в одном понять, как сделать. Подскажите начинающему только не пинайте[sm=3.gif]. Вообщем там надо делить два числа и если ответ получиться дробным выполнить одно действие если целое другое. Собственно как определить какое это число дробное или целое.
|
|
|
помогите новичку (Си). - 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 теряется дробная часть, что нам и нужно
|
|
|
помогите новичку (Си). - 2005-09-04 18:18:39
|
|
|
Drozt
Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
|
Огромное спасибо всё отлично робит !!!
|
|
|
помогите новичку (Си). - 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
|
|
|
помогите новичку (Си). - 2005-09-05 14:21:53
|
|
|
Drozt
Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
|
Всё не надо сам разобрался [sm=1.gif]
|
|
|
помогите новичку (Си). - 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"); } }
|
|
|
помогите новичку (Си). - 2005-09-05 20:58:42
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
и кстати, внешний цикл у тебя, во-первых нафик не нужен, а во-вторых глючный. Со вторым как я понял ты разобрался, а первое потому, как z по определению будет либо 0 либо 1, либо EOF в случае ошибки чтения, когда ничего ещё не прочитано.
|
|
|
помогите новичку (Си). - 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; }
|
|
|
помогите новичку (Си). - 2005-09-05 22:57:36
|
|
|
Drozt
Сообщений: 8
Оценки: 0
Присоединился: 2005-09-04 16:29:03
|
ругается на эту строку if (sscanf (argv[и], "%d", &input) != 1) [sm=1.gif]
|
|
|
помогите новичку (Си). - 2005-09-06 05:42:03
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
ага добавь в начало main: 'int и;'
|
|
|
помогите новичку (Си). - 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]
|
|
|
помогите новичку (Си). - 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; }
|
|
|
помогите новичку (Си). - 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
|
|
|
|
|