[C]sprawdzanie wielkości liter

edek86
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 14 paź 2008, o 14:58
Płeć: Mężczyzna
Lokalizacja: Ruda Śl.
Podziękował: 1 raz

[C]sprawdzanie wielkości liter

Post autor: edek86 »

Witam,
Mam problem z tym programem. Program ma pobierać od użytkownika tekst i sprawdzać ile jest dużych i ile jest małych liter. Coś mam źle z tą instrukcją warunkową ale nie wiem co...

Kod: Zaznacz cały

#define CRT_NO_SECURE_DEPRECATE
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>

int main()
{
   char tab[30];
   int duze,male;
   
   printf("Podaj tekst ");
   scanf("%c",tab);

   duze=0;
   male=0;
   do
   {

      if(issuper(tab))
      {
      duze++;
      printf("%d
",duze);
      }
      else
      {
      male++;
      printf("%d
",male);
      }
      
   }while(tab==EOF); //EOF to znacznik konca linii

   system("PAUSE");
   return 0;
}
Awatar użytkownika
Psycho
Użytkownik
Użytkownik
Posty: 370
Rejestracja: 23 gru 2008, o 09:37
Płeć: Mężczyzna
Lokalizacja: Przemyśl/Kraków
Podziękował: 59 razy
Pomógł: 68 razy

[C]sprawdzanie wielkości liter

Post autor: Psycho »

Tak na pierwszy rzut oka błąd jest tu:
zamiast

Kod: Zaznacz cały

if(issuper(tab))
ma być

Kod: Zaznacz cały

if(isupper(tab))
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

[C]sprawdzanie wielkości liter

Post autor: argv »

Kod: Zaznacz cały

#define CRT_NO_SECURE_DEPRECATE
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>

#define ILE	30

int main()
{
	char tab[ILE] = {'\0'};
	int duze = 0, male = 0;
	int i = 0;
   
	printf("Podaj tekst ");
	fgets(tab, ILE, stdin);
	
	/* usuwamy znak nowego wiersza jesli wystepuje */
	i = strlen(tab)-1;
	if(tab[i] == '\n') tab[i] = '\0';
		
	i = 0;	
	while(tab[i]) {
		isupper(tab[i]) ? duze++ : male++;
		i++;
	}
	printf("Duze %d\n Male: %d\n", duze, male);
	
	system("PAUSE");
	return 0;
}
edek86
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 14 paź 2008, o 14:58
Płeć: Mężczyzna
Lokalizacja: Ruda Śl.
Podziękował: 1 raz

[C]sprawdzanie wielkości liter

Post autor: edek86 »

argv, dzięki za kod tak właśnie ma działać mój program ale bardziej chodzi mi o to co muszę poprawić w moim. Chce się nauczyć a nie gotowce
Spróbuje poprawić mój na podstawie Twojego.

edit.

Poprawiłem to tak:

Kod: Zaznacz cały

#define CRT_NO_SECURE_DEPRECATE
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>

#define ile 20

int main()
{
	char tab[ile];
	int duze,male;
	int i;	
	
	puts("Podaj tekst ");
	gets(tab);

	duze=0;
	male=0;
	i=0;
	do
	{		
	  isupper(tab[i]) ? duze++ : male++;
      i++;
		
	}while(tab[i]);
	printf("Duze %d
 Male: %d
", duze, male);
	system("PAUSE");
	return 0;
}
nie wiem czy dobrze rozumiem ten fragment:
i=0;
do
{
isupper(tab) ? duze++ : male++;
i++;

}while(tab)

funkcja sprawdza 1 element tablicy czy duży czy mały następnie sprawdza drugi element itd.
pętla kończy się gdy napotka znacznik końca linii.
Mógłbyś wyjaśnić mi ten zapis: ? duze++ : male++;
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

[C]sprawdzanie wielkości liter

Post autor: argv »

Kod: Zaznacz cały

isupper(tab[i]) ? duze++ : male++;
to to samo co:

Kod: Zaznacz cały

if(isupper(tab[i])) 
	duze++ 
else
	male++;
-Co do pętli do ... while bym uważał, bo możesz dostać pusty napis.
-Najpierw powinieneś sprawdzić czy tab nie jest puste więc lepszym wyborem jest while,
albo jeszcze lepiej for od 0 do strlen
- zamiast gets, stosuj fgets, bo gets nie sprawdza przepełnienia bufora
- zawsze deklaruj int main(void), niby szczegół ale to oznacza ze main nie przyjmuje argumentów, zapis
main() oznacza że main przyjmuje dowolną ilość argumentów dowolnego typu, to różnica od C++
- zamiast puts możesz stosować printf
edek86
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 14 paź 2008, o 14:58
Płeć: Mężczyzna
Lokalizacja: Ruda Śl.
Podziękował: 1 raz

[C]sprawdzanie wielkości liter

Post autor: edek86 »

dzięki za pomoc
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

[C]sprawdzanie wielkości liter

Post autor: Fibik »

Kod: Zaznacz cały

for(s = tab; *s; s++)
  if( isupper(*s) ) up++;
  else if( islower(*s) lo++;
edek86
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 14 paź 2008, o 14:58
Płeć: Mężczyzna
Lokalizacja: Ruda Śl.
Podziękował: 1 raz

[C]sprawdzanie wielkości liter

Post autor: edek86 »

Jak teraz zapisać ten sam program tylko za pomocą funkcji?
Bo mi coś nie wychodzi

Kod: Zaznacz cały

#define CRT_NO_SECURE_DEPRECATE
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>

#define ile 30

void liczy(char tab[]){
	int a=0;
	int b=0;
	int c=0;
	if (isupper(tab[a]))
		b++;
		else
		c++;
        a++;
	  
	
}
int main()
{
	char tab[ile];
	int duze,male;
	int i;	
	
	printf("Podaj tekst ");
	gets(tab);

	duze=0;
	male=0;
	i=0;
	while(tab[i])
	{		
	  liczy(i,duze,male,i);
	  
	}
	
	printf("Duze %d
 Male: %d
", duze, male);
	system("PAUSE");
	return 0;
}
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

[C]sprawdzanie wielkości liter

Post autor: matshadow »

Kod: Zaznacz cały

#define CRT_NO_SECURE_DEPRECATE
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>

#define ile 30
int duze=0,male=0;

void liczy(char tab[], int i)
{
    if(isalpha(tab[i]))
    {
        if (isupper(tab[i]))  duze++;
        else male++;
    }
}
int main()
{
    char tab[ile];
    int i=0;   
   
    printf("Podaj tekst ");
    gets(tab);

    while(tab[i])
    {
        liczy(tab,i);
        i++;
    }
    printf("Duze %d
Male: %d
", duze, male);
    getch();
    return 0;
}
edek86
Użytkownik
Użytkownik
Posty: 38
Rejestracja: 14 paź 2008, o 14:58
Płeć: Mężczyzna
Lokalizacja: Ruda Śl.
Podziękował: 1 raz

[C]sprawdzanie wielkości liter

Post autor: edek86 »

Może mi ktoś wyjaśnić co ja robie źle w tych funkcjach?
Bez funkcji program działa(poprawnie w komentarzu). Nigdy nie wiem jak mam to przekształcić

Kod: Zaznacz cały

#define CRT_NO_SECURE_DEPRECATE
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#define ile 80

void funkcja(int a,char tab){
	a=strlen(tab);
}

int main()
{
	char tab[ile];
	int dl;

	printf("podaj tekst ");
	gets(tab);

	//dl=strlen(tab);
	funkcja(dl,tab);
	
	printf("dlugosc tekstu wynosi %d
",dl);


	system("pause");
	return 0;
}
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

[C]sprawdzanie wielkości liter

Post autor: argv »

Na oko:

Kod: Zaznacz cały

void funkcja(int a,char tab){
   a=strlen(tab);
}
a przekazujesz przez wartość czyli to co przypiszesz w funkcji ginie.
Możesz przekazać przez zmienną czyli int *a, albo po prostu zwrocić a:

A po drugie tablice przekazujesz do funkcji przez *, bo nazwa tablicy jest wskaznikiem(stalym) na
jej pierwszy element.

Kod: Zaznacz cały

int funkcja(char *tab){
      return strlen(tab);
}
Sięgnij po jakąś książkę do C, na rynku są praktycznie dwie moim zdaniem warte uwagi
- Kernigham & Ritchie - ANSI C - można powiedzieć biblia
- Herbert Schildt - Język C
golden
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 23 cze 2009, o 16:07
Płeć: Mężczyzna

[C]sprawdzanie wielkości liter

Post autor: golden »

cześć,

mam podobny problem co kolega powyżej...

Kod: Zaznacz cały

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

int funkcja(int a){

	for(a=0;a<10;a++);
}

int main()
{
	int i=0;

	funkcja(i);
	printf("%d",i);

	system("pause");
	return 0;
}
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C]sprawdzanie wielkości liter

Post autor: kadiii »

... i podobna recepta dla ciebie - zajrzyj do jakiejś literatury, naprawdę warto. Bo po kodzie widać, że nie masz pojęcia co piszesz.
ODPOWIEDZ