0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 20
1

Написать программу, содержащую две функции, сравнения строк, эквивалентные стандартной функции strcmp

15.12.2015, 19:03. Показов 2014. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, многоуважаемые гуру программирования. Прошу помочь написать одну программу, собственно, вот она: "Написать программу, содержащую две пользовательские функции сравнения строк, эквивалентные стандартной функции strcmp. Первая из них должна использовать индексацию массива, вторая – указатели и арифметические операции с ними." На форуме уже есть похожая тема(Написать функции сравнения строк, эквивалентные стандартной функции strcmp), в ней скинули ссылку на другую тема, в которой есть решение данной задачи, но я, к сожалению, не с мог в ней разобраться. Если кто то может объяснить или знает, как написать эту программу, пожалуйста помогите, буду очень признателен, заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2015, 19:03
Ответы с готовыми решениями:

Написать функции сравнения строк, эквивалентные стандартной функции strcmp
Здравствуйте! Помогите, пожалуйста, с задачкой) Написать программу, содержащую две...

Написать две пользовательские функции объединения строк
Помогите написать программу, содержащую две пользовательские функции объединения строк,...

Ошибка сравнения строк strcmp()
Проблема состоит в том, что в цикле while не происходит корректное сравнение строк. По задумке,...

Написать две пользовательские функции, эквивалентные стандартной функции strlen
Написать программу, содержащую две пользовательские функции определения длины строки, эквивалентные...

4
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
16.12.2015, 20:30 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Если по примитивному, тогда вот накидал.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <string.h>
 
//ptr
int p_strcmp(const char* s1, const char* s2){
    int ret;
    while(!(ret = (int)*s1 - *s2) && *s1){
        ++s1;
        ++s2;
    }
    return ret;
}
 
//index
int i_strcmp(const char* s1, const char* s2){
    int ret, i = 0, j = 0;
    while(!(ret = (int)*(s1 + i) - *(s2 + j)) && *(s1 + i)){
        ++i;
        ++j;
    }
    return ret;
}
 
int main(void){
    printf("% 2d\t% 2d\n", strcmp("ABC", "ABC"), p_strcmp("ABC", "ABC"));
    printf("% 2d\t% 2d\n", strcmp("A",  "ABC"),  p_strcmp("A", "ABC"));
    printf("% 2d\t% 2d\n", strcmp("ABC", "AB"),  p_strcmp("ABC", "AB"));
    putchar('\n');
    printf("% 2d\t% 2d\n", strcmp("xyz", "XYZ"),  i_strcmp("xyz", "XYZ"));
    printf("% 2d\t% 2d\n", strcmp("PHP", "PHPi"), i_strcmp("PHP", "PHPi"));
    printf("% 2d\t% 2d\n", strcmp("12",  "19"),   i_strcmp("12", "19"));
    return 0;
}
Пример работы кода
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12736 / 7566 / 1763
Регистрация: 25.07.2009
Сообщений: 13,949
17.12.2015, 02:52 3
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вместо бонуса
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int mystrcmp(const char * a, const char * b) {
    return ( *a && *a == *b ) ? mystrcmp(a + 1, b + 1) : *a - *b;
}
 
int main(void) {
    char sA[BUFSIZ], sB[BUFSIZ];
    
    while ( printf("First: ") && fgets(sA, BUFSIZ, stdin) && *sA != '\n' && printf("Second: ") && fgets(sB, BUFSIZ, stdin) ) {
        int d = mystrcmp(sA, sB);
        printf("%s\n", ( d < 0 ) ? "First less" : ( d > 0 ) ? "Second less" : "The same");
    }
    
    return 0;
}
0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 20
23.12.2015, 08:36  [ТС] 4
Спасибо большое за ответы!
Вот, тоже что-то написал) Оставлю тут, может кому пригодится.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h> 
#include <stdlib.h> 
 
int ind(char *x, char *y)
{
    int i, result;
    for (i = 0, result = 0; ; i++)
    {
        if ((x[i] == 0) && (y[i] == 0)) { break; }
        if (x[i] == 0) { result = 1; break; }
        if (y[i] == 0) { result = 2; break; }
        if (x[i]<y[i]) { result = 1; break; }
        else if (x[i]>y[i]) { result = 2; break; }
    }
    return result;
}
 
int ukaz(char *x, char *y)
{
    int i, result;
    for (i = 0, result = 0; ; i++)
    {
        if ((*(x + i) == 0) && (*(y + i) == 0)) { break; }
        if (*(x + i) == 0) { result = 1; break; }
        if (*(y + i) == 0) { result = 2; break; }
        if (*(x + i)<*(y + i)) { result = 1; break; }
        else if (*(x + i)>*(y + i)) { result = 2; break; }
    }
    return result;
}
 
int main() {
    char a[100], b[100];
    int status;
    printf("A="); scanf("%s", a);
    printf("B="); scanf("%s", b);
    status = ind(a, b);
    switch (status)
    {
    case 0: printf("With ind:\nA=B"); break;
    case 1: printf("With ind:\nA<B"); break;
    case 2: printf("With ind:\nA>B"); break;
    }
    printf("\n");
    status = ukaz(a, b);
    switch (status)
    {
    case 0: printf("With ukaz:\nA=B\n"); break;
    case 1: printf("With ukaz:\nA<B\n"); break;
    case 2: printf("With ukaz:\nA>B\n"); break;
    }
}
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
23.12.2015, 11:16 5
Для потомков:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <stdio.h>
#include <string.h>
 
int StrcmpPointers(const char* p1, const char* p2)
{
  const unsigned char* s1 = (const unsigned char*) p1;
  const unsigned char* s2 = (const unsigned char*) p2;
 
  unsigned char c1 = 0;
  unsigned char c2 = 0;
 
  do
  {
    c1 = (unsigned char) *s1;
    c2 = (unsigned char) *s2;
    
    s1++;
    s2++;
 
    if (c1 == '\0')
    {
      return c1 - c2;
    }
  }
  while (c1 == c2);
 
  return c1 - c2;
}
 
int StrcmpIndex(const char* p1, const char* p2)
{
  const unsigned char* s1 = (const unsigned char*) p1;
  const unsigned char* s2 = (const unsigned char*) p2;
 
  unsigned char c1 = 0;
  unsigned char c2 = 0;
 
  size_t index = 0;
 
  do
  {
    c1 = (unsigned char) s1[index];
    c2 = (unsigned char) s2[index];
    index++;
 
    if (c1 == '\0')
    {
      return c1 - c2;
    }
  }
  while (c1 == c2);
 
  return c1 - c2;
}
 
char* VerifyResult(const int one, const int two, const int three)
{
  static char testResult[7];
 
  strcpy(testResult, "FAILED");
 
  if (((one > 0) && (two > 0) && (three > 0)) ||
      ((one < 0) && (two < 0) && (three < 0)) ||
      ((one == two) && (two == three) && (three == 0)))
  {
    strcpy(testResult, "PASSED");
  }
 
  return &testResult[0];
}
 
void RunTest(void)
{
  char* strings1[] = {
    "v5E2gQj1uU",
    "Ple19jNhRc", /* !!! */
    "NH3pz6mK2Y",
    "uhv5D3k3bl",
    "fXxEXAABbr",
    "eA4iMAWY0b", /* !!! */
    "24QmKOCS3Y",
    "ztiEQoic1o",
    "WjbZP81kKT",
    "F2B3Eww6lc"};
  char* strings2[] = {
    "oDXd4kpg2R",
    "Ple19jNhRc", /* !!! */
    "wJMZNuvNS3",
    "pHDyPJv8KD",
    "H1yvUdmfTt",
    "eA4iMAWY0b", /* !!! */
    "A5An4wQ8gU",
    "WGgW6NkIgD",
    "Wb5989AAzE",
    "jeAtaoS7is"};
 
  size_t i = 0;
  size_t N = sizeof(strings1) / sizeof(*strings1);
 
  int pointerRes = 0;
  int indexRes = 0;
  int stdRes = 0;
 
  for (i = 0; i < N; i++)
  {
    pointerRes = StrcmpPointers(strings1[i], strings2[i]);
    indexRes = StrcmpIndex(strings1[i], strings2[i]);
    stdRes = strcmp(strings1[i], strings2[i]);
 
    printf("s1 = '%s', s2 = '%s', res (ptr/idx/std): %d / %d / %d -> %s\n",
      strings1[i],
      strings2[i],
      pointerRes,
      indexRes,
      stdRes,
      VerifyResult(pointerRes, indexRes, stdRes));
  }
}
 
int main(void)
{
  RunTest();
  return 0;
}
0
23.12.2015, 11:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2015, 11:16
Помогаю со студенческими работами здесь

Написать программу, содержащую две функции
Написать программу, содержащую две функции. Первая функция, вычисляющая сопротивление участка цепи,...

Написать программу содержащую две функции
Написать программу, содержащую две функции. Первая функция, выводящая на экран строку одинаковых...

Написать программу, содержащую две функции
Первая функция, вычисляющая объем цилиндра по известному радиусу основания и высоте, располагается...

Написать программу, содержащую две функции
Написать программу, содержащую две функции. Первая функция, возвращающая максимальное из двух...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru