各位高手,麻烦帮小弟解决一个C++程序中的问题。不胜感激!!!

时间:2022-05-14 14:14:31
现在有一文件名为1.txt的文本文件。以下是这个文件中的数据:
0.000000 0.000192 0.999808 
0.000002 0.976355 0.023643  
0.000000 0.000484 0.999516 
0.000005 0.205843 0.794153 
0.000006 0.338567 0.661427 
0.000003 0.042140 0.957856 
0.000016 0.879539 0.120445 
0.000006 0.654224 0.345770 
0.000004 0.137737 0.862259 
0.999998 0.000002 0.000000
现在要求根据每行数据的最大值,显示此数据所在的位置。
例如对于第一行的数据,0.999808是最大值,它所在的位置是第三列,于是输出3。
对于第二行数据,0.976355是最大值,它所在的位置是第二列,于是输出2。依次类推。
最终结果输出10个数字,要求结果输入到一个名为ceshi.txt的文本中。并要求前5个数据在第一列输出,后5个数据在第二列输出,根据计算,输出结果应该为:
3  3
2  2
3  2 
3  3
3  1
小弟的程序如下,但结果始终无法输出,请各位大侠,各位高手,各位前辈帮忙修改修改,小弟不胜感激!!!
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <memory.h>
#include <string>
using namespace std;
double maxarray(double *a)
{
double max=-10000000;
for(int i=0;i<3;i++)
if(a[i]>max)
max=a[i];
return max;
}
void main()
{
    double * pattern1;
    char *b1;
    FILE * stream1;
    float readdata1;
    pattern1=new double[10*3];
    b1=new char[10*3];
    CString filePath1="e:\\\\1.txt";
     if((stream1=fopen(filePath1,"r"))!=NULL){
    fseek(stream1,0L,SEEK_SET);
for(int i=0;i<10;i++){
for(int j=0;j<3;j++){
           fscanf(stream1,"%f,",&readdata1);

   pattern1[i*3+j]=readdata1;}
double m;
m=maxarray(pattern1);
      for(int t=0;t<10;t++)

               if(pattern1[i*3+0]==m)
                    b1[t]='1';
               if(pattern1[i*3+1]==m)
                    b1[t]='2';
               if(pattern1[i*3+2]==m)
   b1[t]='3';
        
}

fclose(stream1);
}

filePath1="e:\\\\ceshi1.txt";
if((stream1=fopen(filePath1,"w"))!=NULL){
for(int i=0;i<5;i++){
for(int j=0;j<2;j++){
fprintf(stream1,"%14c",b1[i*2+j]);
}
fprintf(stream1,"\n");
}
fclose(stream1);
}
}

13 个解决方案

#1


\\\\
多了两个

#2


不是\\\\的问题,设定断点时,这里没有出现问题。

#3


引用 2 楼 xin_9318 的回复:
不是\\\\的问题,设定断点时,这里没有出现问题。

你自己已经单步调试了?没发现哪里出问题了吗?

#4


单步调试和设断点调试是程序员必须掌握的技能之一。

#5


刚建了一个游戏qq群:108546670(3D游戏程序设计) 主要探讨一些游戏开发方面的技术和经验以及C++方面的知识,有兴趣的可以加一下~_~

#6


#include <iostream>
#include <string>
using namespace std;

double maxarray(double *a)
{
double max = -10000000;
for(int i=0; i<3; i++)
{
if (*(a+i) > max)
{
max = *(a+i);   //从当前地址起加i
}
}
return max;
}
void main()
{
double * pattern1;
char *b1;
FILE * stream1;
float readdata1;

pattern1 = new double[10*3]; 
memset(pattern1, 0.0, 10*3);      //-->My Code:inatialize
b1 = new char[10*3];   
memset(b1, '\0', 10*3);   //-->My Code:inatialize

string filePath1="e:\\1.txt";     //->My Code

if((stream1=fopen(filePath1.c_str(),"r"))!=NULL)
{
fseek(stream1, 0L, SEEK_SET);

for(int i=0;i<10;i++)
{
for(int j=0;j<3;j++)
{
fscanf_s(stream1,"%f",&readdata1);  
pattern1[i*3+j]=readdata1;
}

double m;
m = maxarray(pattern1+3*i);  //--> My Code第一次pattern[0],第二次pattern[3],以此类推

if(pattern1[i*3+0] == m)
{
b1[i]='1';

if(pattern1[i*3+1] == m)
{
b1[i]='2';
}
if(pattern1[i*3+2] == m)
{
b1[i]='3';
}

}
fclose(stream1);
}

filePath1="e:\\ceshi1.txt";   //-->MyCode
if((stream1=fopen(filePath1.c_str(),"w"))!=NULL)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<2;j++)
{
fprintf(stream1,"%14c",b1[i*2+j]);
}
fprintf(stream1,"\n");
}
fclose(stream1);
}
}

#7


改好了,VC6测试通过,问题比较多,LZ对照看一下吧,主要问题:
1.maxarray函数按你原来的,始终只比较第一行;
2.浮点数比较不能直接“=”
3.动态内存没有释放
4.注意排版


//#include <time.h>
#include <math.h>
//#include <stdlib.h>
#include <iostream>
//#include <string.h>
//#include <memory.h>
#include <string>
using namespace std;
double maxarray(double *a,int j)
{
double max=-10000000;
for(int i=0;i<3;i++)
if(a[j*3+i]>max)
max=a[j*3+i];
return max;
}
void main()
{
  double * pattern1;
  char *b1;
  int t=0,i,j;
  FILE * stream1;
  float readdata1;
  pattern1=new double[10*3];
  b1=new char[10];
  string filePath1="e:\\1.txt";
  if((stream1=fopen(filePath1.c_str(),"r"))!=NULL){
fseek(stream1,0L,SEEK_SET);
for(i=0;i<10;i++){
for(j=0;j<3;j++){
  fscanf(stream1,"%f,",&readdata1);

pattern1[i*3+j]=readdata1;}
double m;
m=maxarray(pattern1,i);
cout<<"m="<<m<<endl;
//  for(int t=0;t<10;t++)
//  {
  if(m-pattern1[i*3+0]<0.00001)       //不能直接“=”
  b1[t++]='1';
  if(m-pattern1[i*3+1]<0.00001)
  b1[t++]='2';
  if(m-pattern1[i*3+2]<0.00001)
b1[t++]='3';

cout<<"b"<<t<<"="<<b1[t-1]<<endl;
//}
}

fclose(stream1);
}

filePath1="e:\\ceshi1.txt";
if((stream1=fopen(filePath1.c_str(),"w"))!=NULL){
for(i=0;i<5;i++){
fprintf(stream1,"%c\t%c",b1[i],b1[i+5]);
fprintf(stream1,"\n");
}
fclose(stream1);
}
delete(b1);       //动态内存没有释放
delete(pattern1);
}

#8


学习了 呵呵

#9


引用 7 楼 lylm 的回复:
改好了,VC6测试通过,问题比较多,LZ对照看一下吧,主要问题:
1.maxarray函数按你原来的,始终只比较第一行;
2.浮点数比较不能直接“=”
3.动态内存没有释放
4.注意排版

太强大了

#10


学习了

#11


调试看看就会发现问题在那里

#12


多谢各位高手的指点,小弟谢谢了。万分感谢!!!

#13


在上面高手的基础上修改了一下,能够达到楼主的要求


#include <math.h>
#include <iostream.h>
#include <string>
#include <iomanip.h>
using namespace std;
double maxarray(double *a,int j)
{
double max=-10000000;
for(int i=0;i<3;i++)
if(a[j*3+i]>max)
max=a[j*3+i];
return max;
}
void main()
{
  double * pattern1;
  char *b1;
  int t=0,i,j;
  FILE * stream1;
  float readdata1;
  pattern1=new double[10*3];
  b1=new char[10];
  string filePath1="e:\\1.txt";
  if((stream1=fopen(filePath1.c_str(),"r"))!=NULL){
fseek(stream1,0L,SEEK_SET);
for(i=0;i<10;i++){
for(j=0;j<3;j++){
  fscanf(stream1,"%f,",&readdata1);

pattern1[i*3+j]=readdata1;}
double m;
m=maxarray(pattern1,i);

  if(m-pattern1[i*3+0]<0.00001)       // 不能直接“=”
  b1[t++]='1';
  if(m-pattern1[i*3+1]<0.00001)
  b1[t++]='2';
  if(m-pattern1[i*3+2]<0.00001)
   b1[t++]='3';
  
  
cout<<setw(2)<<b1[t-1];//设置宽度
if(t%2==0)             //两个数一行
cout<<endl;


}

fclose(stream1);
}

filePath1="e:\\ceshi1.txt";
if((stream1=fopen(filePath1.c_str(),"w"))!=NULL){
    for(i=0;i<5;i++){
fprintf(stream1,"%c\t%c",b1[i],b1[i+5]);
fprintf(stream1,"\n");
}
fclose(stream1);
}
delete(b1);       // 动态内存没有释放
delete(pattern1);
}

#1


\\\\
多了两个

#2


不是\\\\的问题,设定断点时,这里没有出现问题。

#3


引用 2 楼 xin_9318 的回复:
不是\\\\的问题,设定断点时,这里没有出现问题。

你自己已经单步调试了?没发现哪里出问题了吗?

#4


单步调试和设断点调试是程序员必须掌握的技能之一。

#5


刚建了一个游戏qq群:108546670(3D游戏程序设计) 主要探讨一些游戏开发方面的技术和经验以及C++方面的知识,有兴趣的可以加一下~_~

#6


#include <iostream>
#include <string>
using namespace std;

double maxarray(double *a)
{
double max = -10000000;
for(int i=0; i<3; i++)
{
if (*(a+i) > max)
{
max = *(a+i);   //从当前地址起加i
}
}
return max;
}
void main()
{
double * pattern1;
char *b1;
FILE * stream1;
float readdata1;

pattern1 = new double[10*3]; 
memset(pattern1, 0.0, 10*3);      //-->My Code:inatialize
b1 = new char[10*3];   
memset(b1, '\0', 10*3);   //-->My Code:inatialize

string filePath1="e:\\1.txt";     //->My Code

if((stream1=fopen(filePath1.c_str(),"r"))!=NULL)
{
fseek(stream1, 0L, SEEK_SET);

for(int i=0;i<10;i++)
{
for(int j=0;j<3;j++)
{
fscanf_s(stream1,"%f",&readdata1);  
pattern1[i*3+j]=readdata1;
}

double m;
m = maxarray(pattern1+3*i);  //--> My Code第一次pattern[0],第二次pattern[3],以此类推

if(pattern1[i*3+0] == m)
{
b1[i]='1';

if(pattern1[i*3+1] == m)
{
b1[i]='2';
}
if(pattern1[i*3+2] == m)
{
b1[i]='3';
}

}
fclose(stream1);
}

filePath1="e:\\ceshi1.txt";   //-->MyCode
if((stream1=fopen(filePath1.c_str(),"w"))!=NULL)
{
for(int i=0;i<5;i++)
{
for(int j=0;j<2;j++)
{
fprintf(stream1,"%14c",b1[i*2+j]);
}
fprintf(stream1,"\n");
}
fclose(stream1);
}
}

#7


改好了,VC6测试通过,问题比较多,LZ对照看一下吧,主要问题:
1.maxarray函数按你原来的,始终只比较第一行;
2.浮点数比较不能直接“=”
3.动态内存没有释放
4.注意排版


//#include <time.h>
#include <math.h>
//#include <stdlib.h>
#include <iostream>
//#include <string.h>
//#include <memory.h>
#include <string>
using namespace std;
double maxarray(double *a,int j)
{
double max=-10000000;
for(int i=0;i<3;i++)
if(a[j*3+i]>max)
max=a[j*3+i];
return max;
}
void main()
{
  double * pattern1;
  char *b1;
  int t=0,i,j;
  FILE * stream1;
  float readdata1;
  pattern1=new double[10*3];
  b1=new char[10];
  string filePath1="e:\\1.txt";
  if((stream1=fopen(filePath1.c_str(),"r"))!=NULL){
fseek(stream1,0L,SEEK_SET);
for(i=0;i<10;i++){
for(j=0;j<3;j++){
  fscanf(stream1,"%f,",&readdata1);

pattern1[i*3+j]=readdata1;}
double m;
m=maxarray(pattern1,i);
cout<<"m="<<m<<endl;
//  for(int t=0;t<10;t++)
//  {
  if(m-pattern1[i*3+0]<0.00001)       //不能直接“=”
  b1[t++]='1';
  if(m-pattern1[i*3+1]<0.00001)
  b1[t++]='2';
  if(m-pattern1[i*3+2]<0.00001)
b1[t++]='3';

cout<<"b"<<t<<"="<<b1[t-1]<<endl;
//}
}

fclose(stream1);
}

filePath1="e:\\ceshi1.txt";
if((stream1=fopen(filePath1.c_str(),"w"))!=NULL){
for(i=0;i<5;i++){
fprintf(stream1,"%c\t%c",b1[i],b1[i+5]);
fprintf(stream1,"\n");
}
fclose(stream1);
}
delete(b1);       //动态内存没有释放
delete(pattern1);
}

#8


学习了 呵呵

#9


引用 7 楼 lylm 的回复:
改好了,VC6测试通过,问题比较多,LZ对照看一下吧,主要问题:
1.maxarray函数按你原来的,始终只比较第一行;
2.浮点数比较不能直接“=”
3.动态内存没有释放
4.注意排版

太强大了

#10


学习了

#11


调试看看就会发现问题在那里

#12


多谢各位高手的指点,小弟谢谢了。万分感谢!!!

#13


在上面高手的基础上修改了一下,能够达到楼主的要求


#include <math.h>
#include <iostream.h>
#include <string>
#include <iomanip.h>
using namespace std;
double maxarray(double *a,int j)
{
double max=-10000000;
for(int i=0;i<3;i++)
if(a[j*3+i]>max)
max=a[j*3+i];
return max;
}
void main()
{
  double * pattern1;
  char *b1;
  int t=0,i,j;
  FILE * stream1;
  float readdata1;
  pattern1=new double[10*3];
  b1=new char[10];
  string filePath1="e:\\1.txt";
  if((stream1=fopen(filePath1.c_str(),"r"))!=NULL){
fseek(stream1,0L,SEEK_SET);
for(i=0;i<10;i++){
for(j=0;j<3;j++){
  fscanf(stream1,"%f,",&readdata1);

pattern1[i*3+j]=readdata1;}
double m;
m=maxarray(pattern1,i);

  if(m-pattern1[i*3+0]<0.00001)       // 不能直接“=”
  b1[t++]='1';
  if(m-pattern1[i*3+1]<0.00001)
  b1[t++]='2';
  if(m-pattern1[i*3+2]<0.00001)
   b1[t++]='3';
  
  
cout<<setw(2)<<b1[t-1];//设置宽度
if(t%2==0)             //两个数一行
cout<<endl;


}

fclose(stream1);
}

filePath1="e:\\ceshi1.txt";
if((stream1=fopen(filePath1.c_str(),"w"))!=NULL){
    for(i=0;i<5;i++){
fprintf(stream1,"%c\t%c",b1[i],b1[i+5]);
fprintf(stream1,"\n");
}
fclose(stream1);
}
delete(b1);       // 动态内存没有释放
delete(pattern1);
}