Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Айде да решим една задача
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=4231
Страница 1 от 2

Автор:  relsys [ Чет Май 24, 2007 8:39 pm ]
Заглавие:  Айде да решим една задача

Наложи ми се да напиша една програмка на С, ма искам да видя как го правят и професионлистите, после ще постна и моя код, ако имате желание ето задачата:

    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;

Автор:  BrainStorm [ Чет Май 24, 2007 9:17 pm ]
Заглавие: 

Код:
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]);
}

Автор:  ps66 [ Пет Май 25, 2007 8:26 am ]
Заглавие: 

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 :)
:)

Автор:  relsys [ Пет Май 25, 2007 11:42 am ]
Заглавие: 

Ето го моя код:

Код:
#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;
    }
}


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

Автор:  ps66 [ Пет Май 25, 2007 12:03 pm ]
Заглавие: 

в кода:
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

Автор:  relsys [ Пет Май 25, 2007 2:13 pm ]
Заглавие: 

Цитат:
обаче с това:
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 щот тя не се ползва, ама върху такива задачи не се замислям докато пиша, щот в тоя вид няма реално приложение

Автор:  ps66 [ Пет Май 25, 2007 2:38 pm ]
Заглавие: 

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


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

Автор:  HCL [ Пет Май 25, 2007 2:51 pm ]
Заглавие: 

Още едно предложение за втората функция:

Код:
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;
    }
}

Автор:  relsys [ Пет Май 25, 2007 3:11 pm ]
Заглавие: 

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]. Къде бъркам?

Автор:  bateAz [ Пет Май 25, 2007 3:41 pm ]
Заглавие: 

relsys написа:
....

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


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

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

Автор:  relsys [ Пет Май 25, 2007 4:21 pm ]
Заглавие: 

bateAz написа:
relsys написа:
....

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


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

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


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

Автор:  ps66 [ Пет Май 25, 2007 4:56 pm ]
Заглавие:  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)!

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

Автор:  ToHu [ Пет Май 25, 2007 5:04 pm ]
Заглавие: 

Ми който не иска да слуша няма смисъл да му се обяснява.
А относно коментара за честата грешка на С програмистите ... може би е по точно да с екаже на начинаещите С програмисти ;)

Автор:  ps66 [ Пет Май 25, 2007 5:13 pm ]
Заглавие: 

ToHu написа:
Ми който не иска да слуша няма смисъл да му се обяснява.
А относно коментара за честата грешка на С програмистите ... може би е по точно да с екаже на начинаещите С програмисти ;)


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

Автор:  ToHu [ Пет Май 25, 2007 5:43 pm ]
Заглавие: 

Да де, начинаещи със С-то имах в предвид

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/