Skocz do zawartości


Zdjęcie

[C] struktury - dane osób


  • Zamknięty Temat jest zamknięty
2 odpowiedzi w tym temacie

#1 ogrod87

ogrod87

    Początkujący

  • 18 postów

Napisano 07 01 2008 - 22:21

Witam..
Mam parę pytań dot. C
Mianowicie...
1.Mam takie zadanie :

Zaproponuj odpowiednie struktury do zapamiętania dla dwóch osób:
a)imię,nazwisko,wiek,data urodzenia.
b)Napisz funkcję, która zwróci 0, gdy dwie struktury są identyczne, w przeciwnym wypadku zwróci -1


Mój program(jest na stringach, ale nie ma żadnego przeciwskazania do zamienienia np na inty czy chary :)):

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

struct osoba {char imie[25], nazwisko[25],wiek[3],data_ur[10];} osoba1,osoba2;

void wpisz(struct osoba *);
void wyswietl(struct osoba *);
int porownanie (struct osoba *,struct osoba *);

int main()

{ int a;
  wpisz(&osoba1);
  wyswietl(&osoba1);
  wpisz(&osoba2);
  wyswietl(&osoba2);
  a=porownanie(&osoba1,&osoba2);
  if(a==0)
	 printf("\nPodano dwie identyczne struktury");
  if(a==-1)
	 printf("\nNie podano identycznych struktur");
  while(!kbhit());
  return 0;
}
void wpisz (struct osoba *x)
{
  printf("\nPodaj imie		   : "); scanf("%s",x->imie);
  printf("\nPodaj nazwisko	   : "); scanf("%s",x->nazwisko);
  printf("\nPodaj wiek		   : "); scanf("%s",x->wiek);
  printf("\nPodaj date urodzenia : "); scanf("%s",x->data_ur);
}
void wyswietl(struct osoba *x)
{
  printf("\nImie		   : %s",x->imie);
  printf("\nNazwisko	   : %s",x->nazwisko);
  printf("\nWiek		   : %s",x->wiek);
  printf("\nData Urodzenia : %s",x->data_ur);
}
int porownanie (struct osoba *x1, struct osoba *x2)
{
  if (x1->imie==x2->imie)
	  return 0;
  if (x1->nazwisko==x2->nazwisko)
	  return 0;
  if (x1->wiek==x2->wiek)
	  return 0;
  if (x1->data_ur==x2->data_ur)
  return 0;
else
  return -1;
}

I za każdym razem, czy podam, czy nie podam identycznych struktur, zwraca mi -1..

2 pytanie:

czy zapis:
if (x1->imie==x2->imie)
	  return 0;
  if (x1->nazwisko==x2->nazwisko)
	  return 0;
  if (x1->wiek==x2->wiek)
	  return 0;
  if (x1->data_ur==x2->data_ur)
  return 0;
else
  return -1;
jest równoważny:
if (x1->imie==x2->imie || x1->nazwisko==x2->nazwisko || x1->wiek==x2->wiek || x1->data_ur==x2->data_ur||)
   return 0;
else
   return -1;

I jeszcze jedno pytanko :)

Mam takie zadanie:

"Używając operacji sizeof podaj minimalne rozmiary struktur"

Moja strukrura:
struct dana {char A[4]; int w;};

Czy prawidłowo to napisałem?:

#include <stdio.h>
#include <conio.h>
struct dana {char A[4]; int w;};
int main()
{ 
   printf("%d",sizeof(struct dana));
   while(!kbhit());
}

Dzięki i pozdrawiam

  • 0

#2 Anathemed

Anathemed

    Obserwator

  • 6 postów

Napisano 09 01 2008 - 04:56

1.Mam takie zadanie :
Mój program(jest na stringach, ale nie ma żadnego przeciwskazania do zamienienia np na inty czy chary ;)):

x1->imie - oznacza adres tablicy pola 'imie' struktury 'x1'
Pisząc
if (x1->imie==x2->imie)
porównujesz więc adresy, a nie wartości które się pod tymi adresami kryją - adresy te rzadko kiedy są równe.
Prawidłowy kod powinien wyglądać mniej więcej tak:
int imiona_rowne = 1;
int i = 0;
for(i = 0; i < 25; ++i) 
{
   if(x1->imie[i] != x2->imie[i]) { imiona_rowne = 0; break; }
   if(x1->imie[i] == '')break; // jezeli pierwszy string sie skonczyl, rowniez mozemy przerwac petle
}
analogicznie tworzymy petle dla pozostałych tablic stringów, a następnie sprawdzamy wartości zmiennych:
'imiona_rowne', 'wiek_rowny' itd...

  • 0

#3 Tomi85

Tomi85

    Nowy

  • 1 postów

Napisano 13 01 2008 - 17:14

Zamiast:

if (x1->imie==x2->imie)
return 0;


uzyj funkcji strcmp.
Sluzy ona do porownywania napisow, np.
if( strcmp(x1->imie, x2->imie)!=0 ) return 0;

Dokladny opis funkcji znajdziesz tutaj:
http://www.cplusplus.com/reference/clibrar...ing/strcmp.html

  • 0

Zobacz więcej tematów z tagiem: język C



Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych