Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

С задача!

Featured Replies

Напишете С програма, която демонстрира копирането на масив чрез използването на пойнтер нотация. Новият масив не трябва да съдържа гласни букви също така всички елементи трябва да се превърнат в главни букви. 
До тук добре, почнах да копирам, но нещо накрая все ми 1 елемент по-малко, не знам защо... 
Превърнах буквите в главни.. това беше лесната част. И тука идва трудната, да премахна гласните чрез използване на пойнтер нотация, което не съм сигурен на 100% дали ми работи, стигам до някъде.. но после все нещо куца, ще прикача кода и снимка на това какво ми излиза. 

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

void convertToUpper(char *capitalise);
void deleteConsonants(char *consonants);

int main(void)

{
	char slogan[] = "Comp10120 is my favourite module";
	char string[100];
	int length = strlen(slogan);
	
	// converting every element of the char array into uppercase
	convertToUpper(slogan);
	
	char *copySlogan = slogan;
	char *copyString = string; 
	
	for(int i = 0; i < length-1; i++)
	{
		*(copyString + i) = *(copySlogan + i);
	}
	
	deleteConsonants(slogan);
	
	printf("Копиране: \n");
	printf("%s", string);
	
	printf("\n\nПремахване на гласни: ");
	printf("\n%s", slogan);
	//printf("%s\n", slogan);
	//deleteConsonants(slogan);
	//printf("%s", slogan);

}

void convertToUpper(char *capitalise)
{
	while(*capitalise != '\0')
	{
		*capitalise = toupper(*capitalise);
		capitalise++;
	}
}

void deleteConsonants(char *consonants)
{
	while(*consonants != '\0')
	{
		for(int i = 0; i < strlen(consonants); i++)
		{
			if(*consonants == 'E' || *consonants == 'A' || *consonants == 'I' || *consonants == 'O' || *consonants == 'U' || *consonants == 'e' || *consonants == 'a' || *consonants == 'i' || *consonants == 'o' || *consonants == 'u')
			{
				for(int j = i; j < strlen(consonants); j++)
				{
					*consonants = *(consonants +1);
				}
			}
		}
		consonants++;
	}
}

 

Както ще видите на снимката, капитализацията е 6, при копирането се губи 1 елемент, а при премахването на гласни е доста объркано, и една гласна даже остава 'U'. 

Ако някой може да ми даде съвет, ще бъда благодарен, благорадя!

 

Screen Shot 2018-03-08 at 9.54.11 p.m..jpg

#include <stdio.h>

#define SIZE 100

int main()
{
    char slogan[]="Comp10120 is my favourite module";
    char string[SIZE];
    int i;
    char c, *s, *t;
    
    s=slogan;
    t=string;
    i=1;
    
    while (*s)
    {
         c=*s++;
         if (c>='a' && c<='z') c-=32;
         if (c!='A' && c!='E' && c!='I' && c!='O' && c!='U') 
         {
            *t++=c;
            if (++i==SIZE) break;
         }
    }
    *t=0;
    
    printf("%s\n",slogan);
    printf("%s\n",string);

}

 

преди 9 часа, denisov_slav написа:

for(int i = 0; i < length-1; i++) { *(copyString + i) = *(copySlogan + i); }

Не се прави така. Така копираш един елемент по малко. Да не говорим, че е опасно да не се копира нулата, която се явява терминиращ символ.

Не е --- i < length - 1-----, a e --- i < length---

И нулата задължително я копирай навсякъде изрично.

void deleteConsonants(char *consonants)
{
	while(*consonants != '\0')
	{
		for(int i = 0; i < strlen(consonants); i++)
		{
			if(*consonants == 'E' || *consonants == 'A' || *consonants == 'I' || *consonants == 'O' || *consonants == 'U' || *consonants == 'e' || *consonants == 'a' || *consonants == 'i' || *consonants == 'o' || *consonants == 'u')
			{
				for(int j = i; j < strlen(consonants); j++)
				{
					*consonants = *(consonants +1);
				}
			}
		}
		consonants++;
	}
}

Не се пише така. Така зор зорна от линейна сложност правиш квадратна, освен това логиката се усложнява и се създава възможност за грешки.

Алокирай втори масив. Когато от първия прочетеш съгласна я записвай във втория. Когато прочетеш гласна прескачай я и не я записвай. Накрая Копирай втория масив в първия и го де алокирай. 

  • Автор

Благодаря много @ined, досега не бях виждал този начин на решаване на проблема, което е един + за мен. Имам един въпрос, какво прави " *t = 0" ? 
Другата част от кода я разбирам, освен това. 

@Реджеп Иведик, ако използвам 'length' вместо 'length-1' се получаваше това: 

+ 2, 3 произволни елемента всеки път, незнайно защо. И не можах да открия къде съм сбъркал. 

 

Screen Shot 2018-03-09 at 7.15.25 a.m..jpg

преди 37 минути, denisov_slav написа:

+ 2, 3 произволни елемента всеки път, незнайно защо. И не можах да открия къде съм сбъркал. 

Защото не копираш изрично нулата предполагам и отпечатването става, докато не се достигне до някоя случайна нула.

Работиш до length и след това задължително веднага записваш нула.

Сиреч във length записваш нула щото имаме нулево индексиране.

  • Автор
преди 9 минути, Реджеп Иведик написа:

Защото не копираш изрично нулата предполагам и отпечатването става, докато не се достигне до някоя случайна нула.

Работиш до length и след това задължително веднага записваш нула.

Прав си, не се бях сетил за това, току що го пробвах и работи! 

Благодаря! 

  • 1 месец по-късно...

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.