【问题标题】:How to print elements of an array except those containing a specific digit?如何打印数组的元素,除了包含特定数字的元素?
【发布时间】:2021-09-02 21:25:37
【问题描述】:

我刚开始学习 C 语言,我编写了这个程序,它按降序打印数组的元素,然后按降序打印同一数组的 2 位元素。现在我想打印该数组的元素,除了那些包含数字 5 的元素。这是我制作的程序:

#include<stdio.h>
#include<conio.h>
int main(void)
{
    int array[20] = {2,5,1,3,4,10,30,50,40,20,70,90,80,60,100,150,130,110,120,140};

    printf("original array:\n");

    for(int i=0;i<20;i++)
    {
        printf("%i\n", array[i]);
    }

// To sort elements of array in descending order

int i,j,temp;

for(i=0;i<20;i++)
{
        for(j=i+1;j<20;j++)
        {
           if(array[i]>array[j])
           {
               temp = array[i];

               array[i] = array[j];

               array[j] = temp;
           }
        }
}

// Now to print the sorted array

printf("arranged array in descending order:\n");

for(int x = 19;x>=0;x--)
{
    printf("%i\n", array[x]);
}

// To print only 2-digit elements of the array

printf("following are only 2-digit elements of array in descending order:\n");

for(int k = 19;k>=0;k--)
{
    if(array[k]>9 && array[k]<100)
    {
        printf("%i\n", array[k]);
    }
}
}

我应该制定什么逻辑以便只打印包含“5”的元素? 在此先感谢:)

【问题讨论】:

  • 检查一个数字是否包含等于5的数字有什么问题?
  • @VladfromMoscow 我只是不知道怎么做。正如我所说,我刚开始学习 C。我搜索但找不到它。
  • 请阿卜杜拉编辑代码并尽量使其可读性更好。

标签: arrays c logic


【解决方案1】:

如果数字包含数字d,则此函数返回1,否则返回0。

int has(int x, int d)
{
    while(x)
    {
        if(abs(x % 10) == d)
        {
            return 1;
        }
        x /= 10;
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    使用函数更好地组织您的代码。首先,定义一个swap()函数:

    void swap(int *a, int *b)
    {
        int tmp = *a;
        *a = *b;
        *b = *a;
    }
    

    然后,编写一个排序算法。关注您的情况:

    void bubble_sort(int *array, int size)
    {
        int i, j, swap_oper;
        for (i = 0; i < size - 1; ++i) {
            swap_oper = 0;
    
            for (j = 0; j < size - i - 1; ++j) {
                if (array[j] > array[j+1]) {
                    swap(&array[j], &array[j+1]);
                    swap_oper = 1;
                }
            }
    
            if (swap_oper == 0)
                break;
        }
    }
    

    要打印除包含 5 的所有数字,请定义一个检查数字中是否包含 5 的函数:

    int contains_five(int n)
    {
        while (n != 0) {
            if (n % 10 == 5)
                return 1; // true
    
            n /= 10;
        }
        return 0; // false
    }
    

    那么你可以这样使用它:

    void print_array(int *array, int size)
    {
        int i;
        for (i = 0; i < size; ++i) {
            if (!contains_five(array[i]))
                printf("%d ", array[i]);
        }
    }
    

    【讨论】:

    • 它对我有用。只是 print_array 函数只打印那些包含数字 5 的元素。但我修复了它。非常感谢你的帮忙!如果你不介意,你能告诉我你在swap函数中使用的*吗?它应该代表什么? (变量名)和*(变量名)有什么区别?
    • @AbdullahMushtaq 是的,我也编辑了代码。现在它返回1,如果有5,如果没有0。
    • @AbdullahMushtaq * 表示指针。指针是指内存中的地址。例如,int *a 是指向整数的指针,而 int a 是实际整数。现在,swap() 接受两个指针而不是两个值的原因是,在 C 中,函数的参数是按值传递的,而不是按引用传递的。意味着它们被复制:您在函数内部拥有的是参数的副本,而不是实际参数。当您传递一个指针(一个地址)时,该地址值被复制到函数内部,您可以通过使用 *a 取消引用它来访问实际参数。
    • 非常感谢!感谢您的所有帮助:)
    【解决方案3】:

    这些是以二进制形式存储的整数,因此测试一个数字(以 10 为底)实际上是它如何显示的问题。

    试试

    char str [33];
    for(int k = 19;k>=0;k--)
    {
        //convert to a string first
        sprintf(str, "%d", array[k])
        //test for presence of ASCII '5'
        if(!strstr(str, '5'))
        {
            printf("%i\n", array[k]);
        }
    }
    

    【讨论】:

    • 什么是buffer.find? C中没有这样的东西。
    • 对不起 - 那是 C++。调整后现在应该在 C 中工作
    • 我建议在此处发布之前测试答案。可以在线编译执行例如:godbolt.org
    • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 2021-08-13
    • 2018-07-24
    • 1970-01-01
    • 2016-04-26
    • 2019-10-24
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多