小弟初来乍到,向各位大佬致敬!
编程任务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; }这是修改后的