[C] Zählen

Murphy7

Ensign
Registriert
Mai 2008
Beiträge
135
Ich habe ein code der immer + 1 rechnet also 0,1,2,3,4,...
Jetzt möchte ich aber 0, 0.1, 0.2, 0.3, 0.4,... zählen wie kann ich das machen hier ist mein code.

Code:
#include <stdio.h>


int main()
{
  int abbruch, i;   /* Wichtig: i deklarieren! */

  printf ("Zählen von 0 bis (inklusive): ");
  scanf ("%d",&abbruch);

  for (i = 0; i <= abbruch; i++)
  {    /* Anweisungsblock, hier nur mit einer Zeile */
    printf ("%d\n", i);
  }

  return 0;
}

Es kann in c oder c++ sein. Besser ist c++.
 
statt
Code:
for (i = 0; i <= abbruch; i++)
einfach
Code:
for (i = 0; i <= abbruch; i = i + 0.1)
oder (dasselbe nur kürzer)
Code:
for (i = 0; i <= abbruch; i += 0.1)
Des Weiteren musst du i als float (oder double) anstatt als int deklarieren und %f statt %d beim printf verwenden.

Dein Beispiel ist ja C und C++ würde hier für dein eigentliches Problem keinen Unterschied machen (nur die Ein-und Ausgabe mit printf/scanf wäre anders).
 
Zuletzt bearbeitet:
Ich habe ein Programm was die Nullstelle von linearen funktionen errechnet doch irgendwie klappt es nicht. Was ist falsch??

Code:
#include <iostream>
using namespace std;

int main()
{

	float m, n, i, erg;
	cout<<"Nullstelle von einer linearen funktion (y=mx+n)\nWert für m:";
	cin>>m;
	cout<<"Wert für n:";
	cin>>n;
	for (i = -50; i <= 50; i = i + 0.1)
		{
			erg= m*i+n;
			if(erg == 0)
			{	
				break;
				cout<<"\nNullstelle:"<<i;
			}
		}


	cin.get();
}
 
Naja, das was du machst ist ja nicht berechnen, sondern ausprobieren und: Was ist denn wenn die Nullstelle nicht auf einem deiner Folgenglieder liegt?

Ich meine das anschaulich so: Du gehst ja durch und multiplizierst m mit 0,1. So da es ein Float ist könntest du die Nullstelle ja treffen, aber: Was ist wenn die Nullstelle in einem nicht von deiner Funktion erfassten Bereich liegt. Denn die NS kann ja zig Nachkomma stellen haben und deine Funktionswerte kommen gar nicht so tief in den Nachkommabereich?

Ich schätze (weiß es auch nicht genau), dass dies das Problem ist.
 
die funktion is doch totaler nonsens xD nullstellen einer linearen funktion kriegste doch extrem einfach..

x=-n/m
 
PHP:
if(erg == 0)
			{	
				break;
				cout<<"\nNullstelle:"<<i;
			}

Das ist tödlich. erg ist eine Float-Variable, und die wird wahrscheinlich NIE genau gleich 0 sein. Bei Floats muss stattdessen geprüft werden, ob der Absolutwert der Differenz zwischen aktuellem Wert und Zielwert unter eine gewisse Schranke fällt.
Also:
PHP:
float eps = 1e-4; // Schranke
if( fabs(erg) < eps)
{	
 break;
 cout<<"\nNullstelle:"<<i;
}

Die Wahl der Schranke hängt dann vom Problem ab, bei einer Schrittlänge von 0.1 könnte die gewählte Schranke abhängig von den Parametern der Linie aber schon zu niedrig sein...
 
Zuletzt bearbeitet:
Durch den Tip von IceMatrix muss ich das gar nicht so aufwändig machen.
Ich habe nochmal eine andere Frage wie kann ich eine Void funktion machen sodass ich anfang was festlege und ich es dann nur im Programm schreiben muss. Hab es so probiert hat aber nicht funktioniert. Was muss ich denn ändern ?

Code:
#include <stdio.h>


void passwortschutz (void)
{
	char name[10], passwort[10];
	do
	{

		printf("Willkommen an ihrem Pc!\nBitte Loggen Sie sich ein!\nBenutzername:");
		scanf ("%s", &name);
		printf("Passwort:");
		scanf("%s", &passwort);

		if((strcmp(passwort , "password") == 0) && (strcmp(name , "Murphy") == 0))
		{
			printf("\nHerzlich willkommen %s\n", &name);
			
		}
		else
		{
			printf("\n\aBenutzername oder Passwort falsch!\n\n");
			Sleep(1000);
	
		}

	}
	while (strcmp(passwort , "password") != 0);
}

int main ()
{
	passwortschutz;
	printf ("Es hat funktioniert");
	

	return EXIT_SUCCESS;
}

Am besten wär wenn ihr es in C und in C++ erklärt da ich gerade c++ lerne.
 
Hier dein "korrigierter" Code:
Code:
#include <stdio.h>
#include <string.h>
#include <Windows.h>	// Für die Sleep funktion

void passwortschutz()	// Das void in der Klammer ist nicht notwendig
{
	char name[10], passwort[10];
	do
	{
		printf("Willkommen an ihrem Pc!\nBitte Loggen Sie sich ein!\nBenutzername:");
		scanf ("%s", &name);
		printf("Passwort:");
		scanf("%s", &passwort);

		if((strcmp(passwort , "password") == 0) && (strcmp(name , "Murphy") == 0))
		{
			printf("\nHerzlich willkommen %s\n", &name);
		}
		else
		{
			printf("\n\aBenutzername oder Passwort falsch!\n\n");
			Sleep(1000);
		}
	}
	while (strcmp(passwort , "password") != 0);
}

int main ()
{
	passwortschutz();			// Das ist eine Funktion, Funktionen werden IMMER mit Klammern aufgerufen
	printf ("Es hat funktioniert");

	return 0;		                // statt EXIT_SUCCESS kann man auch einfach 0 schreiben, ist weniger Tipp-Arbeit
}

In C++ würde man statt printf und scanf, cout und cin verwenden.
Außerdem würde man in C++ strings statt char arrays verwenden.

Versuch mal den C++ Code zu schreiben, wenn du's nicht schaffst Poste einfach deinen Code.

Gruß
BlackMark
 
Ich habe es in C++ probiert aber es geht leider net das Problem ist string und if mit Wort!
Ich ich weiß nicht wie ich es richtig machen soll.
Code:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

void passwortschutz ()
{
string name[10], passwort[10];
	do
	{

		cout<<"Willkommen an ihrem Pc!\nBitte Loggen Sie sich ein!\nBenutzername:";
		cin>>name;
		cout<<"Passwort:";
		cin>>passwort;

		if((strcmp(passwort , "password") == 0) && (strcmp(name , "Moritz") == 0))
		{
			cout<<"\nHerzlich willkommen %s\n"<<name;
			Sleep(1000);/*macht eine pause für 1s = 1000ms*/
		}
		else
		{
			cout<<"\n\aBenutzername oder Passwort falsch!\n\n";
			Sleep(1000);
			system("cls");/*löscht den vorigen Prozess,sodass es aussieht ob es von vorne startet*/
		}

	}
	while (strcmp(passwort , "password") != 0);
}

int main ()
{
	passwortschutz();
	cout<<"Es hat funktioniert";
	system("Pause");


}
 
Ich glaube du hast die Funktionsweise von Strings in C++ nicht verstanden. Das sind keine Arrays und ein strcmp brauchst du auch nicht. Lies dir doch mal ein Tutorial durch (=>google!)!
 
Ein char array ist eine Kette von Zeichen ( = Zeichenkette ).
Jedoch ein string ist schon eine Zeichenkette, du legst aber einen string array an, also eine Kette von Zeichenketten.

strcmp funktioniert nicht mit strings, das ist eine C funktion und die ist für C-Strings ( char arrays ) gedacht.

Edit: BerniG war schneller

Hier ist dein Code:
Code:
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

void passwortschutz()
{
	string name, passwort;         // Hier keine string arrays anlegen, sondern nur strings
	do
	{
		cout << "Willkommen an ihrem Pc!\nBitte Loggen Sie sich ein!\nBenutzername:";
		getline(cin, name);        // ist besser als cin >> name; da durch getline auch leerzeichen erkannt werden
		cout << "Passwort:";
		getline(cin, passwort);    // gleiches hier
		
		// Du kannst den string direkt über == vergleichen, oder über .compare(...)

		//if( name == "Moritz" && passwort == "password" )
		if( name.compare("Moritz") == 0 && passwort.compare("password") == 0 )
		{
			cout << "\nHerzlich willkommen " << name << "\n";       // bei cout gibt es kein %s, das gibt es nur bei printf
			                                                        // statt \n kann man auch endl verwenden zB: cout << endl; statt cout << "\n";
			Sleep(1000);/*macht eine pause für 1s = 1000ms*/
		}
		else
		{
			cout << "\n\aBenutzername oder Passwort falsch!\n\n";
			Sleep(1000);
			system("cls");/*löscht den vorigen Prozess,sodass es aussieht ob es von vorne startet*/
		}

	}
	while(passwort.compare("password") != 0);
}

int main ()
{
	passwortschutz();

	cout << "Es hat funktioniert" << endl;

	system("pause");
	return 0;           // Diese Funktion heißt int main() also hat sie einen int als rückgabewert, den hast du hier vergessen
}

Gruß
BlackMark
 
Ich hab das mit dem zählen nochmal porbiert für funktionen 3.Grades.
Nur irgendwie passiert nichts.
Code:
#include <iostream>
#include <cmath>


using namespace std;

int main()
{
	float a,b,c,d,i,erg;
	cout<<"Brechnung von Nullstellen(ax^3+bx^2+cx+d)\nGib ein Wert für a ein: ";
	cin>>a;
	cout<<"Gib ein Wert für b ein: ";
	cin>>b;
	cout<<"Gib ein Wert für c ein: ";
	cin>>c;
	cout<<"Gib ein Wert für d ein: ";
	cin>>d;



	for (i = -5; i <= 5; i = i + 0.0001)
		{
			
			erg = (a*(i*i*i))+(b*(i*i))+(c*i)+d;
				float eps = 1e-4; // Schranke
				if( fabs(erg) < eps)
				{    
					break;
					cout<<"\nNullstelle:"<<i;
					system("Pause");
				}  
		}

	system("Pause");
	return 0;
}

Die Nullstelle ist -1.0906
 
Beim Addieren von floats kann es passieren, dass rundungsbedingt krumme Zahlen rauskommen. Also dass i eben dann z.B. plötzlich 0.002000014 ist und nicht 0.002 wie du es erwarten würdest. Wenn du ne double verwenden würdest wäre es schon etwas genauer, außerdem müsstest wohl mit dem eps "spielen".

Übrigens: Hast du absichtlich "Brechung" geschrieben weil es Bruteforce und keine Berechnung ist? Ich dachte eigtl. dass man das (Kubische Gleichung) auch ausrechnen kann. Kann dir dazu aber jetzt keinen Code geben.
 
Du breakst bevor du die Nullstelle ausgibst, also kannst du gar kein Ergebnis sehen!
Du müsstest das break nach der ausgabe setzten, dann sollte es klappen!

Gruß
BlackMark
 
Zurück
Oben