Çözüldü C/C++ Koddaki hatalar nedir?

  • Konuyu başlatan TH6
  • Başlangıç Tarihi
  • Mesaj 4
  • Görüntüleme 266
Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

TH6

Hectopat
Katılım
9 Temmuz 2022
Mesajlar
874
Çözümler
20
Arkadaşlar merhaba bayağıdır C ile uğraşmıyordum. Deneme için bir kod yazayım dedim ancak hata ya da hatalar var bilmiyorum. Bazen register ya da log in kısmında sorun yaşıyorum. Kod şu:

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
struct bank{
 char firstName[20];
 char middleName[20];
 char surName[20];
 char setUserName[40];
 char setPassword[50];
 char setPasswordConfirm[50];
 int choice;
 bool isLog;
 int balance;
};
//Global Variables.
int j;

//Functions Declare.
void registe(struct bank banka[100], int i);
void login(struct bank banka[100], int i);
void mainmenu(struct bank banka[100], int i);

int main()
{
 int a = 0;
 int i = 0;
 struct bank banka[100];
 for(a; a < 100; a++)
 {
 banka[a].balance = 0;
 }
 bool wh = true;
 while(wh == true)
 {
 system("cls");
 printf("*****Welcome to Bank System. What Do You Want to Do?*****\n\n*****1.Register*****\n\n*****2.Log In*****\n\n*****3.Exit*****\n: ");
 scanf("%d", &banka[i].choice);
 switch(banka[i].choice)
 {
 case 1:
 registe(banka, i);
 i++;
 break;
 case 2:
 login(banka, i);
 if(banka[j].isLog == true)
 {
 mainmenu(banka, i);
 }
 break;
 case 3:
 wh = false;
 break;
 }
 }
}

void registe(struct bank banka[100], int i)
{
 system("cls");
 printf("Enter your First Name: \n");
 scanf("%s", banka[i].firstName);
 printf("Enter your Middle Name: \n");
 scanf("%s", banka[i].middleName);
 printf("Enter your Surname: \n");
 scanf("%s", banka[i].surName);
 printf("Enter your Username: \n");
 scanf("%s", banka[i].setUserName);
 printf("Enter your Password: \n");
 scanf("%s", banka[i].setPassword);
 printf("Confirm your Password: \n");
 scanf("%s", banka[i].setPasswordConfirm);
 while(strcmp(banka[i].setPassword, banka[i].setPasswordConfirm))
 {
 printf("Passwords do not match. Please try again\n");
 printf("Enter your Password: \n");
 scanf("%s", banka[i].setPassword);
 printf("Confirm your Password: \n");
 scanf("%s", banka[i].setPasswordConfirm);
 }
 printf("Registering is successful. You can log in.");
 getchar();
 getchar();
 system("cls");
}

void login(struct bank banka[100], int i)
{
 char username[40];
 char password[50];
 int found = 0;
 printf("Enter your Username: \n");
 scanf("%s", username);
 printf("Enter your Password: \n");
 scanf("%s", password);
 for(j = 0; j < i; j++)
 {
 if(strcmp(username, banka[j].setUserName) == 0 && strcmp(password, banka[j].setPassword) == 0)
 {
 found = 1;
 break;
 }
 }
 while(found != 1)
 {
 printf("Username or password are incorrect. Please try again\n");
 printf("Enter your Username: \n");
 scanf("%s", username);
 printf("Enter your Password: \n");
 scanf("%s", password);
 for(j = 0; j < i; j++)
 {
 if(strcmp(username, banka[j].setUserName) == 0 && strcmp(password, banka[j].setPassword) == 0)
 {
 found = 1;
 break;
 }
 }
 }
 banka->isLog = true;
 system("cls");
 printf("Log In is Successful");
 getchar();
 getchar();
}
void mainmenu(struct bank banka[100], int i)
{
 int found;
 int s; // For search.
 char searchName[40];
 bool wh = true;
 int dd;
 while(wh == true)
 {
 printf("-----1.Check Balance-----\n\n");
 printf("-----2.Deposit Money-----\n\n");
 printf("-----3.Withdraw Money----\n\n");
 printf("-----4.Transfer Money----\n\n");
 printf("-----5.Log Out-----------\n: ");
 scanf("%d", &banka[j].choice);
 switch (banka[j].choice)
 {
 case 1:
 printf("Your Balance is %d", banka[j].balance);
 getchar();
 getchar();
 system("cls");
 break;
 case 2:
 system("cls");
 printf("How much money do you want to deposit?: ");
 scanf("%d", &dd);
 banka[j].balance += dd;
 printf("Process Successful");
 getchar();
 system("cls");
 break;
 case 3:
 printf("How much money do you want to withdraw: ");
 scanf("%d", &dd);
 banka[j].balance -= dd;
 printf("Process Successful");
 getchar();
 system("cls");
 break;
 case 4:
 printf("Which account do you want to transfer to?: ");
 scanf("%s", searchName);
 for(s = 0; s < i; s++)
 {
 if(strcmp(searchName, banka[s].setUserName) == 0)
 {
 found = 1;
 break;
 }
 }
 while(found != 1)
 {
 printf("User couldn't find. Please try again.\n\n");
 getchar();
 getchar();
 system("cls");
 printf("Which account do you want to transfer to?: ");
 scanf("%s", searchName);
 for(s = 0; s < i; s++)
 {
 if(strcmp(searchName, banka[s].setUserName) == 0)
 {
 found = 1;
 break;
 }
 }
 }
 printf("Account found. How much money to transfer?: ");
 scanf("%d", &dd);
 while(dd > banka[j].balance)
 {
 printf("You cannot transfer more money than you have. Please try again.\n\n");
 printf("Account found. How much money to transfer?: ");
 scanf("%d", &dd);
 }
 banka[s].balance += dd;
 banka[j].balance -= dd;
 system("cls");

 break;
 case 5:
 printf("Goodbye");
 wh = false;
 break;
 }
 }

}
 
Çözüm
29. satırdaki for döngüsü yanlış olmuş a'yı döngüde de oluşturabilirsiniz:
C:
/*
int a = 0;
for (a; a < 100; a++)
{
    banka[a].balance = 0;
}

yerine
*/
for (int a = 0; a < 100; a++)
{
    banka[a].balance = 0;
}

41. ve 144. satırlardaki switchlerin default case'i yok. case'ler, bütün durumları kontrol etmiyor. Şöyle bir şey yazılabilir:
C:
// Switchlerin sonuna bunu ekleyin.
default:
    printf("Please enter a valid number\n");
    getchar();
    system("cls");
    break;

j'yi de globalde kullanmayın, for döngülerinde üstte yazdığım gibi içinde de oluşturabilirsiniz. Ayrıca main'de ve mainmenu'da da kullanmışsınız, ne yaptığı belli değil çok karışık olmuş. Bir hata falan olacaksa buralardan olabilir.

83. satırda da strcmp'nin return değerini kullanmamışsınız.

181. satırda found'u ilklendirmeden karşılaştırmışsınız. found'un if'lerde atanmasının bir garantisi yok.

Kodu da düzgün formatlayın lütfen, satır numaraları doğru olmayabilir.
Kodunun düzeltilmiş halini aşağıya yazıyorum teker teker verecektim de bir türlü birbirinden düzgünce ayıramadım syntax hatası yapma diye.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

struct bank {
char firstName[20];
char middleName[20];
char surName[20];
char setUserName[40];
char setPassword[50];
char setPasswordConfirm[50];
int choice;
bool isLog;
int balance;
};

// Fonksiyon bildirimi
void registe(struct bank banka[100], int i);
int login(struct bank banka[100], int i); // j yerine return ile index döndürülüyor
void mainmenu(struct bank banka[100], int j);

int main() {
int i = 0;
struct bank banka[100];

for (int a = 0; a < 100; a++) {
banka[a].balance = 0;
banka[a].isLog = false;
}

bool wh = true;
while (wh) {
system("cls");
printf("Welcome to Bank System. What Do You Want to Do?\n\n1. Register\n2. Log In\n3. Exit\n: ");
scanf("%d", &banka.choice);

switch (banka.choice) {
case 1:
registe(banka, i);
i++;
break;
case 2: {
int loggedIndex = login(banka, i);
if (loggedIndex != -1) {
mainmenu(banka, loggedIndex);
}
break;
}
case 3:
wh = false;
break;
default:
printf("Invalid choice.\n");
break;
}
}

return 0;
}

void registe(struct bank banka[100], int i) {
system("cls");
printf("Enter your First Name: \n");
scanf("%19s", banka.firstName);

printf("Enter your Middle Name: \n");
scanf("%19s", banka.middleName);

printf("Enter your Surname: \n");
scanf("%19s", banka.surName);

printf("Enter your Username: \n");
scanf("%39s", banka.setUserName);

printf("Enter your Password: \n");
scanf("%49s", banka.setPassword);

printf("Confirm your Password: \n");
scanf("%49s", banka.setPasswordConfirm);

while (strcmp(banka.setPassword, banka.setPasswordConfirm) != 0) {
printf("Passwords do not match. Please try again\n");
printf("Enter your Password: \n");
scanf("%49s", banka.setPassword);
printf("Confirm your Password: \n");
scanf("%49s", banka.setPasswordConfirm);
}

printf("Registering is successful. You can log in.");
getchar(); getchar();
system("cls");
}

int login(struct bank banka[100], int i) {
char username[40];
char password[50];
int found = 0;

printf("Enter your Username: \n");
scanf("%39s", username);

printf("Enter your Password: \n");
scanf("%49s", password);

for (int j = 0; j < i; j++) {
if (strcmp(username, banka[j].setUserName) == 0 &&
strcmp(password, banka[j].setPassword) == 0) {
banka[j].isLog = true;
system("cls");
printf("Log In is Successful");
getchar(); getchar();
return j; // Başarıyla giriş yaptıysa index döndür
}
}

printf("Username or password incorrect. Returning to main menu...\n");
getchar(); getchar();
return -1; // Giriş başarısız
}

void mainmenu(struct bank banka[100], int j) {
int s;
char searchName[40];
bool wh = true;
int dd;
int found;

while (wh) {
printf("\n-----1. Check Balance-----\n");
printf("-----2. Deposit Money-----\n");
printf("-----3. Withdraw Money----\n");
printf("-----4. Transfer Money----\n");
printf("-----5. Log Out-----------\n: ");
scanf("%d", &banka[j].choice);

switch (banka[j].choice) {
case 1:
printf("Your Balance is %d\n", banka[j].balance);
getchar(); getchar();
system("cls");
break;

case 2:
system("cls");
printf("How much money do you want to deposit?: ");
scanf("%d", &dd);
banka[j].balance += dd;
printf("Process Successful\n");
getchar(); getchar();
system("cls");
break;

case 3:
system("cls");
printf("How much money do you want to withdraw: ");
scanf("%d", &dd);
if (dd > banka[j].balance) {
printf("Insufficient funds.\n");
} else {
banka[j].balance -= dd;
printf("Process Successful\n");
}
getchar(); getchar();
system("cls");
break;

case 4:
found = 0;
printf("Which account do you want to transfer to?: ");
scanf("%39s", searchName);
for (s = 0; s < 100; s++) {
if (strcmp(searchName, banka.setUserName) == 0 && s != j) {
found = 1;
break;
}
}

if (!found) {
printf("User couldn't be found.\n");
getchar(); getchar();
system("cls");
break;
}

printf("Account found. How much money to transfer?: ");
scanf("%d", &dd);
while (dd > banka[j].balance) {
printf("You cannot transfer more money than you have. Please try again.\n");
printf("Amount: ");
scanf("%d", &dd);
}

banka.balance += dd;
banka[j].balance -= dd;
printf("Transfer Successful.\n");
getchar(); getchar();
system("cls");
break;

case 5:
printf("Goodbye\n");
wh = false;
break;

default:
printf("Invalid choice.\n");
break;
}
}
}
 
İfadeler: TH6
P
Peki tam olarak hatam ne genel olarak gözden kaçırdığım bir şey var mı?
 
29. satırdaki for döngüsü yanlış olmuş a'yı döngüde de oluşturabilirsiniz:
C:
/*
int a = 0;
for (a; a < 100; a++)
{
    banka[a].balance = 0;
}

yerine
*/
for (int a = 0; a < 100; a++)
{
    banka[a].balance = 0;
}

41. ve 144. satırlardaki switchlerin default case'i yok. case'ler, bütün durumları kontrol etmiyor. Şöyle bir şey yazılabilir:
C:
// Switchlerin sonuna bunu ekleyin.
default:
    printf("Please enter a valid number\n");
    getchar();
    system("cls");
    break;

j'yi de globalde kullanmayın, for döngülerinde üstte yazdığım gibi içinde de oluşturabilirsiniz. Ayrıca main'de ve mainmenu'da da kullanmışsınız, ne yaptığı belli değil çok karışık olmuş. Bir hata falan olacaksa buralardan olabilir.

83. satırda da strcmp'nin return değerini kullanmamışsınız.

181. satırda found'u ilklendirmeden karşılaştırmışsınız. found'un if'lerde atanmasının bir garantisi yok.

Kodu da düzgün formatlayın lütfen, satır numaraları doğru olmayabilir.
 
Çözüm
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…