Spreadsheet

电子表格
链接
Spreadsheet
问题描述

1979年,Dan Bricklin和Bob Frankston编写了VisiCalc,这是第一个电子表格应用程序。它取得了巨大的成功,在当时,它是Apple II电脑的杀手级应用程序。如今,电子表格在大多数台式电脑上都能找到。 电子表格背后的想法非常简单,尽管很强大。电子表格由一个表格组成,其中每个单元格包含一个数字或公式。公式可以计算依赖于其他单元格值的表达式。可以添加文本和图形以进行演示。 您将编写一个非常简单的电子表格应用程序。你的程序应该接受几个电子表格。电子表格的每个单元格都包含一个数值(仅限整数)或一个公式(仅支持和)。计算完所有公式的值后,程序应输出结果电子表格,其中所有公式已被其值替换。 图:左上角单元格的命名

输入

输入文件的第一行包含要遵循的电子表格数。电子表格以两个整数组成的行开始,用空格隔开,给出列和行的数目。电子表格的以下行各包含一行。一行由该行的单元格组成,由一个空格分隔。

单元格由数字整数值或公式组成。公式以等号(=)开头。之后,一个或多个单元格名称将跟随,并用加号(+)分隔。此公式的值是在引用单元格中找到的所有值的总和。这些单元格可能再次包含公式。公式中没有空格。

您可以安全地假设单元之间没有循环依赖关系。所以每个电子表格都可以完全计算出来。
单元格的名称由列的1到3个字母和行的1到999(包括)之间的数字组成。该列的字母组成以下系列:A、B、C、…、Z、AA、AB、AC、…、AZ、BA、…、BZ、CA、…、ZZ、AAA、AAB、…、AAZ、ABA、…、ABZ、ACA、…、ZZZ。这些字母对应于从1到18278的数字。左上角的单元格名为A1。见图。
在这里插入图片描述

输出
程序的输出格式应与输入格式相同,只是不重复电子表格的数目以及列和行的数目。此外,所有公式都应替换为其值。

思路

就是这样的,先设置一个结构体,存放输入的每一位字符,前面单纯的数字也当做字符输入,是为了后面A1这一类的字符容易存放,以及提取,结构体中再定义一个整数用来存放对应的数字(由前面输入的字符串转化而来的,包括公式)

定义一个结构体类型的二维数组(数组下标就是每个数字对应的坐标),然后主函数里面,输入数据字符串,在数组里面存放好,然后,(我写了一个函数,我觉得看的更清楚)这个函数就是用来转化字符串为具体数字,最主要的就是这个函数,

转换思路:

将有字母的和没有字母的分开转化,由题意可知,公式的第一个字符是"="因此我只需要判断传入的字符串的第一个是不是等号就行了,数字转换肯定知道,主要就是字母转化,比如A1这个是不是可以看做是一个坐标(1,1),我得到一个坐标(也就是当字符串A1+B1循环进行到“+”的时候既不是字母又不是数字,将坐标再次传入函数得到其对应的数据存入返回的数据ans中)进而得到公式的具体值。
最后再说一点,就是标记,避免不必要的重复。

# include <stdio.h>
# include <string.h>
struct c
{
 	char a[1000];//存放输入字符
 	int num;//对应数字 
}s[1000][1000];
int used[1000][1000];//标记
int num (int z,int x)
{
 	if(used[z][x]!=0)
 	return s[z][x].num;
 	int l=strlen(s[z][x].a),ans=0;
 	if(s[z][x].a[0]!='=')
 	{
  		for(int i=0;i<l;i++)
  		{
   			ans=ans*10+s[z][x].a[i]-'0';
  		}return ans;
 	}
 	else 
 	{
  		int k=0,j=0;
  		for(int i=1;i<=l;i++)
  		{
   			if(s[z][x].a[i]>='A'&&s[z][x].a[i]<='Z')
   			{
    				k=k*26+(s[z][x].a[i]-'A'+1);
  			}
   			else if(s[z][x].a[i]>='0'&&s[z][x].a[i]<='9')
   			{
    				j=j*10+s[z][x].a[i]-'0';
   			}
   			else
   			{
    				ans+=num(j,k);
    				j=0;k=0;
   			}
  		}return ans;
 	}
}
int main()
{
 	int n;
 	scanf("%d",&n);
 
 	while(n--)
 	{
  
 		int x,y;
  		scanf("%d %d",&x,&y);
  		for(int i=1;i<=y;i++)
  		{
   			for(int j=1;j<=x;j++)
   			{
   // used[i][j]=1;
    				scanf("%s",&s[i][j].a);
   // s[i][j].num=num(i,j);
   			}
  		}
  		for(int i=1;i<=y;i++)
  		{
   			for(int j=1;j<=x;j++)
   			{
    
    //scanf("%s",&s[i][j].a);
    			s[i][j].num=num(i,j);
    			used[i][j]=1;
   			}
  		}
  	for(int i=1;i<=y;i++)
  	{
   		for(int j=1;j<x;j++)
   		{
    		printf("%d ",s[i][j].num);
   		}printf("%d\n",s[i][x].num);
  	}memset(used,0,sizeof(used));
      } 
 
} 

其实呢,我这个做法不算是正解,虽然在杭电过了,,范围再大一点,肯定就超了。还是用拓扑排序更好,,但是,能力有限,,,还没搞懂,,就先用递归做了,,

发布了27 篇原创文章 · 获赞 5 · 访问量 543
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览