Отговори на тема  [ 26 мнения ]  Отиди на страница 1, 2  Следваща
Айде да решим една задача 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Айде да решим една задача
Наложи ми се да напиша една програмка на С, ма искам да видя как го правят и професионлистите, после ще постна и моя код, ако имате желание ето задачата:

    1. Имаме едномерен глобален масив от байтове (unsigned char) с 256 елемента.
    а) Да се направи функция която получава като параметър един байт n размера на масива и го
    инициализира с байтовете от 0 до n-1 след което да разпечата съдържанието на масива от 0
    до n-1 елемент:
    Пример: при зададен параметър 3 стойностите на масива трябва да са следните:
    m[0] = 0; m[1] = 1; m[2] = 2;
    a отпечатване трябва да стане във вида:
    m[0] = 0
    m[1] = 1
    m[2] = 2
    б) Да се направи функция която получава като параметър един байт размера на масива и
    разменя стойностите на елементите на масива по двойки симетрично около центъра. Масива
    трябва преди това да е инициализиран с помощта на функцията описана по-горе със същата
    или по-голяма стойност на параметъра. Инициализацията е с цел по-лесна проверка на
    резултата. Ако броя байтове е нечетен (т.е. остава един елемент в центъра) този елемент
    трябва да стане 255. Да се разпечата съдържанието на масива от 0 до n-1 елемент.
    Пример:
    при зададен параметър 3 и начални стойности на масива m[0] = 0; m[1] = 1; m[2] = 2;
    резултата трябва да е m[0] = 2; m[1] = 255; m[2] = 0;
    при зададен параметър 4 и начални стойности на масива m[0] = 0; m[1] = 1; m[2] = 2; m[3] =
    3; резултата трябва да е m[0] = 3; m[1] = 2; m[2] = 1; m[3] = 0;


Чет Май 24, 2007 8:39 pm
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пон Юли 04, 2005 11:51 pm
Мнения: 651
Местоположение: София
Мнение 
Код:
void func1(unsigned char n) {
int i;
for(i=0;i<n;i++) {m[i]=i; printf("m[%i] = %i\n",i, m[i]);}
}


Код:
void func2(unsigned char n) {
int i,j
for(i=1;i<=n;i++) {j=m[n-i]; m[n-i]=m[i-1]; m[i-1]=j;}
if(n^1) m[n/2] = 255;
for(i=0;i<n;i++) printf("m[%i] = %i\n",i, m[i]);
}

_________________
От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?


Последна промяна BrainStorm на Пет Май 25, 2007 3:25 pm, променена общо 1 път



Чет Май 24, 2007 9:17 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
BrainStorm написа:
Код:
void func1(unsigned char n) {
int i;
for(i=0;i<n;i++) {m[i]=i; printf("m[%i] = %i\n",i, m[i]);}
}


Код:
void func2(unsigned char n) {
int i,j
for(i=1;i<=n;i++) {j=m[n-i]; m[n-i]=m[i-1]; m[i-1]=j;}
if(n^1) m[n%2] = 255;
for(i=0;i<n;i++) printf("m[%i] = %i\n",i, m[i]);
}


ще се изненадаш - ама func2:
- няма да размества каквото и да е :)
- при нечетно n - ще прави m[1] = 255 :)
:)


Пет Май 25, 2007 8:26 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Ето го моя код:

Код:
#include <stdio.h>
#include <conio.h>

unsigned char m[256], n, i;
unsigned int   x;

void init_array(unsigned char n);
void init_array1(unsigned char n);
void print_array(unsigned char n);
void print_array1(unsigned char n);
void invert_array(unsigned char n);
void invert_array1(unsigned char n);

void main() {
  do {
    printf("Enter N = "); scanf("%d", &x);
  }
  while ((x == 0) || (x > 256));
  n = (char)(x-1);
  init_array(n);
  //init_array1(n);
  print_array(n);
  //print_array1(n);
  //invert_array(n);
  invert_array1(n);
  print_array(n);

  printf("\n\nPress any key to end..."); x = getch();
}

void init_array(unsigned char n) {
  for (i = 0;;i++){
    m[i] = i;
    if (i == n) break;
  }
}

void init_array1(unsigned char n) {
  while(1) {
    m[n] = n;
    if (n == 0) break;
    n--;
  }
}

void print_array(unsigned char n) {
  printf("\n---------------------------------");
  for (i = 0;;i++){
    printf("\nm[%d] = %d", i, m[i]);
    if (i == n) {
      printf("\n---------------------------------\n");
      break;
    }
  }
}

void print_array1(unsigned char n) {
  printf("\n---------------------------------");
  do {
    printf("\nm[%d] = %d", n, m[n]);
    if (n == 0) {
      printf("\n---------------------------------\n");
      break;
    }
    n--;
  }
  while(1);
}

void invert_array(unsigned char n) {
unsigned char temp;
  for (i = 0; i <= n/2; i++) {
    temp = m[i];
    m[i] = m[n - i];
    m[n - i] = temp;
  }
  temp = n/2;
  if ((n - temp) == temp) {
      m[temp] = 255;
    }
}

void invert_array1(unsigned char n) {
unsigned char temp;
  for (i = 0; i <= n/2; i++) {
    temp = m[i];
    m[i] = m[n - i];
    m[n - i] = temp;
  }
  temp = n/2;
  if (!(n & 0x01)) {
      m[temp] = 255;
    }
}


Доколкото аз разбрах условието, целта е кодът да е максимално бърз и да се използват колкото може по - малко променливи. Незнам дали съм се справил добре, не познавам добре С, така че очаквам мнения.


Пет Май 25, 2007 11:42 am
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
в кода:
for (i = 0; i <= n/2; i++) {
temp = m[i];
m[i] = m[n - i];
m[n - i] = temp;
}

правиш една доста често срещана грешка при C програмистите :)

провери какво става при i=0
разменяш m[0] и m[n] а масива ти има m[n-1] размерност

по-добре инзолзвай кода на @BrainStorm като му оправиш грешките разбира се (n/2)
или
for (i = 0; i <= n/2; i++) {
temp = m[i];
m[i] = m[n - i-1];
m[n - i-1] = temp;
}

ако търсиш бързина ... може би следния код ще е по-бърз :)
int n2 = n/2;
for (i = 0; i <= n2; i++)
...

обаче с това:
temp = n/2;
if ((n - temp) == temp) {
m[temp] = 255;
}
направо ... изтрепваш рибата ... :)
много оригинален начин за проверка на четно число :)

ето няколко по-тривиални решения за "дали n е нечетно"
if (n&1) // побитово & ... ако младшия бит е 1 - нечетно ... просто и ясно :)
if (n%2) // остатък от делене на 2 ...

:)

i


Пет Май 25, 2007 12:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Цитат:
обаче с това:
temp = n/2;
if ((n - temp) == temp) {
m[temp] = 255;
}
направо ... изтрепваш рибата ... Smile


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




Цитат:
в кода:
for (i = 0; i <= n/2; i++) {
temp = m[i];
m[i] = m[n - i];
m[n - i] = temp;
}

правиш една доста често срещана грешка при C програмистите Smile

провери какво става при i=0
разменяш m[0] и m[n] а масива ти има m[n-1] размерност


е ама не гледате кода, аз n още като го подавам е -1, щото ако подам 256, тва е вече 2 байта, а условието е да се подава един байт, или греша нещо, но програмата работи правилно...
то сега се сещам че може вместо 256 може да подавам 0 щот тя не се ползва, ама върху такива задачи не се замислям докато пиша, щот в тоя вид няма реално приложение


Пет Май 25, 2007 2:13 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
relsys написа:
...е ама не гледате кода, аз n още като го подавам е -1, щото ако подам 256, тва е вече 2 байта, а условието е да се подава един байт, или греша нещо, но програмата работи правилно...
то сега се сещам че може вместо 256 може да подавам 0 щот тя не се ползва, ама върху такива задачи не се замислям докато пиша, щот в тоя вид няма реално приложение


В грешка си ... ама виждам че не приемаш съвети ... така че успех !


Пет Май 25, 2007 2:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Още едно предложение за втората функция:

Код:
void rearrange_array(unsigned char n)
{   unsigned char x = 0;
    unsigned char buf;

    if(n%2)
    {   array[(n-1)/2] = 255;
    {   x++;
     
    for (i=0; i<(n-x)/2; i++)
    {   buf = array[(n+x)/2 + i];
        array[(n+x)/2 + i] = array[(n+x)/2 - i - 1 - x]
        array[(n+x)/2 - i - 1 - x] = buf;
    }
}


Пет Май 25, 2007 2:51 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
ps66 написа:
relsys написа:
...е ама не гледате кода, аз n още като го подавам е -1, щото ако подам 256, тва е вече 2 байта, а условието е да се подава един байт, или греша нещо, но програмата работи правилно...
то сега се сещам че може вместо 256 може да подавам 0 щот тя не се ползва, ама върху такива задачи не се замислям докато пиша, щот в тоя вид няма реално приложение


В грешка си ... ама виждам че не приемаш съвети ... така че успех !


Размерността на масива е от 1 до 256, n съответно е от 0 до 255, така че при 256 елемента и i=0 се разменят m[0] i m[n-0], което e m[255]. Къде бъркам?


Пет Май 25, 2007 3:11 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
relsys написа:
....

Размерността на масива е от 1 до 256, n съответно е от 0 до 255, така че при 256 елемента и i=0 се разменят m[0] i m[n-0], което e m[255]. Къде бъркам?


Боже, Боже! [-o<

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


Пет Май 25, 2007 3:41 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
bateAz написа:
relsys написа:
....

Размерността на масива е от 1 до 256, n съответно е от 0 до 255, така че при 256 елемента и i=0 се разменят m[0] i m[n-0], което e m[255]. Къде бъркам?


Боже, Боже! [-o<

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


мда, явно няма да се разберем, няма смисъл от безсмислени спорове, само един последен въпрос:
Програмата работи ли?


Пет Май 25, 2007 4:21 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: Айде да решим една задача
Абе човек ... ето ти цитат от собственното задание:
relsys написа:
...
а) Да се направи функция която получава като параметър един байт n размера на масива и го
инициализира с байтовете от 0 до n-1 след което да разпечата съдържанието на масива от 0
до n-1 елемент:
Пример: при зададен параметър 3 стойностите на масива трябва да са следните:
m[0] = 0; m[1] = 1; m[2] = 2;
a отпечатване трябва да стане във вида:
m[0] = 0
m[1] = 1
m[2] = 2
...


кода ти е верен ... само тоя дето ще ползва процедурата ти , се сети да я викне с n=n-1 (n = x-1)!

това е най-лошия начин на писане на какъвто и да е език!


Пет Май 25, 2007 4:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Ми който не иска да слуша няма смисъл да му се обяснява.
А относно коментара за честата грешка на С програмистите ... може би е по точно да с екаже на начинаещите С програмисти ;)


Пет Май 25, 2007 5:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
ToHu написа:
Ми който не иска да слуша няма смисъл да му се обяснява.
А относно коментара за честата грешка на С програмистите ... може би е по точно да с екаже на начинаещите С програмисти ;)


e ... освен "начинаещи" ....може да се добави и "напреднали, но преминаващи от паскал/басик на C" :)


Пет Май 25, 2007 5:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Да де, начинаещи със С-то имах в предвид


Пет Май 25, 2007 5:43 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 26 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни