本课程学习资源:
imageloader.c
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
#include "imageloader.h"
Image *readData(char *filename)
{
//YOUR CODE HERE
FILE *fp=fopen(filename,"r");
if(fp==NULL)
return NULL;
Image *ip=(Image*)malloc(sizeof(Image));
char tempStr[2];
int tempInt;
fscanf(fp,"%s",tempStr);
fscanf(fp,"%d %d",&ip->cols,&ip->rows);
fscanf(fp,"%d",&tempInt);
ip->image=(Color**)malloc(ip->rows*sizeof(Color*));
for(int i=0;i<ip->rows;i++)
{
ip->image[i]=(Color*)malloc(ip->cols*sizeof(Color));
for(int j=0;j<ip->cols;j++)
fscanf(fp,"%hhu %hhu %hhu",&ip->image[i][j].R,&ip->image[i][j].G,&ip->image[i][j].B);
}
fclose(fp);
return ip;
}
void writeData(Image *image)
{
//YOUR CODE HERE
if(image==NULL)
return;
printf("P3\n");
printf("%d %d\n",image->cols,image->rows);
printf("255\n");
for(int i=0;i<image->rows;i++)
{
for(int j=0;j<image->cols;j++)
if(j!=image->cols-1)
printf("%3hhu %3hhu %3hhu ",image->image[i][j].R,image->image[i][j].G,image->image[i][j].B);
else
printf("%3hhu %3hhu %3hhu",image->image[i][j].R,image->image[i][j].G,image->image[i][j].B);
printf("\n");
}
}
void freeImage(Image *image)
{
//YOUR CODE HERE
if(image==NULL)
return;
if(image->image!=NULL)
{
for(int i=0;i<image->rows;i++)
free(image->image[i]);
free(image->image);
}
free(image);
}
steganography.c
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include "imageloader.h"
Color *evaluateOnePixel(Image *image, int row, int col)
{
//YOUR CODE HERE
Color OriginalColor=image->image[row][col];
int WhiteFlag=OriginalColor.B&1;
Color* ans=(Color*)malloc(sizeof(Color));
if(WhiteFlag==1)
{
ans->R=255;
ans->G=255;
ans->B=255;
}
else
{
ans->R=0;
ans->G=0;
ans->B=0;
}
return ans;
}
Image *steganography(Image *image)
{
//YOUR CODE HERE
Image* ans=(Image*)malloc(sizeof(Image));
ans->cols=image->cols;
ans->rows=image->rows;
ans->image=(Color**)malloc(ans->rows*sizeof(Color*));
for(int i=0;i<ans->rows;i++)
{
ans->image[i]=(Color*)malloc(ans->cols*sizeof(Color));
for(int j=0;j<ans->cols;j++)
{
Color* cp=evaluateOnePixel(image,i,j);
ans->image[i][j]=*cp;
free(cp);
}
}
return ans;
}
int main(int argc, char **argv)
{
//YOUR CODE HERE
char* FileName=argv[1];
if(FileName==NULL)
return -1;
Image* OriginalImage=readData(FileName);
if(OriginalImage==NULL)
return -1;
Image* DecodedImage=steganography(OriginalImage);
writeData(DecodedImage);
freeImage(OriginalImage);
freeImage(DecodedImage);
return 0;
}
gameoflife.c
由于系统没安装csh,直接main函数循环一百遍和最终结果对比
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include "imageloader.h"
uint8_t getRuleBit(uint32_t rule,uint8_t index)
{
return 1&(rule>>index);
}
uint8_t evaluate(uint32_t rule,uint8_t adjacentCount,uint8_t selfBit)
{
uint8_t RuleIndex=0;
if(selfBit==1)
RuleIndex+=9;
RuleIndex+=adjacentCount;
uint8_t RuleBit=getRuleBit(rule,RuleIndex);
return RuleBit;
}
Color *evaluateOneCell(Image *image, int row, int col, uint32_t rule)
{
//YOUR CODE HERE
if(image==NULL||image->image==NULL)
return NULL;
//Initialize adjacent color
Color AdjColor[8]={0};
int Directions[3]={-1,0,1};
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==1&&j==1)
continue;
int NewI=(row+Directions[i]+image->rows)%image->rows;
int NewJ=(col+Directions[j]+image->cols)%image->cols;
int index = (i * 3 + j) - ((i*3+j>=5)? 1 : 0);
AdjColor[index]=image->image[NewI][NewJ];
}
}
Color* ans=(Color*)malloc(sizeof(Color));
ans->R=0;
ans->G=0;
ans->B=0;
Color SelfColor=image->image[row][col];
for(int i=0;i<8;i++)
{
uint8_t RGBTargetBits[3][8];
for(int j=0;j<8;j++)
{
RGBTargetBits[0][j]=(AdjColor[j].R>>i)&1;
RGBTargetBits[1][j]=(AdjColor[j].G>>i)&1;
RGBTargetBits[2][j]=(AdjColor[j].B>>i)&1;
}
uint8_t RGBBitsCount[3];
for(int i=0;i<3;i++)
{
RGBBitsCount[i]=0;
for(int j=0;j<8;j++)
RGBBitsCount[i]+=RGBTargetBits[i][j];
}
uint8_t SelfRGBBits[3];
SelfRGBBits[0]=(SelfColor.R>>i)&1;
SelfRGBBits[1]=(SelfColor.G>>i)&1;
SelfRGBBits[2]=(SelfColor.B>>i)&1;
ans->R+=evaluate(rule,RGBBitsCount[0],SelfRGBBits[0])<<i;
ans->G+=evaluate(rule,RGBBitsCount[1],SelfRGBBits[1])<<i;
ans->B+=evaluate(rule,RGBBitsCount[2],SelfRGBBits[2])<<i;
}
return ans;
}
Image *life(Image *image, uint32_t rule)
{
//YOUR CODE HERE
if(image==NULL||image->image==NULL)
return NULL;
Image* ans=(Image*)malloc(sizeof(Image));
ans->cols=image->cols;
ans->rows=image->rows;
ans->image=(Color**)malloc(ans->rows*sizeof(Color*));
for(int i=0;i<ans->rows;i++)
{
ans->image[i]=(Color*)malloc(ans->cols*sizeof(Color));
for(int j=0;j<ans->cols;j++)
{
Color* cp=evaluateOneCell(image,i,j,rule);
ans->image[i][j]=*cp;
free(cp);
}
}
return ans;
}
int main(int argc, char **argv)
{
//YOUR CODE HERE
if(argc<3)
return -1;
char* FileName=argv[1];
char* RuleString=argv[2];
if(FileName==NULL||RuleString==NULL)
return -1;
uint32_t Rule=strtol(RuleString,NULL,16);
Image* OriginalImage=readData(FileName);
if(OriginalImage==NULL)
return -1;
Image* NextImage=NULL;
for(int i=0;i<100;i++)
{
NextImage=life(OriginalImage,Rule);
//writeData(NextImage);
freeImage(OriginalImage);
OriginalImage=NextImage;
}
writeData(NextImage);
freeImage(NextImage);
return 0;
}