以下分享个人做了编程题之后的发现及能力提升。
本次分享:
- 代码展示
- 代码分析(核心部分着重);
示例一:
阿拉伯数字翻译成罗马数字;
这道编程题的原答案是用指针做的,之后老师改成了三维数组来解决:
代码展示
#include<stdio.h>
#include<string.h>
int main()
{
char a[][10][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XCC",
"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"
};
int n,t,i,m;
printf("Please input number: ");
scanf("%d",&n);
printf("Output:\n");
if(n<=0 || n>=1000)
{
printf("Input error!\n");
return 0;
}
printf("%d=",n);
for(m=0,i=1000;m<3;m++,i/=10)
{
t=(n%i)/(i/10);//核心。
printf("%s",a[2-m][t]);
}
putchar(10);
return 0;
}
需要三维数组,然后提取出百位,十位,各位,然后一一对应到三维数组里就可以实现转换。
核心算法部分:
for(m=0,i=1000;m<3;m++,i/=10)
{
t=(n%i)/(i/10);
printf("%s",a[2-m][t]);
}
m=0;m<3;用1000来mod可以实现分离个位十位百位
putchar(10);
此处的putchar(10)输出为’\0’,作换行输出,作用类似于printf("\n");
由此段(n%i)/(i/10)表达式得出:
值得注意的是n%m(n<m)时其值是1.并非0(因为以往总认为是0)…
示例二:
统计单词字母个数;
代码展示:
#include <stdio.h>
#include <string.h>
int main()
{
char str[1000]; // 用来读取整个字符串
char *pStr; // 一个字符指针,用来存储以空格和点号分割的字符串
int iCount = 0; // 记录已经有多少数字输出了,由于每个数字间用一个空格分开,因而需要记录数字的输出数目
printf("please input str:");
gets(str);
pStr = strtok(str, " ."); // 先用空格和点号作一次切割
printf("Output:\n");
while(pStr)
{
if(iCount++)
{
putchar(' '); // 数字间使用一个空格分割
}
printf("%d", strlen(pStr)); // 输出单词的长度
pStr = strtok(NULL, " ."); // 做下一次分割
}
putchar('\n'); // 别忘了换行
return 0;
}
由于此处涉及到了指针的运用导致不得不提前涉猎(本来预计寒假开始)…
代码分析在代码中都一 一 体现了,
char *pStr strtok(str," .");
pStr = strtok(NULL, " ."); 这几个涉及指针部分,先学这部分可以解决类似问题。
此处对代码中的NULL作特别说明;
*p=NULL,指针的变化是p指向了一个地址未0的内存,这就提醒不能对此指针进行引用操作。NULL其实就是0x0.
空指针指没有定位内存的指针,值为NULL(0)。