菜单

Dau
Dau
发布于 2025-01-14 / 37 阅读
0
2

CS61C-Project1(fa20)

本课程学习资源:

CS自学指南

cs61c | CS自学社区

CS 61C

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;
}


评论