Страницы

Translate

суббота, 10 августа 2013 г.

Упражнение 3.2. Напишите функцию escape(s, t), которая при копировании текста из t в s преобразует такие символы, как новая строка и табуляция в "видимые последовательности символов" (вроде \n и \t).

Упражнение 3.2. Напишите функцию escape(s, t), которая при копировании текста из t в s преобразует такие символы, как новая строка и табуляция в "видимые последовательности символов" (вроде \n и \t). Используйте инструкцию switch. Напишите функцию, выполняющую обратное преобразование эскейп- последовательностей в настоящие символы.

#include <stdio.h>
#define LEN 200

void escape(char s[], char t[]);
void reescape(char t2[], char s[]);

int main()
{
    char t[LEN], s[LEN], t2[LEN];
    int c, i;
    
    i = 0;
    while((c=getchar()) != EOF)
    {
        t[i] = c;
        i++;
    }
    t[i] = '\0';
    printf("\n");
    escape(s, t);
    reescape(t2, s);
    printf("%s", s);
    printf("\n\n");
    printf("%s", t2);
    printf("\n");
    return 0;
}

/*escape*/
void escape(char s[], char t[])
{
    int i, j;
    i = j = 0;
    
    while(t[i] != '\0')
    {
        switch (t[i])
        {
            case '\t':
                s[j++] = '\\';
                s[j++] = 't';
                i++;
                break;
            case '\n':
                s[j++] = '\\';
                s[j++] = 'n';
                i++;
                break;
            default:
                s[j++] = t[i++];
                break;
        }
    }
    s[j] = '\0';
}

/*reescape*/
void reescape(char t2[], char s[])
{
    int i, j;
    
    i = j = 0;
    while(s[i] != '\0')
    {
        if(s[i] == '\\')
        {
            switch (s[++i])
            {
                case 'n':
                    t2[j++] = '\n';
                    i++;
                    break;
                case 't':
                    t2[j++] = '\t';
                    i++;
                    break;
                default:
                    t2[j++] = s[i++];
                    break;
            }
        }
        else
            t2[j++] = s[i++];
    }
    t2[j] = '\0';
}

Результат:


вторник, 6 августа 2013 г.

Упражнение 3.1.Напишите программу binsearch(), предусмотрев в ней одну проверку внутри цикла.

Упражнение 3.1. В нашей программе бинарного поиска внутри цикла осуществляются две проверки, хотя могла быть только одна (при увеличении числа проверок вне цикла). Напишите программу, предусмотрев в ней одну проверку внутри цикла. Оцените разницу во времени выполнения.

#include <stdio.h>


int binsearch(int x, int v[], int n);

int main()
{
    int x;
    
    x = 8;
    int v[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    printf("%d\n", binsearch(x, v, 10));
    return 0;
}
    

/*binsearch()*/
int binsearch(int x, int v[], int n)
{
    int low, high, mid;
    
    low = 0;
    high = n - 1;
    mid = (low+high)/2;
    while(low<=high && x != v[mid])
    {
        if(x < v[mid])
            high = mid - 1;
        else if(x > v[mid])
            low = mid + 1;
        mid = (low + high)/2;
    }
    if(x==v[mid])//совпадение найдено
        return mid;
    else
        return -1;//нет совпадений
}

Результат:




понедельник, 5 августа 2013 г.

Упражнение 2.10. Напишите функцию lower.

Упражнение 2.10. Напишите функцию lower, которая переводит большие буквы в малые, используя условное выражение (а не конструкцию if-else).

#include <stdio.h>

int lower(int c);

int main()
{
    int c;
    
    while((c=getchar()) != EOF)
        putchar(lower(c));
    return 0;
}

/*lower*/
int lower(int c)
{
    (c>='A' && c<='Z')? c = c + 'a' - 'A' : c;
    return c;
}



Упражнение 2.9. Вариант функции bitcount(x)

Упражнение 2.9. Применительно к числам, в представлении которых использован дополнительный код, выражение х &= (х-1) уничтожает самую правую 1 в х. Объясните, почему. Используйте это наблюдение при написании более быстрого варианта функции bitcount.

У самого правого единичного значения х есть соответствующее нулевое значение в (х-1), а битовая операция & переводит 1 в ноль, если соответствующий бит равен нулю.

#include <stdio.h>
#include "viewbin.h"

int bitcount(unsigned x);

int main()
{
    int x;
    
    printf("Enter the number\nx: ");
    scanf("%d", &x);
    bin(x);
    printf("%d\n", bitcount(x));
    return 0;
}

int bitcount(unsigned x)
{
    int b;
    
    for(b = 0; x != 0; b++)
        x &=(x-1);
    return b;
}

Результат:


суббота, 3 августа 2013 г.

Упражнение 2.8. Напишите функцию rightrot(х, n), которая циклически сдвигает x вправо на n разрядов.

Упражнение 2.8. Напишите функцию rightrot(х, n), которая циклически сдвигает x вправо на n
разрядов.

В этом задании я покажу два варианта решения и здесь я использую для отображения десятичных чисел в двоичном виде свой заголовочный файл.

Первый вариант.

#include <stdio.h>
#include "viewbin.h"

unsigned rightrot(unsigned x, int n);
int countbits(unsigned x);

int main()
{
    unsigned int x;
    int n;
    
    printf("Enter the number:\nx: ");
    scanf("%d", &x);
    bin(x);//преобразуем в двоичный вид
    printf("n: ");
    scanf("%d", &n);
    printf("\n%d\n", rightrot(x, n));
    bin(rightrot(x, n));
    return 0;
}

/*считаем количество занятых битов*/
int countbits(unsigned x)
{
    int count;
    for(count=1; x>=2; count++)
        x/=2;
    return count;
}


/*rightrot*/
unsigned  rightrot(unsigned x, int n)
{
    int rotbits, bitscount;
    bitscount = (countbits(x)-1);
    while(n--)
    {
        rotbits= x & 1;//запоминаем самый младшый бит
        x = x>>1;//сдвигаем ч на позицию вправо
        x = x | (rotbits<<bitscount);//ставим младший бит 
                                        //на место старшего
    }
    return x;
}

Результат:












Второй вариант:

#include <stdio.h>

unsigned int rightrot(unsigned int x, int n);
int countbits(unsigned x);

int main()
{
    unsigned int x;
    int n;
    
    printf("Enter the number:\nx: ");
    scanf("%d", &x);
    printf("n: ");
    scanf("%d", &n);
    printf("%d\n", rightrot(x, n));
    return 0;
}

/*считаем количество занятых битов*/
int countbits(unsigned x)
{
    int count;
    for(count=1; x>=2; count++)
        x/=2;
    return count;
}

/*rightrot(x, n)*/
unsigned  int rightrot(unsigned int x, int n)
{
    int bit, i;
    i = countbits(x);
    if(n>i)
        n %=i;
    bit = (x&((~((~0>>n)<<n))))<<(countbits(x)-n);//запоминаем n бит
    return (x>>n)|bit;
    
}

Результат:


Упражнение 2.7. Напишите функцию invert(х, р, n), возвращающую значение x с инвертированными n битами,

Упражнение 2.7. Напишите функцию invert(х, р, n), возвращающую значение x с инвертированными n битами, начиная с позиции p (остальные биты не изменяются).


#include <stdio.h>

unsigned invert(unsigned int x, int p, int n);

int main()
{
    unsigned int x;
    int p, n;
    
    printf("Enter the number:\nx: ");
    scanf("%d", &x);
    printf("p: ");
    scanf("%d", &p);
    printf("n: ");
    scanf("%d", &n);
    printf("%d\n", invert(x, p, n));
    return 0;
}

/*invert(x, p, n)*/
unsigned invert(unsigned int x, int p, int n)
{
    return x ^ (~(~0<<n)<<(p+1-n));
}

Результат:


Упражнение 2.6. Напишите функцию setbits(x, p, n, y), возвращающую значение x.

Упражнение 2.6. Напишите функцию setbits(x, p, n, y), возвращающую значение x, в котором n битов, начиная с p-й позиции, заменены на n правых разрядов из y (остальные биты не изменяются).


#include <stdio.h>

unsigned setbits(unsigned int x, int p, int n, unsigned int y);
void bin(unsigned int n);//просмотр десятичных чисел в двоичном виде

int main()
{
    unsigned int x, y;
    int p, n;
    
    printf("Enter the numbers\nx: ");
    scanf("%d", &x);
    bin(x);
    printf("\n");
    printf("p: ");
    scanf("%d", &p);
    printf("n: ");
    scanf("%d", &n);
    printf("y: ");
    scanf("%d", &y);
    bin(y);
    printf("\n");
    x = setbits(x, p, n, y);
    printf("%d\n", x);
    bin(x);
    return 0;
}

/*setbits(x, p, n, y)*/

unsigned setbits(unsigned int x, int p, int n, unsigned int y)
{
    return (x & ~(~(~0<<n)<<(p+1-n))) | ((y&~(~0<<n))<<(p+1-n));
}

void bin(unsigned int n) //
{
    int m, c, i, count, j;
    c = i = n;
    for(count = 0; n>=2; count++)
        n = n/2;
    m = count + 1;
    unsigned int x[m];
    while (i>=2)
    {
        i = i/2;
        c = c%2;
        x[count] = c;
        c=i;
        count--;
    }
    x[0] = i;
    for(j=0; j<=((sizeof(x)/4) - 1); j++)
        printf("%d", x[j]);
}


Результат: