PDA

Tam Sürümünü Görmek İçin : girilen basamak değerindeki sayıları toplama


utebay
02/05/2006, 21:45
girilen bi sayının mesela 455 sayısınını toplamı olan değer ekrana yazdırmasını 14şeklinde aşağıdaki kodu yazdım fakat toplamı yanlış alıyor nerde hatam var yardımcı olurmusunuz
# include <stdio.h>
# include <math.h>

int AddDigits (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j)
{
int sum;
sum=a + b + c + d + e + f + g + h + i + j;

return (sum);
}
int main()
{
char number[10];
int a, b, c, d, e, f, g, h, i, j, sum;
printf("Bir sayi girin..........>");
scanf("%d",&number);
a=number[1];
b=number[2];
c=number[3];
d=number[4];
e=number[5];
f=number[6];
g=number[7];
h=number[8];
i=number[9];
j=number[10];
sum=AddDigits(a, b, c, d, e, f, g, h, i, j);
printf("Sonuc %d",sum);

getchar();
getchar();
return(0);

}


mr1yh1
02/05/2006, 22:50
1-) C de dizilerin indisi 0 dan başlar, 1 den değil.
a[10] için a[0] .. a[9] anlamlı.

2-) a = number[1]; dediğinde char değeri ( yani "rakamın" ansii kodu ) a'ya aktarılır , ki bu senin istediğin şey değil.
number[1]-'0' kullanabilirsin.

C yazmak bende alerji yaratıyor, buna bir bak seversen sende C++ kullanırsın.;)


#include <iostream>
#include <vector>

using namespace std;

typedef vector<int> IntArray;

int addDigits ( IntArray a)
{
int sum = 0;
for ( int i = 0 ; i < a.size() ; i++ ){
sum += a[i];
}
return sum;
}


int main()
{
cout<<"Bir sayi girin..........>";

string sayi;
cin>>sayi;

IntArray rakamlar;
for ( int i = 0 ; i < sayi.size() ; i++ ){
rakamlar.push_back( sayi[i]-'0' );
}

cout << "\n toplam : " << addDigits(rakamlar);

getchar();
return 0;

}

acehreli
03/05/2006, 01:34
Eger hata denetimi yapmayacaksak, daha da kisa bir sey buldum :)


#include <string>
#include <numeric>
#include <iostream>

using namespace std;

int karakter_ekle(int toplam, char karakter)
{
return toplam + (karakter - '0');
}

int main()
{
cout << "Bir sayi girin: ";
string sayi;
cin >> sayi;

cout << "Toplam: "
<< accumulate(sayi.begin(), sayi.end(), 0, karakter_ekle)
<< '\n';
}


Ali

utebay
03/05/2006, 08:37
çok teşekkür ederim acehreli iyi çalışmalar

myavuzselim
03/05/2006, 09:30
c++'daki accumulate hos birseymis. Bu gibi seyleri fonksiyonel bir dilde (mesela haskell) daha ileri duzeyde yapabiliriz:import Char

toplam = (foldl (+) 0) . (map ((flip (-) (ord '0')) . ord))
main = do x <- getLine
print (toplam x)veya:toplam = foldl (\n c -> n + (ord c - ord '0')) 0veya:toplam = foldl (+) 0 . map (\x -> x - (ord '0')) . map ord
veya:toplam "" = 0
toplam (x:xs) = (ord x - ord '0') + (toplam xs)

utebay
03/05/2006, 10:54
benim bu kodu c de yazmam gerekiyor bu konuda yardımcı olurmusunuz

myavuzselim
03/05/2006, 11:12
- toplam = 0 ile basla
- 'number'a "%s" ile (cunku sana string lazim) scanf yaptiktan sonra 'number' icindeki her karakter icin '\0' karakterine denk gelinceye kadar toplama (karakter-'0') ekle.

Veya hic char* ile ugrasma:

int number, toplam, i;
scanf("%d", &number);
toplam = 0;
while (number != 0) {
toplam += number % 10;
number /= 10;
}