本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
实验代码:
#include<stdio.h> #include<string.h> int main(void) { int i, j, n; char ch[1000]; gets(ch); j=strlen(ch); if(ch[0]!=' ') { n=1; for(i=0;i<j-1;i++) { if(ch[i]==' '&&ch[i+1]!=' ') n++; } } else{ n=0; for(i=0;i<j-1;i++) { if(ch[i]==' '&&ch[i+1]!=' ') n++; } } printf("%d",n); return 0; }
设计思路:
题目并没告知输入的单词个数,所以不能依靠for语句来输入数组,因此需要两个函数:gets函数换和strlen函数,一个用于输入数组一个用来记住字符串个数,因为输入的单词是以一个单词加空格的形式或以空格加单词形式,所以可以用if-else语句来进行两种情况的判断,输出的单词个数可以用for语句进行循环并在其中加入if语句以前一个为空格后一个不为空格为条件来完成。
编译错误:
错误:当输入的单词只有一个时,n的值为零,因为从1开始判断会导致第一个单词不会被加到。
方法:将i=1改为i=0
运行截图:
思维导图:
第五周预习题:
预习内容:地址与指针,指针变量的定义,指针的基本运算,角色互换,冒泡排序法,常用字符串处理函数
预习中存在的问题:1,普通变量和指针变量作为参数的情况不太清楚。
2,二级指针**p是什么意思
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#
作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple
#
输出样例:
red blue green yellow purple
实验代码:
#include <stdio.h> #include <string.h> int main (void) { char a[20][10], stra[20]; int i, j, m, n = 1; for (i = 0; i < 20; ++i) { scanf("%s", &a[i]); for (j = 0; j < 10; ++j) { if (a[i][j] == '#') { n = 0; } } if (n == 0) { break; } else { m++; } } for (i = 0; i < m-1; i++) { for (j = i+1; j < m; j++) { if(strlen(a[i]) > strlen(a[j])){ strcpy(stra,a[i]); strcpy(a[i],a[j]); strcpy(a[j],stra); } } } for (i = 0; i < m; ++i) { printf ("%s ", a[i]); } return 0; }
设计思路:
根据题目要求限制了输入单词的个数及长度,所以用二维数组来进行单词的输入。因为单词的长度不确定,所以最好以一个字符串的形式来输入,用两个for语句,第一个用于计算单词个数并输入单词和记录输入单词的个数,第二个用于判断单词长度以及输入的单词是否为结束字符,然后运用选择排序法或冒泡法来比较每个单词的长度大小并将其赋值,其中在比较大小时可用strlen函数,赋值时可用strcpy函数。
编译错误:
错误:在比较长度大小时,第一个循环的次数为单词的个数而不是的单词的个数减一,第二个循环的开始数为第一个循环的开始数加一而不是从零开始。
运行截图:
思维导图:
博客总结需要将PTA上代码做以下修改:(1)通过以自己名字命名的文件输入英文单词,(2)英文单词输入的结束标记为你学号最后一位数+37所对应的ASCII字符。(例如:你的学号最后一位为9,则结束标记为9+37=46所对应的ASCII字符“.”)(3)在不删除原有内容的情况下,将排序后的单词输出到文件。
实验代码:
#include<stdio.h> #include <string.h> #include<stdlib.h> int main(void) { FILE * fp=fopen("F:\\chenq\\新建文本文档.txt","a+"); char a[20][10], stra[20]; int i, j, m, n = 1; for (i = 0; i < 20; ++i) { fscanf(fp,"%s", &a[i]); for (j = 0; j < 10; ++j) { if (a[i][j] == '+') { n = 0; } } if (n == 0) { break; } else { m++; } } for (i = 0; i < m-1; i++) { for (j = i+1; j < m; j++) { if(strlen(a[i]) > strlen(a[j])) { strcpy(stra,a[i]); strcpy(a[i],a[j]); strcpy(a[j],stra); } } } fprintf(fp,"\n"); for (i = 0; i < m; ++i) { fprintf (fp,"%s ", a[i]); } fclose(fp); return 0; }
设计思路:
该题整体思路与英语单词排序一样,只需按照从给定的文件中读取数据并进行数据处理的步骤进行并运用相关的数据类型以及文件操作函数。
编译错误:
错误:地址错误。
重新建立一个文件并将地址写入代码中得到的值满足条件所以代码没错,只需改一下地址即可。
运行截图:
思维导图: