C语言编程(要求使用指针)

(1)任意输入4个互不相等的整数,按由大到小的顺序输出;
(2)在主函数中定义数组a和b,并用若干个实数将b初始化。写一个函数 select(int n, double a[], double b[], double x) ,它将数组b中大于x的数顺序复制到数组a中,并在主函数中将a数组的内容输出。 a数组的内容为空,n是两个数组的大小。(提示:a和b数组分别用两个计数器i和j计算下标,一般i<=j)
(1)写一函数,将一个3×4的矩阵转置,将数据存储到一个4×3的矩阵后,将两个矩阵输出。
(2)输入5个字符串,按由大到小的顺序输出。
(3)对n个等长的字符串排序并输出,n在2~10之间可变。
(4)写一个函数,接受一个已排序的整形数数组和一个整数,将该整数插入数组的适当位置,将该数组在变化前后分别输出。
要求是用指针和函数?!!!


你可以考虑PM我详细商讨

//用栈结构实现辗转相除法计算两数最大公约数
#include<stdio.h>
#include<malloc.h>

#define MAXLEN 100
#define NEWLEN 10
//栈的结构相当于一个手枪子弹匣,每次只能拿到最上面一颗子弹
struct stack{ //栈结构体
int * base; //栈底
int top; //栈顶
int length; //栈高
};
typedef struct stack * p_stack, i_stack; //定义栈类型的结构体

p_stack stack_init(p_stack pstack)//初始化一个栈
{
pstack = NULL; //栈指针为空
pstack = (p_stack)malloc(sizeof(stack)); //为栈分配结构
if(pstack == NULL) //如果未分配成功(指针仍为空)则返回假
return false;
pstack->top = 0; //栈顶位置为0
pstack->base = (int *)malloc(sizeof(int) * MAXLEN); //为栈分配元素空间
pstack->length = MAXLEN; //栈高(容量)初始化
if(pstack->base == NULL) //如果空间未分配成功则释放栈结构,并返回假
{
free(pstack);
pstack = NULL;
return false;
}
return pstack; //返回栈指针
}

p_stack stack_exp(p_stack pstack)//给栈扩容
{
pstack->base = (int *)realloc(pstack->base, sizeof(int) * (pstack->length += NEWLEN)); //给栈重新分配空间,大小为(栈高+NEWLEN)
if(pstack->base == NULL) //如果分配不成功则释放并返回空
{
free(pstack);
pstack = NULL;
}

return pstack; //返回重新分配的空间指针
}

bool stack_release(p_stack pstack)//释放一个栈
{
free(pstack->base); //释放栈空间
free(pstack); //释放栈结构
pstack = NULL; //栈指针指向空
return true; //返回真
}

bool stack_push(p_stack pstack, int value)//压栈
{
if(pstack->top == pstack->length -1) //如果栈满了(栈顶下标=栈高-1),则为栈重新分配空间
stack_exp(pstack);

pstack->base[pstack->top ++] = value; //把值压入栈顶,栈顶指针向上移
return true;
}

int stack_top(p_stack pstack)//栈顶数据
{
return pstack->base[pstack->top - 1]; //返回栈顶数据
}

int stack_pop(p_stack pstack)//弹出
{
if(!pstack->top) //如果栈为空(栈顶下标为0)则返回-1
return -1;
return pstack->base[--(pstack->top)]; //返回栈顶内容,并将栈顶下调1
}

int func(p_stack pstack,int a,int b)//辗转相除法
{
int y,z;

stack_push(pstack,a); //把输入的第一个数压入栈顶
stack_push(pstack,b); //把输入的第二个数压入栈顶

while(1) //循环进行以下步骤
{
y = stack_top(pstack); //取得第一个栈顶数字
stack_pop(pstack); //栈顶数字出栈
z = stack_top(pstack); //取得第二个栈顶数字
if(0==z%y) //如果y能整除z,则y为两数最大公约数
return y;
stack_push(pstack,y); //否则将y压入栈顶
stack_push(pstack,z%y); //然后将z除以y的余数压入栈顶
}
}

int main()
{
p_stack pstack = NULL;
int a, b;

pstack = stack_init(pstack); //对栈初始化

printf("请输入两个整数,以空格分开\n"); //提示输入

scanf("%d %d", &a, &b); //从键盘输入两个整数

printf("最大公约数为:%d\n",func(pstack,a,b)); //调用辗转相除函数

stack_release(pstack); //调用结束,释放栈
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-19
第二个第(1)题。
(1)写一函数,将一个3×4的矩阵转置,将数据存储到一个4×3的矩阵后,将两个矩阵输出。

#include <stdio.h>
#define N 1000
#define M 1000
int mix[N][M];
void Swap( int & a, int & b)
{
int temp = b;
b = a;
a = temp;
}
void Swap_mix( int mix[][M] , int & r, int & c )
{
int i,j,k;
for( i = 1; i <= r ; i++ )
{
for( j = i ; j <= c ; j++ )
{
Swap( mix[i][j] , mix[j][i] );
}
}
k = r;
r = c;
c = k;
}

void Pnt( int mix[][M] , int r, int c )
{
int i,j;
printf("------------------------------------");
for( i = 1; i <= r ; i++ )
{
for( j = 1 ; j <= c ; j++ )
{
printf("%d ",mix[i][j]);
}
printf("\n");
}
printf("------------------------------------");
}
int main()
{
int r=3,c=4,i,j;
printf("请输入一个3*4的矩阵:\n");
for( i = 1; i <= r ; i++ )
{
for( j = 1 ; j <= c ; j++ )
{
scanf("%d",&mix[i][j]);
}
}
printf("转置前 原始矩阵 :\n");
Pnt( mix , r , c );
Swap_mix( mix , r , c );
printf("转置后 转置矩阵:\n");
return 0;
}

第二部分(2)输入5个字符串,按由大到小的顺序输出。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 1000
char s[5][MAXN];

int cmp(const void *a, const void *b)
{
return -strcmp((char*)a, (char*)b);
}

int main()
{
memset(s,0,sizeof(s));
int i;
for( i = 0 ; i< 5 ; i++ )
{
gets(s[i]);
}
//sort(s,s+5,cmp);
qsort(s,5,MAXN,cmp);
for( i = 0 ; i< 5 ; i++ )
{
puts(s[i]);
}
return 0;
}

第二部分 (3)对n个等长的字符串排序并输出,n在2~10之间可变。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 1000
char s[100][MAXN];

int cmp(const void *a, const void *b)
{
return -strcmp((char*)a, (char*)b);
}

int main()
{
memset(s,0,sizeof(s));
printf(" n = ? ");
int i,n;
scanf("%d",&n);
gets(s[0]);
for( i = 0 ; i< n ; i++ )
{
gets(s[i]);
}
//sort(s,s+5,cmp);
qsort(s,n,MAXN,cmp);
for( i = 0 ; i< n ; i++ )
{
puts(s[i]);
}
return 0;
}本回答被提问者采纳
第2个回答  2011-06-11
#include "stdio.h"
#include "stdlib.h"
int getCharCount(char *sz,char ch,int len)
{
int i = 0;
int icount =0;
for(i=0;i<len,i++)
{
if(*sz == ch)
icount = icount +1;
sz++;

}
return icount;
}
void main()
{

char sz[10]=;
int iCnt=0;
iCnt = getCharCount(sz,'a',10);

printf("a 的个数为 %d",iCnt);

getche();

}
第3个回答  2011-05-27
楼上有毛病。
第4个回答  2011-05-23
第一题:
main()
{
int i,j,temp;
int a[4];
for(i=0;i<4;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<4;i++)
for(j=0;j<i;j++)
if(a[i]<a[j])
{
temp = a[i];a[i] = a[j];a[j] = temp;
}
for(i=0;i<4;i++)
{
printf("a[i] = %d\n",a[i]);
}
}

第三题:

main()
{
int a[3][4]={ {1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
int b[4][3],i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
b[j][i] = a[i][j];

printf("a[3][4] = \n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d,",a[i][j]);
printf("\n");
}

printf("b[4][3] = \n");
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
printf("%d,",b[i][j]);
printf("\n");
}

}追问

加油↖(^ω^)↗

相似回答