c语言,求一个数组中,中间值的大小怎么做?
楼主,这道题我的思路是先排序,然后输出排序后中间元素的值
一楼的思路也不错,可以参考
祝楼主进步~
程序如下:
#include stdio.h
#include math.h
#define N 10
int Search(double a[]);
void main()
{
double a[N];
int i,mid;
printf(“请输入数据:”);
for(i=0;iN;i++)
scanf(“%lf”,a[i]);
mid=Search(a);
printf(“中间值为:%.12f\n”,a[mid]);
}
int Search(double a[])
{
int i,j,flag;
double tmp;
for(i=N-1;i=0;i–)
{
flag=0;
for(j=0;ji;j++)
{
if(fabs(a[j])-fabs(a[j+1])1e-10)
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
flag++;
}
}
if(flag==0) break;
}
if(N%2)
return N/2+1;
else
return N/2;
}
————————-
修改宏定义的N值,可以改变数组大小
c语言中关于数组的一点小问题
#include stdio.h
void f1(float a[10][5],float b[10]); 子函数的声明 一般的定义在main函数的外面 且在顶部
void f2(float a[10][5],float c[5]);
static float a[10][5],b[10]={0},c[5]={0}; 这是将数组变量定义成静态的 它们才能在主函数和子函数中同时调用 修改
void main()
{
int i,j;
printf(“请依次输入10个学生五门课的成绩:”);
for(i=0;i10;i++)
for(j=0;j5;j++)
scanf(“%f”,a[i][j]);
f1(a,b);
f2(a,c);
printf(“\n每个学生的平均分:”);
for(i=0;i10;i++)
printf(“%.2f “,b[i]);
printf(“\n每个科目的平均分:”);
for(i=0;i5;i++)
printf(“%.2f “,c[i]);
}
void f1(float a[10][5],float b[10])
{
int i,j;
for(i=0;i10;i++)
for(j=0;j5;j++)
b[i]=b[i]+a[i][j];
for(i=0;i10;i++)
b[i]=b[i]/5;
}
void f2(float a[10][5],float c[5])
{
int i,j;
for(i=0;i5;i++)
for(j=0;j10;j++)
c[i]=c[i]+a[j][i];
for(i=0;i10;i++)
c[i]=c[i]/10;
}
c语言通过输入起点,中间点,终点坐标计算弧长与夹角的代码,透明标尺那个程序里的。
/*c语言通过输入起点,中间点,终点坐标计算弧长与夹角的代码*/
#includestdio.h
#includemath.h
main()
{
float a[3][2],b[1][2],r,R,s,ra,sl; /*二维数组的前三行输入三个对应的坐标,数组b计算起终点的中点坐标*/
int i,j; /*r记录弦的半长,R记录弧的半径,s记录弦中点到弧中点的距离,ra记录夹角,sl记录弧长*/
for(i=0;i3;i++)
{
for(j=0;j2;j++)
{
printf(“a[%d][%d]=”,i+1,j+1);
scanf(“%f,%f”a[i][j]);
printf(“,”);
}
printf(“;\n”);
}
for(i=0;i2;i++)
{
b[0][i]=(a[0][i]+a[2][i])/2.0; /*求出弦中点坐标*/
}
r=sqrt((a[2][0]-a[0][0])*(a[2][0]-a[0][0])+(a[2][1]-a[0][1])*(a[2][1]-a[0][1]))/2.0; /*计算弦长并除以2*/
s=sqrt((a[1][0]-b[1][0])*(a[1][0]-b[1][0])+(a[1][1]-b[1][1])(a[1][1]-b[1][1]));
R=(s*s+r*r)/(2.0*s); /*因为有(R-s)2+r2=R2(这个注释中的2表示平方)*/
ra=2.0*(asin(r/R)); /*求出夹角,弧度制*/
sl=R*ra; /*求出弧长*/
printf(“sl=%f,ra=%f\n”,sl,ra);
}
C语言一道题目分析程序运行过程,将数组a中的n个整数按相反顺序存放 ,求解释!
首先一点 这个确实是可以的
问题是 写的太绕了 让人看着别扭。
看初始值。
int t,*p,*i,*j,m=(n-1)/2;
m就是中点。
i=x; j=x+n-1; p=x+m;
i是开头 j是结尾。 p是中点
然后
for(;i=p;i++,j–)
for用分号分隔的三个域。第一个空,也就是不用初始化值。 因为之前已经做过了
第二个 i=p 也就是ip 当前面一个指针 指到中点后面 退出循环。
第三个 改变 i++,j–
也就是两头凑。 前面向后移动,后面向前移动。 这样 就实现了两端向中间的一个遍历。
实现了倒序。
其实 更简单的是
void inv(int *x, int n)
{ int t,*i,*j;
i=x; j=x+n-1;
for(;ij;i++,j–)
{ t=*i; *i=*j; *j=t; }
}
这样更直观 更简单。
C语言求一个字符串的中点
strlen函数不会包括’\0’,所以到这行“mid=i/2-1”时,mid的值确实为1,如果下面没有别的操作,那么就是教程错了。
C语言解决数组问题
矩阵的加法:
void matrixAdd(int a[M][N], int b[M][N], int c[M][N], int rows, int cols){
int i,j;
for(i=0; irows; i++){
for(j=0; jcols; j++){
c[i][j] = a[i][j]+b[i][j];
}
}
}
矩阵与实数的乘法:
void matrixMul(int a[M][N], int rows, int cols, int v){
int i,j;
for(i=0; irows; i++){
for(j=0; jcols; j++){
a[i][j]*=v;
}
}
}
矩阵的转置:
void matrixTrans(int a[M][N], int at[N][M], int rows, int cols){
int i,j;
for(i=0; irows; i++){
for(j=0; jcols; j++){
at[j][i]=a[i][j];
}
}
}
矩阵的输出:
void matrixPrint(int a[M][N], int rows, int cols){
int i,j;
printf(“输出数组的值:\n”);
for(i=0; irows; i++){
for(j=0; jcols; j++){
printf(“a[%d][%d]=%d, “,i,j,a[i][j]);
}
}
}