C :: Aufgabe #1

7 Lösungen Lösungen öffentlich

Multiplikation ohne zu multiplizieren

Anfänger - C von Gustl - 11.11.2012 um 17:24 Uhr
Erstellen Sie ein Konsolenprogramm welches dem Benutzer auffordert 2 Zahlen einzugeben, diese sollen dann multipliziert werden, jedoch ist nur die Grundrechenart Addition erlaubt.

Wenn einer der 2 Zahlen keine Zahl ist, soll eine Fehlermeldung ausgegeben werden und der Benutzer noch einmal aufgefordert werden eine Zahl einzugeben.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 08.07.2013 um 07:29 Uhr
Quellcode ausblenden C-Code
/****************************************
  * prod1.c    Produkt ohne Multiplikation
  *            Binäre Stellenwertaddition
  *
  * OS     :   GNU/Linux
  * compile:   gcc -Wall -o prod prod1.c
  *
  * devnull    08-07-2013
  ****************************************/
#include <stdlib.h>
#include <limits.h>
#include <values.h>
#include <stdio.h>
#include <errno.h>

/* values.h: #define INTBITS  sizeof(int)*CHAR_BIT */

/* return an unsigned int */
unsigned int get_number( int lfn )
{
	char snum[20];
	char *ep;
	long int lnum=0;
        
	while (1) {
		printf(" %d. positive ganze Zahl: ", lfn );
        scanf( "%s", snum );
            
        errno = 0;
        lnum = strtol( snum, &ep, 10);
		if ((errno==0) && (*ep=='\0')) {
			if (lnum>=0 && lnum<=INT_MAX) 
				break;
			printf( "Zahl liegt ausserhalb Limits (0..%d)!\n",INT_MAX );
		}
		else
			printf( "Eingabe hat kein korrektes 'long int'-Format!\n" );
	}
	return (unsigned int)lnum;
}

/* calculate product w/o multiplication */
unsigned long int prod( unsigned int i1, unsigned int i2 )
{
	unsigned long int sum=0;
    unsigned long int l1=0;
    int shift;
	
    l1=(unsigned long int)i1; 		
    for (shift=0; shift<INTBITS; shift++)
		if (i2>>shift & 1) sum += l1<<shift;
	return sum;
}

/* main */
int main( void )
{
	unsigned int a = get_number(1);
	unsigned int b = get_number(2);
	printf("%u x %u = %lu\n",a,b,prod(a,b));
    return 0;
}
vote_ok
von devnull (8870 Punkte) - 08.07.2013 um 10:43 Uhr
Quellcode ausblenden C-Code
/****************************************
  * prod2.c    Produkt ohne Multiplikation
  *            Dezimale Stellenwertaddition
  *            ("schriftlich multiplizieren")
  *
  * OS     :   GNU/Linux
  * compile:   gcc -Wall -o prod prod2.c
  *
  * devnull    08-07-2013
  ****************************************/
#include <stdlib.h>
#include <limits.h>
#include <values.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

/* return an unsigned int */
unsigned int get_number( int lfn )
{
	char snum[20];
	char *ep;
	long int lnum;
        
	while (1) {
		printf(" %d. positive ganze Zahl: ", lfn );
        scanf( "%s", snum );
            
        errno = 0;
        lnum = strtol( snum, &ep, 10);
		if ((errno==0) && (*ep=='\0')) {
			if (lnum>=0 && lnum<=INT_MAX) 
				break;
			printf( "Zahl liegt ausserhalb Limits (0..%d)!\n",INT_MAX );
		}
		else
			printf( "Eingabe hat kein korrektes 'long int'-Format!\n" );
	}
	return (unsigned int)lnum;
}

/* calculate x*cdigit w/o multiplication */
unsigned long int mul( unsigned long int x, char cdigit )
{
	switch (cdigit) {
	 case '1': return x;
	 case '2': return x<<1;
	 case '3': return (x<<1)+x;
	 case '4': return x<<2;
	 case '5': return (x<<2)+x;
	 case '6': return ((x<<1)+x)<<1;
	 case '7': return (((x<<1)+x)<<1)+x;
	 case '8': return x<<3;
	 case '9': return (x<<3)+x;
	 case 'A': return ((x<<2)+x)<<1;
	}
	return 0;
}

unsigned long int prod( unsigned int i1, unsigned int i2 )
{
	unsigned long int sum=0;
    unsigned long int l1=0;
	char istr[12];
	int p;
	
    l1=(unsigned long int)i1; 		
    sprintf( istr, "%u", i2 );
    for (p=strlen(istr);p;p--) {
		sum += mul(l1,istr[p-1]);
		l1 = mul(l1,'A');
	}
	return sum;
}

/* main */
int main( void )
{
	unsigned int a = get_number(1);
	unsigned int b = get_number(2);
	printf("%u x %u = %lu\n",a,b,prod(a,b));
    return 0;
}
vote_ok
von devnull (8870 Punkte) - 08.07.2013 um 12:55 Uhr
Quellcode ausblenden C-Code
/****************************************
  * prod3.c    Produkt ohne Multiplikation
  *            einfache Addition in Schleife
  *
  * OS     :   GNU/Linux
  * compile:   gcc -Wall -o prod prod3.c
  *
  * devnull    08-07-2013
  ****************************************/
#include <stdlib.h>
#include <limits.h>
#include <values.h>
#include <stdio.h>
#include <errno.h>

/* return an unsigned int */
unsigned int get_number( int lfn )
{
	char snum[20];
	char *ep;
	long int lnum=0;

	while (1) {
		printf(" %d. positive ganze Zahl: ", lfn );
        scanf( "%s", snum );
            
        errno = 0;
        lnum = strtol( snum, &ep, 10);
		if ((errno==0) && (*ep=='\0')) {
			if (lnum>=0 && lnum<=INT_MAX) 
				break;
			printf( "Zahl liegt ausserhalb Limits (0..%d)!\n",INT_MAX );
		}
		else
			printf( "Eingabe hat kein korrektes 'long int'-Format!\n" );
	}
	return (unsigned int)lnum;
}

/* calculate product w/o multiplication */
unsigned long int prod( unsigned int i1, unsigned int i2 )
{
	unsigned long int sum=0;
	unsigned int cnt=(i1<i2)?i1:i2;
	unsigned int add=(i1<i2)?i2:i1;
	unsigned int i;
    
    for (i=0;i<cnt;i++) sum+=add; 	
	return sum;
}

/* main */
int main( void )
{
	unsigned int a = get_number(1);
	unsigned int b = get_number(2);
	printf("%u x %u = %lu\n",a,b,prod(a,b));
    return 0;
}
vote_ok
von ah3n0bar6us (660 Punkte) - 16.07.2016 um 14:45 Uhr
Ein Problem gibt es jedoch, die Multiplikation mit 0 wird nicht akzeptiert. Was natürlich unsauber ist. Aber wenn jmd. einen Verbesserungsvorschlag hat, bin ich ganz Ohr. =)

Quellcode ausblenden C-Code
/* 	Ah3
*  	OS:			Macintosh; Intel Mac OS X 10_11_5
*	compile:   	gcc -std=c11 -Wall -Wextra -pedantic -o mult 1.c
*	date:		16-07-2016
*	Example:
*				./mult
*				./mult 12 13
*/

#include <stdio.h>	// to use printf()
#include <stdlib.h> // to use atoi()

void mult(int dig1, int dig2);

int main(int argc, char const *argv[]){
	// check input
	if (argc == 1) {
		// if no argument given
		char zahl1[32];
		char zahl2[32];
		printf("%s\n", "Bitte Zahl 1 eingeben: " );
		scanf("%s", zahl1);
		printf("%s\n", "Bitte Zahl 2 eingeben: " );
		scanf("%s", zahl2);
		mult(atoi(zahl1), atoi(zahl2));
	} else if (argc == 3) {
		// if  we got two digits
		mult(atoi(argv[1]), atoi(argv[2]));
	} else {
		printf("%s\n", "Something went wrong with your arguments. We start again." );
		main(1,0);
	}
}

void mult(int dig1, int dig2) {
	int result = dig1;
	for (int i = 1;i < dig2; i++) {
		result += dig1;
	}
	if (dig1 == 0 || dig2 == 0) {
		printf("%s\n", "Something went wrong with your arguments. We start again." );
		main(1,0);
	} else {
		printf("Das Produkt aus %i * %i = %i\n", dig1, dig2, result );
	}
}
vote_ok
von mraimbot (590 Punkte) - 04.01.2019 um 22:40 Uhr
Quellcode ausblenden C-Code
/*
 * Datei: Aufgabe-0001.c
 * Datum: 04.01.2019
 *
 * Aufgabe: Multiplikation ohne zu multiplizieren
 * Erstellen Sie ein Konsolenprogramm welches dem Benutzer auffordert 2 Zahlen einzugeben,
 * diese sollen dann multipliziert werden, jedoch ist nur die Grundrechenart Addition erlaubt.
 *
 * Wenn einer der 2 Zahlen keine Zahl ist, soll eine Fehlermeldung ausgegeben werden
 * und der Benutzer noch einmal aufgefordert werden eine Zahl einzugeben.
 */


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


int getNumber(char *numberAsString);
int multiplication(int operant1, int operant2);


int main (int argc, char **argv) {
	int numbers[3] = { 0 };

	numbers[0] = getNumber((2 <= argc) ? argv[1] : NULL);
	numbers[1] = getNumber((3 <= argc) ? argv[2] : NULL);
	numbers[2] = multiplication(numbers[0], numbers[1]);
	
	printf("%i * %i = %i", numbers[0], numbers[1], numbers[2]);

	return EXIT_SUCCESS;
}


int getNumber(char *numberAsString) {
	int result = 0;
	int number = 0;
	char ch;

	if (numberAsString != NULL) {
		result = sscanf_s(numberAsString, "%i", &number);

		if (result != 1) {
			printf("%s ist keine gueltige Ganzzahl.\n", numberAsString);
		}
	}

	while (result != 1) {
		printf("Ganzzahl eingeben: ");
		result = scanf_s("%i", &number);

		while ((ch = getchar()) != '\n' && ch != EOF);

		if (result != 1) {
			printf("Ihre Eingabe ist keine gueltige Ganzzahl.\n");
		}
	}

	return number;
}


int multiplication(int operant1, int operant2) {
	int solution = 0;

	if (operant1 < 0) {
		operant2 *= -1;
		operant1 *= -1;
	}

	for (int i = 0; i < operant1; ++i) {
		solution += operant2;
	}

	return solution;
}
vote_ok
von kathleenw (3600 Punkte) - 07.07.2020 um 09:06 Uhr
Quellcode ausblenden C-Code
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int zahl1, zahl2, loesung, i;
    
    loesung = 0;
    
    printf("Bitte gebe die 1. ganzzahlige Zahl ein: ");
    if(scanf("%d", &zahl1)!=1) {
        printf("Fehler bitte eine ganzzahlige Zahl eingeben. \n");
        return EXIT_FAILURE;
    }
    
    printf("Bitte gebe die 2. ganzzahlige Zahl ein: ");
    if(scanf("%d", &zahl2)!=1) {
        printf("Fehler bitte eine ganzzahlige Zahl eingeben. \n");
        return EXIT_FAILURE;
    }
    
    for (i= 1; i<=zahl2; i++) {
        loesung = loesung + zahl1;
    }
    
    printf("Die Lösung ist: %d\n",loesung);
    
    return EXIT_SUCCESS;
    
}
vote_ok
von psych0dad (260 Punkte) - 11.11.2020 um 15:00 Uhr
Quellcode ausblenden C-Code
/* multiplizieren ohne zu multipliziern */
#include <stdio.h>
#include <stdlib.h>


/* Funktion fuer die Multiplikation */
unsigned int multiplizieren(unsigned int a,unsigned int b){
    unsigned int i, c=0;
    for(i=1; i<=b; i++){
        c+=a;
     }
    return c;
 }

int main(void){
    unsigned int zahl1, zahl2, ergebniss, check1, check2;
    
    printf("--------------------------------------\n");
    printf("Multiplizieren ohne zu multiplizieren!\n");
    printf("--------------------------------------\n\n");
    printf("Geben sie die Zahl 1 ein: ");
    
    /* zwei Schleifen, da sonnst, bei einer Eingabe einse Zeichens  *
     * oder eine Buchstaben eine Dauerschleife ausgeloest wird.     *
     * da der Puffer nicht geleert wird.                            */  

    do{
        check1=scanf("%u", &zahl1);
            if(check1!=1){
                printf("Fehler!!!\n");
                printf("Bitte noch ein Mal die Zahl 1 eingeben.\n");
                printf("Zahl 1: ");
             }
     } while(getchar()!='\n');
    printf("\n--------------------------------------\n\n");
    printf("Geben sie die Zahl 2 ein: ");    
    do{
        
        check2=scanf("%u", &zahl2);
            if(check2!=1){
                printf("Fehlre!!!\n");
                printf("Bitte noch ein die Zahl 2 eingeben!\n");
                printf("Zahl 2: ");
             }
     } while(getchar()!='\n');
    printf("\n\n");
    printf("--------------------------------------\n");
    ergebniss=multiplizieren( zahl1, zahl2);
    printf("%u * %u = %u\n", zahl1, zahl2, ergebniss);
    printf("--------------------------------------\n");
    return EXIT_SUCCESS;
 }