小弟初来乍到,向各位大佬致敬!
编程任务4. 有一个班级,目前只有3个人,以身高进行排序,如序号 学号 身高
1 ,1 1.50
2 3 1.55
3 2 1.60
每次增加一个人,学号自动加1,身高由用户输入,请同学们每完成一次添加把整个人数按照身高重新进行排序并输出,如输入了1.53,排序为:
序号 学号 身高
1 ,1 1.50
1 4 1.53
2 3 1.55
3 2 1.60
用户可以一直输入,当输入为100时,结束输入,并在屏幕上输出一个九九乘法表。
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<curses.h>
#include<ctype.h>
int main()
{
float **p;
float a;
int m,n;
int i,j,x,y;
int temp,k;
m=100;//行数
n=2;//列数
p = (float **) malloc(sizeof(float *) *m);//申请一组一维指针空间。
for(i=0; i<m; i++)
p[i] = (float *) malloc(sizeof(float) *n);//对于每个一维指针,申请一行数据的空间。
printf("依次输入学号和身高,输入任意字母并回车即可中断输入!\n");
for(i=0;i<m;i++)//循环输入数据
{
printf("输入第%d行的数据:",i+1);
for(j=0; j<n; j++)
{
scanf("%f",&p[i][j]);//输入第i行第j列的数据。
a=p[i][j];
if((int) a==0)//判断是否为数字,如果输入的不是数字a的值为0结束循环
{
p[i][j]=0;
goto T;//用goto跳出双重循环,结束输入步骤
}
}
}
T:
for(int x=1; x<i; x++)//这个for循环就是插入排序
{ //通过上面输入循环的到的i,以i为结尾,找到p[x]的位置;
int y=0;
while( (p[y][1]<p[x][1]) && (y<x))//如果前一个值小于后一个值,那么将p[y]往前一行
{
y++;
}//将元素插入到正确的位置
if(x != y) //如果x==y,说明p[x]刚好在正确的行
{
int temp = p[x][1]; //float
for(int k = x; k > y; k--)
{
p[k][1] = p[k-1][1];
}
p[y][1] = temp;
}
}
printf("\n输入的数组为%d行%d列:\n",i+1,n);
for(x=0;x<=i;x++)//循环输出二维数组
{
printf("第%d行数据为:",x+1);
for(y=0;y<n;y++)
{
if(y==0)//判断当前列是否为学号
printf("%d\t",(int) p[x][y]);//将学号强制转换为整形
else
printf("%.2f",p[x][y]);//保留身高两位小数
}
printf("\n");
}
for(i=0;i<m;i++)//释放掉动态数组
free(p[i]);
free(p);
return 0;
}[此贴子已经被作者于2020-2-23 19:59编辑过]
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<curses.h>
#include<ctype.h>
int main()
{
float **p;
float a;
int m,n;
int i,j,x,y,k;
int temp;
m=100;//行数
n=2;//列数
p = (float **) malloc(sizeof(float *) *m);//申请一组一维指针空间。
for(i=0; i<m; i++)
p[i] = (float *) malloc(sizeof(float) *n);//对于每个一维指针,申请一行数据的空间。
printf("依次输入学号和身高,输入任意字母并回车即可中断输入!\n");
for(i=0;i<m;i++)//循环输入数据
{
printf("输入学号%d的身高:",i+1);
for(j=0; j<n; j++)
{
if(j==1)
{
scanf("%f",&p[i][j]);//输入第i行第j列的数据。
a=p[i][j];
if((int) a==0)//判断是否为数字,如果输入的不是数字a的值为0结束循环
{
p[i][j]=0;
goto T;//用goto跳出双重循环,结束输入步骤
}
}
else
p[i][j]=i+1;
}
}
T:
for(int x=1; x<i; x++)//这个for循环就是插入排序
{ //通过上面输入循环的到的i,以i为结尾,找到p[x]的位置;
int y=0;
while( (p[y][1]<p[x][1]) && (y<x))//如果前一个值小于后一个值,那么将p[y]往前一行
{
y++;
}//将元素插入到正确的位置
if(x != y) //如果x==y,说明p[x]刚好在正确的行
{
float temp = p[x][1];
for(int k = x; k > y; k--)
{
p[k][1] = p[k-1][1];
}
p[y][1] = temp;
}
}
printf("\n输入的数组为%d行%d列:\n",i+1,n);
for(x=0;x<=i;x++)//循环输出二维数组
{
printf("第%d行数据为:",x+1);
for(y=0;y<n;y++)
{
if(y==0)//判断当前列是否为学号
printf("%d\t",(int) p[x][y]);//将学号强制转换为整形
else
printf("%.2f",p[x][y]);//保留身高两位小数
}
printf("\n");
}
for(i=0;i<m;i++)//释放掉动态数组
free(p[i]);
free(p);
return 0;
}
这是修改后的