program który musi zliczać duże , małe litery i inne symbole błędnie zlicza symbole

0

Taki oto problem: program który musi zliczać duże , małe litery i inne symbole błędnie zlicza symbole, ktoś coś?

#pragma warning (disable: 4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 256
#define MAX_LINES 200
FILE *fd = NULL;
void big(char *te);
int main()

{
	char d[MAX_LINES][MAX_LINE];
	
	if (!(fd = fopen("DANE.txt", "r")))
	{
		printf("Blad otwarcia zbioru\n");
		exit(2);
	}
	for (int  i = 0; i < MAX_LINES && fgets(d[i], MAX_LINE, fd) != (char*)NULL; i++){
	printf("linia %d:  ", i);
	big(d[i]);
	printf("\n");
	}
	fclose(fd);
	fd = NULL;
	return 0;
}
void big(char *te) {
	char p;
	int l = 0, g = 0;
	int h = 0;
	while (*te != '\0') {
		if (*te >= 'A' && *te <= 'Z') l++;
		if (*te >= 'a' && *te <= 'z') g++;
		else h++;
		*te++;
	}
	printf("duze litery : %d,male: %d,inne : %d", l, g, h);

}


1

Z opisu nie bardzo wiadomo co konkretnie ten program ma robić, a z kodu nie wiadomo już nic. Co takiego ma robić funkcja big?

0
kq napisał(a):

Z opisu nie bardzo wiadomo co konkretnie ten program ma robić, a z kodu nie wiadomo już nic. Co takiego ma robić funkcja big?

funkcja big zlicza male, duze litery i do tego symbole inne( liczby etc)

0

Czyli ma zliczać wszystko?

Co konkretnie wchodzi w skład grupy inne?

0
Patryk27 napisał(a):

Czyli ma zliczać wszystko?

Co konkretnie wchodzi w skład grupy inne?

inne to są inne symbole( liczby, '=,(.....' etc) Tylko symbole, bez liter)

2

Czy ą klasyfikuje się jako litera czy inny symbol?
Czy to inny symbol?
Czy 😋 to inny symbol? (a jeśli tak, czy jest to jeden symbol, czy może wiele?)

2

No to przy tej definicji chyba dobrze zlicza? Podaj może przykład wejścia i oczekiwanego wyniku, który jest inny od tego, który dostajesz…

0
Althorion napisał(a):

No to przy tej definicji chyba dobrze zlicza? Podaj może przykład wejścia i oczekiwanego wyniku, który jest inny od tego, który dostajesz…

Mając taki tekst w pliku :
ABOKJrt9
afhHh4
ffhHH77

Na wyjsciu mam:
linia 0: duze litery : 5,male: 2,inne : 7
linia 1: duze litery : 1,male: 4,inne : 3
linia 2: duze litery : 2,male: 3,inne : 4

chociaz w linii 0 ma byc :1;w linii 1 ma byc :1, w linii 2 ma być: 2
P Oczywiscie linia zerowa jest bezsensu,bo ma być 1 i tak dalej, ale nie czepiajmy sie

1

Twój kod z poprawionym formatowaniem:

if (*te >= 'A' && *te <= 'Z') {
  l++;
}

if (*te >= 'a' && *te <= 'z') {
  g++;
} else {
  h++;
}
0
Patryk27 napisał(a):

Twój kod z poprawionym formatowaniem:

if (*te >= 'A' && *te <= 'Z') {
  l++;
}

if (*te >= 'a' && *te <= 'z') {
  g++;
} else {
  h++;
}

Nic się nie zmieniło)

1

Bo nie miało — to Ci miało tylko podpowiedzieć, kiedy wykonujesz h++ — wtedy, kiedy drugi if ma nieprawdziwy warunek. Czyli liczysz nie-małe litery. W szczególności więc — duże litery.

0
Althorion napisał(a):

Bo nie miało — to Ci miało tylko podpowiedzieć, kiedy wykonujesz h++ — wtedy, kiedy drugi if ma nieprawdziwy warunek. Czyli liczysz nie-małe litery. W szczególności więc — duże litery.

A co jeszcze oprócz tych dużych liter liczy się, bo nadal zmienna inne wypisuje błędne dane :


#pragma warning (disable: 4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 256
#define MAX_LINES 200
FILE *fd = NULL;
void big(char *);
int main()

{
	char d[MAX_LINES][MAX_LINE];
	
	if (!(fd = fopen("DANE.txt", "r")))
	{
		printf("Blad otwarcia zbioru\n");
		exit(2);
	}
	for (int  i = 0; i < MAX_LINES && fgets(d[i], MAX_LINE, fd) != (char*)NULL; i++){
	printf("linia %d:  ", i);
	big(d[i]);
	printf("\n");
	}
	fclose(fd);
	fd = NULL;
	return 0;
}
void big(char *te) {
	char p;
	int l = 0, g = 0;
	int h = 0;
	while (*te != '\0') {
		if (*te >= 'A' && *te <= 'Z') {
			l++;
		}

		else if (*te >= 'a' && *te <= 'z') g++;
		else {
			h++;
		}
		*te++;
	}
	
	printf("duze litery : %d,male: %d,inne : %d", l, g, h);

}
2

Co to znaczy błędne dane?
Wypisuje Ci heheh, jestem bardzo złom zmiennom albo -42?
Dla jakich ciągów wejściowych otrzymujesz te nieoczekiwane rezultaty?

Pamiętaj, że nikt z nas nie widzi Twojego ekranu - opisuj problemy tak szczegółowo, jak tylko się da.

0
Patryk27 napisał(a):

Co to znaczy błędne dane?
Wypisuje Ci heheh, jestem bardzo złom zmiennom albo -42?
Dla jakich ciągów wejściowych otrzymujesz nieoczekiwane rezultaty?

Pamiętaj, że nikt z nas nie widzi Twojego ekranu - opisuj problemy tak szczegółowo, jak tylko się da.

Już napisałem taki kod:


#pragma warning (disable: 4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 256
#define MAX_LINES 200
FILE *fd = NULL;
void big(char *);
int main()

{
	char d[MAX_LINES][MAX_LINE];
	
	if (!(fd = fopen("DANE.txt", "r")))
	{
		printf("Blad otwarcia zbioru\n");
		exit(2);
	}
	for (int  i = 0; i < MAX_LINES && fgets(d[i], MAX_LINE, fd) != (char*)NULL; i++){
	printf("linia %d:  ", i);
	big(d[i]);
	printf("\n");
	}
	fclose(fd);
	fd = NULL;
	return 0;
}
void big(char *te) {
	char p;
	int l = 0, g = 0;
	int h = 0;
	while (*te != '\0') {
		if (*te >= ' ' && *te <= '~') {
			if (*te >= 'A' && *te <= 'Z') {
				l++;
			}

			else if (*te >= 'a' && *te <= 'z') {
				g++;
			}

			else {
				h++;
			}
		}
		else {
			h = h + 0;
		}
		*te++;
	}
	
	printf("duze litery : %d,male: %d,inne : %d", l, g, h);

}

Bo w ostatnim kodzie zamiast tego:
linia 0: duze litery : 5,male: 2,inne : 1
linia 1: duze litery : 1,male: 4,inne : 1
linia 2: duze litery : 2,male: 3,inne : 2

wypisywalo mi
linia 0: duze litery : 5,male: 2,inne : 2
linia 1: duze litery : 1,male: 4,inne : 2
linia 2: duze litery : 2,male: 3,inne : 2

No i problem ze zmienną inne miałem . Nie wiem, może z powodu ENTER jakoś dodawano niepotrzebną jedynkę do tej zmiennej, nie wiem(

0

Nie wiem, może z powodu ENTER jakoś dodawano niepotrzebną jedynkę do tej zmiennej, nie wiem

Dlaczego zatem nie przeczytasz jak ta funkcja się zachowuje?

To jest tak podstawowa funkcja, że została nawet spisana na polskiej wikibooks (https://pl.wikibooks.org/wiki/C/fgets):

Czytanie przerywa, gdy [...] natrafi na koniec pliku lub znak końca linii (znak ten jest zapisywany do str)

0
Patryk27 napisał(a):

Nie wiem, może z powodu ENTER jakoś dodawano niepotrzebną jedynkę do tej zmiennej, nie wiem

Dlaczego zatem nie przeczytasz jak ta funkcja się zachowuje?

To jest tak podstawowa funkcja, że została nawet spisana na polskiej wikibooks (https://pl.wikibooks.org/wiki/C/fgets):

Czytanie przerywa, gdy [...] natrafi na koniec pliku lub znak końca linii (znak ten jest zapisywany do str)

Ale właśnie dlatego dałem instrukcję :

while (*te != '\0') 


2

\0 to nie jest znak końca linii.

1 użytkowników online, w tym zalogowanych: 0, gości: 1