Ferdinand_Amadeus
майор
С нами с 18.06.12
Посты: 1108
|
Итак, суть такова, есть задача про коней-
typedef struct KUN{
char jmeno[15];
char barva[10];
int cena;
struct KUN * dalsi;
} KUN;
Что надо сделать -
1. Пользователь задает число коней "П"
2. Создается список "П" коней.
3. Каждый третий конь зовется "Шемик", все остальные "Гризал"
4. Первые "К" коней имеют цену 20 000, остальные 6000, "К" задает пользователь, "К" должно быть меньше или ровно "П"
5. Окрас всех коней "черный"
6. Каждый новый конь выписывается в новую строку в списке.
7. За каждым Л-тым конем, удаляется следующий конь, но только тогда когда это Шемик, если это Гризал, то он не удаляется, так же невозможно удалить коня если мы на конце списка и ни единого коня в конце нету. ("Л" - задает пользователь, "Л" - от 0 до "П"
Итак, у меня есть несколько вариантов программы, например -
Первый вариант выполнения задания
Code:
#include <stdio.h>
#include <stdlib.h>
typedef struct kun {
char jmeno[15];
char barva[10];
int cena;
struct kun * dalsi;
} KUN;
static KUN *prvni = NULL;
/*tvorba noveho kone*/
KUN * newhorse(char jmeno[20],char barva[20], int cena){
KUN * horse;
horse = malloc(sizeof(KUN));
if (horse == NULL){
printf("Selhala alokace.\n");
return NULL;
} else {
strcpy(horse->jmeno,jmeno);
strcpy(horse->barva,barva);
horse->cena = cena;
horse->dalsi = NULL;
return horse;
}
}
/*prida kone na zacatek*/
void addhorsetostart(KUN * horse){
horse->dalsi = prvni;
prvni = horse;
return;
}
/*prida kone na konec*/
void addhorsetoend(KUN * horse){
KUN * point;
point = prvni;
if (point == NULL){
addhorsetostart(horse);
return;
} else {
while (point->dalsi != NULL){
point = point->dalsi;
}
point->dalsi = horse;
return;
}
}
/*vypise jednoho kone*/
int showone(KUN * horse){
if (horse == NULL){
printf("Kun neexistuje. Nemuzu vypsat.\n");
return 0;
} else {
printf("%s\n",horse->jmeno);
printf("%s\n",horse->barva);
printf("%d\n\n",horse->cena);
return 1;
}
}
/*vypise vsechny kone*/
void showall(){
KUN * point;
point = prvni;
if (point == NULL){
return;
} else {
do {
showone(point);
} while((point = point->dalsi)!= NULL);
return;
}
}
/*vyhleda kone podle jmena*/
KUN * searchbyname(char jmeno[15]){
KUN * point;
point = prvni;
if (point == NULL){
return NULL;
} else {
while ( point->dalsi != NULL && strcmp(point->jmeno,jmeno) != 0 ){
point = point->dalsi;
}
if (strcmp(point->jmeno,jmeno) == 0){
return point;
} else {
return NULL;
}
}
}
/*najde kone na pozici L+1*/
KUN * find(int number){
KUN * point;
KUN * pozice = NULL;
for (point = prvni;number > 0; point = point->dalsi) {
pozice = point;
number--;
}
if (strcmp (pozice->jmeno,"Semik")==0){
deletehorse(pozice);}
else{return;}
}
/*smaze kone*/
int deletehorse(KUN * who){
if (who == NULL){
printf("Takovy kun neexistuje.\n");
return 0;
}
if (prvni == who){
prvni = prvni->dalsi;
free(who);
printf("Kun smazan.\n");
return 1;
}
if (prvni == NULL){
printf("Seznam koni neexistuje.\n");
return 0;
}
KUN * point;
point = prvni;
while ( point->dalsi != NULL && point->dalsi != who){
point = point->dalsi;
}
if (point->dalsi == who){
point->dalsi = who->dalsi;
free(who);
printf("Kun smazan.\n");
return 1;
} else {
printf("Kun nenalezen.\n");
return 0;
}
}
int main() {
int p,k,l,i,j;
/*kontrola vstupu*/
printf("Zadej pocet koni:\n");
if(scanf("%d",&p)==0 || p<=0){
printf("Spatne cislo.\n");
return 0;
}
printf("Zadej hodnotu K:\n");
if(scanf("%d",&k)==0 || k>p || k<=0){
printf("Nespravna hodnota K - musi byt cele cislo a mensi nez pocet koni.\n");
return 0;
}
printf("Zadej hodnotu L:\n");
if(scanf("%d",&l)==0 || l>=p){
printf("Nespravna hodnota L - musi byt cele cislo a mensi nez pocet koni.\n");
return 0;
}
/*vkladani koni podle podminek*/
for(i=1;i<=p;i++){
if(i%3==0 && i<=k)addhorsetoend(newhorse("Semik","cerna",20000));
else if(i%3==0 && i>k)addhorsetoend(newhorse("Semik","cerna",6000));
else if(i%3!=0 && i<=k)addhorsetoend(newhorse("Hryzal","cerna",20000));
else addhorsetoend(newhorse("Hryzal","cerna",6000));
}
/*vypis koni pred a po smazani*/
showall();
printf("Za predpokladu, ze byl na L+1 pozici kun se jmenem Semik, byl vymazan .\n");
find(++l);
showall();
}
Второй вариант выполнения задания
И такой вариант -
Code:
#include <stdio.h>
#include <stdlib.h>
#define MAX_POCET_KONU 999
#define DELKA_JMENA 15
#define DELKA_BARVY 10
struct TKun
{
char jmeno[DELKA_JMENA];
char barva[DELKA_BARVY];
int cena;
struct TKun * dalsi;
};
void vypisKonu(struct TKun * seznam)
{
struct TKun * pom = seznam;
printf("\nVypis konu:\n");
while (pom != NULL)
{
printf("Jmeno:%s Cena:%d Barva:%s\n", pom->jmeno, pom->cena, pom->barva);
pom = pom->dalsi;
}
}
int ctiCislo(int min, int max)
{
int cislo;
while(1)
{
if (scanf("%d", &cislo)!=1)
{
printf("Chyba: Nebylo zadno cele cislo!\n");
while(getchar()!='\n'){}
}
else
{
if (cislo < min || cislo > max) printf("Chyba: Cislo musi byt v rozsahu <%d;%d>!\n", min, max);
else return cislo;
}
printf("Opakujte zadani: ");
}
}
int main(void)
{
int P, K, L, i;
struct TKun * seznam = NULL; // ukazatel na prvniho kone v seznamu
struct TKun * aktulani_kun; // pomocny ukazatel na aktulaniho kone
//*** Uživatel zada počet P, celй čнslo, kontrola!
printf("Zadejte P: ");
P = ctiCislo(1,MAX_POCET_KONU);
// zadani cisla K
printf("Zadejte K: ");
K = ctiCislo(0,P);
// zadani cisla L
printf("Zadejte L: ");
L = ctiCislo(0,P-1);
//*** Vytvořн se spojovэ seznam P koňu:
aktulani_kun = NULL;
for(i=1; i<=P; i++)
{
// vytvorime noveho kone
struct TKun * novy_kun = malloc(sizeof(struct TKun));
novy_kun->cena = i;
novy_kun->dalsi = NULL;
// musime si zapamatovat ukazatel na prvniho vytvoreneho kone
if (seznam == NULL) seznam = novy_kun;
// jestlize existuje aktualni kun, tak noveho kone zaradime za aktualniho kone
if (aktulani_kun != NULL) aktulani_kun->dalsi = novy_kun;
// aktualni kun je ted nove vytvoreny kun
aktulani_kun = novy_kun;
// *** Každэ třetн kůň je Semнk, ostatnн jsou Hryzal
if (i%3 == 0) strncpy(aktulani_kun->jmeno, "Šemнk", DELKA_JMENA);
else strncpy(aktulani_kun->jmeno, "Hryzal", DELKA_JMENA);
// *** pvnнch K konн mб cenu 20000, ostatnн 6000, K zadб uživatel, K musн bэt meně nebo rovno než P, kontrola!
if (i <= K) aktulani_kun->cena = 20000;
else aktulani_kun->cena = 6000;
// *** barva všech konн je černб
strncpy(aktulani_kun->barva, "černб", DELKA_BARVY);
}
//*** vэpis koňн pod sebe
vypisKonu(seznam);
//*** Za L tэm koněm se odstranн dalšн kůň, ale pouze tehdy, pokud to je Šemнk, pokud to je Hryzal, neodstranн se, takй nenн možnй odstranit koně, pokud jsme na konci.. L zadб uživatel L je 0 až P-1, kontrola !! )
i = 0;
aktulani_kun = seznam;
while (aktulani_kun != NULL)
{
i++;
if (i == L)
{
// pokusime se odstranit kone za aktualnim konem
if (aktulani_kun->dalsi != NULL && strcmp(aktulani_kun->dalsi->jmeno,"Ĺ emĂk") == 0)
{
struct TKun * odstranovany = aktulani_kun->dalsi;
aktulani_kun->dalsi = aktulani_kun->dalsi->dalsi;
free(odstranovany);
}
}
aktulani_kun = aktulani_kun->dalsi;
}
//*** Znovu vypiš koně pod sebe
vypisKonu(seznam);
// uvolneni pameti
while (seznam != NULL)
{
aktulani_kun = seznam;
seznam = seznam->dalsi;
free(aktulani_kun);
}
return 0;
}
Суть в чем, меня интересуют другие, возможные, варианты написания этого задания в C.
Заранее благодарю за возможные ответы. Надеюсь в коде все будет понятно, в него чешского примешано
|
|