第五周编程总结
7-1 统计一行文本的单词个数 (15 分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
实验代码:
#include<stdio.h>
#include<string.h>
int main(void)
{
char ch[1000];
int num,i,j;
char c;
gets(ch);
j=0;
for(i=0;(c=ch[i])!='\0';i++)
{
if(c==' ')
{
j=0;
}
else if(j==0)
{
j=1;
num++;
}
}
printf("%d",num);
return 0;
}
实验思路:用两变量分别表示单词数和表示该字符是否是单词,对是否是空格进行判断累加统计结果。
思维导图:
实验所遇问题:老师提供了另一种思路,自己写的时候,首先不太明白字符函数的定义符,比如说用gets()输入字符串,还有不明白用什么确定带 ' 字符算一个单词(这是最主要的问题)然后看老师的思维导图和代码解决了这些问题。
实验结果截图:。
预习题的选择题:1.2-1
下列语句定义 x 为指向 int 类型变量 a 的指针,正确的是()。 (2分)
int a, *x = a;
int a, *x = &a;
int *x = &a, a;
int a, x = a;
确定指针的定义方法。
2-2
int *p 的含义是 (2分)
p是一个指针, 用来存放一个整型数
p是一个指针, 用来存放一个整型数据在内存中的地址
p是一个整型变量
以上都不对
所关知识:int p; //首先从P 处开始,先与结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针
2-3
如果有定义:int m, n = 5, *p = &m; 与m = n 等价的语句是 () 。 (1分)
m = *p;
*p = *&n;
m = &n;
m = **p;
作者: 张泳
单位: 浙江大学城市学院
2-4
变量的指针,其含义是指该变量的( 地址)。 (1分)
值
地址
名
一个标志
2-5
有如下程序段
int p,a=10,b=1;
p=&a; a=p + b;
执行该程序段后,a的值是 (2分)
12
11
10
编译出错
作者: 李廷元
单位: 中国民用航空飞行学院
2-6
对于下列程序,正确的是() 。 (2分)
void f(int *p)
{
*p = 5;
}
int main(void)
{
int a, *p;
a = 10;
p = &a;
f(p);
printf(“%d”, (*p)++);
return 0;
}
5
6
10
11
作者: 张泳
单位: 浙江大学城市学院
2-7
执行如下程序段,打印输出的内容是: (2分)
#include <stdio.h>
void fun (int c, int *d) {
c++;
(*d)++;
}
int main ( ){
int a=5, b=9;
fun(a, &b);
printf("%d, %d", a, b);
return 0;
}
5, 9
6, 10
5, 10
6, 9
有关知识:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区 指针的类型:
(1)intptr;//指针的类型是int
(2)charptr;//指针的类型是char
(3)intptr;//指针的类型是int
(4)int(ptr)[3];//指针的类型是int()[3]
(5)int(ptr)[4];//指针的类型是int()[4]
指针的值----或者叫指针所指向的内存区或地址 /强制类型转换并不会改变a 的类型 &是取地址运算符,是间接运算符。
&a 的运算结果是一个指针,指针的类型是a 的类型加个,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址。
p 的运算结果就五花八门了。总之p 的结果是p 所指向的东西,这个东西有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址。
7-1 英文单词排序 (25 分)
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple
输出样例:
red blue green yellow purple
实验代码:
#include<stdio.h>
#include<string.h>
int main (void){
char a[21][20],b[20],c[20];
int i,j,q=0;
while(1){
scanf("%s",c);
if(c[0]=='#'){
break;
}
else{
strcpy(a[q],c);
q++;
}
}
for(i=0;i<q-1;i++)
for(j=0;j<q-1-i;j++){
if(strlen (a[j])>strlen(a[j+1])){
strcpy(b,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],b);
}
}
for(i=0;i<q;i++){
printf("%s ",a[i]);
}
return 0;
}
实验思路:先对c[0]=='#'这种情况进行判断,然后运用冒泡法思维进行排序(需要运用字符中的一些函数名)如strcpy函数名---进行字符串的复制;strlen计算字符的长度(不包括‘\0'),最后用个循环对结果进行输出。不过此代码有借鉴情况原代码地址:matthew_Leung https://blog.csdn.net/mathew_leung/article/details/80382098。
思维导图:
实验所遇问题:首先没法在第一次运行代码时只能输入一个单词;后来经过调试发现是因为最初的scanf没有写在while之中,
后来遇到的问题是运用数组定值来进行冒泡法排序时char类型的字符没法给数组赋值,哪怕用两个变量分别给定记录j和j+1字符串的长度也没用,然后在书p348将字符串操作函数仔细的看了之后,改用直接定义三个char类型的数组,数组的赋值运用strcpy进行字符串的赋值(复制)。同时自己打的时候虽然考虑到了第一个字符即为#的情况但没有在前面加上while循环,所以一直不得头绪,在借鉴了他人博客后才理解并解决这个问题。还有一些在写代码中的编译错误就太多了。
实验结果截图:
挑战题:
实验代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main (void){
FILE*fp;
char a[21][20],b[20],c[20];
int i,j,q=0;
if((fp=fopen("F:\\xiesimin\\123.txt","a+"))==NULL)
{
printf("File open erorr!\n");
exit(0);
}
while(1){
fscanf(fp,"%s",c[20]);
if(c[0]=='39'){
break;
}else{
strcpy(a[q],c);
q++;
}
for(i=0;i<q-1;i++){
for(j=0;j<q-1-i;j++){
if(strlen (a[j])>strlen(a[j+1])){
strcpy(b,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],b);
}
}
}
for(i=0;i<q;i++){
printf("%s ",a[i]);
fprintf(fp,"%s \n",a[i]);
}
return 0;
}
}
结对编程的感悟:结对编程能让我们相互讨论,然后也更容易发现代码中的错误,也让编程比较轻松些。
!
学习感悟:编写代码实在是需要静下心来慢慢想,不能过于急躁和求快;最好先在纸上将流程图大概画出来。