以下は、プログラミングの質問をした後の個人的な発見と能力の向上を共有しています。
この共有:
- コード表示
- コード分析(コア部分に焦点を当てる);
例1:
アラビア数字をローマ数字に変換します。
このプログラミングの質問に対する元の回答はポインタを使用して作成され、教師はそれを解決するために3次元配列に変更しました:
code show
#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;
}
3次元配列が必要です。次に、数百、数十、および桁が抽出され、3次元配列への1対1のマッピングを変換できます。
コアアルゴリズム部分:
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と見なされていたため)。
例2:
単語の文字数を数えます。
コード表示:
#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;
}
ここではポインターの使用が関係しているので、事前に手を出す必要があります(冬休みが始まると予想されていました)...
コード分析は、コードに1つずつ反映され
ます。char* pStr strtok(str、 "。");
pStr = strtok(NULL、 "。");これらにはポインター部分が含まれます。最初にこの部分を学習して、同様の問題を解決してください。
コード内のNULLの特別な説明は次のとおりです。
* p = NULL、ポインタの変更は、アドレスが0でないメモリをpが指していることです。これは、ポインタを参照できないことを示しています。NULLは実際には0x0です。null
ポインタはメモリを見つけられないポインタを指し、値はNULL(0)です。