分析程序#include<stdio.h> #include<string.h> int chseq(char ch) { if(ch>='a'&&ch<='z'){ return (ch-'a'+1); }else if(ch>='A'&&ch<='Z'){ return (ch-'A'+1); } return 0; } void output(char ch, int n) { if(n%10==1){ printf("%c is %dst character.\n",ch,n); }else if(n%10==2){ printf("%c is %dnd character.\n",ch,n); }else if(n%10==3){ printf("%c is %drd character.\n",ch,n); }else{ printf("%c is %dth character.\n",ch,n); } } int main() { char ch = getchar(); int n = chseq(ch); output(ch, n); return 0; }
时间: 2023-10-23 09:11:55 浏览: 340
这个程序的作用是接收一个字符作为输入,并输出该字符是字母表中的第几个字母。
程序中定义了两个函数:`chseq`和`output`。`chseq`函数接收一个字符作为参数,通过判断字符是否在小写字母范围或大写字母范围内,计算出该字符在字母表中的位置。小写字母a的位置为1,小写字母b的位置为2,以此类推。大写字母A的位置也为1,大写字母B的位置为2,以此类推。如果字符不是字母,则返回0。
`output`函数接收两个参数:一个字符和一个整数。根据整数的个位数字,使用条件语句选择正确的序数词(st、nd、rd或th)并打印出结果。
在`main`函数中,程序首先使用`getchar`函数获取一个字符作为输入,并调用`chseq`函数计算该字符在字母表中的位置。然后,它将字符和位置作为参数调用`output`函数,输出结果。
最后,程序返回0,表示运行成功结束。
这个程序简单明了,功能清晰,可以正确地输出给定字符是字母表中的第几个字母。
相关问题
现有一个已存放了用户加密信息的文件myfile.txt,该文件的生成就是把用户从键盘输入的字符与'x'进行异或运算,用户输入以'\n'结束。现在需要写一个程序,完成用户信息的加密并存放到myfile.txt中。 有两位同学想实现上述功能,分别完成了一个程序。 下列对两个程序的分析中正确的说法是( )。 //学生甲的程序 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { FILE *fp; int i; char ch; fp=fopen("myfile.txt","w+"); if(fp==NULL) { printf("File open error!\n"); exit(0); } ch=getchar(); while(ch!='\n') { ch=ch^'x'; fputc(ch,fp); ch=getchar(); } fclose(fp); return 0; } //学生乙的程序 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { FILE *fp; int i=0; char sec[100]; fp=fopen("myfile.txt","r+"); if(fp==NULL) { printf("File open error!\n"); exit(0); } gets(sec); while(sec[i]!='\0') { sec[i]=sec[i]^120; i++; } fputs(sec,fp); fclose(fp); return 0; }
学生甲的程序是将用户输入的字符与'x'进行异或运算后写入文件myfile.txt中,学生乙的程序是将已存在文件myfile.txt中的内容读入到char数组sec中,然后将数组sec中每个字符与120进行异或运算后再写回文件中。
由于学生乙的程序是以"r+"方式打开文件myfile.txt的,因此在写入文件时会覆盖原有的内容。而学生甲的程序是以"w+"方式打开文件myfile.txt的,每次写入文件都会截断文件并覆盖原有内容。因此,如果学生甲和学生乙的程序都运行,则最终文件myfile.txt中只会包含学生乙程序中加密后的内容。
因此,正确的说法是:学生乙的程序会覆盖学生甲程序写入的内容,最终文件中只包含学生乙程序中加密后的内容。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define maxn 1000 char buf[maxn], str[maxn], signStack[maxn], ch[2]; int len, id, idSign, idAns, i, n; double ans[maxn]; void checkSign(char sign){ if(sign == '(') signStack[idSign++] =
'('; //如果是左括号,则将其入栈
else if (sign == ')') { //如果是右括号,则将栈顶元素弹出,直到遇到左括号
while (signStack[idSign - 1] != '(') {
idSign--;
switch (signStack[idSign]) {
case '+': ans[idAns - 2] += ans[idAns - 1]; break; //加法
case '-': ans[idAns - 2] -= ans[idAns - 1]; break; //减法
case '*': ans[idAns - 2] *= ans[idAns - 1]; break; //乘法
case '/': ans[idAns - 2] /= ans[idAns - 1]; break; //除法
}
idAns--;
}
idSign--; //将左括号弹出
}
else if (sign == '+' || sign == '-') { //如果是加减号
while (idSign > 0 && signStack[idSign - 1] != '(') { //如果栈顶元素不是左括号,则进行运算
idSign--;
switch (signStack[idSign]) {
case '+': ans[idAns - 2] += ans[idAns - 1]; break; //加法
case '-': ans[idAns - 2] -= ans[idAns - 1]; break; //减法
case '*': ans[idAns - 2] *= ans[idAns - 1]; break; //乘法
case '/': ans[idAns - 2] /= ans[idAns - 1]; break; //除法
}
idAns--;
}
signStack[idSign++] = sign; //将当前符号入栈
}
else if (sign == '*' || sign == '/') { //如果是乘除号
while (idSign > 0 && (signStack[idSign - 1] == '*' || signStack[idSign - 1] == '/')) { //如果栈顶元素是乘除号,则进行运算
idSign--;
switch (signStack[idSign]) {
case '*': ans[idAns - 2] *= ans[idAns - 1]; break; //乘法
case '/': ans[idAns - 2] /= ans[idAns - 1]; break; //除法
}
idAns--;
}
signStack[idSign++] = sign; //将当前符号入栈
}
}
int main() {
while (fgets(buf, maxn, stdin)) { //读入一行字符串
if (strcmp(buf, "0\n") == 0) break; //如果读入的字符串是 0,则退出循环
len = strlen(buf);
buf[len - 1] = '\0'; //将换行符替换为字符串结束符
id = idAns = idSign = 0; //初始化数组下标
n = sscanf(buf, "%s", str); //读入一个字符串,返回成功读入的参数个数
while (n == 1) { //如果读入成功
if (sscanf(str, "%lf", &ans[idAns]) == 1) { //如果是数字
idAns++; //将其入数字栈
}
else { //如果是符号
ch[0] = str[0]; ch[1] = '\0'; //将字符串转换为字符
checkSign(ch[0]); //进行运算
}
id += strlen(str) + 1; //移动到下一个字符串的位置
n = sscanf(buf + id, "%s", str); //读入下一个字符串
}
while (idSign > 0) { //将符号栈中的剩余元素进行运算
idSign--;
switch (signStack[idSign]) {
case '+': ans[idAns - 2] += ans[idAns - 1]; break; //加法
case '-': ans[idAns - 2] -= ans[idAns - 1]; break; //减法
case '*': ans[idAns - 2] *= ans[idAns - 1]; break; //乘法
case '/': ans[idAns - 2] /= ans[idAns - 1]; break; //除法
}
idAns--;
}
printf("%.2lf\n", ans[0]); //输出结果
}
return 0;
}
这是一个计算器程序的代码,能够计算带括号的四则运算表达式。程序采用了栈的数据结构,首先将数字入数字栈,遇到符号时进行运算。运算过程中,将符号入符号栈,如果遇到括号,则将栈顶元素弹出,直到遇到左括号。具体运算过程见 checkSign 函数。最后将符号栈中的剩余元素进行运算,输出结果。
阅读全文