c的两个半问题

第一个问题.我自己临时修复了.不过不好用.有的时候可以.有的时候不行.我和同学公认的解决方案是那个地方用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;
}
 
第二个问题是我用阶梯法解奇幻方调整过程.调整部分我没有写完.在测试的时候原始数组可以输出.后面的不能输出.这个不知道原因.第一个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       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++;
 }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");
 }
**/
 
}
 
第三个在开始赋值的时候如果不赋值后面就悲剧了.直接弹出内存读写错误.
这里是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");

}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值