C语言错题汇总

五种方法输出字符串“China”

/*指针和字符数组的应用,用五种方法输出字符串“China”。请改正程序中的错误,使它能得出正确的//果。*/
#include <stdio.h>

main()
{
    int i = 0;
    char str[6] = {'C', 'h', 'i', 'n', 'a', '\0'}, str1[6] , *ptr, *ptr1, *ptr2 , str2[5]; //char str[6] = {'C', 'h', 'i', 'n', 'a', '\0'}, str1[6] , *ptr, *ptr1, *ptr2 , str2[6]; 
    while (str[i] != '\0')
    {
        putchar(*str); //putchar(str[i]);
        str++;  //i++
    }
    scanf("%s", ptr);
    puts(ptr);
    ptr1 = str;
    puts(ptr1);
    ptr2 = "China";
    puts(ptr2);
    str2 = "China"; //strcpy(str2,"China");
    printf("%s", str2);
}
实验五(2016春刘秉权C语言课):利用矩阵相乘公式,编程计算M*N阶矩阵和N*M阶矩阵B之积C(M*M阶矩阵)。
要求:
1.输入输出格式形如:
Input 3*4 matrix a:(输出)
a[0,0]:(输出)11(输入)
a[0,1]:2
...
a[2,2]:7
a[2,3]:9
Input 4*3 matrix b:(输出)
b[0,0]:23(输入)
b[0,1]:21
...
b[3,1]:7
b[3,2]:54
Results:(输出)
  1643  2063  1063(整数输出6位)
  4144  5205  5394
  1014  1106  1923

2.用宏定义形式分别定义M、N的值为3、4。
3.函数原型分别定义成:
void MultiplyMatrix(int a[M][N], int b[N][M], int c[M][M]);/* 函数功能:计算矩阵相乘之积,结果存于二维数组c中 */
void InputMatrixA(int a[M][N]);/* 函数功能:输入矩阵a中的元素 */
void InputMatrixB(int b[N][M]);/* 函数功能:输入矩阵b中的元素 */
void OutputMatrix(int a[M][M]);/* 函数功能:输出矩阵a中的元素 */
4.主函数定义成:
int main()
{
	int a[M][N], b[N][M], c[M][M];
	InputMatrixA(a);
	InputMatrixB(b);
	MultiplyMatrix(a,b,c);
	OutputMatrix(c);
	return 0;
}
#include <stdio.h>
#define  M 3
#define  N 4
/* 函数功能:计算矩阵相乘之积,结果存于二维数组c中 */
void MultiplyMatrix(int a[M][N], int b[N][M], int c[M][M])
{ 	 	  	 
    int i, j, k;
    for (i = 0; i < M; i++)   //i,j都从横行M开始
    { 	 	  	 
        for (j = 0; j < M; j++)
        { 	 	  	 
            c[i][j] = 0;   //初始化c[][]
            for (k = 0; k < N; k++)  //从纵列N开始
            { 	 	  	 
                c[i][j] = c[i][j] + a[i][k] * b[k][j]; 
            }
        }
    }
} 	 	  	 
/* 函数功能:输出矩阵a中的元素 */
void  InputMatrixA(int a[M][N])
{ 	 	  	 
    int i, j;
    printf("Input %d*%d matrix a:\n", M, N);
    for (i = 0; i < M ; i++)
    { 	 	  	 
        for (j = 0; j < N; j++)
        { 	 	  	 
            printf("a[%d,%d]:", i, j);
            scanf("%d", &a[i][j]);
        }
    }
} 	 	  	 
void  InputMatrixB(int b[N][M])
{ 	 	  	 
    int i, j;
    printf("Input %d*%d matrix b:\n", N, M);
    for (i = 0; i < N ; i++)
    { 	 	  	 
        for (j = 0; j < M; j++)
        { 	 	  	 
            printf("b[%d,%d]:", i, j);
            scanf("%d", &b[i][j]);
        }
    }
} 	 	  	 

void  OutputMatrix(int a[M][M])
{ 	 	  	 
    int i , j ;
    printf("Results:\n");
    for (i = 0; i < M; i++)
    { 	 	  	 
        for (j = 0; j < M; j++)
        { 	 	  	 
            printf("%6d", a[i][j]);
        }
        printf("\n");
    }
} 	 	  	 
int main()
{ 	 	  	 
    int a[M][N], b[N][M], c[M][M];
    InputMatrixA(a);
    InputMatrixB(b);
    MultiplyMatrix(a, b, c);
    OutputMatrix(c);
    return 0;
} 	
1~9组成三个3位数的平方数。
将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不许有重复数字,要求每组中的三位数都组成一个平方数
**输入格式要求:提示信息:"The 3 squares with 3 different digits each are:\n"
**输出格式要求:"%d,%d,%d\n"
程序运行示例如下:
The 3 squares with 3 different digits each are:
361,529,784
#include<stdio.h>
int main()
{	   	     	   
    int a[20],num[20][3],b[10];
    int i,j,k,m,n,t,flag;
    printf("The 3 squares with 3 different digits each are:\n");
    for(j=0,i=11;i<=31;i++)
    if(i%10!=0) //整10的平方会出现0;
    {	   	     	   
        k=i*i;
        num[j+1][0]=k/100;
        num[j+1][1]=k/10%10;
        num[j+1][2]=k%10;
        if(!(num[j+1][0]==num[j+1][1]||num[j+1][0]==num[j+1][2]||
                            num[j+1][1]==num[j+1][2]))
            a[++j]=k;//找到满足条件的三位数//
    }
    for(i=1;i<=j-2;++i)
    {	   	     	   
        b[1]=num[i][0];
        b[2]=num[i][1];
        b[3]=num[i][2];//第i个数的个十百//
        for(t=i+1;t<=j-1;++t)//j是总个数,i的下一个数//
        {	   	     	   
            b[4]=num[t][0];
            b[5]=num[t][1];
            b[6]=num[t][2];//下一个数的个十百//
            for(flag=0,m=1;!flag&&m<=3;m++)
                for(n=4;!flag&&n<=6;n++)
                    if(b[m]==b[n])flag=1;//比较6个数都不同//
            if(!flag)
                for(k=t+1;k<=j;k++)
                {	   	     	   
                    b[7]=num[k][0];
                    b[8]=num[k][1];
                    b[9]=num[k][2];
                    for(flag=0,m=1;!flag&&m<=6;m++)
                        for(n=7;!flag&&n<=9;n++)
                            if(b[m]==b[n])flag=1;
                    if(!flag)
                        printf("%d,%d,%d\n",a[i],a[t],a[k]);
                }
        }
    }
    return 0;
}
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
**输入格式要求:"%d" 提示信息:"please input the total of numbers:"
**输出格式要求:"%d is left\n" 
程序运行示例如下:
please input the total of numbers:30
29 is left
#include <stdio.h>

const int M = 3;

int main()
{	   	  	  	   
    int n, s = 0,i;
    printf("please input the total of numbers:");
    scanf("%d", &n);
    for (i = 2; i <= n; ++i)
        s = (s + M) % i;
    printf("%d is left\n", s + 1);
    return 0;
}	

此题是约瑟夫环问题 详细解释:(12条消息) 约瑟夫环——公式法(递推公式)_陈浅墨的博客-CSDN博客_约瑟夫问题

谁家孩子跑最慢
  张、王、李三家各有三个小孩。一天,三家的九个孩子在一起比赛短
跑,规定不分年龄大小,跑第一得9分,跑第二得8分,一次类推。比赛结果
各家的总分相同,且这些孩子没有同时到达终点,也没有一家的两个或三
个孩子获得相连的名次。已知获第一名的是李家的孩子,获得第二的是王
家的孩子。求各家各个孩子的得分,获得最后一名的是谁家的孩子?
**输入格式要求:提示信息:"The last one arrived to end is a child from family Zhang.\n"
**输出格式要求:"%d  "
程序运行示例如下:
7  5  3  
8  6  1  
9  4  2  
The last one arrived to end is a child from family Wang.
#include<stdio.h>
int score[4][4];
main()
{	   	     	   	 
    int i, j, k, who; //最慢孩子标记为who
    score[1][1] = 7;  //张孩子一定第三
    score[2][1] = 8;  //王
    score[3][1] = 9;  //李
    for (i = 4; i < 6; i++) //不能有两个孩子连号 所以张二最大为5
        for (j = 4; j < 7; j++)
            for (k = 4; i != j && k < 7; k++)
                if (k != i && k != j
                        && 15 - i - score[1][1] != 15 - j - score[2][1]
//三个孩子互不相等
                        && 15 - i - score[1][1] != 15 - k - score[3][1]
                        && 15 - j - score[2][1] != 15 - k - score[3][1])
                {	   	     	   	 
                    score[1][2] = i;
                    score[1][3] = 15 - i - 7;
                    score[2][2] = j;
                    score[2][3] = 15 - j - 8;
                    score[3][2] = k;
                    score[3][3] = 15 - k - 9;
                }
    for (who = 0, i = 1; i <= 3; i++, printf("\n"))
        for (j = 1; j <= 3; j++)
        {	   	     	   	 
            printf("%d  ", score[i][j]);
            if (score[i][j] == 1)
                who = i;
        }
    if (who == 1)
        printf("The last one arrived to end is a child from family Zhang.\n");
    else if (who == 2)
        printf("The last one arrived to end is a child from family Wang.\n");
    else
        printf("The last one arrived to end is a child from family Wang.\n");
}
改错 指针数组编程实现按奥运会参赛国国名排序
请用指针数组编程实现按奥运会参赛国国名,在字典中的顺序对其入场次序进行排序。
假设参赛国不超过150个。
下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误。
注意:请将修改正确后的完整源程序拷贝粘贴到答题区内。
对于没有错误的语句,请不要修改,修改原本正确的语句也要扣分。
当且仅当错误全部改正,且程序运行结果调试正确,才给加2分。
经教师手工核对后,如果未用指针数组做函数参数编程,那么即使做对也不给分。
改错时不能改变程序原有的意图,不能改变函数原型。

#include  <stdio.h>
#define   MAX_LEN  80
#define   N  150
void SortString(char *ptr[], int n);
main()
{
    int    i, n;
    char   *pStr[N]; //char   *pStr[N], str[N][MAX_LEN]; 
    printf("How many countries?\n");
    scanf("%d",&n);
                         //   for (i = 0; i < N; i++)  //在使用数组指针之前必须对数组元 
    素初始化
                         // pStr[i] = str[i];//让pStr[i]指向二维数组str的第i行
    printf("Input their names:\n");
    for (i=0; i<n; i++)
    {
        scanf("%s",pStr[i]);
    }
    SortString(pStr[i], n);  //SortString(pStr, n);
    printf("Sorted results:\n");
    for (i=0; i<n; i++)
    {
        puts(pStr[i]);
    }
}
 
void SortString(char *ptr[], int n)
{
    int    i, j;
    char  *temp;
    for (i=0; i<n-1; i++)
    {
        for (j = i+1; j<n; j++)
        {
            if (ptr[j] < ptr[i]); //if (strcmp(ptr[j], ptr[i]) < 0)
            {
                temp = ptr[i];
                ptr[j] = ptr[i];
                ptr[j] = temp;
            }
        }
    }
}

字符串结束标志'\0' 和空格符' ' 不是同一个ASCII码

绘制金字塔
要求用户从键盘输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案:
    A
   ABA
  ABCBA
 ABCDCBA
/*注意,最后一行输出的字符前面也有一个空格*/
#include <stdio.h>

 main(){
char c;
printf("Please input a capital:\n");
scanf("%c",&c);

for(int i='A';i<=c;i++ ){
    for(int j=c-i;j>=0;j--)
        printf(" ");
    for(int m=0;m<=i-'A';m++)
        printf("%c",'A'+m);
    for(int j=1;j<=i-'A';j++)
        printf("%c",i-j);

    printf("\n");
}
}

4位以内的相亲数

220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
284的真因数之和为:1+2+4+71+142=220
毕达哥拉斯吧这样的数对A,B称为相亲数:A的真因数之和为B,而B的真因数之和为A。设计程序求4位以内的相亲数。
#include <math.h>
#include <stdio.h>

int main()
{
    int i, j, s, t, s1;             //相亲数 i,s
    for (i = 11; i <= 9999; i++)
    {
        s = 1;
        t = sqrt(i); //只需算根号i次 后面的会重复
        for (j = 2; j <= t; j++)
        {
            if (i % j == 0)
                s = s + j + i / j;
        }
        if (i == t * t) //如果i为平方数,则其开方只能使用一次
            s -= t;
        if (i < s)
        {
            s1 = 1;
            t = sqrt(s);
            for (j = 2; j <= t; j++)
            {
                if (s % j == 0)
                    s1 = s1 + j + s / j;
            }
            if (s == t * t)
                s1 -= t;
            if (s1 == i)
            {
                printf("相亲数:%d,%d\n", i, s);
                printf("%d 的真因数之和为:%d", i, 1); 

                for (j = 2; j <= i / 2; j++)
                {
                    if (i % j == 0)
                        printf("+%d", j);
                }
                printf("=%d\n", s);
                printf("%d 的真因数之和为:%d", s, 1);
                for (j = 2; j <= s / 2; j++)
                {
                    if (s % j == 0)
                        printf("+%d", j);
                }
                printf("=%d\n", i);
            }
        }
    }
    return 0;
}

用switch语句实现“ + ” “ - ” “ * ” " / "

#include <stdio.h>
#include <math.h>
int main(){
    float a,b;
    char op,c;
    loop: printf("Please enter the expression:\n");
    scanf("%f %c%f",&a,&op,&b);
     switch(op)
    {
    case '+':
        printf("%f + %f = %f\n",a,b,a+b);
        printf("Do you want to continue(Y/N or y/n)?");
        scanf(" %c",&c);
        if (c=='y'||c=='Y') goto loop;
        break;
    case '-':
        printf("%f - %f = %f\n",a,b,a-b);
        printf("Do you want to continue(Y/N or y/n)?");
        scanf(" %c",&c);
        if (c=='y'||c=='Y') goto loop;
        break;
        case '*':
        printf("%f * %f = %f\n",a,b,a*b);
        printf("Do you want to continue(Y/N or y/n)?");
        scanf(" %c",&c);
        if (c=='y'||c=='Y') goto loop;
        break;
    case '/':
        if(fabs(b)<=1e-7) {
            printf("Division by zero!\n");
            printf("Do you want to continue(Y/N or y/n)?");
            scanf(" %c",&c);
            if (c=='y'||c=='Y') goto loop;
            break;
        }
        printf("%f / %f = %f\n",a,b,a/b);
        printf("Do you want to continue(Y/N or y/n)?");
        scanf(" %c",&c);
        if (c=='y'||c=='Y') goto loop;
        break;
    default:
        printf("Unknown operator!\n");
        printf("Do you want to continue(Y/N or y/n)?");
        scanf(" %c",&c);
        if (c=='y'||c=='Y') goto loop;

    }
    return 0;
}
八皇后问题。
在一个8*8的国际象棋棋盘上,有八个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。
#include<stdio.h>
#define NUM 8
int a[NUM + 1]; //由于每一行只能有一个皇后,故只需要记录列号
int main()
{
    int i, k, flag, not_finish = 1, count = 0;
    i = 1;
    a[1] = 1;
    printf("The possible configuration of 8 queens are:\n");
    while (not_finish)
    {
        while (not_finish && i <= NUM) //没找完毕
        {
            for (flag = 1, k = 1; flag && k < i; k++)    //列排除
                if (a[k] == a[i])  flag = 0;
            for (k = 1; flag && k < i; k++)             //主、副对角线排除
                if ((a[i] == a[k] - (k - i)) || (a[i] == a[k] + (k - i)))
                    flag = 0;
            if (!flag)  //冲突解决
            {
                if (a[i] == a[i - 1])       //列冲突
                {
                    i--; //回溯上一个
                    if (i > 1 && a[i] == NUM) //第i行已满
                        a[i] = 1;
                    else if (i == 1 && a[i] == NUM) //第一行已满
                        not_finish = 0; //结束
                    else a[i]++; //i行下一个
                }
                else if (a[i] == NUM)a[i] = 1;
                else         a[i]++;
            }
            else if (++i <= NUM)
            {
                if (a[i - 1] == NUM)
                    a[i] = 1;
                else
                    a[i] = a[i - 1] + 1;
            }
        }
        if (not_finish)
        {
            ++count;
            printf((count - 1) % 3 ? "  [%2d]:" : "\n   [%2d]:", count);
            for (k = 1; k <= NUM; k++)
                printf(" %d", a[k]);
            if (a[NUM - 1] < NUM)
                a[NUM - 1]++;
            else a[NUM - 1] = 1;
            i = NUM - 1;
        }
    }
    return 0;
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值