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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

Задача на С

Featured Replies

  • Автор

Така, най-накрая стигнах до нещо по-добро.

Мисля, че този код ми върши добра работа за сега.

Проблема е, че цифрите в масивите не са в растящ ред.

Някакви идеи как да ги отпечатва в растящ ред?

В главния масив "array" не трябва да са в растящ ред, но в другите 2 array1 и array2 искам да ги направя в такъв.

 

Ето го и кода:

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int five(int n)
{
    int c=0;
    if (n<0) n=-n;
    while (n)
    {
       if (n%10==5) c++;
       n/=10;
    }
    return c;
}

int main ()
{
    int array[100], array1[100], array2[100];
    int s1=0, s2=0, mx, c5=0, i, j;
    printf("Welcome to the program\n\nThis program is made by Kristian Nalbanotov\n\n");
    printf("Press any letter or number from the keyboard and then hit 'Enter' to generate array with 100 random numbers\n");
    scanf("%d",&array);
    srand (time(NULL));
    printf("The following random numbers were made:\n");
    for (i=0; i<100; i++)
    {
       int t=rand()%100;
       printf("%d\t",t);
       array=t;
    }
    printf("\n\narray1:\n");
    for (i=0; i<100; i+=5) {
        mx = array;
        for (j=i+1; j<i+5; j++)
            if (array[j]>mx) mx=array[j];
        for (j=i; j<i+5; j++)
            if (array[j]==mx)
            {
                array1[s1++]=mx;
                printf("%d\t",mx);
            }
            else array2[s2++]=array[j];
    }
    
    printf("\n\n array2:\n");
    for (i=0; i<s2; i++) {
       int t=array2;
       printf("%d\t",t);
       c5+=five(t);
    }   
    printf("\ The number '5' were found %d times in the array. ",c5);
    printf("\n");
    system("pause");

Редактирано от Kristian Nalbantov (преглед на промените)

  • Отговори 63
  • Прегледи 7,2k
  • Създадено
  • Последен отговор
int sort(int* masiv, int maxmasiv)
    {
    int i;
    int n;
    int k=0;
    while(1)
        {
        for (i=0; i < maxmasiv - 1; i++)
            {
            if (masiv[i] > masiv[i + 1])
                {
                k = k + 1;
                n = masiv[i];
                masiv[i] = masiv[i + 1];
                masiv[i + 1] = n;
                }
            }
        if (k == 0) break;
        else k=0; 
        } 
    return 0;
    }

Редактирано от Реджеп Иведик (преглед на промените)

..

много ги обичаш тия while(1) ей... Много лоша практика е това за цикъл, който има ясно условие за край.

Редактирано от flare (преглед на промените)

много ги обичаш тия while(1) ей... Много лоша практика е това за цикъл, който има ясно условие за край.

 

Почвам да пиша, без да знам още какво точно ще напиша, но знам, че ще е цикъл. Затуй безкраен цикъл и брейк. На колегата ако не му харесва, да ме поправи, хем после ще може да се похвали, че е намерил кусур на Всесъвършения.

  • Автор
int sort(int* masiv, int maxmasiv)
    {
    int i;
    int n;
    int k=0;
    while(1)
        {
        for (i=0; i < maxmasiv - 1; i++)
            {
            if (masiv[i] > masiv[i + 1])
                {
                k = k + 1;
                n = masiv[i];
                masiv[i] = masiv[i + 1];
                masiv[i + 1] = n;
                }
            }
        if (k == 0) break;
        else k=0; 
        } 
    return 0;
    }

Сега пробвах да го заредя, но не ми дава да ползвам break извън loop или switch.

Редактирано от Kristian Nalbantov (преглед на промените)

Сега пробвах да го заредя, но не ми дава да ползвам break извън loop или switch.

Забравил си някоя скоба.

Почвам да пиша, без да знам още какво точно ще напиша, но знам, че ще е цикъл. Затуй безкраен цикъл и брейк. На колегата ако не му харесва, да ме поправи, хем после ще може да се похвали, че е намерил кусур на Всесъвършения.

Ами, като показваш на хората как се прави, хубаво би било да е и според правилата. Кодът трябва не само да работи, но и да е написан четливо.

Иначе, като напишеш 5-6000 реда и ще започнеш сам да се чудиш, какво си имал предвид тук или там. Пък да не говорим за голям проект подържан от двадесетина души.

int sort(int* masiv, int maxmasiv)
    {
    int i;
    int n;
    int k;
    do
        {
        k = 0;
        for (i=0; i < maxmasiv - 1; i++)
            {
            if (masiv[i] > masiv[i + 1])
                {
                k = 1;
                n = masiv[i];
                masiv[i] = masiv[i + 1];
                masiv[i + 1] = n;
                }
            }
        } while (k != 0);
    return 0;
    }

Е, готово, написах и к=1, а не к = к+1, защото някой може да е философ като мен и да каже, че числата като прибавяш към тях 1 дълго време и в един момент стават 0.

Редактирано от Реджеп Иведик (преглед на промените)

Е, готово, написах и к=1, а не к = к+1, защото някой може да е философ като мен и да каже, че числата като прибавяш към тях 1 дълго време и в един момент стават 0.

Не, философът би казал, че не само е напълно излишно да събираш, като може само да присвояваш, ами и е объркващо за страничен човек, който ти чете кода.

И би допълнил, че говорещо име като swap_is_made(napravena_razmqna в ползвания стил на именуване) би било по-добре, щото while(swap_is_made) си звучи направо като изречение на английски, че даже може и да накара читателя да разбере как работи сортирането. И също може да е булева, макар в C да не ги уважават много хората...

Ай стига заяждане :P

Бая дълго време ще ти трябва да сортираш 4 милиарда числа за да се стигне до това.

Зависи. С никъде не ти осигурява размера на int!!! СТандарта ти осигурява само това:

sizeof(short int) <= sizeof(int) <= sizeof(long int) sizeof(long long int)

Зависи. С никъде не ти осигурява размера на int!!! СТандарта ти осигурява само това:

sizeof(short int) <= sizeof(int) <= sizeof(long int) sizeof(long long int)

Това е безпредметен спор. Важното е, че е напълно излишно да се увеличава с едно и е грешно логически - смисълът на този флаг, е да се установи имало ли е размяна, не колко са размените.

Бая дълго време ще ти трябва да сортираш 4 милиарда числа за да се стигне до това.

 

На времето, думата като беше 8 бита и 256 числа стигаха. Какви години бяха, и бозата беше по 6 стотинки.  :)  :)  :)

Това е безпредметен спор. Важното е, че е напълно излишно да се увеличава с едно и е грешно логически - смисълът на този флаг, е да се установи имало ли е размяна, не колко са размените.

Вярно е, но по-горе изказаха мнение, което не е прецизно.

Иначе присвояването е и по-бързо то събиране (една команда incr по-малко :) )

На времето, думата като беше 8 бита и 256 числа стигаха. Какви години бяха, и бозата беше по 6 стотинки.  :)  :)  :)

И тогава умножението на два байта на асемблер беше (почти) тема за курсова работа

  • Автор

Здравейте пак колеги.

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

Мисля, че проблема идва от тази част на кода :

void A_B()
{
    int i;
FILE* pFile=fopen("array_test.txt","w");
  for(i=0;i<100;i++)
  fprintf(pFile,"%d ",(PRIM_ARR));

fclose(pFile);
}

 

Ето го и целия код :

 

 

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <string.h>
#define MAX 100
void SHOW_MENU();
void PRIMARY_ARRAY();
void SHOW_PRIMARY_ARRAY(int PRIM_ARR[]);
void SEC_ARRAY();
int PRIM_ARR[MAX];
int SEC_ARR[MAX];
void A_A();
void A_B();

int five(int n)
{
    int c=0;
    if (n<0) n=-n;
    while (n)
    {
       if (n%10==5) c++;
       n/=10;
    }
    return c;
}
int main ()
{
        while(1)
{
int CHOICE;
SHOW_MENU();
printf("THE SYSTEM IS WAITING YOUR CHOICE...");
scanf("%d", &CHOICE);
printf("\n\n");
switch(CHOICE)
{
case 1: PRIMARY_ARRAY(PRIM_ARR); break;
case 2: SHOW_PRIMARY_ARRAY(PRIM_ARR); break;
case 3: SEC_ARRAY(SEC_ARRAY); break;
case 4: A_A();break;
case 5: A_B();break;
default: printf("INCORRECT CHOICE! PLEASE CHOOSE AGAIN!"); break;
}
}
printf("\n");
    system("pause");
    return 0;
}
void SHOW_MENU() //SHOWS THE USER CONTROL MENU
{
printf(" WELCOME TO USER MENU \n");
printf(".....................................\n");
printf("1. Input primary array \n");
printf("2. Show primary array \n");
printf("3. Use the random number generator to fill the Array\n");
printf("4. To read array from file\n");
printf("5. To save array in file\n");
printf("6. TO EXIT PRESS CTRL + C \n");
printf("\n");
printf("\n");
}

void PRIMARY_ARRAY() //INPUTS PRIMARY ARRAY ELEMENTS
{
     int array[100], array1[100], array2[100];
    int s1=0, s2=0, mx, c5=0, i, j, x, n, k=0, sort;
    int index;
for(index=0; index<MAX; index++)
{ printf("INPUT MAIN ARRAY ELEMENT [%d] OUT OF 100: ", index+1);
scanf("%d", &PRIM_ARR[index]);
}
}

void SHOW_PRIMARY_ARRAY(int PRIM_ARR[]) //SHOWS PRIMARY ARRAY ELEMENTS
{ int index;
printf("YOUR PRIMARY ARRAY IS:\n");
for(index=0; index<MAX; index++)
{ printf("%d\t", PRIM_ARR[index]);
}
printf("\n");
}
void A_A()
{
FILE* pFile=fopen("array.txt","r");
    int i, index;
  int array3[100];
  {
  for(i=0;i<100;i++)
  fscanf(pFile,"%d",array3+i);
fclose(pFile);
  }
}
void A_B()
{
    int i;
FILE* pFile=fopen("array_test.txt","w");
  for(i=0;i<100;i++)
  fprintf(pFile,"%d ",(PRIM_ARR));

fclose(pFile);
}
void SEC_ARRAY()
{
    int index;
{
    int array[100], array1[100], array2[100];
    int s1=0, s2=0, mx, c5=0, i, j, x, n, k=0, sort;
    printf("Welcome to the program...\n\nThis program is made by Kristian Nalbanotov.\n\n");
    printf("Press any letter or number from the keyboard and then hit 'Enter' to generate array with 100 random numbers\n");
    scanf("%d",&array);
    srand (time(NULL));
    printf("The following random numbers were generated:\n");
    for (i=0; i<100; i++)
    {
       int t=rand()%100;
       printf("%d\t",t);
       array=t;
    }
    printf("\n\ARRAY 1: The maximum numbers of every five numbers are:\n");
    for (i=0; i<100; i+=5)
    {
        mx = array;
        for (j=i+1; j<i+5; j++)
            if (array[j]>mx) mx=array[j];
        for (j=i; j<i+5; j++)
            if (array[j]==mx)
                {
                array1[s1++]=mx;
                printf("%d\t",mx);
            }
            else array2[s2++]=array[j];
    }
    
    printf("\n\n ARRAY 2: The numbers which are not in ARRAY 1 are:\n");
    for (i=0; i<s2; i++) {
       int t=array2;
       printf("%d\t",t);
       c5+=five(t);
    }   
    printf("\n The number '5' were found %d times in array2. ",c5);
    printf("\n");
}
}

Редактирано от Kristian Nalbantov (преглед на промените)

Някакви идеи?

Мисля, че проблема идва от тази част на кода

Любимият ми въпрос... Мислиш... а разгледа ли изобщо какво пише там???

  for(i=0;i<100;i++)
    fprintf(pFile,"%d ",(PRIM_ARR));

Къде е индекса на масива?

Редактирано от flare (преглед на промените)

И да сложи индекса пак няма да работи цялата тая каша, защото никъде не указва на функцията кой масив да се запише.

При четенето положението е подобно - чете се в някакъв локален масив дето после го губиш при затваряне на функцията.

Редактирано от ined (преглед на промените)

Това изглежда прекалено дълго за поставената задача. Сигурно може да се направи с 1/5 от кода.

  • Автор

Това изглежда прекалено дълго за поставената задача. Сигурно може да се направи с 1/5 от кода.

Ами аз не исках да ви занимавам с цялата задача и сега я довършвам.

Цялата е малко по-сложна и за това кода е дълъг :

 

• Получава целочислен от 100 елемента и извежда на екрана въведения масив.

• Записва в масив1 на максималното от всеки 5 числа и в масив2 - всички останали числа.

• Да се намери колко пъти се среща цифрата 5 в масив2.

• Програмата да има текстово меню, от което потребителят да избира дали да въвежда масив

или да обработва вече въведен такъв.

• Да се добави възможност за прочитане на масива от файл, посочен от потребителя.

• Да се добави възможност за запис на масива във файл, посочен от потребителя, по 4

числа на ред, разделени едно от друго с празна позиция.

• Определяне на номера на реда, съдържащ максималното нечетно число.

• Да се записва резултатът във файл, посочен от потребителя.

• Да се прави проверка на потребителския вход.

• Да не се позволява да се въвеждат невалидни числа. Да не се дава възможност на

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

• Да се прави контрол на информацията, въвеждана от файловете.

Ами аз не исках да ви занимавам с цялата задача и сега я довършвам.

Цялата е малко по-сложна и за това кода е дълъг :

 

• Получава целочислен от 100 елемента и извежда на екрана въведения масив.

• Записва в масив1 на максималното от всеки 5 числа и в масив2 - всички останали числа.

• Да се намери колко пъти се среща цифрата 5 в масив2.

• Програмата да има текстово меню, от което потребителят да избира дали да въвежда масив

или да обработва вече въведен такъв.

• Да се добави възможност за прочитане на масива от файл, посочен от потребителя.

• Да се добави възможност за запис на масива във файл, посочен от потребителя, по 4

числа на ред, разделени едно от друго с празна позиция.

• Определяне на номера на реда, съдържащ максималното нечетно число.

• Да се записва резултатът във файл, посочен от потребителя.

• Да се прави проверка на потребителския вход.

• Да не се позволява да се въвеждат невалидни числа. Да не се дава възможност на

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

• Да се прави контрол на информацията, въвеждана от файловете.

И къде имаш затрудения ?

  • Автор

И къде имаш затрудения ?

Ами някой ако вижда грешки или по-добри варианти да казва.

Кода за сега представлява това :

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <time.h>

#include <string.h>

#define MAX 100

void SHOW_MENU();

void PRIMARY_ARRAY();

void SHOW_PRIMARY_ARRAY(int PRIM_ARR[]);

void SEC_ARRAY();

int PRIM_ARR[MAX];

int SEC_ARR[MAX];

void A_A();

void A_B();

int index;

int five(int n)

{

    int c=0;

    if (n<0) n=-n;

    while (n)

    {

       if (n%10==5) c++;

       n/=10;

    }

    return c;

}

int main ()

{

        while(1)

{

int CHOICE;

SHOW_MENU();

printf("The system is waiting for your choice...");

scanf("%d", &CHOICE);

printf("\n\n");

switch(CHOICE)

{

case 1: PRIMARY_ARRAY(PRIM_ARR); break;

case 2: SHOW_PRIMARY_ARRAY(PRIM_ARR); break;

case 3: SEC_ARRAY(SEC_ARRAY); break;

case 4: A_A();break;

case 5: A_B();break;

default: printf("INCORRECT CHOICE! PLEASE CHOOSE AGAIN!"); break;

}

}

printf("\n");

    system("pause");

    return 0;

}

void SHOW_MENU() //SHOWS THE USER CONTROL MENU

{

printf(" WELCOME TO USER MENU \n");

printf(".....................................\n");

printf("1. Input primary array \n");

printf("2. Show primary array \n");

printf("3. Use the random number generator to fill the Array\n");

printf("4. To read array from file\n");

printf("5. To save array in file\n");

printf("6. TO EXIT PRESS CTRL + C \n");

printf("\n");

printf("\n");

}

void PRIMARY_ARRAY() //INPUTS PRIMARY ARRAY ELEMENTS

{

for(index=0; index<MAX; index++)

{ printf("INPUT MAIN ARRAY ELEMENT [%d] OUT OF 100: ", index+1);

scanf("%d", &PRIM_ARR[index]);

}

}

void SHOW_PRIMARY_ARRAY(int PRIM_ARR[]) //SHOWS PRIMARY ARRAY ELEMENTS

{

    int index;

printf("YOUR PRIMARY ARRAY IS:\n");

for(index=0; index<MAX; index++)

{

    printf("%d\t", PRIM_ARR[index]);

}

printf("\n");

}

void A_A()

{

FILE* pFile=fopen("array.txt","r");

    int i;

  int array3[100];

  {

  for(i=0;i<100;i++)

  fscanf(pFile,"%d",array3+i);

fclose(pFile);

  }

}

void A_B()

{

FILE *p;

scanf("%d", &PRIM_ARR[index]);

fwrite(PRIM_ARR,sizeof(PRIM_ARR),1,p);

fclose(p);

}

void SEC_ARRAY()

{

{

    int array[100], array1[100], array2[100];

    int s1=0, s2=0, mx, c5=0, i, j,k=0;

    printf("Welcome to the program...\n\nThis program is made by Kristian Nalbanotov.\n\n");

    printf("Press any letter or number from the keyboard and then hit 'Enter' to generate array with 100 random numbers\n");

    scanf("%d",&array);

    srand (time(NULL));

    printf("The following random numbers were generated:\n");

    for (i=0; i<100; i++)

    {

       int t=rand()%100;

       printf("%d\t",t);

       array=t;

    }

    printf("\n ARRAY 1: The maximum numbers of every five numbers are:\n");

    for (i=0; i<100; i+=5)

    {

        mx = array;

        for (j=i+1; j<i+5; j++)

            if (array[j]>mx) mx=array[j];

        for (j=i; j<i+5; j++)

            if (array[j]==mx)

                {

                array1[s1++]=mx;

                printf("%d\t",mx);

            }

            else array2[s2++]=array[j];

    }

    

    printf("\n\n ARRAY 2: The numbers which are not in ARRAY 1 are:\n");

    for (i=0; i<s2; i++)

    {

       int t=array2;

       printf("%d\t",t);

       c5+=five(t);

    }   

    printf("\n The number '5' were found %d times in array2. ",c5);

    printf("\n");

}

}

Добре де, компилатор нямаш ли ?


Ако компилатора и линкера не дават грешки, програмата прави ли каквото очакваш ?


Ако програмата не прави каквото очакваш, има дебугери, където можеш да разгледаш изпълнението на кода стъпка по стъпка и да откриеш какво не си направил евентуално както трябва.

Редактирано от Реджеп Иведик (преглед на промените)

  • Автор

Добре де, компилатор нямаш ли ?

Ако компилатора и линкера не дават грешки, програмата прави ли каквото очакваш ?

Ако програмата не прави каквото очакваш, има дебугери, където можеш да разгледаш изпълнението на кода стъпка по стъпка и да откриеш какво не си направил евентуално както трябва.

Ами тръгва, излиза ми менюто и почти всичко работи.

Проблеми има при четене и запис в текстов файл на масивите.

Другото което се опитвам да направя е да вкарам като в SEC_ARR разделяне на 2 масива и броене на числото 5 от 2-рия подмасив в PRIM_ARR

Редактирано от Kristian Nalbantov (преглед на промените)

void A_B()
{
FILE *p;
scanf("%d", &PRIM_ARR[index]);
fwrite(PRIM_ARR,sizeof(PRIM_ARR),1,p);
fclose(p);
}

 

Не виждам къде отваряш файла. Трябва да има нещо като 

 

p = fopen("nanana.txt", "wb");

 

примерно


Или режима на отваряне да е "ab", a ne "wb", в зависимост от това, какво искаш да направиш.


Ние не сме машини. Има дебугери. Като пуснеш кода на дебугера, стъпка по стъпка, сам ще си откриеш грешките.


http://www.cplusplus.com/reference/cstdio/fopen/?kw=fopen

/* fopen example */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("myfile.txt","w");
  if (pFile!=NULL)
  {
    fputs ("fopen example",pFile);
    fclose (pFile);
  }
  return 0;
}

И трябва да отвориш файла във функцията, защото там си декларирал FILE* p. Дори и да си декларирал глобална променлива FILE* p и да си я асоциирал с файл някъде вън от функцията, това е друга променлива, недостъпна по този начин за функцията. По този начин функцията може да достъпи само локалната променлива FILE* p, но тя не е асоциирана с никакъв файл, следователно кодът няма да записва във файл.

Редактирано от Реджеп Иведик (преглед на промените)

  • Автор

И трябва да отвориш файла във функцията, защото там си декларирал FILE* p. Дори и да си декларирал глобална променлива FILE* p и да си я асоциирал с файл някъде вън от функцията, това е друга променлива, недостъпна по този начин за функцията. По този начин функцията може да достъпи само локалната променлива FILE* p, но тя не е асоциирана с никакъв файл, следователно кодът няма да записва във файл.

 

 

Днес намерих този вариант

за отваряне на файл, но като го пусна ми дава error. http://postimg.org/image/p0jkxftr3/

{
   char ch, file_name[25];
   FILE *fp;
   printf("Enter the name of file you wish to see\n");
   gets(file_name);
 
   fp = fopen(file_name,"r"); // read mode
   if( fp == NULL )
   {
      perror("Error while opening the file.\n");
   }
   printf("The contents of %s file are :\n", file_name);
   while( ( ch = fgetc(fp) ) != EOF )
      printf("%c",ch);
   fclose(fp);
}

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

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

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

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

Дарение

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

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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