Çözüldü C kodlarını döngü halinde çalıştırma

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Deqarnieux

Hectopat
Katılım
11 Ocak 2021
Mesajlar
131
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Merhaba. Yazdığım kodda işlemlerin sonunda kodu başa alarak işlemleri tekrar etmesini istiyorum ama bir türlü beceremedim.

Goto kullanmadan, değer döndüren bir fonksiyon ile yapmam lazım.

Kod:
#include <stdio.h>





int my_strlen(char s1[])

{

int a=0;

int b=0;

for (a=0; s1[a]!= '\0' ;++a)

{

    b++;

}

   return b; 

}





char* my_strcpy(char s1[], char s2[])

{

    int a=0;

    for(;a<my_strlen(s1);++a)

    {

        s1[a]=s2[a];

              

    }

    return s1;

}





int my_strcmp(char s1[],char s2[])

{

    int a=0;

    int b;

    if(my_strlen(s1)!=my_strlen(s2))

    {

        return -1;

    }

    else

    {   

        for(;a<my_strlen(s1);++a)

        {

            if(s1[a]==s2[a])

            {

                b=0;       

            }

            else

            {

                return -1;

            }

        }

        return b;

    }

}





char* my_strcat(char s1[],char s2[])

{

    int a;

    int b=my_strlen(s1);

    for(a=0;a<my_strlen(s2);++a)

    {

        s1=s2[a];

        b+=1;

    }

    return s1;

}



char* my_strncat(char s1[],char s2[],int n)

{

    int a;

    int b=my_strlen(s2);

    for(a=0;a!=n;++a)

    {

        s2=s1[a];

        b+=1;

    }

    return s2;

}



void son(){



printf("Islem sonlanmistir.\n");

}





int main()

{

    char s1[]= "anime";

    char s2[]= "kitap";

    int f;

    int k;

    int p;

    

    

    



    

    printf("1-Dizilerin kac harften olustugunu gosterir.\n");

    printf("2-s2 dizisini s1 dizisine kopyalar.\n");

    printf("3-s1 dizisi ile s2 dizisini karsilastirir.\n");

    printf("4-s2 dizisini s1 dizininin sonuna ekler.\n");

    printf("5-s1 dizisini 5 harften fazla olmayacak sekilde s2 dizisine ekler.\n");

    printf("istediginiz islemi seciniz.\n");

    

    scanf("%d",&f);

    if (f==1)

    {

        goto bir;

    }

    else if (f==2)

    {

        goto iki;

    }

    else if (f==3)

    {

        goto uc;

    }

    else if (f==4)

    {

        goto dort;

    }

    else

    {

        goto bes;

    }

    

    bir:

        printf("1. dizide %d tane harf var.\n2. dizide %d tane harf var.\n",my_strlen(s1),my_strlen(s2));

        

         printf("Baska islem yapmak istiyormusunuz.\nEvet=1 Hayir=2\n");

         scanf("%d",&p);

         if (p==1)

         {

        

        }

         else if (p==2)

         {

             son();

             return 0;

         }

    

        

    iki:

        my_strcpy(s1,s2);

        printf("1. dizi = %s\n",s1);

        

        printf("Baska islem yapmak istiyormusunuz.\nEvet=1 Hayir=2\n");

         scanf("%d",&p);

         if (p==1)

         {

        

        }

         else if (p==2)

         {

             son();

             return 0;

         }

    



        

    uc:

         if(my_strcmp(s1,s2)==0)

         {

              printf("Islem sonucu %d diziler esittir.\n",my_strcmp(s1,s2));   

            }

         else

         {

              printf("Islem sonucu %d diziler farklidir.\n",my_strcmp(s1,s2));

         }

        

         printf("Baska islem yapmak istiyormusunuz.\nEvet=1 Hayir=2\n");

         scanf("%d",&p);

         if (p==1)

         {

        

        }

         else if (p==2)

         {

             son();

             return 0;

         }

        

    dort:

          my_strcat(s1,s2);

          printf("1. Dizi = %s\n",s1);

          

          printf("Baska islem yapmak istiyormusunuz.\nEvet=1 Hayir=2\n");

         scanf("%d",&p);

         if (p==1)

         {

        

        }

         else if (p==2)

         {

             son();

             return 0;

         }

          

    bes:

          

          printf("1. Dizinin kac harfi s2 Dizisine eklensin.\n5 harfi gecemez.\n");

          scanf("%d",&k);

          my_strncat(s1,s2,k);

          printf("2. Dizi = %s\n",s2);   

          

          printf("Baska islem yapmak istiyormusunuz.\nEvet=1 Hayir=2\n");

         scanf("%d",&p);

         if (p==1)

         {

        

        }

         else if (p==2)

         {

             son();

             return 0;

         }   

            

    return 0;

}
 
Son düzenleyen: Moderatör:
Çözüm
Değişkenleri her zaman ilklendir.
Değişkenlere güzel isim var. f, k ve p anlamsız. 2 haftaya unutursun ne olduklarını.
Çok fazla değiştirmemeye çalıştım ama ben kabaca böyle yapardım. Aslında pointer aritmetiği kullanmak çok daha mantıklı olacaktır.
Strcmp de direkt öyle çalışmaz, sıfırdan küçük değer verir, direkt -1 vermez her zaman. Ama bu seviye için önemli değil.

Kod:
#include <stdio.h>

int my_strlen(char* str) {
    int i = 0;

    while (str[i] != 0) {
        ++i;
    }

    return i;
}

char* my_strcpy(char* dest, char* src) {
    int i = 0;

    while (src[i] != 0) {
        dest[i] = src[i];
    }

    dest[i] = src[i];
    
    return dest;
}

int my_strcmp(char* str1, char* str2) {
    int i = 0;

    while (1) {
        if (str1[i] != str2[i]) {
            return str1[i] < str2[i] ? -1 : 1;
        }

        if (str1[i] = 0) {
            return 0;
        }
    }
}

char* my_strcat(char* str1, char* str2) {
    int i1 = 0;
    int i2 = 0;

    while (str1[i1] != 0) {
        ++i1;
    }

    while (str2[i2] != 0) {
        str1[i1] = str2[i2];
        ++i1;
        ++i2;
    }

    str1[i1] = str2[i2];

    return str1;
}

char* my_strncat(char* str1, char* str2, int n) {
    int i1 = 0;
    int i2 = 0;

    while (str1[i1] != 0) {
        ++i1;
    }

    for (; i2 < n; ++i2, ++i1) {
        str1[i1] = str2[i2];
    }

    str1[i1] = str2[i2];

    return str1;
}

void son() {
    printf("Islem sonlanmistir.\n");
}

void bir(char* str1, char* str2) {
    printf("1. dizide %d tane harf var.\n2. dizide %d tane harf var.\n", my_strlen(str1), my_strlen(str2));
}

void iki(char* str1, char* str2) {
    my_strcpy(str1, str2);
    printf("1. dizi = %s\n", str1);
}

void uc(char* str1, char* str2) {
    int result = my_strcmp(str1, str2);

    if (result == 0) {
        printf("Islem sonucu %d diziler esittir.\n", result);
    }
    else {
        printf("Islem sonucu %d diziler farklidir.\n", result);
    }
}

void dort(char* str1, char* str2) {
    my_strcat(str1, str2);
    printf("1. Dizi = %s\n", str1);
}

void bes(char* str1, char* str2) {
    int n = 0;
    printf("1. Dizinin kac harfi s2 Dizisine eklensin.\n 5 harfi gecemez.\n");
    scanf("%d", &n);

    my_strncat(str1, str2, n);

    printf("2. Dizi = %s\n", str2);
}

int secFonk() {
    int sec = 0;

    printf("1-Dizilerin kac harften olustugunu gosterir.\n");
    printf("2-s2 dizisini s1 dizisine kopyalar.\n");
    printf("3-s1 dizisi ile s2 dizisini karsilastirir.\n");
    printf("4-s2 dizisini s1 dizininin sonuna ekler.\n");
    printf("5-s1 dizisini 5 harften fazla olmayacak sekilde s2 dizisine ekler.\n");
    printf("istediginiz islemi seciniz.\n");
    scanf("%d", &sec);

    return sec;
}

int flagFonk() {
    int flag = 0;
    printf("Baska islem yapmak istiyormusunuz.\nEvet = 1 Hayir = 2\n");
    scanf("%d", &flag);

    return flag;
}

int main() {
    char s1[] = "anime";
    char s2[] = "kitap";

    int sec = 0;
    int k = 0;
    int p = 0;

    volatile int flag = 1;

    while (flag) {
        sec = secFonk();

        switch (sec)     {
        case 1: bir(s1, s2);    break;
        case 2: iki(s1, s2);    break;
        case 3: uc(s1, s2);    break;
        case 4: dort(s1, s2);    break;
        case 5: bes(s1, s2);    break;
        default: printf("Hatali tuslama yaptiniz.\n"); break;
        }

        flag = flagFonk();
    }

    return 0;
}
Sanıyorum sondaki devam etmek istiyor musunuz için düşünüyorsun. "p" değişkenine 1 ver kodun başında;

C:
p=1

while (p==1)

{

tüm kodların buraya

}

şeklinde kullanırsan p=2 olduğunda döngüden atar. Sende sonuna "Hoşça kalın" falan yazarsın.
 
Görünüşü 400 satır kod olduğu için incelemem lazım ama goto kullanmadan kod yazmak mümkün.

Sanıyorum sonda ki devam etmek istiyor musunuz için düşünüyorsun. "p" değişkenine 1 ver kodun başında;
Kod:
p=1
while (p==1)
{
tüm kodların buraya
}
şeklinde kullanırsan p=2 olduğunda döngüden atar. Sen de sonuna "Hoşçakalın" falan yazarsın.
Bu şekilde yapılırsa compiler'ın insafına kalınır.
Kod o şekilde çalışmaz hocam while içinde şart barındırır. Sadece 1 yazarak şart belirtmiş olmazsınız.
Çok değil, C ile ilgili konulara yazmadan önce sadece 2 gram C öğrenmenizi tavsiye ediyorum.
Aynısını size de tavsiye ediyorum. -1 yazılsa da aynı şeyi yapacaktır.
 

Geri
Yukarı