浙大MOOC翁恺C语言程序设计课后习题解答记录-完结

*浙大MOOC翁恺C语言程序设计课后习题解答记录

题目来源:https://blog.csdn.net/fjinhao/article/details/46853171
##week 02
##2.0

#include <stdio.h>

int main()
{
	int a,b;
	printf("请输入两个正整数:"); 
	scanf("%d %d", &a, &b);
	printf("%d + %d = %d\n", a, b, a+b);
	printf("%d - %d = %d\n", a, b, a-b);
	printf("%d * %d = %d\n", a, b, a*b);
	printf("%d / %d = %d\n", a, b, a/b);
	
	return 0;
}

***##2.1***厘米换算英尺英寸

#include <stdio.h>

int main()
{
	int a;
	scanf("%d", &a);
	double b = a/100.0/0.3048*12;
	int c = (int)b;
	printf("%d %d", c/12, c%12);
	
	return 0;
}

更简略的程序(重新定义double变量为int时,会自动抛弃小数点及后面部分,无四舍五入

#include <stdio.h>

int main()
{
	int cm;
	scanf("%d", &cm);
	double t = cm/100.0/0.3048;
	int foot = t;
	int inch = (t - foot)*12;
	printf("%d %d\n", foot, inch);
	
	return 0;
}

##2.2******然后是几点

#include <stdio.h>

int main()
{
	//首先将给定的时间间隔分离出小时与分钟, 
	int oldtime;
	int t;
	scanf("%d %d", &oldtime, &t);
	int hour = t/60;
	int min = t%60;
	// 然后将其时间间隔转化成四位数表示的形式,与原来时间相加得到新时间 
	int pass =hour * 100 + min;
	int newtime = oldtime + pass;
	//由于可能出现分钟位超过六十的情况,因此将新时间的分钟,小时分离,对60整除,并对小时进位(or not),分钟减去进位(or not),再转化成四位数表示的形式 
	min = newtime%100;
	hour = newtime/100;
	int s = min/60;
	hour += s;
	min -= s*60;
	newtime = hour*100 + min;
	printf("%d", newtime);
	return 0;
}

***scanf里忘记了加&***,调试了很久(哭o(╥﹏╥)o
另一种别人写的,和我的思路正好相反

`#include <stdio.h>
int main()
{
	int i, j, x = 0, y, z;
	scanf("%d%d", &i, &j);
	if(i >= 1000)
	{
	       x = i / 1000;
	       y = (i % 1000) / 100;
	       z = (i %1000) %100;
	}
	else
	{
	       y = i / 100;
	       z = i % 100; 
	}
	int s = (10*x + y) * 60 + z;
	int n = s + j;
	i = n / 60 *100 + (n - ((n / 60 )* 60));
	printf("%d", i); 
	return 0;
}`

时间:2019/3/9
##2.3******逆序的三位数

#include <stdio.h>

int main()
{
	int a;
	scanf("%d", &a);
	//将该三位数通过%和/的方式拆成三个数 
	int b,c,d;
	b = a/100;
	int m = a%100;
	c = m/10;
	d = m%10;
	//组合成一个新的数 
	int newnum = d*100 + c*10 + b;
	printf("%d", newnum);
	
	return 0;
 } 

##2.4******BCD解密
由于不了解二进制,十进制,十六进制在电脑上的关系,因此题干难以理解!!!
老师给出的解答

#include <stdio.h>

int main()
{
	int a;
	scanf("%d", &a);
	printf("%x", a); 
	
	return 0;
 } 

当直接使用"%x"会直接将十进制的数以16进制形式输出,但是不会有16进制前面的那两个字符!
或者这样做:

#include <stdio.h>

int main()
{
	int a;
	scanf("%d", &a);
	int b = a/16*10 + a%16;
	printf("%d", b); 
	
	return 0;
 } 

直接把十进制的数通过数学计算的形式转化成十六进制。
##3.0******超速判断

#include <stdio.h>

int main()
{
	int speed;
	scanf("%d", &speed);
	//判断是否超速并输出 
	if (speed > 60){
		printf("Speed: %d - Speeding", speed);
	}else{
		printf("Speed: %d - OK", speed);
	}

	return 0;
}

##3.1******三天打鱼两天晒网

#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	//除去5之后,得到剩下的余数 
	int t = n%5;
	//判断与3的大小关系 
	if (t>=1 && t<=3){
		printf("Fishing in day %d\n", n);
	} else{
		printf("Drying in day %d\n", n);
	}
	return 0;
}

##3.2*** 用天平找小球***

#include <stdio.h>

int main()
{
	int a,b,c;
	scanf("%d %d %d", &a, &b, &c);
	//只需比较是否相等,不用管大小关系,比较两次即可得出结论 
	if (a == b){
		printf("C");
	}else{
		if (a == c){
			printf("B");
	}	else{
			printf("A");
		}
	}
	return 0;
}

##3.3*** 12-24小时制***

#include <stdio.h>

int main()
{
	int hour, minute;
	scanf("%d:%d", &hour, &minute);
	//只需比较hour和12及0的关系,在这个基础上考虑减或不减12
	if (hour>=0 && hour<12){
		printf("%d:%d AM", hour, minute);
	} else if (hour == 12){
		printf("%d:%d PM", hour, minute);
	}else{
		printf("%d:%d PM", hour-12, minute);
	}
	return 0;
}

##3.4*** 成绩转换***

#include <stdio.h>

int main()
{
	int score;
	scanf("%d",&score);
	score /= 10;
	switch (score){
		case 10:
		case 9:
			printf("A");
			break;
		case 8:
			printf("B");
			break;
		case 7:
			printf("C");
			break;
		case 6:
			printf("D");
			break;
		default:
			printf("E");
	}
	
	return 0;
}

##4.0*** 求符合给定条件的整数集***

整了很久,原因是没弄清楚各层的关系,弄错了大括号!
#include <stdio.h>

int main()
{
	int a,b,c,s;
	scanf("%d",&a);
	b = a;
	c = a;
	s = a;
	int t = a+3;
	//三层嵌套,第二层和第三层需要if来使得a,b,c不等,注意在每个循环的末尾加上改变条件的表达式! 
	//输出时只需在a变化后加空行即可, 
	while(a<=t){
		while(b<=t){
			if (b!=a){
				while (c<=t){
					if (c!=a && c!=b){
						printf("%d ", a*100+b*10+c);
					}
					c++;
				}
				
			} 
			b++;
			c = s;
			
		}
		a++;
		b=s;
		printf("\n");
			
	}
	return 0;		
}

##4.1*** 水仙花数***
时间花了很久才写出来!

#include <stdio.h>

int main()
{
	//tansfer为传入循环时代替的t的值
	//digit是transfer的每位数的值 
	//u_n为传入循环时代替的N的变量,防止N被改变
	//c是求和时每个位的N次方的值,sum即为各位n次方的和 
	int n,transfer,digit,u_n,c;
	//min和max是n位数的区间端点值 
	int min=1, max =1;
	scanf("%d", &n);
	//q_n为计算N位数区间的循环时代替的n的值 
	int q_n=n;
	while (q_n>1){
		min *= 10;
		max *= 10;
		q_n--;
	}
	max = max*10 -1;
	transfer = min;
	int m;
	int sum;
//	printf("n=%d",n);
	while (transfer<=max){
		m=transfer;
		sum = 0;
		while (m>0){
			digit = m%10;
			c=1;
			//循环求n次方 
			while(u_n>0){
				c *= digit;
				u_n--;				
			}
			//求n次方之和 
			sum += c;
			m = m/10;
			u_n=n;				
		}
		if (sum == transfer){
			printf("%d\n", transfer);			
		}
		transfer++;
	}
	
	return 0;
 } 

时间:2019/3/10
##4.2*** 打印九九口诀表***

#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	//trans为循环内部代替n的变量,防止n被改变 
	//i,t均为循环内部的变量 
	int trans = n,i=1,t;
	while (i<=n){
		t=1;
		//printf("i=%d, n=%d,t=%d\n",i,n,t);
		while(t<=i){
			printf("%d*%d=%d   ", t,i,t*i);						
			t++;
			}
		i++; 
		//当i+1发生时,换行 
		printf("\n");	
	}
	return 0;	
}

##4.3*** 统计素数并求和***

#include <stdio.h>

int main()
{
	int M,N;
	scanf("%d %d",&M,&N);
	int count=0,sum=0;
	int i=2;
	int status = 1;//1表示为素数,0表示不是素数 
	//printf("M=%d,N=%d\n",M,N);
	while(M<=N){
		do
		{
			if(M%i == 0){
				//printf("该数不是素数!"); 
				status = 0; 
				break;
			}else{
				i++;
			} 	
		}while (i<M);
		
		if (status == 1){
			//printf("%d为素数\n",M);
			sum += M;
			count++;
		}
		//printf("M=%d,status = %d\n",M,status);
		M++;
		i=2;
		status = 1;
		//printf("changed_M=%d,i=%d\n",M,i);
	}
	printf("%d %d", count, sum); 
	
	return 0;
 } 

##4.4*** 猜数字游戏***
注释的大部分为调试时加上的,调试的时间比较长是因为又忘记在scanf里面的变量前面加&,o(╥﹏╥)o
下次一定要注意注意注意注意!!!!!

#include <stdio.h>

int main()
{
	int number,i;
	scanf("%d %d", &number, &i);
	int x;//这个数为用户输入的数字	
	//printf("请输入一个数字:");
	scanf("%d",&x);
	int count=1;//用于和i比较
	if (x<0){
		printf("Game Over!");
	}else{
			while(x>0){
				if (x>number){
					printf("Too big\n");
				}else if(x<number){
					printf("Too small\n");
				}else{
					if (count ==1){
						printf("Bingo!\n");
					}else if(count <= 3){
						printf("Lucky You!\n");
					}else{
						printf("Good Guess!\n");
					}
					//printf("I am here before the loop.\n");					
					while(x>0){
						//printf("Am I in this loop?\n");
						scanf("%d",&x);
						//printf("x=%d\n",x);
						if (x<0){
							//printf("I want to out of the loop.\n");
							return 0;
						}else{
							//printf("I am in this loop!\n");
						}
						//printf("I am leaving?!\n");
					}
					//printf("I am out!");
				}
				count++;
				if (count>i){
					printf("Game Over!\n");
					break;
				}
				scanf("%d",&x);
			} 
	}	
	return 0;
 } 

时间:2019/3/11
##5.0*** 求序列前N项和***
在写的时候不小心看错了题目,导致浪费了太多时间!!!

#include <stdio.h>

int main()
{
	int N;
	//scanf("%d", &N);
	N = 20;
	int i;
	double sum=0.0;
	double s, t=2.0,m=1.0,c;
	//printf("original:t=%f,sum=%f\n",t,sum);
	for(i=1;i<=N;i++){		
		s = t / m;
		c=t;
		t += m;	
		m=c;	
		sum += s;		
		//printf("s=%f,t=%f,sum=%f\n",s, t, sum);	
	}
	printf("%.2f", sum);
	
	return 0;
 } 

##5.1*** 约分最简分式***

#include <stdio.h>
//辗转相除法确定最大公约数 
int main()
{
	int a,b;
	scanf("%d/%d", &a, &b);
	//a = 4; b=6;
	int c = a, d = b;//代替a,b进入循环,防止a,b的值被改变 
	int t;
	while(d != 0){
		t = c%d;
		c = d;
		d = t;
	}
	//printf("%d/%d=%d/%d\n", a,b,a/c,b/c);
	printf("%d/%d", a/c, b/c);
	return 0;
}

##5.2*** 念数字***

#include <stdio.h>

int main()
{
	int number;
	//scanf("%d",&number);
	number = -600;
	if (number < 0){
		printf("fu ");
		number *= -1;
	}
	//得到number的(位数-1)*10 
	int t = number,mask = 1;
	do{
		t /= 10;
		mask *= 10;
		
	}while (t>9);
	
	t = number;
	//printf("mask=%d,t=%d\n",mask,t);
	int i;
	do{
		i = t/mask;
		//printf("i= %d\n",i);
		switch (i){
			case 0:
				printf("ling");
				break;
			case 1:
				printf("yi");
				break;
			case 2:
				printf("er");
				break;
			case 3:
				printf("san");
				break;
			case 4:
				printf("si");
				break;
			case 5:
				printf("wu");
				break;
			case 6:
				printf("liu");
				break;
			case 7:
				printf("qi");
				break;
			case 8:
				printf("ba");
				break;
			case 9:
				printf("jiu");
				break;	
		}
		if (mask >0){
			printf(" ");
		}
		t %= mask;
		//printf("\nt = %d\n",t);		
		mask /= 10;
		
	}while (mask>0);
	
	return 0;
 } 

##5.3*** 求a的连续和***

#include <stdio.h>

int main()
{
	int a,n,i;
	scanf("%d %d", &a, &n);
	int mul=0, sum = 0;
	for( i=1 ; i<=n ; i++){
		//printf("I am in the loop.\n");
		mul = mul * 10 + a;
		//printf("mul=%d", mul);
		sum += mul;
		//printf("  sum=%d\n",sum);
		
	}
	printf("%d", sum);
	return 0;
 } 

##6.0 混合类型数据格式化输入

#include <stdio.h>
/*
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
*/

int main()
{
	int a;
	double b,c;
	char d;
	scanf("%lf %d %c %lf", &b, &a, &d, &c);
	printf("%c %d %.2f %.2f", d, a, b, c);
	return 0;
 } 

##6.1简单计算器
没有思路,完全不知道怎么读入一个运算表达式!如果用char作为输入的话,发现太长会报warning,超过char的表达范围。
&忽略了题目的条件“四种运算符优先级相同”!
来自:https://blog.csdn.net/huozhiwu0424/article/details/37671693
c语言输入,每次scanf的读取数目与该语句内部的变量多少有关,如果小于输入的数目,则剩下的输入会被舍弃,但如果另写一句scanf,则可以继续读取第一个scanf读取完后的输入!

#include <stdio.h>
int main()
{
	int a,b;
	char c;
	scanf("%d", &a);
	
	while(scanf("%c", &c)){
		switch (c){
			case '+': {scanf("%d", &b); a+=b; break;}
			case '-': {scanf("%d", &b); a-=b; break;}
			case '*': {scanf("%d", &b); a*=b; break;}
			case '/': {scanf("%d", &b);
 
				if(b == 0){
					printf("ERROR\n");
					return 0;
				}else{
					a/=b; break;
				}
			}
			case '=': {printf("%d\n",a); return 0;}
			default:{
				printf("ERROR\n"); return 0;
			}
				
		}
 
	}
	return 0;
}

##6.2字符串字母大小写转换
了解了上一道题如何输入,这一道题会变得非常简单。

#include <stdio.h>
/*
输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。
*/
int main()
{
	char a;
	while(scanf("%c",&a)){
		if (a>= 'A'&& a<= 'Z'){
			a += 'a'-'A';
			printf("%c", a);
		}else if(a>='a' && a<= 'z'){
			a += 'A'-'a';
			printf("%c", a);
		}else if(a == '#'){
			break;
		}else{
			printf("%c",a);
		}
		
	}
	return 0;
}

##6.3 单词长度
注意1.连续出现两个空格时,不能打印出count=0,必须跳过,读取下一个字符;
2.最后一个单词结尾必然没有空格,因此最后一个单词的字符数打印应该在break语句的前面;
3.空格问题,只需在打印最后一个单词时不加空格即可。

#include <stdio.h>

int main()
{
	char a;
	int count=0,i=0;
	while(scanf("%c", &a)){
		if (a != '.'){		
			if (a != ' '){
				count ++;
			}else if(a == ' '){	
				if (count != 0){
					printf("%d ",count);					
					count =0;
				}				
			}		
		}else{
			printf("%d",count);						
			break;
		}		
	}
	return 0;

##7.0 写出这个数
注意int表示的整数范围只在十位数,因此本题需用第六周习题里面的char类型读入,再根据ASCII将字符数字转化成整数。
念出这个数可根据前面的习题,创建一个函数,调用即可。

#include <stdio.h>
void readnumber(int number);//函数原型 

int main()
{
	char n;
	//scanf("%d", &n);
	//n=1234567890987654321123456789;
	int i;
	int sum =0;
	while(1){
		scanf("%c", &n);
		if (n == '\n'){
			break;
		}
		i = (int)n -48;
		sum += i;		
	}
	//printf("%d\n",sum);
	readnumber(sum); 
	
	return 0;
}

void readnumber(int number){
	//int number;
	//scanf("%d",&number);
	//number = -3;
	if (number < 0){
		printf("fu ");
		number *= -1;
	}
	//得到number的(位数-1)*10 
	int t = number,mask = 1;
	do{
		t /= 10;
		mask *= 10;
		
	}while (t>9);
	
	t = number;
	//printf("mask=%d,t=%d\n",mask,t);
	int i,count=0;
	do{
		i = t/mask;
		if (i!=0 || count !=0){			
			//printf("i= %d\n",i);
			switch (i){
				case 0:
					printf("ling");
					break;
				case 1:
					printf("yi");
					break;
				case 2:
					printf("er");
					break;
				case 3:
					printf("san");
					break;
				case 4:
					printf("si");
					break;
				case 5:
					printf("wu");
					break;
				case 6:
					printf("liu");
					break;
				case 7:
					printf("qi");
					break;
				case 8:
					printf("ba");
					break;
				case 9:
					printf("jiu");
					break;	
			}
			if (mask >0){
				printf(" ");
			}
		}
		t %= mask;
		//printf("\nt = %d\n",t);		
		mask /= 10;
		count++;		
	}while (mask>0);
} 

##7.1换个格式输出整数
让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。

输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。

输出格式:每个测试用例的输出占一行,用规定的格式输出n。

输入样例1:
234
输出样例1:
BBSSS1234
输入样例2:
23
输出样例2:
SS123

##7.1和7.2忘记保存了o(╥﹏╥)o

##7.3数素数
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。

输入格式:

输入在一行中给出M和N,其间以空格分隔。

输出格式:

输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。

输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

#include <stdio.h>

int main()
{
	int pm,pn;
	scanf("%d %d", &pm, &pn);
	int i,n=3;
	int status=1,count =1,j=0;
	while(count<pn){	
		for(i=2;i<n;i++){
				if (n%i ==0){
					status =0;
					//printf("n=%d不是素数,status=%d\n",n,status);
					break;
				}	
		}
		if(status ==1){
			count ++;
			//printf("n=%d是素数,count =%d\n",n,count);
			if (count>=pm){
				printf("%d",n);
				j++;					
			}
			if (j<10 && j>0){
				printf(" ");
			}else{
				printf("\n");
				j = 0;
			}
		}
		n++;
		status =1;
		
	}
	
	return 0;
}

##8.0查找整数

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:

输入在第1行中给出2个正整数N(<=20)和X,第2行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:

在一行中输出X的位置,或者“Not Found”。

输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found

#include <stdio.h>

int main()
{
	int n,x;
	scanf("%d %d",&n, &x);//n为一维数组的大小
	int number[n];
	int i,t,status=0;
	for (i=0;i<n;i++){
		scanf("%d",&t);
		number[i]=t;
	}
	for(i=0;i<n;i++){
		if(number[i] == x){
			printf("%d",i);
			status=1;
			break;
		}
	}
	if(status==0){
		printf("Not Found");
	}

	return 0;
}

##8.1 求一批整数中出现最多的个位数字

#include <stdio.h>

int main()
{
	int n=10;//共十个数字,0~9 
	int s; 
	scanf("%d",&s);//s为给出的整数的个数
	int number[3],a[n];
	//对a[n]初始化 
	int i,j; 
	int temp,t;
	for(i=0;i<n;i++){
		a[i] = 0;
	}
	//读入数组 
	for (i=0;i<s;i++){
		scanf("%d",&number[i]);
	}	
	//得到10个数字出现频率的次数,组成一个数组,如a[3]=1,表示数字3出现的次数为1 
	for (i=0;i<s;i++){
		while(number[i]>0){		
			t = number[i]%10;
			a[t]++;
			number[i] /= 10;
		}
	}
	
	int b[n];
	for (i=0;i<n;i++){
		b[i] = a[i];
	}
	//冒泡排序 
	for (j = 0; j < n-1; j++){
        for (i = 0; i < n - 1 - j; i++){
            if(b[i] > b[i + 1]){
                temp = b[i];
                b[i] = b[i + 1];
                b[i + 1] = temp;
            }
        }
	}
	printf("%d: ",b[n-1]);
	for (i=0;i<n;i++){
		if(a[i] == b[n-1]){
			printf("%d ",i);
		}
	}
		
	return 0;
}

最后的空格实在是不知道咋写进去,如果使用类似素数里面的状态参数判断,发现不成功
查看答案后,发现很简单,把空格移到前面就可以o(╥﹏╥)o

	printf("%d:",b[n-1]);
	for (i=0;i<n;i++){
		if(a[i] == b[n-1]){
			printf(" %d ",i);
		}
	}

同时里面也不需要使用冒泡算法,只需要找到最大值就可以了。

int max=0;
	for (i=0;i<n;i++) {
		if(max < a[i]){
			max = a[i];	
		}
	}
	
	printf("%d:",max);
	for (i=0;i<n;i++){
		if(a[i] == max){
			printf(" %d ",i);
		}
	}

##8.2 求矩阵的局部极大值

#include <stdio.h>
/*
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。
本题要求给定矩阵的全部局部极大值及其所在的位置。

*/
int main()
{
	int row,col;
	scanf("%d %d", &row, &col);
	
	int matrix[row][col];
	int i,j;
	
	for (i=0;i<row;i++){
		for(j=0;j<col;j++){
			scanf("%d",&matrix[i][j]);
		}
	}
	//
//	for (i=0;i<row;i++){
//		for(j=0;j<col;j++){
//			printf("%d", matrix[i][j]);
//			if(j<col-1){
//				printf(" ");
//			}
//		}
//		printf("\n");
//	}
	//
	int count = 0;
	for (i=1;i<row-1;i++){
		for(j=1;j<col-1;j++){
			if(matrix[i][j] > matrix[i-1][j] && matrix[i][j] > matrix[i+1][j] &&
				matrix[i][j] > matrix[i][j-1] && matrix[i][j] > matrix[i][j+1]){
					printf("%d %d %d\n", matrix[i][j], i+1, j+1);
					count ++;
			}
		}
	}
	if (count == 0){
		printf("None %d %d", row,col);
	}
	
	return 0;
 } 

8.3 组个最小数

问题:1.当不确定数组大小时,读入什么条件结束读入

char ch;
while(ch != '\n'){
		//进入循环,开始读入数组
}

2.如何将第一步寻找最小的数与之后的步骤写成一个大的循环
看完别人的代码,发现完全理解错了题意,测试用例看错了!!
以下代码来自:https://blog.csdn.net/phenixfate/article/details/42918685

#include<stdio.h>
 
int main()
{
	int array[10];
	int i,n;
	for(i=0;i<10;i++)
	{
		scanf("%d",&n);
		array[i] = n;
	}
	for(i=1;i<10;i++)      //输出第一个数 
	{
		if(array[i]!=0)
		{
			printf("%d",i);
			array[i] --;
			break;
		}
	}
	int j; 
	for(i=0;i<10;i++)
	{
		for(j=1;j<=array[i];j++)
			printf("%d",i);
	}
	
	return 0;
} 

##10.0说反话

发现自己不知道读入字符串如何结束读入,o(╥﹏╥)o,感觉自己好笨!

char s[100];
gets(s);

gets(s);//这里的函数是:读入字符串,只有在读到回车时才停止读入,空格正常读入!(所以也会和scanf一样有数组越界的风险)
scanf函数读入为读到空格,回车,tab为止

#include <stdio.h>
#include <string.h>
 
int main(int argc, const char* argv[])
{
	char len[81];
	gets(len);
	int k = strlen(len);
	char* p;
	p = len + k;
	//printf("%d",k);
	while (1) {
		if(*p == ' ' && *p+1 != ' ') {
			*p = '\0';
			printf("%s ", p+1);
		}
		if ( p == len){
			printf("%s", p);
			break;
		}
		p--;
	} 
	
	return 0;
}
 

注意:
1.printf("%s",p);//输出的是字符串(以’\0’作为结束的字符串),不是单个的字符,
2.printf("%d",p);//输出的是p指针的十进制地址,当然%p输出的就是16进制的地址
##8.1在字符串中查找指定字符

输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。

输入格式:

输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。

输出格式:

在一行中按照题目要求输出结果。

输入样例1:
It is a black box
b
输出样例1:
black box
输入样例2:
It is a black box
B
输出样例2:
Not found

注意:1.C语言中,输出字符串的函数有两个:
puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。
2.C语言中,输入字符串的函数有两个:
scanf():通过格式控制符 %s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
注意scanf()读到空格,tab,回车结束,
gets():直接输入字符串,并且只能输入字符串。读到回车结束,读到空格不停止
gets(arrayName);参数是
字符数组

#include <stdio.h>
#include <string.h>
 
int main(int argc, const char* argv[])
{
	char len[81];
	char c[2];
	gets(len);
	scanf("%s", c);
	//
//	printf("len=%s ", len);
//	printf("%s\n",c);
	//
	char *p = strchr(len, c[0]);
	if( p != NULL) {
		printf("%s\n", p);
	} else {
		printf("Not found\n");
	}
	
	return 0;
}
 

发现自己指针没学明白,printf("%p",p)输出的是指针p的16进制地址,printf("%s",p)输出的是指针p指向的字符串。

##8.2 删除字符串中的子串

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:

输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:

在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
**没写出来,发现自己对字符数组,指针这块理解得不够透彻,很多语法都没写对!

#include <stdio.h>
#include <string.h>

int main(int argc, const char* argv[])
{
	char s1[81], s2[81];
	gets(s1);
	gets(s2);
	int i;
	do{
		char *p = strstr(s1,s2);
		if (p){
			for(i=0;i<strlen(p)-strlen(s2);i++){
				p[i] = p[strlen(s2) +i];
			}
			p[i] = '\0';
		}else{
			printf("%s",s1);
			break;
		}
		
	}while(1);
	return 0;

3.21//
基本上C语言的学习就到此告一段落了,接下来应该要进行数据结构的学习了。
C语言学习时间:3.10-3.21,十一天有点长,太拖沓了!接下来的数据结构要认真快速地完成。

  • 49
    点赞
  • 347
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值