C语言,输入一数组,取出所有的前一个小于后一个的元素,组成新的数组,输出其值.

输入一个正整数 repeat ,接下去输入 repeat 组数据,每组数据为:
读入 1 个正整数n , 再读入 n 个整数 。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 获取数组个数
int get_repeat()
{
    int repeat = 0;
    do
    {
        printf("请输入repeat的值[repeat > 0]: ");
        scanf("%d", &repeat);
    } while (0 >= repeat);

    return repeat;
}

// 获取每个数组的内容
// current_numbers 一维数组,表示每个数组所含元素个数
// repeat          数组总个数
int ** get_repeats_array(int * current_numbers, int repeat)
{
    int num = 0;                                                               // 当前数组的个数
    int * array = 0;                                                           // 动态数组,存储当前数组的元素
    int **parr = (int **)malloc(sizeof(int *) *repeat);                        // 指针数组,每个元素表示一个数组

    for (int i = 0; i < repeat; i++)
    {
        do {
            printf("请输入当前数组中元素个数: ");
            scanf("%d", &num);
        } while (0 >= num);
        current_numbers[i] = num;                                              // 当前数组元素个数存储一维数组中
        array = (int *)malloc(sizeof(int) * num);
        if (NULL == array)
        {
            printf("malloc failed...\n");
            exit(EXIT_FAILURE);
        }

        printf("请输入%d个元素: ", num);
        for (int j = 0; j < num; j++)
        {
            scanf("%d", &array[j]);                                            // 将数据存储到数组中
        }

        parr[i] = array;                                                       // 将当前数组放入到指针数组中
    }

    return parr;
}

// 释放申请有内存空间
void release(int ***ptr, int *** other, int ** nums, int ** new_nums, int len)
{
    for (int i = 0; i < len; i++)
    {
        free((*ptr)[i]);
        free((*other)[i]);
    }

    free(*ptr);
    free(*nums);
    free(*other);
    free(*new_nums);
    *ptr = 0;
    *nums = 0;
    *other = 0;
    *new_nums = 0;
}

// 取出符合要求的数据元素,并放入新的数组中
int ** sort(int ** array, int * nums, int len, int *new_nums)
{
    int count = 0;
    int * tmp = 0;
    int ** pparr = (int **)malloc(sizeof(int*) * len);                         // 指针数组

    for (int i = 0; i < len; i++)
    {
        tmp = (int *)malloc(sizeof(int));                                      // 一维数组,存储符合要求的数据
        for (int j = 0; j < nums[i] - 1; j++)
        {
            if (array[i][j] < array[i][j + 1])
            {
                tmp = (int *)realloc(tmp, sizeof(int) * (count + 1));          // 增加存储空间,以容纳新的数据
                tmp[count++] = array[i][j];
            }
        }

        new_nums[i] = count;                                                   // 记录当前数据中元素个数
        pparr[i] = tmp;                                                        // 将当前数组地址放入指针数组中
        count = 0;                                                             // 清空记录个数
        tmp = 0;
    }

    return pparr;
}

// 打印数组中的元素
// array 指针数组,存储所有数组
// nums  一维数组,当前数组中元素个数
// len   指针数组中存储数组的个数
void print_array(int ** array, int * nums, int len)
{
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < nums[i]; j++)
        {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

// TEST
int main(int argc, char * argv[])
{
    int * current_numbers = 0;
    int * new_nums = 0;
    int ** pparray = 0;
    int ** ppnew_array = 0;
    int n = get_repeat();

    current_numbers = (int *)malloc(sizeof(int) * n);
    new_nums = (int *)malloc(sizeof(int) * n);

    pparray = get_repeats_array(current_numbers, n);
    printf("\n原始数据如下:\n");
    print_array(pparray, current_numbers, n);

    ppnew_array = sort(pparray, current_numbers, n, new_nums);
    printf("符合要求的数据元素如下:\n");
    print_array(ppnew_array, new_nums, n);

    release(&pparray, &ppnew_array, &current_numbers, &new_nums, n);
    
    return 0;
}

程序中有些地方没有做数据有效性验证,自己添加上就好了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-04-06
#include <stdio.h>
void main()
int n;
scanf("%d",&n);
while(n--){
int m,i=0;
scanf("%d",&m);
while(m--){
int num,a;
scanf("%d",&num);
if(i++)
if(a>num)
printf("%d>%d\t",a,num);
a = num;
}
printf("\n");
}
system("pause");
}

追问

输出为每组数据,在独立的一行上输出结果(各元素间空一格)。输入样例
2
7 3 1 2 3 5 7 6
6 0 4 5 6 9 3

输出样例
1 2 3 5
0 4 5 6

能不能用数组做
刚刚试了不行

追答

你把原题发来。

本回答被网友采纳
第2个回答  2017-04-07
//按照你的意思,应该是这样。已经在VC运行过了

#include <stdio.h>

#define N 100

int main()
{
int repeat;//数据组数
int n;//每组数据数字个数
int i, j, m; //循环变量
int a[N][N];//定义一个二维数组
char b[N][N];//将数据存入到字符数组中
/*
原因:
因为所取元素个数不确定,所以需要用‘\0’来判断结束符

*/

printf("您需要输入多少组数据?\n");
scanf("%d", &repeat);
printf("每组数据输入多少个数字?\n");
scanf("%d",&n);

for(i = 0;i < repeat;i++) //存入数据
{
printf("请输入第%d行的数字\n", (i+1));

for(j = 0;j < n;j++)
{
scanf("%d",&a[i][j]);
}
}

for(i = 0;i < repeat;i++) //筛选数据
{

for(j = 0,m = 0;j + 1< n;j++)
{
if(a[i][j] < a[i][j+1])
{
b[i][m] = a[i][j] + '0'; //将数据存入b
m++;
}

}
b[i][m] = '\0'; //每行的最后一个置为空

}

for(i = 0;i < repeat;i++) //输出b
{
for(j = 0;b[i][j]!='\0';j++)
{
printf("%c ",b[i][j]);
}

putchar(10); //换行
}

return 0;
}