c dilinde bit düzeyinde iki sayiyı(0000 0101 ve 0000 0010 gibi) sıkıştırıp t 8 bitte indirirerek tek bir dosyaya kaydetme yardımm lütfen?
?
VE BİRDE ŞU KODA BAKARMISINIZ CALŞMİIYOR?????
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main() {
FİLE *dg;
const int n=10;
char ad[10];
int no,not,i=0;
dg=fopen("ögrenci.text","w");
if(dg==NULL)
puts("ögrenci.text dosyası acılmadı"),exit(1);
puts("10 ögrenciye ait bilgileri giriniz");
while(i<=n)
{
printf("%d.ninci ögrenci numarasi"i); scanf("%d",&no);
printf("%d.ninci ögrenci adi",i); scanf("%s",&ad);
printf8"%d.ninci ögrenci notu",i); scanf("%d",¬);
fprintf(dg,"%5d,%4d,%1d\n",no,ad,not);
}
fclose(dg);
puts("bilgiler kaydedildi.\a");
getch();
return 0;
}
Bir sayının bitler halinde gosterilmesi,ikilik(binary) tabanda belirtilmesi demektir.Bilindigi uzere ikilik tabandaki sayılar 0(false) ve 1(true) dir.Soruda sayıların 8 bitte ifadesi istendigi icin 8 uzunluguna sahip bir dizi(array) tanımlanabilir.Bu bitlerin elde edilmesi icin ise,girilen sayı 1 olana kadar modul(2) işlemine tabi tutulacaktır.
Yukarıdaki soruda,ilk olarak girilen bir sayının kac bitte olması gerektigi belirlenmelidir.Ornegin kullanıcı 5 girdiginde 3 bit,8 girdiginde 4 bit,16 girdiginde 5 bit olması gerekecektir.Burada yakalanan bagıntı 2 uzeri n degerinin,kullanıcının girdigi sayıdan buyuk olması durumunda gereken bit sayısıdır.Buradaki n degeri dongu iterasyon degeridir.Bit sayısının bilinmesinin sebebi,8 uzunluguna sahip diziye kac veri(bit) girişinin yapılması olmasıdır.Aksi takdirde veri(bit) girisi sabit olacak ve ortaya cıkan sonuclarda goruntu ve hesap acısından anomaliler gorulecektir.
Bu asamadan sonra yapılacak hamle,sayının ikilik tabandaki karsılıgını bulmak olacaktır.Daha onceden de bahsedildigi gibi,bir sayının ikilik tabanda gosterilmesi,ilgili sayının 2 den kucuk olana kadar modul(2) degerine tabi tutulması ile gerceklesir.
Algoritmanın son asamasında ise,8 bitte elde edilen sayının dosyaya yazılması kalacaktır.Sonuc olarak bu algoritmanın C dilindeki karsılıgı asagıdaki gibi olabilir.
#include <stdio.h>
#include <math.h>
main() {
int sayi=0;
printf("Sayi:");
scanf("%d",&sayi);
int bitSayisi=0;
while(pow(2,bitSayisi) <= sayi)
bitSayisi++;
char bitDizisi[8]={0};
int i=7;
while(bitSayisi!=0) {
bitDizisi=sayi%2;
sayi/=2;
i--;bitSayisi--;
}
for(i=0;i<8;i++) {
if(i==4)
printf(" ");
printf("%d",bitDizisi);
}
FILE *dosya=NULL;
if((dosya=fopen("Bit.txt","a"))==NULL) {
printf("Dosya Acilamadi\n");
return 1;
}
for(i=0;i<8;i++) {
if(i==4)
fprintf(dosya," ");
fprintf(dosya,"%d",bitDizisi);
}
getchar();
return 0;
}
Soruda 2 sayı uzerinden bit hesaplanması istenmiştir.Yukarıdaki algoritmada,2.sayı icin eklemeyi artık rahatlıkla yapabilirsiniz.
Başarılar
2.sorunuza binaen,su onemli noktaya deginecegim,C dilinde 'not' kelimesi reserve edilmiş bir kelimedir.Yani int not,float not,char not gibi degiskenler tanımlayamassınız.Bu keyword ozel bir kelimedir ve tanımlaması yapılamaz.Kodda bulunan diger noktalar gozden kacan ufak hatalardır.
Kodun duzeltilmiş hali asagıdaki gibidir.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main() {
FILE *dg; // I harfi
const int n=10;
char ad[10];
int no,nott,i=0;
dg=fopen("ögrenci.text","w");
if(dg==NULL)
puts("ögrenci.text dosyası acılmadı"),exit(1);
puts("10 ögrenciye ait bilgileri giriniz");
while(i<=n)
{
printf("%d.ninci ögrenci numarasi",i); scanf("%d",&no); // virgul yok
printf("%d.ninci ögrenci adi",i); scanf("%s",&ad);
printf("%d.ninci ögrenci notu",i); scanf("%d",nott); // printf(8 ve - karakteri
fprintf(dg,"%5d,%4d,%1d\n",no,ad,nott);
}
fclose(dg);
puts("bilgiler kaydedildi.\a");
getch();
return 0;
}
Başarılar