Tablice znakowe - 3 proste zadanka - pytanie laika

0

Czy mógłby mi ktoś pomóc, ewentualnie naprowadzić na rozwiązanie jak wykonać 3 poniższe programy:

3.7. Napisz program, który wypełni dziesięcioelementową tablicę jednowymiarową typu
znakowego, znakami podanymi przez użytkownika, a następnie wyświetli na ekranie tylko te
elementy tablicy, które nie należą do współczesnego, podstawowego alfabetu łacińskiego.
3.8. Napisz program, który wypełni dziesięcioelementową tablicę jednowymiarową typu znakowego, znakami podanymi przez użytkownika, a następnie wszystkie przecinki znajdujące się w tablicy zamieni na spacje i poda ich ilość.
3.9. Napisz program, który poprosi użytkownika o podanie dowolnej litery podstawowego, współczesnego alfabetu łacińskiego, a następnie wyświetli nazwę podanej litery w alfabecie lotniczym (wskazówki: stworzyć bazę wiedzy programu w postaci jednowymiarowej tablicy typu string).

Siedzę nad nimi już 2 dni i jakoś nie mogę wymyślić jak je rozwiązać ;/

1

No to pokaż co przez te dwa dni udało Ci się zrobić... :]

0

Generalnie na razie nie mam pomysły jak się za to zabrać. Jedyne co wymyśliłem to do zadania 3.7 o taki programik:

int main()
{
	char lit[6]={'A','B','C','D','E','\0'};
	char wpis[3];
	for (int i=0;i<3;i++)
	{
		cin>>wpis[i];	
	}
	
	wpis[3]='\0';
	char wys[3];
	int a=0;
	for (int i=0;i<3;i++)
	{
		for (int j=0;j<6;j++)
		{
			if (wpis[i]==lit[j])
			wys[i]=wpis[i];
			a++;	
		}
		wys[a]='\0';	
	}
	
	cout<<"Wypisz znaki nie z alfabetu: ";
	for (int i=0;i<=a;i++)
	{
		cout<<wys[i]<<" ";
	}
	
	getch();
	return 0;
}

Jednak wyświetla mi jakiś syf przed znakami spoza tablicy.

0

w pierwszym zadaniu musisz się dowiedzieć jakie są te znaki z współczesnego podstawowego języka łacińskiego, potem sprawdź ich kod w ASCII. jeżeli są to np znaki od 100 do 105 w kodzie ascii to robisz warunek:

if(tablica[i]>=100 && tablica[i] <=105) {wyswietl}

oczywiscie ten warunek ma byc w petli. nad reszta zaraz pomysle. (nie podaje ci calego kodu abys pomyslal.)

-------------------------//edit
zadanie 2

użyj funkcji replace. poszukaj w google jak sie jej uzywa. najlepjej(c++ references ) albo http://www.c.vj.e.pl/index6.php

----------------------//edit
Zadanie 3

tu masz alfabet lotniczy:

Alpha
Bravo
Charlie
Delta
Echo
Foxtrot
Golf
Hotel
India
Juliet
Kilo
Lima
Mike
November
Oscar
Papa
Quebec
Romeo
Sierra
Tango
Uniform
Victor
Whiskey
Xray
Yankee
Zulu 

i teraz musisz sprawdzic jaka litere wpisuje czyli:

for(int i=0;i<=chyba 24;i++)
{
     if(int(znak)==chyba 78+i)
    {
         cout<<tablica[i];
}

tablica, do tablicy wklepujesz ten alfabet. te liczby w for to jest ile jest tych znakow od a do z, a w warunku to od duzej litery w kodzie ascii.

Mam nadzieje ze troche przyblizylem ci co masz zrobic.

PS nie wiem czy to bedzie dzialac bo nie mam mozliwosci teraz wrzucenia tego do IDE c++ bo nie jestem u siebie na komputerze ale jak dobrze to skonwertujesz wszystko to powinno dzialac ;) jak cos to pisz

0
EneR napisał(a)

tylko ze najpierw musisz zamienic znaki wpisywane na kod ascii czyli:

char znak;
cout<<"Wpisz element talicy"<<endl;
cin>>znak;
tablica[i]=int(znak);

Huh? Typ char jest typem jak najbardziej liczbowym, przechowującym wartości w zakresie 0-255. Nic nie trzeba zamieniać.

#include <stdio.h>


int  main(void)
{
    char    value;


    value = 'a';
    printf("a == 97? %s\n", value == 97 ? "TRUE" : "FALSE");

    value = 100;
    printf("100 -> %c\n", value);

    return 0;
}

Wynik:

a == 97? TRUE
100 -> d

Chyba, że w C++ jest inaczej...

0

no to jak nie trzeba zmieniac no to nie musi wpisywac tego do int() chyba oto ci chodzi. Myslalem ze trzeba bo dawno tego uzywalem i nie pamietam ale dzieki za poprawke

0

Nie musi wpisywać do tablicy intów. Jeśli tablica w Twoim kodzie będzie tablicą charów, to to zadziała, ale rzutowanie jest niepotrzebne. Nazwa typu jest nieco myląca, co nawet sam Ritchie przyznał, kiedy wypowiadał się na temat niedoskonałości języka C. Bardziej odpowiednią nazwą byłoby tu byte, gdyż każdy znak w ASCII jest bajtem, a to że na ekranie czy papierze występuje jako krzaczek jest kwestią reprezentacji. Nawet "plik tekstowy ASCII" jest ciągiem liczb, tylko że w ograniczonym zakresie zwanym "zakresem znaków drukowalnych"... co i tak bywa pojęciem dość luźnym, wprowadzającym dodatkowe zamieszanie. Jeszcze większy bałagan (chciałoby się wręcz wykrzyknąć "nareszcie!") wprowadził Unicode, ale to już temat na inny flame war.

0

zad 3.7 zrobiłem tak:

char wpis[10];
	char wys[10];
	int a=0;
	for (int i=0;i<10;i++)
	{
		cin>>wpis[i];	
		if (( wpis[i] < 'a' || wpis[i] > 'z') && (wpis[i] < 'A' || wpis[i] > 'Z')) 
		{
			wys[a]=wpis[i];
			a++;	
		}
	}
	
	cout<<"Litery nie nalezace do alfabetu lacinskiego to:\n";
	for (int i=0;i<a;i++)
	{
		cout<<wys[i]<<" ";	
	}

zad 3.8 tak:

char wpis[10];
	int spacja=0;
	for (int i=0;i<10;i++)
	{
		cin>>wpis[i];	
		if (wpis[i]==',')
		{
			wpis[i]=' '; 
			spacja++; 			
		}
	}
	
	cout<<"Ilosc przecinkow: "<<spacja<<endl;

Ale na to 3.9 wciąż nic i nie przychodzi na myśl...

0

Inne rozwiązanie zad. 3.8:

#include <stdio.h>
#include <string.h>


int  main(void)
{
    char    *text = "Ala, wraz z kotem, stwierdzili, że w tym,zdaniu jest zbyt, wiele, przecinków,", *pos;
    int     counter = 0, len;


    len = strlen(text);
    pos = text;
    while ( pos - text < len )
        if ( (pos = strstr(pos, ", ")) != NULL ) {
            counter++;
            pos += 2;
        } else
            break;

    printf("Ilość przecinków: %d\n", counter);
    return 0;
}

...i jeszcze inne, tak żeby zachęcić do eksperymentowania:

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


int  main(void)
{
    char    *text = "Ala, wraz z kotem, stwirdzili, że w tym,zdaniu jest zbyt, wiele, przecinków,",
            sep[] = {',', ' '},
            *pos;
    int     counter = 0, len;


    len = strlen(text);
    for ( pos = text; pos - text < len - 1; pos++ )
        if ( memcmp(pos, sep, 2) == 0 )
            counter++;

    printf("Ilość przecinków: %d\n", counter);
    return 0;
}

Tylko to jest mały hardcore. Nie używaj dopóki nie będziesz miał pewności, że wiesz jak i dlaczego to działa.

Co do 3.9, EneR podał Ci listę wyrazów. Stwórz zwykłą tabelę tych wyrazów, a po indeksie (będącym również liczbą przyporządkowaną do znaku, z pewnym przesunięciem) wyciągniesz właściwy.

0

Zrobiłem tak (do uzupełnienia jeszcze program, ale działa)

string tab[3]={"Alpha","Bravo"}
		
	char a; 
	cin >> a; 
	if (a>='A' && a<='Z')
	{
		int index = a - 'A';
		cout << tab[index]; 
	}
	else
	{
		int index = a - 'a'; 
		cout << tab[index];
	}

Dzięki za pomoc ;)

0

Widzę tutaj jeden problem. Język C nie posiada żadnego mechanizmu automatycznej kontroli zakresu indeksów tablicy. Musisz sam się o to martwić. Pomyśl co się stanie, kiedy użytkownik poda na wejściu coś innego niż małą lub wielką literę. Np. cyfrę, albo polski krzaczek.
Masz też powtórzony kod. Pomyśl czy nie lepiej byłoby zamienić wielką literę (jeśli takowa wystąpi) na małą przed obliczeniem indeksu. W ten sposób będziesz wyciągał dane z tabeli w jednym miejscu, a nie w dwóch. Nie jest to jednak błąd, więc nie musisz się tym nadto przejmować.

0
Kumashiro napisał(a)

... poda na wejściu coś innego niż małą lub wielką literę. Np. cyfrę, albo polski krzaczek.

zauważyłem to. Trochę zmieniłem kod i w tej chwili wygląda on następująco:

if (isupper(a)) //zamiana duzej litery na mala
	{
		a=tolower(a);
	}
	
	int index=a-'a';
	if (a>='a' && a<='z')
	{
		cout<<"W alfabecie lotniczym to: "<<tab[index]; 	
	}
	else //zabezpieczenie przeciwko podaniu zlego znaku
		cout<<"Podany znak nie jest litera alfabetu lacinskiego.";

Bardziej tego kodu odchudzić z moim zasobem wiedzy odchudzić nie potrafię.

0

Nie musisz sprawdzać wielkości znaku funkcją isupper(). Jeśli znak nie będzie wielką literą, funkcja tolower() zwróci znak podany w argumencie bez żadnych zmian. Zatem tolower('A') zwróci a, zaś tolower('r') zwróci r.

0

czyli wystarczy dać samo a=tolower(a) ? A jak nie tak to jak wykonać to żeby wyświetlało to co chce bez względu na wielkość litery?

0

Tak wynika z dokumentacji.

0
// zad 3.7
char input[10];
std::cin.getline(input, 10);
char* c = input;
while (*c != '\0')
{
    if (!isalpha(*c))
        std::cout << *c;
    ++c;
}
std::cout << std::endl;

// zad 3.8
char input[10];
std::cin.getline(input, 10);
char* c = input;
size_t spaces = 0;
while (*c != '\0')
{
    if (*c == ',')
        *c = ' ';
    if (*c == ' ')
        ++spaces;
    ++c;
}
std::cout << input << '\n' << spaces << std::endl;

// zad 3.9
const char[] letters = 
{
    "Alpha", "Bravo", "Charlie", "Delta",
    "Echo", "Foxtrot", "Golf", "Hotel",
    "India", "Juliet", "Kilo", "Lima",
    "Mike", "November", "Oscar", "Papa",
    "Quebec", "Romeo", "Sierra", "Tango",
    "Uniform", "Victor", "Whiskey", "Xray",
    "Yankee", "Zulu"
};
char c;
std::cout << "Podaj litere: ";
std::cin >> c;
while (!isalpha(c))
{
    std::cout << "To nie jest litera. Sprobuj ponownie: ";
    std::cin >> c;
}
std::cout << letters[tolower(c) - 'a'] << std::endl;

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