[C++] Napis - wyswietlanie napisu w klasie.

Forum dotyczące ogólnie pojętego programowania - algorytmów, struktur danych, narzędzi programistycznych, itp - głównie w kontekście komputerów PC.
ODPOWIEDZ
TheTaoist
-
Posty: 3
Rejestracja: 30 lis 2008, 13:07
Lokalizacja: Dolny Śląsk

[C++] Napis - wyswietlanie napisu w klasie.

Post autor: TheTaoist » 07 sty 2009, 17:45

Witam
Mam problem z uzyskaniem napisu w klasie.
Kolega napisal programik ja go lekko zmodyfikowalem, ale tez nie udalo mi sie uzyskac napisu.
Oto Kod zrodlowy:

Kod: Zaznacz cały

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

class UCZEN
{
 public:
  int x,y;
  int a,b;
 protected:
  int wzrost;
  int waga;
  float srednia;
  char imie[10];
 public:
  void WezWzrost(int wzr);
  void WezImie (char imie);
  void DajUCZNIA(void);
  int DajWzrost(void)
  {return wzrost;}
  char DajImie()
  {return imie[10]; }

};

void UCZEN::WezWzrost(int wzr)
{
 wzrost=wzr;
}

void UCZEN::WezImie(char imi)
{
 imie[10]=imi;
}

void UCZEN::DajUCZNIA(void)
{
 gotoxy(x,y);
 putch('1');
}

void main(void)
{
 clrscr();
 UCZEN U1,U2;
 U1.WezWzrost(178);
 cout<< "Wzrost = "<<U1.DajWzrost()<<endl;
[color=red] U1.WezImie('fd');[/color]
 cout<< "Imie " <<U1.DajImie()<<endl;
 U1.DajUCZNIA();
 getch();
 }
wszystko gra gdy w polu WezImie() - w nawiasach wpisuje poj. litere. gdy wpisuje slowo jakies to wyswietla ostatnia litere tego slowa.
Czy ktos bylby w stanie mi pomoc - w piatek mam poprawe kolokwium, facet jednak mowil ze jeszcze jedno kolokwium zrobi, a czasu coraz mniej na poprawy ;/
I jeszcze taka mala prosba. W tym (na przykladzie tego) programiku ktos moglby mi wytlumaczyc konstruktor klasy?

PS. Korzystam z Borlanda 6 wersja enterprise suite

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 07 sty 2009, 19:04

Argument twojej funkcji (czy jak to się tam w klasach nazywa), czyli char imi, to jest pojedyńcza zmienna typu char. Natomiast char imie[10]; to jest wskaźnik na pierwszy znak jakiegoś ciągu znaków. Dlatego jeśli chcesz przekazać do funkcji cały napis to musisz przekazać wskaźnik na pierwszy znak tego napisu. Czyli argumentem funkcji powinien być wskaźnik na char. Druga sprawa, nie możesz całego ciągu znaków przepisać z miejsca na miejsce za pomocą znaku "=", bo musisz skopiować cały obszar pamięci. Pisząc imie[10]=imi; wpisujesz na dziesiąty znak ciągu "imie" wartość zmiennej jednoznakowej "imi". Żeby przepisać cały ciąg znaków musisz użyć pętli przepisując kolejne znaki pojedyńczo albo użyć gotowej funkcji "strcpy". Po trzecie, przy wywołaniu funkcji - jeśli podajesz jeden znak używasz apostrofów, np. 'a', jeśli chcesz podać cały ciąg znaków musisz użyć cudzysłowia, np. "abc". Wówczas "abc" stanowi wskaźnik do miejsca w pamięci w którym są zapisane na stałe te trzy bajty reprezentujące litery abc. Z moich niesprawdzonych praktycznie przemyśleń wynika że jeśli funkcje WezImie i DajImie zrobisz tak:

Kod: Zaznacz cały

void UCZEN::WezImie(char * imi)
{
 strcpy(imie, imi);
}

  char * DajImie()
  {return imie; } 
I wywołasz ją tak:

Kod: Zaznacz cały

U1.WezImie("karol");
to powinno działać. Do zrozumienia jak działają stringi w C musisz dobrze znać działanie wskaźników.

Oprócz tego, zamiast cout dużo lepiej jest używać funkcji printf :wink:

ODPOWIEDZ