妙趣横生的算法(C语言实现) 杨峰
题目28:请编写一个C程序,在终端用键盘输入字符串,以Ctrl+Z组合键表示输入完毕,统计输入的字符串中空格符、制表符、换行符的个数,并显示统计的结果。
分析:通过查表可知空格符的ASCII为32,制表符的ASCII为9,换行符的ASCII为10.可以通过他们不同的ASCII码来区分出来它们。此外,Ctrl+Z的组合键输入的字符在计算机中对应的是EOF结束标志。
#include <stdio.h>
#include<String.h>
main(){
char c;
int space=0,table=0,enter=0;
printf("Please input a string:/n");
scanf("%c",&c);
while(c!=EOF){
switch(c){
case 32:space++;break;
case 9:table++;break;
case 10:enter++;break;
default:break;
}
scanf("%c",&c);
}
printf("The number of space:%d/n",space);
printf("The number of table:%d/n",table);
printf("The number of enter:%d/n",enter);
getchar();
return 0;
}
题目29:编写一个程序,在终端输入一个字符,输出它的ASCII码。
分析:通常我们输出一个字符一般用printf("%c",c);的形式,因为输出格式规定的是"%c",因此表示以字符的形式输出,所以我们看到的是x对应的ASCII码的字符形式。例如,执行printf("%c",97);语句等价于执行printf("%c",'a');语句。屏幕上输出地只是一个字符a。如果换一种输出形式,例如printf("%d",x);那么输出的就是x对应的ASCII码的整数形式。这样用户通过这个输出就可以知道字符x对应的ASCII码了。
#include <stdio.h>
#include<String.h>
main(){
char c;
printf("Please input a character:/n");
scanf("%c",&c);
getchar();
printf("The ASCII of %c is %d/n",c,c);
}
题目30,基于switch语句的译码器:给定一个前缀表如下:a-->1,b-->01,c-->001。又知有一个0/1字符串为:"001011101001011001",编写一个C程序,按照给定的前缀码表为该字符串译码。
#include <stdio.h>
#include<String.h>
void Decode(char *str,int n);
main(){
char str[18]="001011101001011001";
Decode(str,18);
getchar();
}
void Decode(char *str,int n)
{
int i=0;
while(i<n)
{
switch(str[i])
{
case '1':printf("a");break;
case '0':
{
i++;
switch(str[i])
{
case '1':printf("b");break;
case '0':
{
i++;
switch(str[i])
{
case '1':printf("c");break;
}
break;
}
}
break;
}
}
i++;
}
}
题目31,指针变量作参数:编写一个函数inputArray,该函数被主函数调用,通过该函数实现向主函数中定义的变量数组输入数据。
分析:本题目要求对主函数中的数组值进行修改,因此无法通过函数的返回值来实现该功能。所以要想对被调函数修改主函数中的数组值,只能将数组的首地址(指针)作为函数的参数进行传递,被调函数通过主函数传递来的数组地址对数组值进行修改。
#include <stdio.h>
#include<String.h>
void inputArray(int *array,int len){
int i;
for(i=0;i<len;i++)
scanf("%d",array+i);
}
main(){
int i,array[10];
inputArray(array,10);
for(i=0;i<10;i++){
printf("%d ",array[i]);
}
printf("/n");
}
题目32,矩阵的置换运算:用键盘从终端输入一个3行4列的矩阵,编写一个函数对该矩阵进行置换操作。
#include <stdio.h>
#include<String.h>
void inputMatrix(int (*a)[4],int m,int n);
void outputMatrix(int (*b)[3],int m,int n);
void transport(int (*a)[4],int (*b)[3]);
int main(void){
int a[3][4],b[4][3];
printf("Please input the Matrix:/n");
inputMatrix(a,3,4);
transport(a,b);
printf("The transport Matrix is:/n");
outputMatrix(b,4,3);
getchar();
return 0;
}
void inputMatrix(int (*a)[4],int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
scanf("%d",*(a+i)+j);
}
}
void outputMatrix(int (*b)[3],int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",*(*(b+i)+j));
printf("/n");
}
}
void transport(int (*a)[4],int (*b)[3]) //void transport(int (*a)[4],int (*b)[3]);
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]=a[j][i];
}
题目33,矩阵的乘法运算:有两个矩阵A1、A2,分别如下:
1 2 3 1 0 2 3
A1= 4 5 6 A2=4 1 5 6
6 8 9 0
编写一个程序,实现这两个矩阵的乘积。
#include <stdio.h>
#include<String.h>
int main(void){
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][4]={{1,0,2,3},{4,1,5,6},{6,8,9,0}};
int c[2][4]={{0,0,0,0},{0,0,0,0}};
int i,j,k;
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<3;k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
printf("The result is:/n");
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
printf("%d ",c[i][j]);
printf("/n");
}
return 0;
}