第一个问题.我自己临时修复了.不过不好用.有的时候可以.有的时候不行.我和同学公认的解决方案是那个地方用C++写.问题在最后的我用的是%s 他是%c这个是对文件异或加密的解密程序.要快速到后面输入个错误密码就可以了.中间的具体过程不用去关心.我只关心后面的scanf为啥有的时候没法用?
#include<stdio.h>
//#include<iostream.h>
#include<stdlib.h>
#define ALLOCATE 1000
#define INCREMENT 1000000
int main()
{FILE *fp;
char *a=(char *)malloc(sizeof(char)* ALLOCATE );
char *p;
long i=0,k,j,size=ALLOCATE;
char c,ch='y',h1;
fp=fopen("2.avi","rb");
if(!fp)
{printf("can not open the file/n");
exit(-1);}
while(ch=='y')
{printf("请输入密码:");
scanf("%i",&j);
if(j==123)
{
srand(j);
c=fgetc(fp);
while(!feof(fp))
{
if(i==size)
{
p=(char *)malloc(sizeof(char)*(size+INCREMENT));
for(k=0;k<size;k++)
p[k]=a[k];
a=p;
size=size+INCREMENT;
}
h1=rand();
h1=h1^c;
a[i]=h1;
i++;
c=fgetc(fp);
}//endwhile(!feof(fp))
fp=fopen("2.avi","wb");
for(k=0;k<=i-1;k++)
fputc(a[k],fp);
printf("解密完成!/n");
fclose(fp);
delete a;
exit(1);
}//end if(j==123)
else
{
//cout<<"密码错误!!是否继续尝试(y/n):";
//ch=getchar();
printf("密码错误!!是否继续尝试(y/n):");
//cin>>ch;
//scanf("%c",&ch);
scanf("%s",&ch);
}
}
system("PAUSE");
return 0;
}
//#include<iostream.h>
#include<stdlib.h>
#define ALLOCATE 1000
#define INCREMENT 1000000
int main()
{FILE *fp;
char *a=(char *)malloc(sizeof(char)* ALLOCATE );
char *p;
long i=0,k,j,size=ALLOCATE;
char c,ch='y',h1;
fp=fopen("2.avi","rb");
if(!fp)
{printf("can not open the file/n");
exit(-1);}
while(ch=='y')
{printf("请输入密码:");
scanf("%i",&j);
if(j==123)
{
srand(j);
c=fgetc(fp);
while(!feof(fp))
{
if(i==size)
{
p=(char *)malloc(sizeof(char)*(size+INCREMENT));
for(k=0;k<size;k++)
p[k]=a[k];
a=p;
size=size+INCREMENT;
}
h1=rand();
h1=h1^c;
a[i]=h1;
i++;
c=fgetc(fp);
}//endwhile(!feof(fp))
fp=fopen("2.avi","wb");
for(k=0;k<=i-1;k++)
fputc(a[k],fp);
printf("解密完成!/n");
fclose(fp);
delete a;
exit(1);
}//end if(j==123)
else
{
//cout<<"密码错误!!是否继续尝试(y/n):";
//ch=getchar();
printf("密码错误!!是否继续尝试(y/n):");
//cin>>ch;
//scanf("%c",&ch);
scanf("%s",&ch);
}
}
system("PAUSE");
return 0;
}
第二个问题是我用阶梯法解奇幻方调整过程.调整部分我没有写完.在测试的时候原始数组可以输出.后面的不能输出.这个不知道原因.第一个for的循环是输出阶梯法的数组.
0 0 0 0 5 0 0 0 0零
0 0 0 4 0 10 0 0 0一
0 0 3 0 9 0 15 0 0二
0 2 0 8 0 14 0 20 0三
1 0 7 0 13 0 19 0 25四
0 6 0 12 0 18 0 24 0五
0 0 11 0 17 0 23 0 0六
0 0 0 16 0 22 0 0 0七
0 0 0 0 21 0 0 0 0 八
0 0 0 4 0 10 0 0 0一
0 0 3 0 9 0 15 0 0二
0 2 0 8 0 14 0 20 0三
1 0 7 0 13 0 19 0 25四
0 6 0 12 0 18 0 24 0五
0 0 11 0 17 0 23 0 0六
0 0 0 16 0 22 0 0 0七
0 0 0 0 21 0 0 0 0 八
这个是第一个输出的图.
这个是要求输出的图.但是它就是没有输出.开始调整了一边.我想看看效果.没有效果
0 0 0 0 0 0 0 0 0零
0 0 0 0 0 10 0 0 0一
0 0 3 16 9 22 15 0 0二
0 0 20 8 21 14 2 0 0三
0 0 7 25 13 1 19 0 0四
0 0 24 12 5 18 6 0 0五
0 0 11 4 17 0 23 0 0六
0 0 0 0 0 0 0 0 0七
0 0 0 0 0 0 0 0 0 八
0 0 0 0 0 10 0 0 0一
0 0 3 16 9 22 15 0 0二
0 0 20 8 21 14 2 0 0三
0 0 7 25 13 1 19 0 0四
0 0 24 12 5 18 6 0 0五
0 0 11 4 17 0 23 0 0六
0 0 0 0 0 0 0 0 0七
0 0 0 0 0 0 0 0 0 八
# include "stdio.h"
void main()
{
int i,j,x,y;
int a[9][9]={0};//总数组.
int hang=4,lie=0;//行和列
int ljq1=0;//计数器
int k=1;//赋值的累加
do //输入模块 混合调整模块
{//调度算法
a[hang][lie]=k;//保障赋值.从1到n^2
ljq1++;
if (ljq1==5) //计数器归零.想办法跳转.
{
hang+=5;
lie-=3;
ljq1=0;
k++;
continue;
}
hang--;
lie++;
k++;
void main()
{
int i,j,x,y;
int a[9][9]={0};//总数组.
int hang=4,lie=0;//行和列
int ljq1=0;//计数器
int k=1;//赋值的累加
do //输入模块 混合调整模块
{//调度算法
a[hang][lie]=k;//保障赋值.从1到n^2
ljq1++;
if (ljq1==5) //计数器归零.想办法跳转.
{
hang+=5;
lie-=3;
ljq1=0;
k++;
continue;
}
hang--;
lie++;
k++;
}while (k!=26);//end输入模块
for(hang=0;hang<9;hang++)//a数组输出模块
{
for (lie=0;lie<9;lie++)
{
printf("%d/t",a[hang][lie]);
}
printf("/n");
}//end a数组输出模块
printf("123/n");
//调整模块
//列调整一
for (i=0;i<3;i++)
{
for (j=2;j<8;j++)
{
if (0==a[i][j]) continue;
else{
printf("3/n");
for (x=6;x>1;x++)
{ printf("*/n");
if (a[j][x]==0)
{
a[j][x]=a[i][j];
}
}
}
}
}
printf("13/n");
//列调整二
for (i=7;i<9;i++)
{
for (j=2;j<8;j++)
{
if (0==a[i][j]) continue;
else{
for (x=6;x>1;x++)
if (a[j][x]==0)
{
a[j][x]=a[i][j];
}
}
}
}
printf("1/n");
for(hang=0;hang<9;hang++)//a数组输出模块
{
for (lie=0;lie<9;lie++)
{
printf("%d/t",a[hang][lie]);
}
printf("/n");
}
/** for(hang=0;hang<5;hang++)//c数组输出模块
{
for (lie=0;lie<5;lie++)
{
printf("%d/t",c[hang][lie]);
}
printf("/n");
}
**/
{
for (lie=0;lie<9;lie++)
{
printf("%d/t",a[hang][lie]);
}
printf("/n");
}//end a数组输出模块
printf("123/n");
//调整模块
//列调整一
for (i=0;i<3;i++)
{
for (j=2;j<8;j++)
{
if (0==a[i][j]) continue;
else{
printf("3/n");
for (x=6;x>1;x++)
{ printf("*/n");
if (a[j][x]==0)
{
a[j][x]=a[i][j];
}
}
}
}
}
printf("13/n");
//列调整二
for (i=7;i<9;i++)
{
for (j=2;j<8;j++)
{
if (0==a[i][j]) continue;
else{
for (x=6;x>1;x++)
if (a[j][x]==0)
{
a[j][x]=a[i][j];
}
}
}
}
printf("1/n");
for(hang=0;hang<9;hang++)//a数组输出模块
{
for (lie=0;lie<9;lie++)
{
printf("%d/t",a[hang][lie]);
}
printf("/n");
}
/** for(hang=0;hang<5;hang++)//c数组输出模块
{
for (lie=0;lie<5;lie++)
{
printf("%d/t",c[hang][lie]);
}
printf("/n");
}
**/
}
第三个在开始赋值的时候如果不赋值后面就悲剧了.直接弹出内存读写错误.
这里是l和k没有赋值.第一个是最小.直接输出.所以就悲剧了.这个是数组中最大的和最小的换位子
#include "stdio.h"
void main()
{
static int a[10]={1,2,3,4,5,10,9,8,7,6};
int max=0,min=0,k=0,j=0,l=0,i=0;//这里有问题.
printf("the number 1 is:/n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("/n");
max=a[0];
min=a[0];
for(i=0;i<9;i++)
if(max<a[i+1])
{
max=a[i+1];
k=i+1;
}
for(j=0;j<9;j++)
if(min>a[j+1])
{
min=a[j+1];
l=j+1;
//printf("l=%d",&l);
}
a[l]=max;
a[k]=min;
printf("/nthe number2 is:/n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("/n");
void main()
{
static int a[10]={1,2,3,4,5,10,9,8,7,6};
int max=0,min=0,k=0,j=0,l=0,i=0;//这里有问题.
printf("the number 1 is:/n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("/n");
max=a[0];
min=a[0];
for(i=0;i<9;i++)
if(max<a[i+1])
{
max=a[i+1];
k=i+1;
}
for(j=0;j<9;j++)
if(min>a[j+1])
{
min=a[j+1];
l=j+1;
//printf("l=%d",&l);
}
a[l]=max;
a[k]=min;
printf("/nthe number2 is:/n");
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("/n");
}