一.思路
二.代码
三.总结
一.思路
本题关键是字符串读入提取的问题,
一开始我觉得用getchar一个一个读然后判断的话,如果读到等号等号前面的字符没有办法得到了
用gets一次性读入一行字符的话还是要一个一个判断
于是想着用scanf,每次读入一个单词判断一下这个单词里有没有等号
但是实际上用scanf读反而会是程度读起来更复杂。因为用scanf读入后还是要一个字符一个字符的判断
实际上还是要对字符进行逐个的判断
而之前遇到的问题可以有两种解决办法,
用getchar循环读入
一是判断等号,但是每次记录前一个读取的字符,然后判断前一个字符是否是PUI这三个字符中的某一个
一是判断是否是P,U,I这三个关键字符,然后判断其后的字符是否是等号,如果是进行数字的提取,如果不是,进行下一次循环
二.代码
#include<stdio.h>
int main() {
double P, I, U;
char c,bc,t,pre;
char line[1000];
int n;
scanf_s("%d", &n);
t = getchar();
int i;
for (i = 1; i <= n;i++) {
P = -1;
I = -1;
U = -1;
int times = 2;
while (times--) {
while ((c = getchar()) != EOF) {
if (c == '=') {
if (bc == 'I') {
scanf_s("%lf", &I);
pre = getchar();
if (pre == 'm') I = I*0.001;
else if (pre == 'k')I = I * 1000;
else if (pre == 'M')I = I * 1000000;
break;
}
if (bc == 'U') {
scanf_s("%lf", &U);
pre = getchar();
if (pre == 'm') U = U*0.001;
else if (pre == 'k')U = U * 1000;
else if (pre == 'M')U = U * 1000000;
break;
}
if (bc == 'P') {
scanf_s("%lf", &P);
pre = getchar();
if (pre == 'm') P = P*0.001;
else if (pre == 'k')P = P * 1000;
else if (pre == 'M')P = P * 1000000;
break;
}
}// if c== '='
bc = c;
}//while c=getchar
}//for i
gets_s(line);
printf("%s%d\n", "Problem #", i);
if (P == -1) { printf("P=%.2fW\n", U*I); }
else if (U==-1) { printf("U=%.2fV\n", P/I); }
else if (I==-1) { printf("I=%.2fA\n",P/U); }
}//while n
return 0;
}
三.总结
如何选择最优的读入方式
读入时 注意转行符的处理