Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Интересные и занимательные задачи по программированию > [C++] Работа с массивами, целыми, без WinAPI


Автор: sOckets 20.9.2006, 17:44
Привет , и так я хочю чтоб в этой теме все кто хочет подкидывали задачки на "С++" , чтоб именно "С++" без WinAPI и тд , просто хочю поднатянуть матчасть...ну там работа с массивами,целыми и тд. У кого есть задачки очень прошу их сюда скидывать, только по подробней обьясняйте smile
И ещё если у когото там в учебных заведениях задачки дают , тоже кидайте сюда.
Жду

Автор: sergejzr 20.9.2006, 17:48
Для домашних заданий, курсовых, существует "Центр Помощи"

Тема перенесена! 

Автор: sergejzr 20.9.2006, 18:06
Напишите пожалуйста программу, которая считает количество дней между двумя датами (обе включительно). Даты передаются с коммандной строки в формате год.месяц.день пример:

a.exe --date_from 1990.12.10 --date_to 2005.01.01

В случае неправильного ввода выводится обьясняющая информация и возвращается 1, иначе выводится количество дней и возвращается 0.

Автор: sOckets 20.9.2006, 18:07
sergejzr, Ок ,спасибо , я действительно мешкался и не знал где создать тему

Добавлено @ 18:08 
Цитата
Напишите пожалуйста программу, которая считает количество дней между двумя датами (обе включительно). Даты передаются с коммандной строки в формате год.месяц.день пример:

a.exe --date_from 1990.12.10 --date_to 2005.01.01

В случае неправильного ввода выводится обьясняющая информация и возвращается 1, иначе выводится количество дней и возвращается 0.


решаем....

Автор: sOckets 20.9.2006, 18:50
ужасно :'( я не знаю решения smile позор , пол часа искал как можно работать с датой в "С++" ...ничего не нашёл smile 

sergejzr, пожалуйста , если не трудно хоть подскажите куда копать и что инклюдить smile

Автор: Sartorius 20.9.2006, 19:01
 Инклудить ничего не дада. Возьми сам разбей переданные строки на год, месяц и день... а дальше сам smile 
 Если будет желание , можешь еще вот над чем подумать

Отсортировать последовательность байтов(файл) произвольной длинны за время O(n)

Автор: sOckets 20.9.2006, 19:12
Цитата
Отсортировать последовательность байтов(файл) произвольной длинны за время O(n)

извиняюсь , по подробней можно ?  smile 

Автор: 586 20.9.2006, 21:07
Цитата(sergejzr @  20.9.2006,  19:06 Найти цитируемый пост)
Напишите пожалуйста программу, которая считает количество дней между двумя датами (обе включительно). Даты передаются с коммандной строки в формате год.месяц.день пример:

a.exe --date_from 1990.12.10 --date_to 2005.01.01

В случае неправильного ввода выводится обьясняющая информация и возвращается 1, иначе выводится количество дней и возвращается 0. 


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

BYTE mm[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int __cdecl main(int argc, char** argv)
{
    int a=0, b=0;
    for(int i=1; i<argc; i++)
    {
        if(!strcmp(argv[i], "--date_from"))
        {
            i++; a=i;
            if(i<argc) continue; 
            else goto err;
        }
        if(!strcmp(argv[i], "--date_to"))
        {
            i++; b=i;
            if(i<argc) continue;
            else goto err;
        }
    }
    if(!a || !b)
    {
err:
        printf("Bad command line\n");
        return 1;
    }
    int y, m, d, y1, m1, d1, n;
    if(sscanf(argv[a], "%d.%d.%d", &y, &m, &d)!=3 ||
        sscanf(argv[b], "%d.%d.%d", &y1, &m1, &d1)!=3)
    {
err1:
        printf("Bad time format\n");
        return 1;
    }
    m--; m1--;
    if(m<0 || m>11 || y<0 || d<1 || m1<0 || m1>11 || y1<0 || d1<1) goto err1;
    if(d>mm[m] || d1>mm[m1]) goto err1;
    n=(y1-y)*365;
    n+=(y1-y)/4;
    if(!(y%4) || !(y1%4)) n++;
    i=m;
    if(m!=m1) while(1)
    {
        if(i==11) i=0;
        if(i==m1-1) break;
        n+=mm[i];
        i++;
    }
    if(m==m1)
        n+=d1-d;
    else {
        n+=mm[m]-d;
        n+=d1;
    }
    printf("=== %d\n", n);
    getch();

    return 0;
}

Автор: Rockie 20.9.2006, 21:32
и високосный год  smile 

Автор: 586 20.9.2006, 21:34
Цитата(Rockie @  20.9.2006,  22:32 Найти цитируемый пост)
и високосный год

строка 43, 44.  smile 

Цитата
Напишите пожалуйста программу, которая считает количество дней между двумя датами (обе включительно).

Это я не учёл. Тогда в конце расчетов нужно сделать инкремент n.

Автор: 586 20.9.2006, 21:49
Код
#include <stdio.h>
#include <windows.h>
#include <conio.h>

BYTE mm[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int __cdecl main(int argc, char** argv)
{
    int a=0, b=0;
    for(int i=1; i<argc; i++)
    {
        if(!strcmp(argv[i], "--date_from"))
        {
            i++; a=i;
            if(i<argc) continue; 
            else goto err;
        }
        if(!strcmp(argv[i], "--date_to"))
        {
            i++; b=i;
            if(i<argc) continue;
            else goto err;
        }
    }
    if(!a || !b)
    {
err:
        printf("Bad command line\n");
        return 1;
    }
    int y, m, d, y1, m1, d1, n;
    if(sscanf(argv[a], "%d.%d.%d", &y, &m, &d)!=3 ||
        sscanf(argv[b], "%d.%d.%d", &y1, &m1, &d1)!=3)
    {
err1:
        printf("Bad time format\n");
        return 1;
    }
    m--; m1--;
    if(m<0 || m>11 || y<0 || d<1 || m1<0 || m1>11 || y1<0 || d1<1) goto err1;
    if(d>mm[m] || d1>mm[m1]) goto err1;
    n=(y1-y)*365;
    n+=(y1-y)/4;
    if(!(y%4) || !(y1%4)) n++;
    i=m+1;
    if(m!=m1) while(1)
    {
        if(i>=11) i=0;
        if(i==m1) break;
        n+=mm[i];
        i++;
    }
    if(m==m1)
        n+=d1-d;
    else {
        n+=mm[m]-d;
        n+=d1;
    }
    n++;
    printf("=== %d\n", n);
    return 0;
}

Автор: Sartorius 20.9.2006, 22:08
Ну пусть с goto smile  
Вот 44-я строка : считаем разницу между 1999 и 2001 - есть один високосный , а не 43 - я не 44 - я строки не сработают. smile 
 

Автор: vinter 20.9.2006, 22:28
Цитата

Ну пусть с goto

непорядок ИМХО

Автор: 586 20.9.2006, 22:37
Цитата(vinter @  20.9.2006,  23:28 Найти цитируемый пост)
Цитата
Ну пусть с goto

непорядок ИМХО 

Просто сократил размер кода.
Цитата(Sartorius @  20.9.2006,  23:08 Найти цитируемый пост)
Вот 44-я строка : считаем разницу между 1999 и 2001 - есть один високосный , а не 43 - я не 44 - я строки не сработают

Я чего-нибудь придумаю. Создавать цикл нехочу.

Автор: Sartorius 20.9.2006, 22:50
 586, да на самом деле ИМХО проще считать количество дней до текущего от 0.0.0000 все проблемы отпадут
Ну а потом просто разность между двумя такими "абсолютными" датами smile 

Автор: 586 20.9.2006, 23:07
Цитата
да на самом деле ИМХО проще считать количество дней до текущего от 0.0.0000 все проблемы отпадут
Ну а потом просто разность между двумя такими "абсолютными" датами

а смысл? все равно надо определить количество весокосных годов. может я тебя неправильно понял...
вообщем не знаю. где-то в коде ошибки.

Автор: Sartorius 20.9.2006, 23:30
 Смысл такой : [кол-во дней от рождества христова] = год * 365 + год / 4 + [количество дней в прошедших месяцах] + [число];
 потом считаем разницу и все

Автор: Rockie 21.9.2006, 00:06
sergejzr,  5136? =)
Вариант для билдера. Юзает TDateTime и считает високосные. Правда предварительно нужно дату к другому формату привести.
Код
#include<vcl>
#include<iostream>
#include<algorithm>
#include<string>

using namespace std;

string FormatTimeToNormal(string str)    // "1994.05.03" -->  "03.05.1994"
{
   reverse(str.begin(),str.end());
   reverse(str.begin(),str.begin()+2);
   reverse(str.begin()+3,str.begin()+5);
   reverse(str.begin()+6,str.end());
   return str;
}


int main(int argc, char* argv[]){

 if(argc!=5) {cout<<"possibly error input"; return 0; }
 string str1 = argv[2];
 string str2 = argv[4];

 // make normal time and convert to TDateTime
 TDateTime first_date = StrToDateTime( FormatTimeToNormal(str1).c_str() );
 TDateTime next_date = StrToDateTime( FormatTimeToNormal(str2).c_str() );

 int difference = next_date - first_date;   // count difference

 if(difference<0) {cout<<"possibly error input"; return 0; }
 cout<<difference<<'\n';

 system("pause");
 return 0;
}


Цитата(sergejzr @  20.9.2006,  18:06 Найти цитируемый пост)
 (обе включительно)

Опа, тоже по ТЗ не отработал =)
sergejzr, а зачем? если будет "2006.09.21" и "2006.09.21", то получится разница в день

Автор: SkaZka 21.9.2006, 09:50
Привет!На вас последняя надежда. Програмка большая... нужна программа для биометрической аутентификации , например по отпечатку пальца. Может хотя бы подскажите где такую скачать можно? smile 
Нужно разработать целый сервер, начиная со сканирования, до подтверждения идентификатора.

Автор: sergejzr 21.9.2006, 12:37
SkaZka, создавай отдельную тему (сперва почитай правила)

Цитата(Rockie @  20.9.2006,  22:06 Найти цитируемый пост)
sergejzr, а зачем? если будет "2006.09.21" и "2006.09.21", то получится разница в день

Всё верно. С 00:00 первой даты и до 23:59 второй даты.

Вообще вроде как библиотеками специальными не пользуемся.. Чистый С++. (StrToDateTime как раз учитывает многое при переводе дат.)

Автор: Dov 19.10.2006, 21:02
А с какого момента ведём отсчёт:
1. Сотворения Мира
2. Рождества Христова
3. Принятия Григорианского Календаря
4. Великой Октябрьской Социалистической Революции и т.д. ...
...

Автор: Rockie 19.10.2006, 23:11
Dov,  smile 
начальный момент задается, на предыдущей странице задание.

Автор: Dov 19.10.2006, 23:19
Rockie  smile  smile 
Я имею ввиду, с какого момента начальная дата считается валидной  smile 

Автор: Baltazar5000 6.3.2007, 21:15
Что будет выведено на экран после исполнения фрагмента программы
1)
int ss[3][3] = { {2, 0, 4}, {4, 0, 0}, {3, 3, 3} };
int s = 0, i, j;
for(i = 0; i < 3; i++)
    for(j = 0; j < 3; j++)
        s += ss[i][j];
printf("%d ", s);

2)
int ss[3][3] = { {2, 3, 1}, {2, 0, 0}, {0, 2, 2} };
int s = 1, i, j;
for(i = 0; i < 3; i++)
    for(j = 0; j < 3; j++)
        if(ss[i][j] > 0)
            s *= ss[i][j];
printf("%d ", s);

3)
int ss[3][3] = { {3, 7, 0}, {8, 5, 0}, {0, 7, 3} };
int s = 0, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i == j)
            s += ss[i][j];
}
printf("%d ", s);

4)
int ss[3][3] = { {2, 3, 4}, {2, 3, 2}, {1, 6, 5} };
int s = 1, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i == j)
            s *= ss[i][j];
}
printf("%d ", s);

5)
int ss[3][3] = { {2, 3, 7}, {6, 2, 5}, {6, 8, 1} };
int s = 1, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i + j == 2)
            s *= ss[i][j];
}
printf("%d ", s);

6)
int ss[3][3] = { {17, 0, 16}, {1, 5, 2}, {6, 13, 17} };
int s = 0, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i + j == 2)
            s += ss[i][j];
}
printf("%d ", s);

7)
int ss[3][3] = { {1, 3, 1}, {2, 3, 2}, {4, 3, 1} };
int s = 0, i, j;
for(i = 0; i < 3; i++)
    for(j = 0; j < 3; j++)
        s += ss[i][j];
printf("%d ", s);

8)
int ss[3][3] = { {0, 3, 1}, {3, 3, 0}, {2, 3, 1} };
int s = 1, i, j;
for(i = 0; i < 3; i++)
    for(j = 0; j < 3; j++)
        if(ss[i][j] > 0)
            s *= ss[i][j];
printf("%d ", s);

9)
int ss[3][3] = { {1, 2, 4}, {6, 2, 7}, {1, 0, 6} };
int s = 0, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i == j)
            s += ss[i][j];
}
printf("%d ", s);

10)
int ss[3][3] = { {3, 7, 5}, {4, 7, 3}, {3, 1, 6} };
int s = 1, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i == j)
            s *= ss[i][j];
}
printf("%d ", s);

11)
int ss[3][3] = { {0, 0, 6}, {3, 2, 5}, {8, 4, 7} };
int s = 1, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i + j == 2)
            s *= ss[i][j];
}
printf("%d ", s);

12)
int ss[3][3] = { {13, 4, 8}, {17, 13, 10}, {2, 13, 9} };
int s = 0, i, j;
for(i = 0; i < 3; i++)
{    for(j = 0; j < 3; j++)
        if (i + j == 2)
            s += ss[i][j];
}
printf("%d ", s);

13)
int ss[3][3] = { {4, 6, 7}, {6, 8, 8}, {9, 4, 7} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 0;
    for(j = 0; j < 3; j++)
        s += ss[i][j];
    printf("%d ", s);
}

14)
int ss[3][3] = { {7, 1, 7}, {7, 2, 7}, {3, 7, 5} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 1;
    for(j = 0; j < 3; j++)
        s *= ss[i][j];
    printf("%d ", s);
}

15)
int ss[3][3] = { {0, 3, 5}, {1, 1, 5}, {2, 5, 1} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 1;
    for(j = 0; j < 3; j++)
        s *= ss[j][i];
    printf("%d ", s);
}

16)
int ss[3][3] = { {7, 6, 13}, {3, 3, 10}, {14, 7, 3} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 0;
    for(j = 0; j < 3; j++)
        s += ss[j][i];
    printf("%d ", s);
}

17)
int ss[3][3] = { {23, 27, 39}, {8, 36, 12}, {22, 3, 22} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[i][0];
    for(j = 0; j < 3; j++)
        if(ss[i][j] < s)
            s = ss[i][j];
    printf("%d ", s);
}

18)
int ss[3][3] = { {33, 40, 39}, {12, 21, 45}, {12, 37, 9} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[0][i];
    for(j = 0; j < 3; j++)
        if(ss[j][i] < s)
            s = ss[j][i];
    printf("%d ", s);
}

19)
int ss[3][3] = { {14, 13, 50}, {18, 39, 43}, {3, 40, 45} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[i][0];
    for(j = 0; j < 3; j++)
        if(ss[i][j] > s)
            s = ss[i][j];
    printf("%d ", s);
}

20)
int ss[3][3] = { {52, 23, 54}, {32, 49, 8}, {7, 17, 44} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[0][i];
    for(j = 0; j < 3; j++)
        if(ss[j][i] > s)
            s = ss[j][i];
    printf("%d ", s);
}

21)
int ss[3][3] = { {6, 6, 3}, {6, 8, 7}, {9, 7, 2} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 0;
    for(j = 0; j < 3; j++)
        s += ss[i][j];
    printf("%d ", s);
}

22)
int ss[3][3] = { {6, 1, 4}, {1, 3, 6}, {4, 0, 5} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 1;
    for(j = 0; j < 3; j++)
        s *= ss[i][j];
    printf("%d ", s);
}

23)
int ss[3][3] = { {3, 1, 0}, {5, 5, 5}, {5, 4, 3} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 1;
    for(j = 0; j < 3; j++)
        s *= ss[j][i];
    printf("%d ", s);
}

24)
int ss[3][3] = { {17, 19, 12}, {12, 13, 10}, {17, 6, 3} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = 0;
    for(j = 0; j < 3; j++)
        s += ss[j][i];
    printf("%d ", s);
}

25)
int ss[3][3] = { {2, 22, 11}, {13, 13, 4}, {16, 28, 17} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[i][0];
    for(j = 0; j < 3; j++)
        if(ss[i][j] < s)
            s = ss[i][j];
    printf("%d ", s);
}

26)
int ss[3][3] = { {18, 14, 13}, {21, 23, 3}, {6, 15, 7} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[0][i];
    for(j = 0; j < 3; j++)
        if(ss[j][i] < s)
            s = ss[j][i];
    printf("%d ", s);
}

27)
int ss[3][3] = { {26, 12, 3}, {18, 8, 9}, {20, 13, 4} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[i][0];
    for(j = 0; j < 3; j++)
        if(ss[i][j] > s)
            s = ss[i][j];
    printf("%d ", s);
}

28)
int ss[3][3] = { {1, 16, 25}, {28, 30, 21}, {8, 13, 4} };
int s, i, j;
for(i = 0; i < 3; i++)
{    s = ss[0][i];
    for(j = 0; j < 3; j++)
        if(ss[j][i] > s)
            s = ss[j][i];
    printf("%d ", s);
}

Автор: aff 7.3.2007, 14:24
у меня три задачи не решаются. на 2 первые есть алгоритмы но почему-то не работают.
1 строка содержит проивзольный английский текст, сформировать массивы гласных и согласных:

Код

#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{char *A; //сама строка
char B[]={'a','e','i','o','u','y'}; //массив гласных
char *C;//массив гласных букв
char *F; //а это - согласных букв
int x,y=0,z=0,q=0,i;
printf("Vvedite stroku\n");
gets(A);                                    // вот здесь встает вся программа
 for (x=0;x<strlen(A);x++)
   { for (y=0;y<strlen(B);y++)
      { if (A[x]==B[y])
          { C[z]=A[x];  z++;  }
        else
          { F[q]=A[x];   q++; }
      }
   }
for (z=0;z<100;z++)
  { printf("%c\t",C[z]);  }
for (q=0;q<100;q++)
  { printf("%c\t",F[q]);  }
getch();}



2 даны 2 натуральных числа: n и m. проверить есть ли в записи числа m цифры, совпадающие с цифрами n:
Код

#include<stdio.h>
#include<conio.h>
main()
{
long n,m;
int k,j;
printf("Vvedite n,m\n");
scanf("%d%d",&n,&m);
while(n!=0) 
{k=n%10; n=n/10;
  while (m!=0)
   {j=m%10; m=m/10;
     if (j==k) printf("%d\t",k);
   }
}
getch();}


3 подсчитать кол-во эл-тов матриц x[5.4] и y[3.5]? удовлетворяющих условиям a<=x<=b и a<=y<=b. кол-во элементов вычислить в функции.

Автор: Rockie 8.3.2007, 17:44
Цитата(aff @  7.3.2007,  14:24 Найти цитируемый пост)
gets(A);                                    // вот здесь встает вся программа

aff, ты не выделил память под указатель A. используй malloc для Си или new для C++. Либо 

Код

char A[80]; //сама строка


p.s.: создавай http://forum.vingrad.ru/act-Post/CODE-00/f-142/syntax-nocolor.html если вопрос новый

Автор: FireSnake 9.3.2007, 22:52
А вот на строки простенькая задачка, но с подъе...водным камнем.


Задача Spy

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


Шпион, давно внедрившийся в ранее вражескую, а теперь дружественную страну, использовал для передачи донесений шифровальную машинку, привезенную с собой в начале карьеры, а значит морально устаревшую . Работал сей автомат так: в каждом слове сообщения он менял гласную букву на цепочку символов, состоящую из этой самой буквы в начале, некого кодового слова и вновь этой же буквы. Простой шифр, правда? Если учесть, что машинка работала только с малыми буквами латинского алфавита, секретное донесение "i like pivo" с использованием кодирующей последовательности "qa" на родине героя получали в виде "iqai liqaikeqae piqaivoqao". Все было прекрасно, пока машинка от старости не начала кодировать одно и то же сообщение по несколько раз. Помогите криптографам, получившим сообщение, отправленное неисправной машинкой, его прочитать.

Ввод-вывод: В первой строке вводите с клавиатуры зашифрованную последовательность, во второй - кодирующую последовательность. В строке вывода выводите на экран искомую строку.


 

Пример:

Ввод>

iqaiqaqaaiqai liqaiqaqaaiqaikeqaeqaqaaeqae piqaiqaqaaiqaivoqaoqaqaaoqao 

Ввод> qa

Вывод> i like pivo


Ограничения: кодированная строчка не длиннее 255 символов, кодовое слово не длиннее 255 символов.

П.С. у кого пройдет все тесты, поделитесь в чем этот подводный камень. Решения можете постить здесь.smile. А  я  буду писать результат проверки.


Автор: Strannik 10.3.2007, 12:12
FireSnake, а копирайты поставить? Или откуда задача сказать?
Цитата

Решения можете постить здесь.

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

Автор: FireSnake 10.3.2007, 22:02
Цитата(Strannik @  10.3.2007,  12:12 Найти цитируемый пост)
FireSnake, а копирайты поставить? Или откуда задача сказать?

Цитата

Решения можете постить здесь.



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


Про копирайты я действительно забыл. но я и не утверждаю что это моя задача. А касательно дать линк на сайт, то мне самому инетересно посмотреть чужые решения(свое у меня есть).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)