求给位大神,高分悬赏,重谢分,满意有巨额追加分!!

下列程序的功能是:将一正整数序列{K1,K2,...,K9}重新排列成一个新的序列。新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。要求编写函数jsValue()实现此功能,最后调用writeDat()函数将新序列输出到文件out.dat中。
说明:在程序中已给出了10个序列,每个序列有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。
例:序列{6,8,9,1,2,5,4,7,3}
经重排后成为{3,4,5,2,1,6,8,9,7}
部分源程序存在文件prog1.c中。
【追加50分!!如果是正确的函数我验证成功了,再追加50分!!来吧,各位高手!帮帮我,万谢啊!!】
【我用的是TC2.0 ,这是硬规定,还请仔细看题目】
以下是我找到的解题思路可以参考,求详细过程,万分感谢!!(因为我是小白,囧~)
【解题思路】对于二维数维a[10][9],利用两个for循环语句实现对数组中每个元素的访问。在外层循环中当自变量i从0递增到9,完成对10个序列的访问。对每一个序列,首先把第1个元素的值赋给value,然后在第二层循环中对a[i][0]后面的每~个元素进行判断,如果表达式a[i][j]<value成立,则把a[i][j]的值赋给num,再把a[i][j]前面的每一个元素向后移动一个位置,最后把num的值赋给a[i][0]。

你看看这个怎么样,排序方法是快速排序的最基础的一部分
你可以研究一下快速排序
#include <stdio.h>
#include <stdlib.h>

int NUM[10][9] = {
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3
};

void jsValue(){
int temp;
int i,j,k;
for(k=0;k<10;k++){/*分别对第一行至第十行进行排序*/
temp=NUM[k][0];
i=0;
j=8;
while(i<j){
while(NUM[k][j]>temp&&i<j) j--;
if(i<j){
NUM[k][i]=NUM[k][j];
i++;
}
while(NUM[k][i]<temp&&i<j) i++;
if(i<j){
NUM[k][j]=NUM[k][i];
j--;
}
}
NUM[k][i]=temp;
}

}

writeDat()
{
FILE *fout;
int i,j;
fout=fopen("c:\\out.dat","w");/*我把文件存在了C盘*/
for(i=0;i<10;i++){
for(j=0;j<9;j++) fprintf(fout,"%3d",NUM[i][j]);
fprintf(fout,"\n");
}
}
void main()
{
jsValue();
writeDat();
}追问

我对您的崇拜无法用语言来表达!非常感谢您!但有个小问题,以下是您的程序执行后的结果:
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
6 8 9 6 6 6 6 7 6
我很费解…麻烦您了!

追答

你是不是看错了?我的运行结果截图给你看
请注意,排序后,我的文件是存在了C盘根目录下,不要找错文件了
请注意,请直接复制粘贴我的完整程序,以免自己打错了
我知道TC2.0并不适合直接复制粘贴较长的程序,希望你能一点一点的复制进去
在大一刚学C的时候,我们也是使用TC2.0的,实在是不适合编辑源程序
而且我可以替楼上告诉你,楼上的注释符号//在TC里不是注释符号,所以才有了许多错误
关于原理,请去查看快速排序

追问

谢谢谢谢!!成功了!!您能加入些注释行吗?写上具体的作用。因为我是初学的菜鸟,很多东西都不太懂,而这个函数的完成对我来说非常非常非常重要的!!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-10
#include <stdio.h>
void jsValue(int(*a)[9])
{
int i,j,k,t;
int key;
for(i=0;i<10;i++)
{
key=a[i][0];
for(j=1;j<9;j++)
{
if(a[i][j]<key) /*如果a[i][j]<key,就把a[i][j]移到最前面的a[i][0]*/
{
t=a[i][j];
for(k=j;k>0;k--) /* a[i][0]--a[i][j]之间的元素全部向后移动一次 */
{
a[i][k]=a[i][k-1];
}
a[i][0]=t;
}
}
}
}
void writeDat(int(*a)[9])
{
FILE *fp;
int i,j;
fp=fopen("d:\\out.dat","w");
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
fprintf(fp,"%d ",a[i][j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}

int main()
{
int NUM[10][9] =
{
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3
};
int i,j,k;
jsValue(NUM);
for(i=0;i<10;i++)
{
for(j=0;j<9;j++)
{
printf("%d ",NUM[i][j]);
}
printf("\n");
}
writeDat(NUM);
printf("以上已写入文件:d:\\out.dat!!!\n");
return 0;
}

结果:
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7
3 4 5 2 1 6 8 9 7本回答被网友采纳
第2个回答  2012-06-04
static int NUM[10][9] = {
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3
};

void Move(int row, int count)
{
for (int i = count - 1; i >= 0; i--)
{
NUM[row][i + 1] = NUM[row][i];
}
}

void jsValue()
{
for (int i = 0; i < 10; i++)
{
int first = NUM[i][0];
for (int k = 0; k < 9; k++)
{
if (first > NUM[i][k])
{
int temp = NUM[i][k];
Move(i, k);
NUM[i][0] = temp;
}
}
}
}

void writeDat()
{
FILE* pFile = fopen("out.dat", "w");
if (!pFile)
{
fclose(pFile);
}

int a = sizeof(NUM);
fwrite(NUM, sizeof(NUM),1, pFile);
fclose(pFile);
}

void ReadData()
{
FILE* pFile = fopen("out.dat", "r");
if (!pFile)
{
fclose(pFile);
}

int a = sizeof(NUM);
fread(NUM, sizeof(NUM),1, pFile);
fclose(pFile);
}

int _tmain(int argc, _TCHAR* argv[])
{
//ReadData();
jsValue();
writeDat();

for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 9; k++)
{
printf("%d ", NUM[i][k]);
}
printf("\n");
}

getchar();
return 0;
}追问

【非常感谢,我正在验证函数中。请您给函数加上注释行,写上具体的作用。因为我是初学的菜鸟,很多东西都不太懂,而这个函数的完成对我来说非常重要!如果您的注释详细,我会给您高分追加的再次感谢!!】

【验证完啦,结果是:警告2个,错误20个。我晕死~~~大哥,您能认真点吗— —# 不过还是要说谢谢!!】

追答

// Demo.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

// 初始化数组, 10个数组都用你给的例子作为初始值
static int NUM[10][9] = {
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3,
6,8,9,1,2,5,4,7,3
};

// 移动数组的位置, row是哪一个数组, count就是移动打是前几个
// 例如Move(2, 3), 就是移动的是NUM[2]的前3 - 1个都往后移动,把第一个空出来,把比较之后小的
// 放到第一个位置上
void Move(int row, int count)
{
for (int i = count - 1; i >= 0; i--)
{
NUM[row][i + 1] = NUM[row][i];
}
}

// 交换函数
void jsValue()
{
// 二位数组的遍历
for (int i = 0; i NUM[i][k])
{
int temp = NUM[i][k];
Move(i, k);
NUM[i][0] = temp;
}
}
}
}

// 写文件
void writeDat()
{
FILE* pFile = fopen("out.dat", "w");
if (!pFile)
{
fclose(pFile);
}

int a = sizeof(NUM);
fwrite(NUM, sizeof(NUM),1, pFile);
fclose(pFile);
}

// 读取数据做测试使用, 主要是测试写入的数据对不对
void ReadData()
{
FILE* pFile = fopen("out.dat", "r");
if (!pFile)
{
fclose(pFile);
}

int a = sizeof(NUM);
fread(NUM, sizeof(NUM),1, pFile);
fclose(pFile);
}

int _tmain(int argc, _TCHAR* argv[])
{
//ReadData();
jsValue();
writeDat();

// 遍历把移动后的数据打印出来,查看结果是否正确
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 9; k++)
{
printf("%d ", NUM[i][k]);
}
printf("\n");
}

getchar();
return 0;
}

相似回答