preguntas C 2014 Nian pluma

1, señala errores en el programa, explican las razones y correcta

int * p, * q; 
p = malloc (sizeof (int) * 20); 
q = malloc (sizeof (int) * 10); 
... 
q = p; 
... 
libre (P); 
libre (q);

análisis:

Error 1, q almacenados originalmente dirección de un tipo int de área de memoria, en ausencia de la liberación de esta dirección para modificar el contenido de q, de modo que esta zona no se puede recuperar, lo que resulta en una pérdida de memoria .

Error 2, p y q se refieren a la misma zona de la memoria, la región de memoria ha sido liberado después de usar libre (P), no puede ser libre de nuevo. Corrección: la libre (q) colocado delante de q = p (corrección de maneras diferentes, donde seleccionar una)


2, señalado errores en el programa, explican las razones y correcta
// intercambio cadena 
nula la swap (P char *, char * q) 
{ 
	char * TEMP; // P, el valor de cambio q referirse 
	* TEMP = P *; 
	* P = q *; 
	* q * = TEMP; 
}

Análisis: El código crea primero un parámetro contenidos p y q necesitan dos tipo char de dirección, dentro del código para el intercambio de estos dos parámetros, sin ningún impacto en el mundo exterior.

El código se modifica como sigue:

el canje de vacío (P char *, char * Q) 
{ 
	Char TEMP [100]; 
	strcpy (TEMP, P); // strcpy función: copia de cadena 
	strcpy (P, Q); 
	strcpy (Q, TEMP); 
}

3, respuesta corta, arr matriz de enteros, N es la longitud de la matriz, enumb de variables enteras, la siguiente función es responsable de identificar arr matriz igual enumb posición del elemento. Existen tres tipos de anomalías señalaron que el programa, y por qué.

for (i = N-1; arr [i] = enumb;! - i) 
  printf ( “% d”, i);

análisis:

En primer lugar, para el bucle de nuevo debe tener un punto y coma, de lo contrario cada ciclo se emiten.

En segundo lugar, si la matriz arr sin enumb, i será un número negativo, desbordamiento de matriz.

Por último, si se han reducido, voy a disminuir hasta que rebose.


 4, respuesta corta, SI el otro S1 S2 (B); ¿Cuál es la estructura? Uso muestra la estructura del lenguaje cómo expresar? Y marcar salto condicional y la fuerza de salto

 Análisis: estructura de bifurcación condicional

si (b) Goto L1; // salto condicional 
Goto L2; // forzado Jump 
Ll: S1 
L2 de: S2

5、简答题,C语言中,常量存储在哪里?静态局部变量和静态全局变量存储在哪里?

分析:常量存储在常量区,静态局部变量和静态全局变量存储在全局数据区。


 6、填空题,下面程序是对链表进行选择排序,填上空缺的部分

list selectsort(list head){
	list p = (struct node*)malloc(sizeof(node));
	p->next = head;
	head = p;//新建一个头结点
	p = head->next;
	list k = head, q = head;

	while (p->next)
	{
		q = p->next;
		k = q;  //k记录最小值位置
          //找到最小元素位置 while (q) { if (q->data < k->data) { k = q; } q = q->next; }
          //交换元素位置 if (p->next != k) { int r = p->next->data; p->next->data = k->data; k->data = r; } p = p->next; //填空一 } p = head; head = head->next; //填空二 free(p); //释放头结点 return head; //填空三 } 

 7、填空题,快速排序法求某个数组前n个元素第k大的数

int find_k(int *a, int n,int k) {
	int i, j, t;
	int low = 0,high = n - 1;
	do {
		i = low; j = high; t = a[low];
		do {
			while (a[j]>t) j--;
			while (a[i]<t) i++;
			if () 
				swap(&a[j], &a[i]);
			else
				;
		} while (i<j);
		if (i == k)
			return t;
		if (i>k)
			;
		if (i<k)
			;
	} while (low<high);
	;
}

分析:该题目使用快排划分的第一种写法,原理是利用每次快排划分之后总能确定一个元素的最终位置。该程序可能仍然存在问题,最大的数字是第0个。

int find_k(int *a, int n,int k) { //从大到小排序
	int i, j, t;
	int low = 0,high = n - 1;
	do {
		i = low; j = high; t = a[low];
		do {
			while (a[j]<t) j--;
			while (a[i]>t) i++;
			if (i<j) 
				swap(&a[j], &a[i]);
			else
				break;   //填空1
		} while (i<j);
		if (i == k)
			return t;
		if (i>k)
			high = i - 1;   //填空2
		if (i<k)
			low = i + 1;     //填空3
	} while (low<high);
	return  a[low];   //填空4
}

8、填空题,约瑟夫环问题 【见2015年】 

int a[N + 1];
int *p = a, i,j,k;
for(i = 0; i<N + 1; i++)
    *(p+i) = i;
;
;
for( i = 0; k != 1; p++)
{
    if()
        p = a + 1;
    if()
        i++;
    if()
    {
        k--;
        i = 0;
        *p = 0;
    }
}
for(i = 0; i<N + 1; i++)
{
    if()
        printf("%d\n",a[i]);
}

分析:15年约瑟夫环区别

int a[N + 1];
int *p = a, i,j,k;
//赋值0~N for(i = 0; i<N + 1; i++) *(p+i) = i; p = a + 1; //填空1 k = N; //填空2 for( i = 0; k > 1; p++) //k为剩下的人数 { if(p>a + N) p = a + 1; if(*p != 0) //碰到元素为0说明已经杀死,不参与计数 i++; //i报数 if(i == 3) { k--; i = 0; *p = 0; } }
//打印输出 for(i = 0; i<N + 1; i++) { if(a[i] != 0) printf("%d\n",a[i]); }

9、 填空题,完美乘法,若a*b=c,且abc中0~9的数字各出现一次,填写程序空缺处。

int f[10],s[3];
int n=0;
for (int a = 12; a<999; a++)
{
    int t = 0;
    //清空数字计数
    for (int x = 0; x<10; x++)
        f[x] = 0;
    for (int b = 345; b<9999; b++)
    {
        int c ;
        ;     //填空一
        s[0] = a;
        s[1] = b;
        s[2] = c;
        //计算abc中出现数字的次数
        for (int x = 0; x < 3; x++)
        {
            int y = s[x];
            while ()
            {
                int t = y % 10;
                f[t]++;
                ;    //填空二
            }
        }
        //检查是否每个数都个出现一次
        for (int x = 0; x<10; x++)
        {
            if ()  ;   //填空三
        }
        if ()
            printf("%d*%d=%d\n",a,b,c);
            ;//填空四 } }

分析:

int f[10],s[3];
int n=0;
for (int a = 12; a<999; a++)
{
    int t = 0;
    //清空数字计数
    for (int x = 0; x<10; x++)
        f[x] = 0;
    for (int b = 345; b<9999; b++)
    {
        int c = a*b;
        s[0] = a;
        s[1] = b;
        s[2] = c;
        //计算abc中出现数字的次数
        for (int x = 0; x < 3; x++)
        {
            int y = s[x];
            while (y > 0)
            {
                int t = y % 10;
                f[t]++;
                y = y / 10;
            }
        }
        //检查是否每个数都个出现一次
        for (int x = 0; x<10; x++)
        {
            if (f[x] != 1)  t++;
        }
        if (t == 0)
            printf("%d*%d=%d\n",a,b,c);
        n++;			//统计循环次数
    }
}

10、编程题,将字符串逆转,函数原型void reverse(char *str);,要求空间复杂度为O(1)

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

void reverse(char *str)
{
    int i = 0, len = strlen(str);
    for (; i < len / 2; i++)
    {
        char a = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = a;
    }
}
int main()
{
    char ch[] = "helloworld";
    reverse(ch);
    printf("逆转后:%s",ch);
    return 0;
}
 

11、编程题,比较两个身份证字符串的生日大小。函数原型int isbothsame(char str1[19], char str2[19]);

#include <stdio.h>
#include <stdlib.h>

int isbothsame(char str1[19], char str2[19])
{
    int low = 6, hight = 13;
    while (low<hight &&str1[low] == str2[low])low++; //low记录不相同的位置
    return str1[low] - str2[low];  //负数表示str1的年长
}
int main()
{
    char a[] = "412824199605281234",b[] = "41282519960825789x";
    if(isbothsame(a,b) < 0)
        printf("a年长!");
    else
        printf("b年长!");
    return 0;
}

12、编程题,计算1-x+x^2/2!-x^3/3!+…+x^n/n!  【见2015年】

void main()
{
    int n, x, j, i = 1;
    float sum = 1, k = -1;
    printf("Input n and x:\n");
    scanf("%d %d", &n, &x);
    while (i <= n) {
        k = -1;
        for (j = 1; j <= i; j++) {
            k = -1*k*x;
        }
        for (j = 1; j <= i; j++) {
            k =  k/ j;
        }
        sum += k;
        i++;
    }
    printf("%f\n", sum);
}

动态规划改进:

void main()
{
        int n,x,i=1;
        float sum = 1,k = -1;
        printf("Input n and x:\n");
        scanf("%d %d", &n, &x);
        while (i <= n) {
            k = -1 * k*x / i;
            sum += k;
            i++;
        }
        printf("%f", sum);
}

13、编程题一个链表,找出其中数据项最大的结点,然后将其移动到链表尾部(结点node由整型data节点指针next构成不允许申请新的结点

#include <stdio.h>
#include <stdlib.h>

typedef struct slist
{
    int data;
    struct slist *next;
};
void movemax(struct slist *L)
{
    struct slist *p = L->next, *pre = L, *max = p;
    //找到最大值的位置
    while (p)
    {
        if (p->data>max->data)max = p;
        pre = p;
        p = p->next;
    }
    //此时p指向NULL,pre指向最后一个结点
    //最大值和最后一个节点交换
    int temp = pre->data;
    pre->data = max->data;
    max->data = temp;
}
int main()
{
    //建立单链表【尾插法】
    int a[] = {1,4,7,8,5,2,9,6,3};
    struct slist *p,*head = (struct slist*)malloc(sizeof(struct slist));
    head ->next = NULL;
    int i;
    p = head;
    for(i = 0;i < 9;i++)
    {
        struct slist *node = (struct slist*)malloc(sizeof(struct slist));
        node ->data = a[i];
        node ->next = p ->next;
        p ->next = node;
        p = node;
    }
    printf("找到最大值后移:\n");
    movemax(head);
    //输出
    p = head ->next;
    while(p != NULL)
    {
        printf("%d\t",p ->data);
        p = p->next;
    }
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/pam-sh/p/12585160.html
Recomendado
Clasificación